Skip to content

Commit 550e961

Browse files
authored
[minor] wrap before each/after each hooks to separate step when there are several (#220)
1 parent e78ebc3 commit 550e961

29 files changed

+842
-531
lines changed

src/plugins/allure-reporter-plugin.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { extname, logWithPackage } from '../common';
3434
import type { ContentType } from '../common/types';
3535
import { randomUUID } from 'crypto';
3636
import { copyAttachments, copyFileCp, copyTest, mkdirSyncWithTry, writeResultFile } from './fs-tools';
37-
import { mergeStepsWithSingleChild, removeFirstStepWhenSame } from './helper';
37+
import { mergeStepsWithSingleChild, removeFirstStepWhenSame, wrapHooks } from './helper';
3838

3939
const beforeEachHookName = '"before each" hook';
4040
const beforeAllHookName = '"before all" hook';
@@ -981,6 +981,8 @@ export class AllureReporter {
981981

982982
// filter steps here
983983
this.filterSteps(this.currentTest.wrappedItem, this.allureSkipSteps);
984+
this.currentTest.wrappedItem.steps = wrapHooks('"before each" hook', this.currentTest.wrappedItem.steps);
985+
this.currentTest.wrappedItem.steps = wrapHooks('"after each" hook', this.currentTest.wrappedItem.steps);
984986

985987
this.setExecutableStatus(this.currentTest, result, details);
986988

src/plugins/helper.ts

+39
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ExecutableItem } from 'allure-js-commons/dist/esm';
2+
import { Stage, Status } from 'allure-js-commons';
23

34
/**
45
* Recursively merge the steps when a step has single child with the same name
@@ -105,3 +106,41 @@ export function removeStepsByName(steps: ExecutableItem[], commands: string[]):
105106

106107
return result;
107108
}
109+
110+
export const wrapHooks = (
111+
stepName: '"before each" hook' | '"after each" hook',
112+
steps: ExecutableItem[],
113+
): ExecutableItem[] => {
114+
let startIndex: number | undefined = undefined;
115+
let endIndex: number | undefined = undefined;
116+
117+
steps.forEach((step, i) => {
118+
if (step.name?.startsWith(stepName) && startIndex === undefined) {
119+
startIndex = i;
120+
}
121+
122+
if (step.name?.startsWith(stepName) && startIndex !== undefined) {
123+
endIndex = i;
124+
}
125+
});
126+
127+
if (endIndex !== undefined && startIndex !== undefined && startIndex !== endIndex) {
128+
const childrenBeforeEach = steps.slice(startIndex, endIndex + 1);
129+
130+
return [
131+
...steps.slice(0, startIndex),
132+
{
133+
name: `${stepName}s`,
134+
steps: childrenBeforeEach,
135+
status: 'passed' as Status,
136+
statusDetails: {},
137+
stage: 'finished' as Stage,
138+
attachments: [],
139+
parameters: [],
140+
},
141+
...steps.slice(endIndex + 1),
142+
];
143+
}
144+
145+
return steps;
146+
};

tests/test-folder/mocha-events/events/plugin-events-test-fail.test.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ describe('hello suite', () => {
120120
expect(resFixed.map(t => t.steps.map(s => s.name))).toEqual([
121121
[
122122
'step right after start',
123-
'"before each" hook: [cypress-allure-adapter]',
124-
...whenCoverage('"before each" hook'),
123+
'"before each" hooks',
125124
'wrap',
126125
...whenCoverage('"after each" hook'),
127126
'step right before test end',

tests/test-folder/mocha-events/failures/test-retries/fail-one-test-before-each-retry.test.ts

+2-10
Original file line numberDiff line numberDiff line change
@@ -162,16 +162,8 @@ describe('hello suite', { retries: 1 }, () => {
162162

163163
it('check tests parent steps', async () => {
164164
expect(resFixed.map(t => t.steps.map(s => s.name))).toEqual([
165-
[
166-
'"before each" hook: [cypress-allure-adapter]',
167-
'"before each" hook',
168-
...whenCoverage('"before each" hook', '"after each" hook'),
169-
],
170-
[
171-
'"before each" hook: [cypress-allure-adapter]',
172-
'"before each" hook',
173-
...whenCoverage('"before each" hook', '"after each" hook'),
174-
],
165+
['"before each" hooks', '"after each" hook'],
166+
['"before each" hooks', ...whenCoverage('"after each" hook')],
175167
]);
176168
});
177169

tests/test-folder/mocha-events/hooks/all-hook.test.ts

+1-8
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,7 @@ describe('hello suite', () => {
275275

276276
it('check tests parent steps', async () => {
277277
expect(resFixed.map(t => t.steps.map(s => s.name))).toEqual([
278-
[
279-
'"before each" hook: [cypress-allure-adapter]',
280-
...whenCoverage('"before each" hook'),
281-
'"before each" hook',
282-
'log: message',
283-
'"after each" hook',
284-
...whenCoverage('"after each" hook'),
285-
],
278+
['"before each" hooks', 'log: message', '"after each" hooks'],
286279
]);
287280
});
288281
});

tests/test-folder/mocha-events/hooks/before-after--nested-suite/data-nested-suite-after-fail-simple-04.ts

+30-16
Original file line numberDiff line numberDiff line change
@@ -78,24 +78,31 @@ const data: TestData = {
7878
mapStep: m => ({ status: m.status, attachments: m.attachments }),
7979
expected: [
8080
{
81-
name: '"before each" hook: [cypress-allure-adapter]',
81+
name: '"before each" hooks',
8282
status: 'passed',
8383
attachments: [],
8484
steps: [
8585
{
86+
name: '"before each" hook: [cypress-allure-adapter]',
87+
status: 'passed',
8688
attachments: [],
87-
name: 'will not intercept requests to save bodies',
89+
steps: [
90+
{
91+
attachments: [],
92+
name: 'will not intercept requests to save bodies',
93+
status: 'passed',
94+
steps: [],
95+
},
96+
],
97+
},
98+
{
99+
name: '"before each" hook',
88100
status: 'passed',
89101
steps: [],
102+
attachments: [],
90103
},
91104
],
92105
},
93-
{
94-
name: '"before each" hook',
95-
status: 'passed',
96-
steps: [],
97-
attachments: [],
98-
},
99106
{
100107
name: 'log: test 1',
101108
status: 'passed',
@@ -115,24 +122,31 @@ const data: TestData = {
115122
mapStep: m => ({ status: m.status, attachments: m.attachments }),
116123
expected: [
117124
{
118-
name: '"before each" hook: [cypress-allure-adapter]',
125+
name: '"before each" hooks',
119126
status: 'passed',
120127
attachments: [],
121128
steps: [
122129
{
130+
name: '"before each" hook: [cypress-allure-adapter]',
131+
status: 'passed',
123132
attachments: [],
124-
name: 'will not intercept requests to save bodies',
133+
steps: [
134+
{
135+
attachments: [],
136+
name: 'will not intercept requests to save bodies',
137+
status: 'passed',
138+
steps: [],
139+
},
140+
],
141+
},
142+
{
143+
name: '"before each" hook',
125144
status: 'passed',
126145
steps: [],
146+
attachments: [],
127147
},
128148
],
129149
},
130-
{
131-
name: '"before each" hook',
132-
status: 'passed',
133-
steps: [],
134-
attachments: [],
135-
},
136150
{
137151
name: 'log: test 2',
138152
status: 'passed',

tests/test-folder/mocha-events/hooks/before-after--nested-suite/data-nested-suite-after-pass-06.ts

+30-16
Original file line numberDiff line numberDiff line change
@@ -50,24 +50,31 @@ const data: TestData = {
5050
mapStep: m => ({ status: m.status, attachments: m.attachments }),
5151
expected: [
5252
{
53-
name: '"before each" hook: [cypress-allure-adapter]',
53+
name: '"before each" hooks',
5454
status: 'passed',
5555
attachments: [],
5656
steps: [
5757
{
58+
name: '"before each" hook: [cypress-allure-adapter]',
59+
status: 'passed',
5860
attachments: [],
59-
name: 'will not intercept requests to save bodies',
61+
steps: [
62+
{
63+
attachments: [],
64+
name: 'will not intercept requests to save bodies',
65+
status: 'passed',
66+
steps: [],
67+
},
68+
],
69+
},
70+
{
71+
name: '"before each" hook',
6072
status: 'passed',
6173
steps: [],
74+
attachments: [],
6275
},
6376
],
6477
},
65-
{
66-
name: '"before each" hook',
67-
status: 'passed',
68-
steps: [],
69-
attachments: [],
70-
},
7178
{
7279
name: 'log: test 1',
7380
status: 'passed',
@@ -87,24 +94,31 @@ const data: TestData = {
8794
mapStep: m => ({ status: m.status, attachments: m.attachments }),
8895
expected: [
8996
{
90-
name: '"before each" hook: [cypress-allure-adapter]',
97+
name: '"before each" hooks',
9198
status: 'passed',
9299
attachments: [],
93100
steps: [
94101
{
102+
name: '"before each" hook: [cypress-allure-adapter]',
103+
status: 'passed',
95104
attachments: [],
96-
name: 'will not intercept requests to save bodies',
105+
steps: [
106+
{
107+
attachments: [],
108+
name: 'will not intercept requests to save bodies',
109+
status: 'passed',
110+
steps: [],
111+
},
112+
],
113+
},
114+
{
115+
name: '"before each" hook',
97116
status: 'passed',
98117
steps: [],
118+
attachments: [],
99119
},
100120
],
101121
},
102-
{
103-
name: '"before each" hook',
104-
status: 'passed',
105-
steps: [],
106-
attachments: [],
107-
},
108122
{
109123
name: 'log: test 2',
110124
status: 'passed',

tests/test-folder/mocha-events/hooks/before-after--nested-suite/data-nested-suite-before-pass-02.ts

+30-16
Original file line numberDiff line numberDiff line change
@@ -50,24 +50,31 @@ const data: TestData = {
5050
mapStep: m => ({ status: m.status, attachments: m.attachments }),
5151
expected: [
5252
{
53-
name: '"before each" hook: [cypress-allure-adapter]',
53+
name: '"before each" hooks',
5454
status: 'passed',
5555
attachments: [],
5656
steps: [
5757
{
58+
name: '"before each" hook: [cypress-allure-adapter]',
59+
status: 'passed',
5860
attachments: [],
59-
name: 'will not intercept requests to save bodies',
61+
steps: [
62+
{
63+
attachments: [],
64+
name: 'will not intercept requests to save bodies',
65+
status: 'passed',
66+
steps: [],
67+
},
68+
],
69+
},
70+
{
71+
name: '"before each" hook',
6072
status: 'passed',
6173
steps: [],
74+
attachments: [],
6275
},
6376
],
6477
},
65-
{
66-
name: '"before each" hook',
67-
status: 'passed',
68-
steps: [],
69-
attachments: [],
70-
},
7178
{
7279
name: 'log: test 1',
7380
status: 'passed',
@@ -87,24 +94,31 @@ const data: TestData = {
8794
mapStep: m => ({ status: m.status, attachments: m.attachments }),
8895
expected: [
8996
{
90-
name: '"before each" hook: [cypress-allure-adapter]',
97+
name: '"before each" hooks',
9198
status: 'passed',
9299
attachments: [],
93100
steps: [
94101
{
102+
name: '"before each" hook: [cypress-allure-adapter]',
103+
status: 'passed',
95104
attachments: [],
96-
name: 'will not intercept requests to save bodies',
105+
steps: [
106+
{
107+
attachments: [],
108+
name: 'will not intercept requests to save bodies',
109+
status: 'passed',
110+
steps: [],
111+
},
112+
],
113+
},
114+
{
115+
name: '"before each" hook',
97116
status: 'passed',
98117
steps: [],
118+
attachments: [],
99119
},
100120
],
101121
},
102-
{
103-
name: '"before each" hook',
104-
status: 'passed',
105-
steps: [],
106-
attachments: [],
107-
},
108122
{
109123
name: 'log: test 2',
110124
status: 'passed',

0 commit comments

Comments
 (0)