diff --git a/src/test/features/modules.feature b/src/test/features/modules.feature new file mode 100644 index 000000000..e3176eea5 --- /dev/null +++ b/src/test/features/modules.feature @@ -0,0 +1,26 @@ +Feature: Basic Navigation + + Background: + Given I go on the Gaia login page +# And Percy takes a snapshot named 'Login Page' + And I login with user 'admin' and password 'admin123' + + Scenario: View Dashboard + When I arrive on the Dashboard page + Then Percy takes a snapshot named 'Dashboard' + + Scenario: View modules + When I go on the modules page + Then Percy takes a snapshot named 'Modules' + + Scenario: View module details + When I go on the module 'e01f9925-a559-45a2-8a55-f93dc434c676' page + Then Percy takes a snapshot named 'Module Details' + + Scenario: View stack details + When I go on the stack 'de28a01f-257a-448d-8e1b-00e4e3a41db2' page + Then Percy takes a snapshot named 'Stack Details' + + Scenario: View job details + When I go on the job '5e856dc7-6bed-465f-abf1-02980206ab2a' for stack 'de28a01f-257a-448d-8e1b-00e4e3a41db2' page + Then Percy takes a snapshot named 'Job Details' diff --git a/src/test/java/io/gaia_app/e2e/CucumberContextConfiguration.java b/src/test/java/io/gaia_app/e2e/CucumberContextConfiguration.java new file mode 100644 index 000000000..8d79db2d2 --- /dev/null +++ b/src/test/java/io/gaia_app/e2e/CucumberContextConfiguration.java @@ -0,0 +1,43 @@ +package io.gaia_app.e2e; + +import io.cucumber.java.After; +import io.cucumber.java.Before; +import io.gaia_app.e2e.stepDefs.StepDefs; +import io.gaia_app.test.SharedMongoContainerTest; +import org.openqa.selenium.Dimension; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxOptions; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.concurrent.TimeUnit; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class CucumberContextConfiguration extends SharedMongoContainerTest { + + @Before + public void setup_cucumber_spring_context() { + FirefoxOptions options = new FirefoxOptions(); + options.addArguments("-headless"); + + FirefoxDriver firefoxDriver = new FirefoxDriver(options); + firefoxDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); + firefoxDriver.manage().window().setSize(new Dimension(1280,800)); + + StepDefs.driver = firefoxDriver; + + mongo.emptyDatabase(); + mongo.runScript("src/test/resources/db/00_team.js"); + mongo.runScript("src/test/resources/db/10_user.js"); + mongo.runScript("src/test/resources/db/20_module.js"); + mongo.runScript("src/test/resources/db/30_stack.js"); + mongo.runScript("src/test/resources/db/40_job.js"); + mongo.runScript("src/test/resources/db/50_step.js"); + mongo.runScript("src/test/resources/db/60_terraformState.js"); + } + + @After + public void tearDown(){ + StepDefs.driver.close(); + } + +} diff --git a/src/test/java/io/gaia_app/e2e/CucumberIT.java b/src/test/java/io/gaia_app/e2e/CucumberIT.java new file mode 100644 index 000000000..fc2a33db1 --- /dev/null +++ b/src/test/java/io/gaia_app/e2e/CucumberIT.java @@ -0,0 +1,13 @@ +package io.gaia_app.e2e; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.jupiter.api.Tag; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(plugin = "pretty", features = "src/test/features") +@Tag("e2e") +public class CucumberIT { + +} diff --git a/src/test/java/io/gaia_app/e2e/SeleniumIT.java b/src/test/java/io/gaia_app/e2e/SeleniumIT.java deleted file mode 100644 index 65435d7c6..000000000 --- a/src/test/java/io/gaia_app/e2e/SeleniumIT.java +++ /dev/null @@ -1,162 +0,0 @@ -package io.gaia_app.e2e; - -import io.gaia_app.test.SharedMongoContainerTest; -import io.percy.selenium.Percy; -import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.*; -import org.openqa.selenium.Dimension; -import org.openqa.selenium.OutputType; -import org.openqa.selenium.TakesScreenshot; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.firefox.FirefoxDriver; -import org.openqa.selenium.firefox.FirefoxOptions; -import org.openqa.selenium.support.PageFactory; -import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.server.LocalServerPort; - -import java.io.File; -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertEquals; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -@Tag("e2e") -class SeleniumIT extends SharedMongoContainerTest { - - @LocalServerPort - private int serverPort; - - private static WebDriver driver; - - private static Percy percy; - - @BeforeAll - public static void openServerAndBrowser() throws IOException { - FirefoxOptions options = new FirefoxOptions(); - options.addArguments("-headless"); -// ChromeOptions options = new ChromeOptions(); -// options.addArguments( -// "--headless", -// "--disable-web-security", -// "--allow-running-insecure-content", -// "--ignore-certificate-errors"); - driver = new FirefoxDriver(options); - - percy = new Percy(driver); - - driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - - mongo.emptyDatabase(); - mongo.runScript("00_team.js"); - mongo.runScript("10_user.js"); - mongo.runScript("20_module.js"); - mongo.runScript("30_stack.js"); - mongo.runScript("40_job.js"); - mongo.runScript("50_step.js"); - mongo.runScript("60_terraformState.js"); - } - - @AfterAll - public static void closeServerAndBrowser() { - // Close our test browser. - driver.quit(); - } - - private String testUrl(){ - return "http://localhost:"+serverPort; - } - - @Test - @Order(1) // this test runs first as it logs the user in ! - void loginPage() { - driver.get(testUrl()); - driver.manage().window().setSize(new Dimension(1280,800)); - - var page = new LoginPage(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); - - percy.snapshot("Login Page"); - - page.login("admin", "admin123"); - } - - @Test - void dashboardPage_showsModuleCount() { - driver.get(testUrl()+"/dashboard"); - - var page = new DashboardPage(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); - page.waitForPageLoaded(); - - assertEquals(3, page.modulesCount()); - assertEquals(1, page.stacksCount()); - assertEquals(0, page.stacksToUpdateCount()); - - percy.snapshot("Dashboard"); - } - - @Test - void modulesPage_showsModules() { - driver.get(testUrl()+"/modules"); - - var page = new ModulesPage(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); - page.waitForPageLoaded(); - - assertEquals(3, page.modulesCount()); - - percy.snapshot("Modules"); - } - - @Test - void modulePage_showsModuleDetails() { - driver.get(testUrl()+"/modules/e01f9925-a559-45a2-8a55-f93dc434c676"); - - var page = new ModulePage(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); - - assertThat(page.moduleName()).isEqualTo("terraform-docker-mongo"); - assertThat(page.moduleDescription()).contains("A sample terraform"); - assertThat(page.terraformImageTag()).isEqualTo("0.11.14"); - - percy.snapshot("Module Details"); - } - - @Test - void stackPage_showsStackDetails() { - driver.get(testUrl()+"/stacks/de28a01f-257a-448d-8e1b-00e4e3a41db2/edit"); - - var page = new StackPage(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); - - assertThat(page.stackName()).isEqualTo("local-mongo"); - - percy.snapshot("Stack Details"); - } - - @Test - void jobPage_showsJobDetails() { - driver.get(testUrl()+"/stacks/de28a01f-257a-448d-8e1b-00e4e3a41db2/jobs/5e856dc7-6bed-465f-abf1-02980206ab2a"); - - var page = new JobPage(driver); - PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); - - assertThat(page.jobDetailTitle()).isEqualTo("Job 5e856dc7-6bed-465f-abf1-02980206ab2a"); - - percy.snapshot("Job Details"); - } - - void takeScreenshot() { - var file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); - System.out.println(file.getAbsolutePath()); - try { - FileUtils.copyFileToDirectory(file, new File("./target")); - } catch (IOException e) { - e.printStackTrace(); - } - } -} diff --git a/src/test/java/io/gaia_app/e2e/DashboardPage.kt b/src/test/java/io/gaia_app/e2e/pages/DashboardPage.kt similarity index 92% rename from src/test/java/io/gaia_app/e2e/DashboardPage.kt rename to src/test/java/io/gaia_app/e2e/pages/DashboardPage.kt index b27199b1a..74befbf54 100644 --- a/src/test/java/io/gaia_app/e2e/DashboardPage.kt +++ b/src/test/java/io/gaia_app/e2e/pages/DashboardPage.kt @@ -1,10 +1,8 @@ -package io.gaia_app.e2e +package io.gaia_app.e2e.pages import org.openqa.selenium.By import org.openqa.selenium.WebDriver import org.openqa.selenium.WebElement -import org.openqa.selenium.support.FindBy -import org.openqa.selenium.support.ui.ExpectedCondition import org.openqa.selenium.support.ui.ExpectedConditions import org.openqa.selenium.support.ui.WebDriverWait diff --git a/src/test/java/io/gaia_app/e2e/JobPage.kt b/src/test/java/io/gaia_app/e2e/pages/JobPage.kt similarity index 94% rename from src/test/java/io/gaia_app/e2e/JobPage.kt rename to src/test/java/io/gaia_app/e2e/pages/JobPage.kt index 3d7e79a5e..0d1d6c93e 100644 --- a/src/test/java/io/gaia_app/e2e/JobPage.kt +++ b/src/test/java/io/gaia_app/e2e/pages/JobPage.kt @@ -1,4 +1,4 @@ -package io.gaia_app.e2e +package io.gaia_app.e2e.pages import org.openqa.selenium.WebDriver import org.openqa.selenium.WebElement diff --git a/src/test/java/io/gaia_app/e2e/LoginPage.kt b/src/test/java/io/gaia_app/e2e/pages/LoginPage.kt similarity index 97% rename from src/test/java/io/gaia_app/e2e/LoginPage.kt rename to src/test/java/io/gaia_app/e2e/pages/LoginPage.kt index 6070b4206..3e7535532 100644 --- a/src/test/java/io/gaia_app/e2e/LoginPage.kt +++ b/src/test/java/io/gaia_app/e2e/pages/LoginPage.kt @@ -1,4 +1,4 @@ -package io.gaia_app.e2e +package io.gaia_app.e2e.pages import org.junit.jupiter.api.Assertions.assertEquals import org.openqa.selenium.By diff --git a/src/test/java/io/gaia_app/e2e/ModulePage.kt b/src/test/java/io/gaia_app/e2e/pages/ModulePage.kt similarity index 96% rename from src/test/java/io/gaia_app/e2e/ModulePage.kt rename to src/test/java/io/gaia_app/e2e/pages/ModulePage.kt index b06d0266d..e6e9c8ea1 100644 --- a/src/test/java/io/gaia_app/e2e/ModulePage.kt +++ b/src/test/java/io/gaia_app/e2e/pages/ModulePage.kt @@ -1,4 +1,4 @@ -package io.gaia_app.e2e +package io.gaia_app.e2e.pages import org.openqa.selenium.WebDriver import org.openqa.selenium.WebElement diff --git a/src/test/java/io/gaia_app/e2e/ModulesPage.kt b/src/test/java/io/gaia_app/e2e/pages/ModulesPage.kt similarity index 96% rename from src/test/java/io/gaia_app/e2e/ModulesPage.kt rename to src/test/java/io/gaia_app/e2e/pages/ModulesPage.kt index 41a88c61f..9eaf9e272 100644 --- a/src/test/java/io/gaia_app/e2e/ModulesPage.kt +++ b/src/test/java/io/gaia_app/e2e/pages/ModulesPage.kt @@ -1,4 +1,4 @@ -package io.gaia_app.e2e +package io.gaia_app.e2e.pages import org.openqa.selenium.By import org.openqa.selenium.WebDriver diff --git a/src/test/java/io/gaia_app/e2e/StackPage.kt b/src/test/java/io/gaia_app/e2e/pages/StackPage.kt similarity index 94% rename from src/test/java/io/gaia_app/e2e/StackPage.kt rename to src/test/java/io/gaia_app/e2e/pages/StackPage.kt index 066ed26b9..46b2b08ee 100644 --- a/src/test/java/io/gaia_app/e2e/StackPage.kt +++ b/src/test/java/io/gaia_app/e2e/pages/StackPage.kt @@ -1,4 +1,4 @@ -package io.gaia_app.e2e +package io.gaia_app.e2e.pages import org.openqa.selenium.WebDriver import org.openqa.selenium.WebElement diff --git a/src/test/java/io/gaia_app/e2e/stepDefs/ModuleStepDefs.java b/src/test/java/io/gaia_app/e2e/stepDefs/ModuleStepDefs.java new file mode 100644 index 000000000..ac142b811 --- /dev/null +++ b/src/test/java/io/gaia_app/e2e/stepDefs/ModuleStepDefs.java @@ -0,0 +1,91 @@ +package io.gaia_app.e2e.stepDefs; + +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import io.gaia_app.e2e.pages.*; +import org.openqa.selenium.By; +import org.openqa.selenium.support.PageFactory; +import org.openqa.selenium.support.pagefactory.AjaxElementLocatorFactory; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ModuleStepDefs extends StepDefs { + + @Given("I go on the Gaia login page") + public void i_go_on_the_gaia_login_page() { + driver.get(baseUrl()); + + var page = new LoginPage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + } + + @Given("I login with user {string} and password {string}") + public void i_login_onto_Gaia_with_user_and_password(String login, String password) { + driver.get(baseUrl()); + + // print html here ! + System.out.println(driver.findElement(By.tagName("body")).getAttribute("outerHTML")); + + var page = new LoginPage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + + page.login(login, password); + } + + @Then("I arrive on the Dashboard page") + public void i_arrive_on_the_dashboard_page() { + var page = new DashboardPage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + page.waitForPageLoaded(); + + assertEquals(3, page.modulesCount()); + assertEquals(1, page.stacksCount()); + assertEquals(0, page.stacksToUpdateCount()); + } + + @When("I go on the modules page") + public void i_go_on_the_modules_page() { + driver.get(baseUrl()+"/modules"); + + var page = new ModulesPage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + page.waitForPageLoaded(); + + assertEquals(3, page.modulesCount()); + } + + @When("I go on the module {string} page") + public void iGoOnTheModulePage(String moduleId) { + driver.get(baseUrl()+"/modules/" + moduleId); + + var page = new ModulePage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + + assertThat(page.moduleName()).isEqualTo("terraform-docker-mongo"); + assertThat(page.moduleDescription()).contains("A sample terraform"); + assertThat(page.terraformImageTag()).isEqualTo("0.11.14"); + } + + @When("I go on the stack {string} page") + public void iGoOnTheStackPage(String stackId) { + driver.get(baseUrl()+"/stacks/"+stackId+"/edit"); + + var page = new StackPage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + + assertThat(page.stackName()).isEqualTo("local-mongo"); + } + + @When("I go on the job {string} for stack {string} page") + public void iGoOnTheJobForStackPage(String jobId, String stackId) { + driver.get(baseUrl()+"/stacks/"+stackId+"/jobs/"+jobId); + + var page = new JobPage(driver); + PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), page); + + assertThat(page.jobDetailTitle()).isEqualTo("Job " + jobId); + } + +} diff --git a/src/test/java/io/gaia_app/e2e/stepDefs/PercyStepDef.java b/src/test/java/io/gaia_app/e2e/stepDefs/PercyStepDef.java new file mode 100644 index 000000000..0d3c4e13f --- /dev/null +++ b/src/test/java/io/gaia_app/e2e/stepDefs/PercyStepDef.java @@ -0,0 +1,12 @@ +package io.gaia_app.e2e.stepDefs; + +import io.cucumber.java.en.Then; +import io.percy.selenium.Percy; + +public class PercyStepDef extends StepDefs{ + + @Then("Percy takes a snapshot named {string}") + public void percyTakesASnapshotNamedDashboardPage(String snapshotName) { + new Percy(driver).snapshot(snapshotName); + } +} diff --git a/src/test/java/io/gaia_app/e2e/stepDefs/StepDefs.java b/src/test/java/io/gaia_app/e2e/stepDefs/StepDefs.java new file mode 100644 index 000000000..f06d06d1e --- /dev/null +++ b/src/test/java/io/gaia_app/e2e/stepDefs/StepDefs.java @@ -0,0 +1,17 @@ +package io.gaia_app.e2e.stepDefs; + +import org.openqa.selenium.WebDriver; +import org.springframework.boot.web.server.LocalServerPort; + +public class StepDefs { + + public static WebDriver driver; + + @LocalServerPort + private int serverPort; + + protected String baseUrl(){ + return "http://localhost:"+serverPort; + } + +}