3131import io .qameta .allure .model .StatusDetails ;
3232import io .qameta .allure .model .StepResult ;
3333import io .qameta .allure .model .TestResult ;
34- import io .qameta .allure .util .ResultsUtils ;
3534
3635import java .io .ByteArrayInputStream ;
3736import java .nio .charset .Charset ;
4645import java .util .stream .Collectors ;
4746import java .util .stream .IntStream ;
4847
48+ import static io .qameta .allure .util .ResultsUtils .getStatus ;
49+ import static io .qameta .allure .util .ResultsUtils .getStatusDetails ;
50+
4951/**
5052 * Allure plugin for Cucumber JVM 3.0.
5153 */
@@ -72,7 +74,11 @@ public class AllureCucumber3Jvm implements Formatter {
7274 private final EventHandler <TestStepFinished > stepFinishedHandler = this ::handleTestStepFinished ;
7375
7476 public AllureCucumber3Jvm () {
75- this .lifecycle = Allure .getLifecycle ();
77+ this (Allure .getLifecycle ());
78+ }
79+
80+ public AllureCucumber3Jvm (final AllureLifecycle lifecycle ) {
81+ this .lifecycle = lifecycle ;
7682 }
7783
7884 @ Override
@@ -104,10 +110,14 @@ private void handleTestCaseStarted(final TestCaseStarted event) {
104110
105111 final LabelBuilder labelBuilder = new LabelBuilder (currentFeature , event .testCase , tags );
106112
113+ final String name = event .testCase .getName ();
114+ final String featureName = currentFeature .getName ();
115+
107116 final TestResult result = new TestResult ()
108117 .setUuid (getTestCaseUuid (event .testCase ))
109118 .setHistoryId (getHistoryId (event .testCase ))
110- .setName (event .testCase .getName ())
119+ .setFullName (String .format ("%s: %s" , featureName , name ))
120+ .setName (name )
111121 .setLabels (labelBuilder .getScenarioLabels ())
112122 .setLinks (labelBuilder .getScenarioLinks ());
113123
@@ -128,22 +138,18 @@ private void handleTestCaseStarted(final TestCaseStarted event) {
128138 }
129139
130140 private void handleTestCaseFinished (final TestCaseFinished event ) {
131- final StatusDetails statusDetails =
132- ResultsUtils .getStatusDetails (event .result .getError ()).orElse (new StatusDetails ());
133-
134- if (statusDetails .getMessage () != null && statusDetails .getTrace () != null ) {
135- lifecycle .updateTestCase (getTestCaseUuid (event .testCase ), scenarioResult ->
136- scenarioResult
137- .setStatus (translateTestCaseStatus (event .result ))
138- .setStatusDetails (statusDetails ));
139- } else {
140- lifecycle .updateTestCase (getTestCaseUuid (event .testCase ), scenarioResult ->
141- scenarioResult
142- .setStatus (translateTestCaseStatus (event .result )));
143- }
144-
145- lifecycle .stopTestCase (getTestCaseUuid (event .testCase ));
146- lifecycle .writeTestCase (getTestCaseUuid (event .testCase ));
141+ final String uuid = getTestCaseUuid (event .testCase );
142+ lifecycle .updateTestCase (
143+ uuid ,
144+ testResult -> testResult .setStatus (translateTestCaseStatus (event .result ))
145+ );
146+ final Optional <StatusDetails > details = getStatusDetails (event .result .getError ());
147+ details .ifPresent (statusDetails -> lifecycle .updateTestCase (
148+ uuid ,
149+ testResult -> testResult .setStatusDetails (statusDetails )
150+ ));
151+ lifecycle .stopTestCase (uuid );
152+ lifecycle .writeTestCase (uuid );
147153 }
148154
149155 private void handleTestStepStarted (final TestStepStarted event ) {
@@ -211,18 +217,22 @@ private String getHistoryId(final TestCase testCase) {
211217 return Utils .md5 (testCaseLocation );
212218 }
213219
220+ @ SuppressWarnings ("ReturnCount" )
214221 private Status translateTestCaseStatus (final Result testCaseResult ) {
215- Status allureStatus ;
216- if (testCaseResult .getStatus () == Result .Type .UNDEFINED || testCaseResult .getStatus () == Result .Type .PENDING ) {
217- allureStatus = Status .SKIPPED ;
218- } else {
219- try {
220- allureStatus = Status .fromValue (testCaseResult .getStatus ().lowerCaseName ());
221- } catch (IllegalArgumentException e ) {
222- allureStatus = Status .BROKEN ;
223- }
222+ switch (testCaseResult .getStatus ()) {
223+ case FAILED :
224+ return getStatus (testCaseResult .getError ())
225+ .orElse (Status .FAILED );
226+ case PASSED :
227+ return Status .PASSED ;
228+ case SKIPPED :
229+ case PENDING :
230+ return Status .SKIPPED ;
231+ case AMBIGUOUS :
232+ case UNDEFINED :
233+ default :
234+ return null ;
224235 }
225- return allureStatus ;
226236 }
227237
228238 private List <Parameter > getExamplesAsParameters (final ScenarioOutline scenarioOutline ) {
@@ -263,7 +273,7 @@ private void handleHookStep(final TestStepFinished event) {
263273 Consumer <StepResult > stepResult = result -> result .setStatus (translateTestCaseStatus (event .result ));
264274
265275 if (!Status .PASSED .equals (translateTestCaseStatus (event .result ))) {
266- final StatusDetails statusDetails = ResultsUtils . getStatusDetails (event .result .getError ()).get ();
276+ final StatusDetails statusDetails = getStatusDetails (event .result .getError ()).get ();
267277 final HookTestStep hookTestStep = (HookTestStep ) event .testStep ;
268278 if (hookTestStep .getHookType () == HookType .Before ) {
269279 final TagParser tagParser = new TagParser (currentFeature , currentTestCase );
@@ -289,15 +299,15 @@ private void handlePickleStep(final TestStepFinished event) {
289299 final StatusDetails statusDetails ;
290300 if (event .result .getStatus () == Result .Type .UNDEFINED ) {
291301 statusDetails =
292- ResultsUtils . getStatusDetails (new PendingException ("TODO: implement me" ))
302+ getStatusDetails (new PendingException ("TODO: implement me" ))
293303 .orElse (new StatusDetails ());
294304 lifecycle .updateTestCase (getTestCaseUuid (currentTestCase ), scenarioResult ->
295305 scenarioResult
296306 .setStatus (translateTestCaseStatus (event .result ))
297307 .setStatusDetails (statusDetails ));
298308 } else {
299309 statusDetails =
300- ResultsUtils . getStatusDetails (event .result .getError ())
310+ getStatusDetails (event .result .getError ())
301311 .orElse (new StatusDetails ());
302312 }
303313
0 commit comments