testcafe-reporter-qase 2.0.1 → 2.0.3

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 CHANGED
@@ -1,8 +1,32 @@
1
+ # qase-testcafe@2.0.3
2
+
3
+ ## What's new
4
+
5
+ Support `ignore` metadata for test cases. If the test case has the `ignore` tag, the reporter will not send the result to the Qase
6
+ TMS.
7
+
8
+ ```ts
9
+ const q = qase.ignore().create();
10
+ test.meta({ ...q })(
11
+ 'test',
12
+ async (t) => {
13
+ await t;
14
+ },
15
+ );
16
+ ```
17
+
18
+ # qase-testcafe@2.0.2
19
+
20
+ ## What's new
21
+
22
+ Improved error collection. The error stack trace contains more useful debugging information: browser, code, etc.
23
+
1
24
  # qase-testcafe@2.0.1
2
25
 
3
26
  ## What's new
4
27
 
5
- Support group parameters for test cases. You can specify the group parameters in the test case using the following format:
28
+ Support group parameters for test cases. You can specify the group parameters in the test case using the following
29
+ format:
6
30
 
7
31
  ```ts
8
32
  const q = qase.groupParameters({ 'param01': 'value01', 'param02': 'value02' }).create();
package/dist/factory.d.ts CHANGED
@@ -7,6 +7,6 @@ export declare const factory: (options: TestcafeQaseOptionsType) => {
7
7
  noColors: boolean;
8
8
  reportTaskStart: () => void;
9
9
  reportFixtureStart: () => void;
10
- reportTestDone: (name: string, testRunInfo: TestRunInfoType, meta: Record<string, string>) => Promise<void>;
10
+ reportTestDone(name: string, testRunInfo: TestRunInfoType, meta: Record<string, string>): Promise<void>;
11
11
  reportTaskDone: () => Promise<void>;
12
12
  };
package/dist/factory.js CHANGED
@@ -16,8 +16,12 @@ const factory = (options) => {
16
16
  reportFixtureStart: () => {
17
17
  /* empty */
18
18
  },
19
- reportTestDone: async (name, testRunInfo, meta) => {
20
- await reporter.reportTestDone(name, testRunInfo, meta);
19
+ async reportTestDone(name, testRunInfo, meta) {
20
+ return reporter.reportTestDone(name, testRunInfo, meta,
21
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
22
+ // @ts-expect-error Inject testrail error formatting method with bound context
23
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-argument
24
+ this.formatError.bind(this));
21
25
  },
22
26
  reportTaskDone: async () => {
23
27
  await reporter.reportTaskDone();
package/dist/qase.d.ts CHANGED
@@ -4,6 +4,7 @@ export declare class qase {
4
4
  private static _qaseFields;
5
5
  private static _qaseParameters;
6
6
  private static _qaseGroupParameters;
7
+ private static _qaseIgnore;
7
8
  /**
8
9
  * Set a Qase ID for the test case
9
10
  * Don't forget to call `create` method after setting all the necessary parameters
@@ -53,12 +54,22 @@ export declare class qase {
53
54
  * Don't forget to call `create` method after setting all the necessary parameters
54
55
  * @param {Record<string, string>} values
55
56
  * @example
56
- * const q = qase.group_parameters({ 'severity': 'high', 'priority': 'medium' }).create();
57
+ * const q = qase.groupParameters({ 'severity': 'high', 'priority': 'medium' }).create();
57
58
  * test.meta(q)('Test case title', async t => { ... });
58
59
  * or
59
60
  * test.meta({userField: 123, ...q})('Test case title', async t => { ... });
60
61
  */
61
- static group_parameters: (values: Record<string, string>) => typeof qase;
62
+ static groupParameters: (values: Record<string, string>) => typeof qase;
63
+ /**
64
+ * Set a ignore flag for the test case
65
+ * Don't forget to call `create` method after setting all the necessary parameters
66
+ * @example
67
+ * const q = qase.ignore().create();
68
+ * test.meta(q)('Test case title', async t => { ... });
69
+ * or
70
+ * test.meta({userField: 123, ...q})('Test case title', async t => { ... });
71
+ */
72
+ static ignore: () => typeof qase;
62
73
  /**
63
74
  * Create a Qase metadata
64
75
  * Call this method after setting all the necessary parameters
@@ -74,6 +85,7 @@ export declare class qase {
74
85
  QaseFields: string;
75
86
  QaseParameters: string;
76
87
  QaseGroupParameters: string;
88
+ QaseIgnore: string;
77
89
  };
78
90
  private static toNormalizeRecord;
79
91
  }
package/dist/qase.js CHANGED
@@ -12,6 +12,7 @@ qase._qaseTitle = '';
12
12
  qase._qaseFields = '';
13
13
  qase._qaseParameters = '';
14
14
  qase._qaseGroupParameters = '';
15
+ qase._qaseIgnore = '';
15
16
  /**
16
17
  * Set a Qase ID for the test case
17
18
  * Don't forget to call `create` method after setting all the necessary parameters
@@ -73,15 +74,28 @@ qase.parameters = (values) => {
73
74
  * Don't forget to call `create` method after setting all the necessary parameters
74
75
  * @param {Record<string, string>} values
75
76
  * @example
76
- * const q = qase.group_parameters({ 'severity': 'high', 'priority': 'medium' }).create();
77
+ * const q = qase.groupParameters({ 'severity': 'high', 'priority': 'medium' }).create();
77
78
  * test.meta(q)('Test case title', async t => { ... });
78
79
  * or
79
80
  * test.meta({userField: 123, ...q})('Test case title', async t => { ... });
80
81
  */
81
- qase.group_parameters = (values) => {
82
+ qase.groupParameters = (values) => {
82
83
  _a._qaseGroupParameters = _a.toNormalizeRecord(values);
83
84
  return _a;
84
85
  };
86
+ /**
87
+ * Set a ignore flag for the test case
88
+ * Don't forget to call `create` method after setting all the necessary parameters
89
+ * @example
90
+ * const q = qase.ignore().create();
91
+ * test.meta(q)('Test case title', async t => { ... });
92
+ * or
93
+ * test.meta({userField: 123, ...q})('Test case title', async t => { ... });
94
+ */
95
+ qase.ignore = () => {
96
+ _a._qaseIgnore = 'true';
97
+ return _a;
98
+ };
85
99
  /**
86
100
  * Create a Qase metadata
87
101
  * Call this method after setting all the necessary parameters
@@ -98,12 +112,14 @@ qase.create = () => {
98
112
  QaseFields: _a._qaseFields,
99
113
  QaseParameters: _a._qaseParameters,
100
114
  QaseGroupParameters: _a._qaseGroupParameters,
115
+ QaseIgnore: _a._qaseIgnore,
101
116
  };
102
117
  _a._qaseID = '';
103
118
  _a._qaseTitle = '';
104
119
  _a._qaseFields = '';
105
120
  _a._qaseParameters = '';
106
121
  _a._qaseGroupParameters = '';
122
+ _a._qaseIgnore = '';
107
123
  return meta;
108
124
  };
109
125
  qase.toNormalizeRecord = (record) => {
@@ -11,10 +11,11 @@ interface TestRunErrorFormattableAdapterType {
11
11
  screenshotPath: string;
12
12
  testRunId: string;
13
13
  testRunPhase: string;
14
+ type: string;
14
15
  code?: string;
15
16
  isTestCafeError?: boolean;
16
17
  callsite?: CallsiteRecordType;
17
- errMsg?: string;
18
+ errMsg: string;
18
19
  diff?: boolean;
19
20
  id?: string;
20
21
  }
@@ -53,12 +54,6 @@ export declare class TestcafeQaseReporter {
53
54
  * @private
54
55
  */
55
56
  private static getStatus;
56
- /**
57
- * @param {TestRunErrorFormattableAdapterType[]} errors
58
- * @returns {Error}
59
- * @private
60
- */
61
- private static transformErrors;
62
57
  /**
63
58
  * @param {ScreenshotType[]} screenshots
64
59
  * @returns {Attachment[]}
@@ -83,8 +78,9 @@ export declare class TestcafeQaseReporter {
83
78
  * @param {string} title
84
79
  * @param {TestRunInfoType} testRunInfo
85
80
  * @param {Record<string, string>} meta
81
+ * @param formatError
86
82
  */
87
- reportTestDone: (title: string, testRunInfo: TestRunInfoType, meta: Record<string, string>) => Promise<void>;
83
+ reportTestDone: (title: string, testRunInfo: TestRunInfoType, meta: Record<string, string>, formatError: (error: any, prefix: string) => string) => Promise<void>;
88
84
  /**
89
85
  * @returns {Promise<void>}
90
86
  */
package/dist/reporter.js CHANGED
@@ -11,6 +11,7 @@ var metadataEnum;
11
11
  metadataEnum["parameters"] = "QaseParameters";
12
12
  metadataEnum["groupParameters"] = "QaseGroupParameters";
13
13
  metadataEnum["oldID"] = "CID";
14
+ metadataEnum["ignore"] = "QaseIgnore";
14
15
  })(metadataEnum || (metadataEnum = {}));
15
16
  /**
16
17
  * @class TestcafeQaseReporter
@@ -30,22 +31,6 @@ class TestcafeQaseReporter {
30
31
  }
31
32
  return qase_javascript_commons_1.TestStatusEnum.passed;
32
33
  }
33
- /**
34
- * @param {TestRunErrorFormattableAdapterType[]} errors
35
- * @returns {Error}
36
- * @private
37
- */
38
- static transformErrors(errors) {
39
- const [errorMessages, errorStacks] = errors.reduce(([messages, stacks], error) => {
40
- const stack = error.callsite?.stackFrames?.map((line) => String(line)) ?? [];
41
- messages.push(error.errMsg ?? 'Error');
42
- stacks.push(stack.join('\n'));
43
- return [messages, stacks];
44
- }, [[], []]);
45
- const error = new Error(errorMessages.join('\n\n'));
46
- error.stack = errorStacks.join('\n\n');
47
- return error;
48
- }
49
34
  /**
50
35
  * @param {ScreenshotType[]} screenshots
51
36
  * @returns {Attachment[]}
@@ -80,10 +65,18 @@ class TestcafeQaseReporter {
80
65
  * @param {string} title
81
66
  * @param {TestRunInfoType} testRunInfo
82
67
  * @param {Record<string, string>} meta
68
+ * @param formatError
83
69
  */
84
- this.reportTestDone = async (title, testRunInfo, meta) => {
85
- const error = TestcafeQaseReporter.transformErrors(testRunInfo.errs);
70
+ this.reportTestDone = async (title, testRunInfo, meta, formatError) => {
86
71
  const metadata = this.getMeta(meta);
72
+ if (metadata[metadataEnum.ignore]) {
73
+ return;
74
+ }
75
+ const errorLog = testRunInfo.errs
76
+ .map((error, index) => formatError(error, `${index + 1} `).replace(
77
+ // eslint-disable-next-line no-control-regex
78
+ /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''))
79
+ .join('\n');
87
80
  await this.reporter.addTestResult({
88
81
  author: null,
89
82
  execution: {
@@ -91,11 +84,11 @@ class TestcafeQaseReporter {
91
84
  start_time: null,
92
85
  end_time: null,
93
86
  duration: testRunInfo.durationMs,
94
- stacktrace: error.stack ?? null,
87
+ stacktrace: errorLog,
95
88
  thread: null,
96
89
  },
97
90
  fields: metadata[metadataEnum.fields],
98
- message: error.message,
91
+ message: errorLog ? errorLog.split('\n')[0] ?? '' : '',
99
92
  muted: false,
100
93
  params: metadata[metadataEnum.parameters],
101
94
  group_params: metadata[metadataEnum.groupParameters],
@@ -139,6 +132,7 @@ class TestcafeQaseReporter {
139
132
  QaseFields: {},
140
133
  QaseParameters: {},
141
134
  QaseGroupParameters: {},
135
+ QaseIgnore: false,
142
136
  };
143
137
  if (meta[metadataEnum.oldID] !== undefined && meta[metadataEnum.oldID] !== '') {
144
138
  const v = meta[metadataEnum.oldID].split(',');
@@ -157,6 +151,12 @@ class TestcafeQaseReporter {
157
151
  if (meta[metadataEnum.parameters] !== undefined && meta[metadataEnum.parameters] !== '') {
158
152
  metadata.QaseParameters = JSON.parse(meta[metadataEnum.parameters]);
159
153
  }
154
+ if (meta[metadataEnum.groupParameters] !== undefined && meta[metadataEnum.groupParameters] !== '') {
155
+ metadata.QaseGroupParameters = JSON.parse(meta[metadataEnum.groupParameters]);
156
+ }
157
+ if (meta[metadataEnum.ignore] !== undefined && meta[metadataEnum.ignore] !== '') {
158
+ metadata.QaseIgnore = meta[metadataEnum.ignore] === 'true';
159
+ }
160
160
  return metadata;
161
161
  }
162
162
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testcafe-reporter-qase",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "Qase TMS TestCafe Reporter",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",