From 33605984c38d5a1b0b232dd9f167f363b1d9d7ec Mon Sep 17 00:00:00 2001 From: "luisa.colorado" Date: Fri, 20 Jun 2025 15:36:06 -0500 Subject: [PATCH] upload last changes to review CI pipeline --- .github/workflows/run-CI.yml | 41 ++++++++++ pom.xml | 13 ++- src/main/java/pom/pages/TodoListPage.java | 5 ++ .../runners/cucumber/TodoListTestSuite.java | 3 +- .../stepdefinitions/TodoStepDefinitions.java | 80 +++++++++++++++++-- .../features/todomvc/add_new_items.feature | 19 ++++- src/test/resources/serenity.conf | 6 +- 7 files changed, 153 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/run-CI.yml diff --git a/.github/workflows/run-CI.yml b/.github/workflows/run-CI.yml new file mode 100644 index 0000000..3a8a72e --- /dev/null +++ b/.github/workflows/run-CI.yml @@ -0,0 +1,41 @@ +name: Continuous-Integration + +on: + push: + branches: + - 'main' + pull_request: + branches: + - 'main' + workflow_dispatch: + inputs: + browserName: + description: 'Browser type' + required: false + type: environment + +jobs: + start-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + + - name: Build with Maven + run: mvn clean + + - name: Run tests + run: mvn verify + + - uses: deblockt/cucumber-report-annotations-action@v1.7 + with: + access-token: ${{ secrets.GITHUB_TOKEN }} + path: "**/cucumber-report.json" + + diff --git a/pom.xml b/pom.xml index 78aafc0..ac5dcb4 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,16 @@ 3.24.2 test + + io.qameta.allure + allure-cucumber7-jvm + test + + + io.qameta.allure + allure-junit-platform + test + @@ -93,7 +103,8 @@ maven-surefire-plugin 3.0.0-M4 - false + true + true diff --git a/src/main/java/pom/pages/TodoListPage.java b/src/main/java/pom/pages/TodoListPage.java index c847748..eadd713 100644 --- a/src/main/java/pom/pages/TodoListPage.java +++ b/src/main/java/pom/pages/TodoListPage.java @@ -4,11 +4,16 @@ import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import java.util.List; + public class TodoListPage extends PageObject { @FindBy(className = "new-todo") private WebElement addItem; + @FindBy(id="list") + public List listOfSettings; + public void addTask(String item) { addItem.sendKeys(item); } diff --git a/src/test/java/runners/cucumber/TodoListTestSuite.java b/src/test/java/runners/cucumber/TodoListTestSuite.java index 3c2728d..24b77ca 100644 --- a/src/test/java/runners/cucumber/TodoListTestSuite.java +++ b/src/test/java/runners/cucumber/TodoListTestSuite.java @@ -6,9 +6,10 @@ @RunWith(CucumberWithSerenity.class) @CucumberOptions( - plugin = {"pretty"}, + plugin = {"pretty", "html:target/cucumber-reports.html"}, features = "src/test/resources/features/todomvc/add_new_items.feature", glue = "runners.cucumber.stepdefinitions", snippets = CucumberOptions.SnippetType.CAMELCASE + ,tags = "@solo" ) public class TodoListTestSuite {} diff --git a/src/test/java/runners/cucumber/stepdefinitions/TodoStepDefinitions.java b/src/test/java/runners/cucumber/stepdefinitions/TodoStepDefinitions.java index 323398f..1d3b216 100644 --- a/src/test/java/runners/cucumber/stepdefinitions/TodoStepDefinitions.java +++ b/src/test/java/runners/cucumber/stepdefinitions/TodoStepDefinitions.java @@ -1,23 +1,30 @@ package runners.cucumber.stepdefinitions; +import io.cucumber.datatable.DataTable; import io.cucumber.java.Before; +import io.cucumber.java.DataTableType; import io.cucumber.java.ParameterType; +import io.cucumber.java.Transpose; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; -import net.serenitybdd.screenplay.*; +import net.serenitybdd.screenplay.Actor; import net.serenitybdd.screenplay.actions.Open; import net.serenitybdd.screenplay.actors.OnStage; import net.serenitybdd.screenplay.actors.OnlineCast; -import net.serenitybdd.screenplay.conditions.ConditionalPerformable; -import net.serenitybdd.screenplay.conditions.ConditionalPerformableOnQuestion; -import org.hamcrest.Matcher; -import org.hamcrest.Matchers; +import org.assertj.core.api.SoftAssertions; +import org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Convert; +import org.openqa.selenium.WebElement; +import pom.pages.TodoListPage; +import screenplay.model.Label; import screenplay.questions.todolist.Items; -import screenplay.questions.travelocity.DepartureFlight; import screenplay.tasks.todolist.AddAnItem; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; import static net.serenitybdd.screenplay.GivenWhenThen.seeThat; import static net.serenitybdd.screenplay.actors.OnStage.theActorInTheSpotlight; @@ -25,6 +32,8 @@ public class TodoStepDefinitions { + TodoListPage todoListPage; + @Before public void setStage () { OnStage.setTheStage(new OnlineCast()); @@ -41,7 +50,7 @@ public void stats_with_an_empty_list(Actor actor) { ); } - @When("he adds {string} to his list") + @When("he adds {} to his list") public void he_adds_to_his_list(String toDo) { theActorInTheSpotlight().attemptsTo( AddAnItem.called(toDo)); @@ -54,4 +63,61 @@ public void the_todo_list_should_contain(List expectedItems) { ); } + @Given("parameters are collected as map") + public void parametersAreCollectedAsMap(List> data) { + System.out.println("data processed is " + data); + } + + @DataTableType() + public Map convert(Map parametersMap){ + return parametersMap.entrySet() + .stream() + .map(TodoStepDefinitions::removeQuotesFromEntryValue) + .collect(HashMap::new, + (newMap, originalMap) -> newMap.put(originalMap.getKey(), nullIfEmpty(originalMap.getValue())), + HashMap::putAll + ); + } + + public static Map.Entry removeQuotesFromEntryValue(Map.Entry entry) { + return Map.entry(entry.getKey(), entry.getValue().replaceAll("\"", "")); + } + + public static Map.Entry replaceNullIfEmpty(Map.Entry entry) { + return Map.entry(entry.getKey(), entry.getValue().replaceAll("", null)); + } + + /** + * Returns null if the input is empty. + * + * @param param The input string. + * @return The param or null if the input is empty. + */ + public static String nullIfEmpty(String param){ + return !param.isEmpty() ? param : null; + } + + @Given("parameters are collected as list") + public void parametersAreCollectedAsList(List data) { + System.out.println(data); + } + + @When("parameters are transposed in a list") + public void parametersAreTransposedAsList(@Transpose List entry) { + System.out.println(entry); + } + + @Then("the setting is available") + public void stepThree(DataTable settingsTable){ + List options = settingsTable.asList(String.class); + List matchingOptions = settingsTable.asList(String.class); + SoftAssertions sa = new SoftAssertions(); + sa.assertThat(matchingOptions) + .as("All options are available") + .containsExactlyInAnyOrderElementsOf(options); + sa.assertAll(); + } + + + } diff --git a/src/test/resources/features/todomvc/add_new_items.feature b/src/test/resources/features/todomvc/add_new_items.feature index e9f4625..62d020d 100644 --- a/src/test/resources/features/todomvc/add_new_items.feature +++ b/src/test/resources/features/todomvc/add_new_items.feature @@ -1,7 +1,22 @@ Feature: Add new items + @solo Scenario: Add items to an empty list Given Toby starts with an empty list - When he adds "Buy some milk" to his list + When he adds Buy some milk to his list Then the todo list should contain the following items: - | Buy some milk| \ No newline at end of file + | Buy some milk| + + + + Scenario: map input + Given parameters are collected as map + |header1|header2|header3|header4| + |"value1" |"value2" |"value3" | "" | + And parameters are collected as list + |header1| + |value1 | + |value2 | + |value3 | + When parameters are transposed in a list + |header12|value4 |value5 |value6 | diff --git a/src/test/resources/serenity.conf b/src/test/resources/serenity.conf index 7852c21..95ec62b 100644 --- a/src/test/resources/serenity.conf +++ b/src/test/resources/serenity.conf @@ -4,10 +4,10 @@ # WebDriver configuration # webdriver { - driver = chrome + driver = edge autodownload = true } -headless.mode = true +#headless.mode = true #serenity.test.root = todomvc.features #Set this property to have more finer control on how screenshots are taken: BEFORE_AND_AFTER_EACH_STEP #FOR_EACH_ACTION, AFTER_EACH_STEP, FOR_FAILURES, DISABLED @@ -21,7 +21,7 @@ chrome.switches = """--start-maximized;--remote-allow-origins=*;--test-type;--no pages { - angular = "https://todomvc.com/examples/angularjs/#/", + angular = "https://todomvc.com/examples/angular/dist/browser/#/all", booking ="https://www.travelocity.com/" }