diff --git a/src/main/java/net/serenitybdd/cucumber/SerenityReporter.java b/src/main/java/net/serenitybdd/cucumber/SerenityReporter.java index 9c2b2ea..ddbff68 100644 --- a/src/main/java/net/serenitybdd/cucumber/SerenityReporter.java +++ b/src/main/java/net/serenitybdd/cucumber/SerenityReporter.java @@ -401,17 +401,32 @@ public void startOfScenarioLifeCycle(Scenario scenario) { } private void startScenario(Scenario scenario) { - //getThucydidesListeners().withDriver(ThucydidesWebDriverSupport.getDriver()); StepEventBus.getEventBus().testStarted(scenario.getName()); StepEventBus.getEventBus().addDescriptionToCurrentTest(scenario.getDescription()); StepEventBus.getEventBus().addTagsToCurrentTest(convertCucumberTags(currentFeature.getTags())); StepEventBus.getEventBus().addTagsToCurrentTest(convertCucumberTags(scenario.getTags())); + registerFeatureJiraIssues(currentFeature.getTags()); + registerScenarioJiraIssues(scenario.getTags()); + checkForSkipped(currentFeature); checkForPending(currentFeature); checkForManual(scenario); } + private void registerFeatureJiraIssues(List tags) { + List issues = extractJiraIssueTags(tags); + if (!issues.isEmpty()) { + StepEventBus.getEventBus().addIssuesToCurrentStory(issues); + } + } + + private void registerScenarioJiraIssues(List tags) { + List issues = extractJiraIssueTags(tags); + if (!issues.isEmpty()) { + StepEventBus.getEventBus().addIssuesToCurrentTest(issues); + } + } private List convertCucumberTags(List cucumberTags) { List tags = Lists.newArrayList(); @@ -421,6 +436,21 @@ private List convertCucumberTags(List cucumberTags) { return ImmutableList.copyOf(tags); } + private List extractJiraIssueTags(List cucumberTags) { + List issues = Lists.newArrayList(); + for (Tag tag : cucumberTags) { + if(tag.getName().startsWith("@issue:")) { + String tagIssueValue = tag.getName().substring("@issue:".length()); + issues.add(tagIssueValue); + } + if(tag.getName().startsWith("@issues:")) { + String tagIssuesValues = tag.getName().substring("@issues:".length()); + issues.addAll(Arrays.asList(tagIssuesValues.split(","))); + } + } + return issues; + } + @Override public void endOfScenarioLifeCycle(Scenario scenario) { if (examplesRunning) { diff --git a/src/test/groovy/net/serenitybdd/cucumber/outcomes/WhenCreatingSerenityTestOutcomes.groovy b/src/test/groovy/net/serenitybdd/cucumber/outcomes/WhenCreatingSerenityTestOutcomes.groovy index 7996e7d..d13a2d8 100644 --- a/src/test/groovy/net/serenitybdd/cucumber/outcomes/WhenCreatingSerenityTestOutcomes.groovy +++ b/src/test/groovy/net/serenitybdd/cucumber/outcomes/WhenCreatingSerenityTestOutcomes.groovy @@ -1,6 +1,7 @@ package net.serenitybdd.cucumber.outcomes import com.github.goldin.spock.extensions.tempdir.TempDir +import net.serenitybdd.cucumber.integration.FeatureWithMoreIssuesTag import net.serenitybdd.cucumber.integration.FeatureWithNoName import net.serenitybdd.cucumber.integration.ScenariosWithTableInBackgroundSteps import net.serenitybdd.cucumber.integration.ScenarioThrowingPendingException @@ -287,6 +288,47 @@ It goes for two lines""" recordedTestOutcomes[0].tags.contains(TestTag.withName("ISSUE-456").andType("issue")) } + def "should fill @issue keys"() { + given: + def runtime = serenityRunnerForCucumberTestRunner(BasicArithemticScenario.class, outputDirectory); + + when: + runtime.run(); + def recordedTestOutcomes = new TestOutcomeLoader().forFormat(OutcomeFormat.JSON).loadFrom(outputDirectory) + + then: + recordedTestOutcomes.each { outcome -> + outcome.tags.contains(TestTag.withName("ISSUE-123").andType("issue")) + outcome.getIssueKeys().contains("ISSUE-123"); + } + and: + recordedTestOutcomes[0].tags.contains(TestTag.withName("ISSUE-456").andType("issue")) + recordedTestOutcomes[0].getIssueKeys().contains("ISSUE-123"); + recordedTestOutcomes[0].getIssueKeys().contains("ISSUE-456"); + } + + def "should fill @issues keys"() { + given: + def runtime = serenityRunnerForCucumberTestRunner(FeatureWithMoreIssuesTag.class, outputDirectory); + + when: + runtime.run(); + def recordedTestOutcomes = new TestOutcomeLoader().forFormat(OutcomeFormat.JSON).loadFrom(outputDirectory) + + then: + recordedTestOutcomes.each { outcome -> + outcome.tags.contains(TestTag.withName("ISSUE-123,ISSUE-789").andType("issues")) + outcome.getIssueKeys().contains("ISSUE-123"); + outcome.getIssueKeys().contains("ISSUE-789"); + } + and: + recordedTestOutcomes[0].tags.contains(TestTag.withName("ISSUE-456,ISSUE-001").andType("issues")) + recordedTestOutcomes[0].getIssueKeys().contains("ISSUE-456"); + recordedTestOutcomes[0].getIssueKeys().contains("ISSUE-001"); + recordedTestOutcomes[0].getIssueKeys().contains("ISSUE-123"); + recordedTestOutcomes[0].getIssueKeys().contains("ISSUE-789"); + } + def "scenarios with the @pending tag should be reported as Pending"() { given: def runtime = serenityRunnerForCucumberTestRunner(MultipleScenariosWithPendingTag.class, outputDirectory); diff --git a/src/test/java/net/serenitybdd/cucumber/integration/FeatureWithMoreIssuesTag.java b/src/test/java/net/serenitybdd/cucumber/integration/FeatureWithMoreIssuesTag.java new file mode 100644 index 0000000..23009ea --- /dev/null +++ b/src/test/java/net/serenitybdd/cucumber/integration/FeatureWithMoreIssuesTag.java @@ -0,0 +1,10 @@ +package net.serenitybdd.cucumber.integration; + +import cucumber.api.CucumberOptions; +import cucumber.api.junit.Cucumber; +import org.junit.runner.RunWith; + + +@RunWith(Cucumber.class) +@CucumberOptions(features="src/test/resources/samples/calculator/basic_arithmetic_more_issues.feature") +public class FeatureWithMoreIssuesTag {} diff --git a/src/test/resources/samples/calculator/basic_arithmetic_more_issues.feature b/src/test/resources/samples/calculator/basic_arithmetic_more_issues.feature new file mode 100644 index 0000000..1ffce39 --- /dev/null +++ b/src/test/resources/samples/calculator/basic_arithmetic_more_issues.feature @@ -0,0 +1,18 @@ +@foo +@issues:ISSUE-123,ISSUE-789 +Feature: Basic Arithmetic + Calculing additions + + Background: A Calculator + Given a calculator I just turned on + + @issues:ISSUE-456,ISSUE-001 + Scenario: Addition + # Try to change one of the values below to provoke a failure + When I add 4 and 5 + Then the result is 9 + + Scenario: Another Addition + # Try to change one of the values below to provoke a failure + When I add 4 and 7 + Then the result is 11