jest-qase-reporter 2.1.3 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +6 -0
- package/dist/jest.d.ts +1 -85
- package/dist/jest.js +37 -3
- package/dist/reporter.d.ts +7 -0
- package/dist/reporter.js +39 -1
- package/docs/usage.md +21 -3
- package/package.json +11 -11
- package/tsconfig.build.json +3 -1
package/changelog.md
CHANGED
package/dist/jest.d.ts
CHANGED
|
@@ -1,98 +1,14 @@
|
|
|
1
1
|
import { StepFunction } from 'qase-javascript-commons';
|
|
2
2
|
export declare const qase: {
|
|
3
3
|
(caseId: number | string | number[] | string[], name: string): string;
|
|
4
|
-
/**
|
|
5
|
-
* Set a title for the test case
|
|
6
|
-
* @param {string} value
|
|
7
|
-
* @example
|
|
8
|
-
* test('test', () => {
|
|
9
|
-
* qase.title("Title");
|
|
10
|
-
* expect(true).toBe(true);
|
|
11
|
-
* });
|
|
12
|
-
*/
|
|
13
4
|
title(value: string): void;
|
|
14
|
-
/**
|
|
15
|
-
* Ignore the test case
|
|
16
|
-
* @example
|
|
17
|
-
* test('test', () => {
|
|
18
|
-
* qase.ignore();
|
|
19
|
-
* expect(true).toBe(true);
|
|
20
|
-
* });
|
|
21
|
-
*/
|
|
22
5
|
ignore(): void;
|
|
23
|
-
/**
|
|
24
|
-
* Add a comment to the test case
|
|
25
|
-
* @param {string} value
|
|
26
|
-
* @example
|
|
27
|
-
* test('test', () => {
|
|
28
|
-
* qase.comment("Comment");
|
|
29
|
-
* expect(true).toBe(true);
|
|
30
|
-
* });
|
|
31
|
-
*/
|
|
32
6
|
comment(value: string): void;
|
|
33
|
-
/**
|
|
34
|
-
* Set a suite for the test case
|
|
35
|
-
* @param {string} value
|
|
36
|
-
* @example
|
|
37
|
-
* test('test', () => {
|
|
38
|
-
* qase.suite("Suite");
|
|
39
|
-
* expect(true).toBe(true);
|
|
40
|
-
* });
|
|
41
|
-
*/
|
|
42
7
|
suite(value: string): void;
|
|
43
|
-
/**
|
|
44
|
-
* Set fields for the test case
|
|
45
|
-
* @param {Record<string, string>} values
|
|
46
|
-
* @example
|
|
47
|
-
* test('test', () => {
|
|
48
|
-
* qase.fields({field: "value"});
|
|
49
|
-
* expect(true).toBe(true);
|
|
50
|
-
* });
|
|
51
|
-
*/
|
|
52
8
|
fields(values: Record<string, string>): void;
|
|
53
|
-
/**
|
|
54
|
-
* Set parameters for the test case
|
|
55
|
-
* @param {Record<string, string>} values
|
|
56
|
-
* @example
|
|
57
|
-
* test('test', () => {
|
|
58
|
-
* qase.parameters({param: "value"});
|
|
59
|
-
* expect(true).toBe(true);
|
|
60
|
-
* });
|
|
61
|
-
*/
|
|
62
9
|
parameters(values: Record<string, string>): void;
|
|
63
|
-
/**
|
|
64
|
-
* Set group params for the test case
|
|
65
|
-
* @param {Record<string, string>} values
|
|
66
|
-
* @example
|
|
67
|
-
* test('test', () => {
|
|
68
|
-
* qase.groupParameters({param: "value"});
|
|
69
|
-
* expect(true).toBe(true);
|
|
70
|
-
* });
|
|
71
|
-
*/
|
|
72
10
|
groupParameters(values: Record<string, string>): void;
|
|
73
|
-
|
|
74
|
-
* Add a step to the test case
|
|
75
|
-
* @param name
|
|
76
|
-
* @param body
|
|
77
|
-
* @example
|
|
78
|
-
* test('test', () => {
|
|
79
|
-
* qase.step("Step", () => {
|
|
80
|
-
* expect(true).toBe(true);
|
|
81
|
-
* });
|
|
82
|
-
* expect(true).toBe(true);
|
|
83
|
-
* });
|
|
84
|
-
*/
|
|
85
|
-
step(name: string, body: StepFunction): Promise<void>;
|
|
86
|
-
/**
|
|
87
|
-
* Add an attachment to the test case
|
|
88
|
-
* @param attach
|
|
89
|
-
* @example
|
|
90
|
-
* test('test', () => {
|
|
91
|
-
* qase.attach({ name: 'attachment.txt', content: 'Hello, world!', type: 'text/plain' });
|
|
92
|
-
* qase.attach({ paths: ['/path/to/file', '/path/to/another/file']});
|
|
93
|
-
* expect(true).toBe(true);
|
|
94
|
-
* });
|
|
95
|
-
*/
|
|
11
|
+
step(name: string, body: StepFunction, expectedResult?: string, data?: string): Promise<void>;
|
|
96
12
|
attach(attach: {
|
|
97
13
|
name?: string;
|
|
98
14
|
type?: string;
|
package/dist/jest.js
CHANGED
|
@@ -22,6 +22,8 @@ exports.qase = qase;
|
|
|
22
22
|
* });
|
|
23
23
|
*/
|
|
24
24
|
exports.qase.title = (value) => {
|
|
25
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
25
27
|
global.Qase.title(value);
|
|
26
28
|
};
|
|
27
29
|
/**
|
|
@@ -33,6 +35,8 @@ exports.qase.title = (value) => {
|
|
|
33
35
|
* });
|
|
34
36
|
*/
|
|
35
37
|
exports.qase.ignore = () => {
|
|
38
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
36
40
|
global.Qase.ignore();
|
|
37
41
|
};
|
|
38
42
|
/**
|
|
@@ -45,6 +49,8 @@ exports.qase.ignore = () => {
|
|
|
45
49
|
* });
|
|
46
50
|
*/
|
|
47
51
|
exports.qase.comment = (value) => {
|
|
52
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
48
54
|
global.Qase.comment(value);
|
|
49
55
|
};
|
|
50
56
|
/**
|
|
@@ -57,6 +63,8 @@ exports.qase.comment = (value) => {
|
|
|
57
63
|
* });
|
|
58
64
|
*/
|
|
59
65
|
exports.qase.suite = (value) => {
|
|
66
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
60
68
|
global.Qase.suite(value);
|
|
61
69
|
};
|
|
62
70
|
/**
|
|
@@ -69,6 +77,8 @@ exports.qase.suite = (value) => {
|
|
|
69
77
|
* });
|
|
70
78
|
*/
|
|
71
79
|
exports.qase.fields = (values) => {
|
|
80
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
72
82
|
global.Qase.fields(values);
|
|
73
83
|
};
|
|
74
84
|
/**
|
|
@@ -81,6 +91,8 @@ exports.qase.fields = (values) => {
|
|
|
81
91
|
* });
|
|
82
92
|
*/
|
|
83
93
|
exports.qase.parameters = (values) => {
|
|
94
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
84
96
|
global.Qase.parameters(values);
|
|
85
97
|
};
|
|
86
98
|
/**
|
|
@@ -93,12 +105,16 @@ exports.qase.parameters = (values) => {
|
|
|
93
105
|
* });
|
|
94
106
|
*/
|
|
95
107
|
exports.qase.groupParameters = (values) => {
|
|
108
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
109
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
96
110
|
global.Qase.groupParams(values);
|
|
97
111
|
};
|
|
98
112
|
/**
|
|
99
113
|
* Add a step to the test case
|
|
100
114
|
* @param name
|
|
101
115
|
* @param body
|
|
116
|
+
* @param expectedResult
|
|
117
|
+
* @param data
|
|
102
118
|
* @example
|
|
103
119
|
* test('test', () => {
|
|
104
120
|
* qase.step("Step", () => {
|
|
@@ -106,11 +122,25 @@ exports.qase.groupParameters = (values) => {
|
|
|
106
122
|
* });
|
|
107
123
|
* expect(true).toBe(true);
|
|
108
124
|
* });
|
|
125
|
+
* @example
|
|
126
|
+
* test('test', () => {
|
|
127
|
+
* qase.step("Step", () => {
|
|
128
|
+
* expect(true).toBe(true);
|
|
129
|
+
* }, "Expected result", "Input data");
|
|
130
|
+
* expect(true).toBe(true);
|
|
131
|
+
* });
|
|
109
132
|
*/
|
|
110
|
-
exports.qase.step = async (name, body) => {
|
|
111
|
-
const
|
|
133
|
+
exports.qase.step = async (name, body, expectedResult, data) => {
|
|
134
|
+
const stepName = expectedResult || data
|
|
135
|
+
? `${name} QaseExpRes:${expectedResult ? `: ${expectedResult}` : ''} QaseData:${data ? `: ${data}` : ''}`
|
|
136
|
+
: name;
|
|
137
|
+
const runningStep = new qase_javascript_commons_1.QaseStep(stepName);
|
|
112
138
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
113
|
-
await runningStep.run(body, async (step) =>
|
|
139
|
+
await runningStep.run(body, async (step) => {
|
|
140
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
141
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-return
|
|
142
|
+
return global.Qase.step(step);
|
|
143
|
+
});
|
|
114
144
|
};
|
|
115
145
|
/**
|
|
116
146
|
* Add an attachment to the test case
|
|
@@ -127,6 +157,8 @@ exports.qase.attach = (attach) => {
|
|
|
127
157
|
for (const file of attach.paths) {
|
|
128
158
|
const attachmentName = path_1.default.basename(file);
|
|
129
159
|
const contentType = (0, qase_javascript_commons_1.getMimeTypes)(file);
|
|
160
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
130
162
|
global.Qase.attachment({
|
|
131
163
|
file_path: file,
|
|
132
164
|
size: 0,
|
|
@@ -139,6 +171,8 @@ exports.qase.attach = (attach) => {
|
|
|
139
171
|
return;
|
|
140
172
|
}
|
|
141
173
|
if (attach.content) {
|
|
174
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
|
|
142
176
|
global.Qase.attachment({
|
|
143
177
|
file_path: null,
|
|
144
178
|
size: attach.content.length,
|
package/dist/reporter.d.ts
CHANGED
|
@@ -103,5 +103,12 @@ export declare class JestQaseReporter implements Reporter {
|
|
|
103
103
|
* @private
|
|
104
104
|
*/
|
|
105
105
|
private removeQaseIdsFromTitle;
|
|
106
|
+
/**
|
|
107
|
+
* Extract expected result and data from step title and return cleaned string
|
|
108
|
+
* @param {string} input
|
|
109
|
+
* @returns {{expectedResult: string | null, data: string | null, cleanedString: string}}
|
|
110
|
+
* @private
|
|
111
|
+
*/
|
|
112
|
+
private extractAndCleanStep;
|
|
106
113
|
onRunnerEnd(): Promise<void>;
|
|
107
114
|
}
|
package/dist/reporter.js
CHANGED
|
@@ -63,6 +63,7 @@ class JestQaseReporter {
|
|
|
63
63
|
frameworkName: 'jest',
|
|
64
64
|
reporterName: 'jest-qase-reporter',
|
|
65
65
|
});
|
|
66
|
+
// @ts-expect-error - global.Qase is dynamically added at runtime
|
|
66
67
|
global.Qase = new global_1.Qase(this);
|
|
67
68
|
this.metadata = this.createEmptyMetadata();
|
|
68
69
|
}
|
|
@@ -208,6 +209,17 @@ class JestQaseReporter {
|
|
|
208
209
|
this.metadata.ignore = true;
|
|
209
210
|
}
|
|
210
211
|
addStep(step) {
|
|
212
|
+
// Parse expectedResult and data from step name if present
|
|
213
|
+
// Only process text steps (not gherkin steps)
|
|
214
|
+
// Check if step is a text step (either explicitly TEXT type, undefined, or string 'text')
|
|
215
|
+
const isTextStep = (qase_javascript_commons_1.StepType && step.step_type === qase_javascript_commons_1.StepType.TEXT) || step.step_type === undefined || step.step_type === 'text';
|
|
216
|
+
if (isTextStep && step.data && 'action' in step.data) {
|
|
217
|
+
const stepTextData = step.data;
|
|
218
|
+
const stepData = this.extractAndCleanStep(stepTextData.action);
|
|
219
|
+
stepTextData.action = stepData.cleanedString;
|
|
220
|
+
stepTextData.expected_result = stepData.expectedResult;
|
|
221
|
+
stepTextData.data = stepData.data;
|
|
222
|
+
}
|
|
211
223
|
this.metadata.steps.push(step);
|
|
212
224
|
}
|
|
213
225
|
addAttachment(attachment) {
|
|
@@ -236,7 +248,7 @@ class JestQaseReporter {
|
|
|
236
248
|
const ids = JestQaseReporter.getCaseId(value.title);
|
|
237
249
|
const filePath = this.getCurrentTestPath(path);
|
|
238
250
|
// Determine status based on error type
|
|
239
|
-
const testStatus = (0, qase_javascript_commons_1.determineTestStatus)(error
|
|
251
|
+
const testStatus = (0, qase_javascript_commons_1.determineTestStatus)(error ?? null, value.status);
|
|
240
252
|
return {
|
|
241
253
|
attachments: [],
|
|
242
254
|
author: null,
|
|
@@ -291,6 +303,32 @@ class JestQaseReporter {
|
|
|
291
303
|
}
|
|
292
304
|
return title;
|
|
293
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* Extract expected result and data from step title and return cleaned string
|
|
308
|
+
* @param {string} input
|
|
309
|
+
* @returns {{expectedResult: string | null, data: string | null, cleanedString: string}}
|
|
310
|
+
* @private
|
|
311
|
+
*/
|
|
312
|
+
extractAndCleanStep(input) {
|
|
313
|
+
let expectedResult = null;
|
|
314
|
+
let data = null;
|
|
315
|
+
let cleanedString = input;
|
|
316
|
+
const hasExpectedResult = input.includes('QaseExpRes:');
|
|
317
|
+
const hasData = input.includes('QaseData:');
|
|
318
|
+
if (hasExpectedResult || hasData) {
|
|
319
|
+
const regex = /QaseExpRes:\s*:?\s*(.*?)\s*(?=QaseData:|$)QaseData:\s*:?\s*(.*)?/;
|
|
320
|
+
const match = input.match(regex);
|
|
321
|
+
if (match) {
|
|
322
|
+
expectedResult = match[1]?.trim() ?? null;
|
|
323
|
+
data = match[2]?.trim() ?? null;
|
|
324
|
+
cleanedString = input
|
|
325
|
+
.replace(/QaseExpRes:\s*:?\s*.*?(?=QaseData:|$)/, '')
|
|
326
|
+
.replace(/QaseData:\s*:?\s*.*/, '')
|
|
327
|
+
.trim();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return { expectedResult, data, cleanedString };
|
|
331
|
+
}
|
|
294
332
|
async onRunnerEnd() {
|
|
295
333
|
await this.reporter.publish();
|
|
296
334
|
}
|
package/docs/usage.md
CHANGED
|
@@ -65,19 +65,37 @@ The reporter uses the title from the `test.step` function as the step title. By
|
|
|
65
65
|
Additionally, these steps get their own result in the Qase Test run, offering a well-organized summary of the test flow. This helps quickly identify the cause of any failures.
|
|
66
66
|
|
|
67
67
|
```javascript
|
|
68
|
+
const { qase } = require("jest-qase-reporter/jest");
|
|
69
|
+
|
|
68
70
|
test('A Test case with steps, updated from code', async () => {
|
|
69
|
-
await
|
|
71
|
+
await qase.step('Initialize the environment', async () => {
|
|
70
72
|
// Set up test environment
|
|
71
73
|
});
|
|
72
|
-
await
|
|
74
|
+
await qase.step('Test Core Functionality of the app', async () => {
|
|
73
75
|
// Exercise core functionality
|
|
74
76
|
});
|
|
75
77
|
|
|
76
|
-
await
|
|
78
|
+
await qase.step('Verify Expected Behavior of the app', async () => {
|
|
77
79
|
// Assert expected behavior
|
|
78
80
|
});
|
|
79
81
|
});
|
|
80
82
|
```
|
|
83
|
+
|
|
84
|
+
#### Steps with Expected Result and Data
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
const { qase } = require("jest-qase-reporter/jest");
|
|
88
|
+
|
|
89
|
+
test('A Test case with steps including expected results and data', async () => {
|
|
90
|
+
await qase.step('Click button', async () => {
|
|
91
|
+
// Click action
|
|
92
|
+
}, 'Button should be clicked', 'Button data');
|
|
93
|
+
|
|
94
|
+
await qase.step('Fill form', async () => {
|
|
95
|
+
// Form filling action
|
|
96
|
+
}, 'Form should be filled', 'Form input data');
|
|
97
|
+
});
|
|
98
|
+
```
|
|
81
99
|
<br>
|
|
82
100
|
|
|
83
101
|
### Fields
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jest-qase-reporter",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.4",
|
|
4
4
|
"description": "Qase TMS Jest Reporter",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -45,18 +45,18 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"lodash.get": "^4.4.2",
|
|
47
47
|
"lodash.has": "^4.5.2",
|
|
48
|
-
"qase-javascript-commons": "~2.4.
|
|
49
|
-
"uuid": "^9.0.
|
|
48
|
+
"qase-javascript-commons": "~2.4.13",
|
|
49
|
+
"uuid": "^9.0.1"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
-
"@jest/globals": "^29.
|
|
53
|
-
"@jest/reporters": "^29.
|
|
54
|
-
"@jest/test-result": "^29.
|
|
55
|
-
"@types/jest": "^29.5.
|
|
56
|
-
"@types/lodash.get": "^4.4.
|
|
57
|
-
"@types/lodash.has": "^4.5.
|
|
58
|
-
"jest": "^29.
|
|
59
|
-
"ts-jest": "^29.
|
|
52
|
+
"@jest/globals": "^29.7.0",
|
|
53
|
+
"@jest/reporters": "^29.7.0",
|
|
54
|
+
"@jest/test-result": "^29.7.0",
|
|
55
|
+
"@types/jest": "^29.5.14",
|
|
56
|
+
"@types/lodash.get": "^4.4.9",
|
|
57
|
+
"@types/lodash.has": "^4.5.9",
|
|
58
|
+
"jest": "^29.7.0",
|
|
59
|
+
"ts-jest": "^29.4.5"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
62
|
"jest": ">=28.0.0"
|