1+ package io .qameta .allure ;
2+
3+ import io .qameta .allure .aspects .StepsAspects ;
4+ import io .qameta .allure .listener .LifecycleNotifier ;
5+ import io .qameta .allure .listener .StepLifecycleListener ;
6+ import io .qameta .allure .model .Attachment ;
7+ import io .qameta .allure .model .ExecutableItem ;
8+ import io .qameta .allure .model .Status ;
9+ import io .qameta .allure .model .StepResult ;
10+ import io .qameta .allure .model .TestResult ;
11+ import io .qameta .allure .test .AllureResults ;
12+ import io .qameta .allure .test .AllureResultsWriterStub ;
13+ import org .junit .jupiter .api .Test ;
14+
15+ import java .util .UUID ;
16+ import java .util .concurrent .atomic .AtomicInteger ;
17+ import java .util .stream .Stream ;
18+
19+ import static io .qameta .allure .util .ResultsUtils .getStatus ;
20+ import static io .qameta .allure .util .ResultsUtils .getStatusDetails ;
21+ import static java .util .Collections .emptyList ;
22+ import static java .util .Collections .singletonList ;
23+ import static org .assertj .core .api .Assertions .assertThat ;
24+
25+ /**
26+ * @author charlie (Dmitry Baev).
27+ */
28+ class StepLifecycleListenerTest {
29+
30+ @ Test
31+ void shouldExecuteBeforeStepStart () {
32+ final AtomicInteger executionCount = new AtomicInteger ();
33+ final StepLifecycleListener listener = new StepLifecycleListener () {
34+ @ Override
35+ public void beforeStepStart (final StepResult result ) {
36+ executionCount .incrementAndGet ();
37+ }
38+ };
39+ final AllureResults run = run (listener , "first" , "second" );
40+
41+ assertThat (run .getTestResults ())
42+ .flatExtracting (TestResult ::getSteps )
43+ .extracting (StepResult ::getName )
44+ .containsExactly ("first" , "second" );
45+
46+ assertThat (executionCount .get ())
47+ .isEqualTo (2 );
48+ }
49+
50+ @ Test
51+ void shouldExecuteAfterStepStart () {
52+ final AtomicInteger executionCount = new AtomicInteger ();
53+ final StepLifecycleListener listener = new StepLifecycleListener () {
54+ @ Override
55+ public void afterStepStart (final StepResult result ) {
56+ executionCount .incrementAndGet ();
57+ Allure .addAttachment ("inner " + result .getName (), "some" );
58+ }
59+ };
60+ final AllureResults run = run (listener , "first" , "second" );
61+
62+ assertThat (run .getTestResults ())
63+ .flatExtracting (TestResult ::getSteps )
64+ .extracting (StepResult ::getName )
65+ .containsExactly ("first" , "second" );
66+
67+ assertThat (run .getTestResults ())
68+ .flatExtracting (TestResult ::getSteps )
69+ .filteredOn ("name" , "first" )
70+ .flatExtracting (StepResult ::getAttachments )
71+ .extracting (Attachment ::getName )
72+ .containsExactly ("inner first" );
73+
74+ assertThat (run .getTestResults ())
75+ .flatExtracting (TestResult ::getSteps )
76+ .filteredOn ("name" , "second" )
77+ .flatExtracting (StepResult ::getAttachments )
78+ .extracting (Attachment ::getName )
79+ .containsExactly ("inner second" );
80+
81+ assertThat (executionCount .get ())
82+ .isEqualTo (2 );
83+ }
84+
85+ @ Issue ("177" )
86+ @ Test
87+ void shouldExecuteBeforeStepStop () {
88+ final AtomicInteger executionCount = new AtomicInteger ();
89+ final StepLifecycleListener listener = new StepLifecycleListener () {
90+ @ Override
91+ public void beforeStepStop (final StepResult result ) {
92+ executionCount .incrementAndGet ();
93+ Allure .addAttachment ("inner " + result .getName (), "some" );
94+ }
95+ };
96+ final AllureResults run = run (listener , "first" , "second" );
97+
98+ assertThat (run .getTestResults ())
99+ .flatExtracting (TestResult ::getSteps )
100+ .extracting (StepResult ::getName )
101+ .containsExactly ("first" , "second" );
102+
103+ assertThat (run .getTestResults ())
104+ .flatExtracting (TestResult ::getSteps )
105+ .filteredOn ("name" , "first" )
106+ .flatExtracting (StepResult ::getAttachments )
107+ .extracting (Attachment ::getName )
108+ .containsExactly ("inner first" );
109+
110+ assertThat (run .getTestResults ())
111+ .flatExtracting (TestResult ::getSteps )
112+ .filteredOn ("name" , "second" )
113+ .flatExtracting (StepResult ::getAttachments )
114+ .extracting (Attachment ::getName )
115+ .containsExactly ("inner second" );
116+
117+ assertThat (executionCount .get ())
118+ .isEqualTo (2 );
119+ }
120+
121+ protected AllureResults run (final StepLifecycleListener listener , final String ... steps ) {
122+ final AllureResultsWriterStub writer = new AllureResultsWriterStub ();
123+ final LifecycleNotifier notifier = new LifecycleNotifier (
124+ emptyList (),
125+ emptyList (),
126+ emptyList (),
127+ singletonList (listener )
128+ );
129+ final AllureLifecycle lifecycle = new AllureLifecycle (writer , notifier );
130+
131+ final String uuid = UUID .randomUUID ().toString ();
132+ final TestResult result = new TestResult ().setUuid (uuid );
133+
134+ final AllureLifecycle cached = Allure .getLifecycle ();
135+ try {
136+ Allure .setLifecycle (lifecycle );
137+ StepsAspects .setLifecycle (lifecycle );
138+
139+ lifecycle .scheduleTestCase (result );
140+ lifecycle .startTestCase (uuid );
141+
142+ Stream .of (steps ).forEach (step -> {
143+ final String stepUuid = UUID .randomUUID ().toString ();
144+ lifecycle .startStep (stepUuid , new StepResult ().setName (step ).setStatus (Status .PASSED ));
145+ lifecycle .stopStep (stepUuid );
146+ });
147+ } catch (Throwable e ) {
148+ lifecycle .updateTestCase (uuid , testResult -> {
149+ getStatus (e ).ifPresent (testResult ::setStatus );
150+ getStatusDetails (e ).ifPresent (testResult ::setStatusDetails );
151+
152+ });
153+ } finally {
154+ lifecycle .stopTestCase (uuid );
155+ lifecycle .writeTestCase (uuid );
156+
157+ Allure .setLifecycle (cached );
158+ StepsAspects .setLifecycle (cached );
159+ }
160+
161+ return writer ;
162+ }
163+ }
0 commit comments