@testomatio/reporter 1.6.6 → 1.6.7
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/lib/adapter/playwright.js +28 -4
- package/lib/client.js +23 -2
- package/lib/pipe/testomatio.js +3 -2
- package/lib/reporter-functions.js +6 -2
- package/lib/xmlReader.js +4 -1
- package/package.json +1 -1
|
@@ -55,11 +55,28 @@ class PlaywrightReporter {
|
|
|
55
55
|
logs = `\n\n${chalk.bold('Logs:')}\n${chalk.red(result.stderr.join(''))}\n${result.stdout.join('')}`;
|
|
56
56
|
}
|
|
57
57
|
const manuallyAttachedArtifacts = services.artifacts.get(fullTestTitle);
|
|
58
|
-
const
|
|
58
|
+
const testMeta = services.keyValues.get(fullTestTitle);
|
|
59
59
|
const rid = test.id || test.testId || uuidv4();
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* @type {{
|
|
63
|
+
* browser?: string,
|
|
64
|
+
* dependencies: string[],
|
|
65
|
+
* isMobile?: boolean
|
|
66
|
+
* metadata: Record<string, any>,
|
|
67
|
+
* name: string,
|
|
68
|
+
* }}
|
|
69
|
+
*/
|
|
70
|
+
const project = {
|
|
71
|
+
browser: test.parent.project().use.defaultBrowserType,
|
|
72
|
+
dependencies: test.parent.project().dependencies,
|
|
73
|
+
isMobile: test.parent.project().use.isMobile,
|
|
74
|
+
metadata: test.parent.project().metadata,
|
|
75
|
+
name: test.parent.project().name,
|
|
76
|
+
};
|
|
77
|
+
|
|
61
78
|
const reportTestPromise = this.client.addTestRun(checkStatus(result.status), {
|
|
62
|
-
rid
|
|
79
|
+
rid: `${rid}-${project.name}`,
|
|
63
80
|
error,
|
|
64
81
|
test_id: getTestomatIdFromTestTitle(`${title} ${test.tags?.join(' ')}`),
|
|
65
82
|
suite_title,
|
|
@@ -68,12 +85,19 @@ class PlaywrightReporter {
|
|
|
68
85
|
time: duration,
|
|
69
86
|
logs,
|
|
70
87
|
manuallyAttachedArtifacts,
|
|
71
|
-
meta:
|
|
88
|
+
meta: {
|
|
89
|
+
browser: project.browser,
|
|
90
|
+
isMobile: project.isMobile,
|
|
91
|
+
project: project.name,
|
|
92
|
+
projectDependencies: project.dependencies?.length ? project.dependencies : null,
|
|
93
|
+
...testMeta,
|
|
94
|
+
...project.metadata, // metadata has any type (in playwright), but we will stringify it in client.js
|
|
95
|
+
},
|
|
72
96
|
file: test.location?.file,
|
|
73
97
|
});
|
|
74
98
|
|
|
75
99
|
this.uploads.push({
|
|
76
|
-
rid
|
|
100
|
+
rid: `${rid}-${project.name}`,
|
|
77
101
|
title: test.title,
|
|
78
102
|
files: result.attachments.filter(a => a.body || a.path),
|
|
79
103
|
file: test.location?.file,
|
package/lib/client.js
CHANGED
|
@@ -165,6 +165,27 @@ class Client {
|
|
|
165
165
|
} = testData;
|
|
166
166
|
let { message = '' } = testData;
|
|
167
167
|
|
|
168
|
+
// stringify meta values and limit keys and values length to 255
|
|
169
|
+
if (meta) {
|
|
170
|
+
for (const key in meta) {
|
|
171
|
+
if (typeof meta[key] === 'object') {
|
|
172
|
+
meta[key] = JSON.stringify(meta[key]);
|
|
173
|
+
}
|
|
174
|
+
// cut values
|
|
175
|
+
if (meta[key].length > 255) {
|
|
176
|
+
meta[key] = meta[key].substring(0, 255);
|
|
177
|
+
debug(APP_PREFIX, `Meta info value "${meta[key]}" is too long, trimmed to 255 characters`);
|
|
178
|
+
}
|
|
179
|
+
// cut keys
|
|
180
|
+
if (key.length > 255) {
|
|
181
|
+
const newKey = key.substring(0, 255);
|
|
182
|
+
meta[newKey] = meta[key];
|
|
183
|
+
delete meta[key];
|
|
184
|
+
debug(APP_PREFIX, `Meta info key "${key}" is too long, trimmed to 255 characters`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
168
189
|
let errorFormatted = '';
|
|
169
190
|
if (error) {
|
|
170
191
|
errorFormatted += this.formatError(error) || '';
|
|
@@ -259,7 +280,7 @@ class Client {
|
|
|
259
280
|
APP_PREFIX,
|
|
260
281
|
`🗄️ ${this.uploader.successfulUploads.length} artifacts ${
|
|
261
282
|
process.env.TESTOMATIO_PRIVATE_ARTIFACTS ? 'privately' : chalk.bold('publicly')
|
|
262
|
-
} 🟢
|
|
283
|
+
} 🟢uploaded to S3 bucket`,
|
|
263
284
|
);
|
|
264
285
|
}
|
|
265
286
|
|
|
@@ -275,7 +296,7 @@ class Client {
|
|
|
275
296
|
|
|
276
297
|
uploadedArtifacts.forEach(upload => {
|
|
277
298
|
debug(
|
|
278
|
-
`🟢
|
|
299
|
+
`🟢Uploaded artifact`,
|
|
279
300
|
`${upload.relativePath},`,
|
|
280
301
|
'size:',
|
|
281
302
|
`${upload.sizePretty},`,
|
package/lib/pipe/testomatio.js
CHANGED
|
@@ -215,7 +215,7 @@ class TestomatioPipe {
|
|
|
215
215
|
this.store.runPublicUrl = this.runPublicUrl;
|
|
216
216
|
this.store.runId = this.runId;
|
|
217
217
|
console.log(APP_PREFIX, '📊 Report created. Report ID:', this.runId);
|
|
218
|
-
process.env.runId = this.runId;
|
|
218
|
+
process.env.runId = this.runId;
|
|
219
219
|
debug('Run created', this.runId);
|
|
220
220
|
} catch (err) {
|
|
221
221
|
const errorText = err.response?.data?.message || err.message;
|
|
@@ -241,7 +241,7 @@ class TestomatioPipe {
|
|
|
241
241
|
const cancelReporting = this.requestFailures >= parseInt(process.env.TESTOMATIO_MAX_REQUEST_FAILURES, 10);
|
|
242
242
|
if (cancelReporting) {
|
|
243
243
|
this.reportingCanceledDueToReqFailures = true;
|
|
244
|
-
const errorMessage =
|
|
244
|
+
const errorMessage =
|
|
245
245
|
`⚠️ ${process.env.TESTOMATIO_MAX_REQUEST_FAILURES} requests were failed, reporting to Testomat aborted.`;
|
|
246
246
|
console.warn(`${APP_PREFIX} ${chalk.yellow(errorMessage)}`);
|
|
247
247
|
}
|
|
@@ -396,6 +396,7 @@ class TestomatioPipe {
|
|
|
396
396
|
await this.axios.put(`/api/reporter/${this.runId}`, {
|
|
397
397
|
api_key: this.apiKey,
|
|
398
398
|
status_event,
|
|
399
|
+
detach: params.detach,
|
|
399
400
|
duration: params.duration,
|
|
400
401
|
tests: params.tests,
|
|
401
402
|
});
|
|
@@ -32,9 +32,13 @@ function addStep(message) {
|
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Add key-value pair(s) to the test report
|
|
35
|
-
* @param {*} keyValue
|
|
35
|
+
* @param {*} keyValue or key
|
|
36
|
+
* @param {string?} value
|
|
36
37
|
*/
|
|
37
|
-
function setKeyValue(keyValue) {
|
|
38
|
+
function setKeyValue(keyValue, value = null) {
|
|
39
|
+
if (value && typeof keyValue === 'string') {
|
|
40
|
+
keyValue = { [keyValue]: value };
|
|
41
|
+
}
|
|
38
42
|
services.keyValues.put(keyValue);
|
|
39
43
|
}
|
|
40
44
|
|
package/lib/xmlReader.js
CHANGED
|
@@ -21,7 +21,8 @@ const config = require('./config');
|
|
|
21
21
|
const ridRunId = randomUUID();
|
|
22
22
|
|
|
23
23
|
const TESTOMATIO_URL = process.env.TESTOMATIO_URL || 'https://app.testomat.io';
|
|
24
|
-
const { TESTOMATIO_RUNGROUP_TITLE, TESTOMATIO_TITLE, TESTOMATIO_ENV, TESTOMATIO_RUN
|
|
24
|
+
const { TESTOMATIO_RUNGROUP_TITLE, TESTOMATIO_TITLE, TESTOMATIO_ENV, TESTOMATIO_RUN,
|
|
25
|
+
TESTOMATIO_MARK_DETACHED } = process.env;
|
|
25
26
|
|
|
26
27
|
const options = {
|
|
27
28
|
ignoreDeclaration: true,
|
|
@@ -41,6 +42,7 @@ class XmlReader {
|
|
|
41
42
|
title: TESTOMATIO_TITLE,
|
|
42
43
|
env: TESTOMATIO_ENV,
|
|
43
44
|
group_title: TESTOMATIO_RUNGROUP_TITLE,
|
|
45
|
+
detach: !!TESTOMATIO_MARK_DETACHED,
|
|
44
46
|
// batch uploading is implemented for xml already
|
|
45
47
|
isBatchEnabled: false,
|
|
46
48
|
};
|
|
@@ -424,6 +426,7 @@ class XmlReader {
|
|
|
424
426
|
|
|
425
427
|
const dataString = {
|
|
426
428
|
...this.stats,
|
|
429
|
+
detach: this.requestParams.detach,
|
|
427
430
|
api_key: this.requestParams.apiKey,
|
|
428
431
|
status: 'finished',
|
|
429
432
|
tests: this.tests,
|