@testomatio/reporter 2.3.7-beta.2-xml-import β 2.3.7-beta.4-stack-artifacts
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/README.md +1 -1
- package/lib/bin/cli.js +1 -1
- package/lib/bin/reportXml.js +2 -5
- package/lib/bin/startTest.js +3 -3
- package/lib/client.js +48 -25
- package/lib/junit-adapter/csharp.d.ts +1 -0
- package/lib/junit-adapter/csharp.js +7 -40
- package/lib/pipe/debug.js +1 -1
- package/lib/pipe/testomatio.js +15 -19
- package/lib/reporter.d.ts +19 -9
- package/lib/reporter.js +40 -5
- package/lib/template/testomatio.hbs +1026 -1366
- package/lib/uploader.js +0 -4
- package/lib/utils/utils.js +11 -90
- package/lib/xmlReader.d.ts +26 -32
- package/lib/xmlReader.js +50 -106
- package/package.json +1 -1
- package/src/bin/cli.js +1 -1
- package/src/bin/reportXml.js +2 -5
- package/src/bin/startTest.js +5 -5
- package/src/client.js +80 -31
- package/src/junit-adapter/csharp.js +6 -45
- package/src/pipe/debug.js +3 -2
- package/src/pipe/testomatio.js +81 -75
- package/src/reporter.js +7 -4
- package/src/template/testomatio.hbs +1026 -1366
- package/src/uploader.js +0 -5
- package/src/utils/utils.js +9 -96
- package/src/xmlReader.js +45 -128
- package/lib/junit-adapter/nunit-parser.d.ts +0 -82
- package/lib/junit-adapter/nunit-parser.js +0 -369
- package/src/junit-adapter/nunit-parser.js +0 -404
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ Testomat.io Reporter (this npm package) supports:
|
|
|
13
13
|
- π [Stack traces](./docs/stacktrace.md) and error messages
|
|
14
14
|
- π [GitHub](./docs/pipes/github.md), [GitLab](./docs/pipes/gitlab.md) & [Bitbucket](./docs/pipes/bitbucket.md) integration
|
|
15
15
|
- π
Realtime reports
|
|
16
|
-
- ποΈ Other test frameworks supported via [
|
|
16
|
+
- ποΈ Other test frameworks supported via [JUNit XML](./docs/junit.md)
|
|
17
17
|
- πΆββοΈ Steps _(work in progress)_
|
|
18
18
|
- π [Logger](./docs/logger.md) _(work in progress, supports Jest for now)_
|
|
19
19
|
- βοΈ Custom properties and metadata _(work in progress)_
|
package/lib/bin/cli.js
CHANGED
|
@@ -145,7 +145,7 @@ program
|
|
|
145
145
|
.option('--lang <lang>', 'Language used (python, ruby, java)')
|
|
146
146
|
.option('--timelimit <time>', 'default time limit in seconds to kill a stuck process')
|
|
147
147
|
.action(async (pattern, opts) => {
|
|
148
|
-
if (!pattern.endsWith('.xml')
|
|
148
|
+
if (!pattern.endsWith('.xml')) {
|
|
149
149
|
pattern += '.xml';
|
|
150
150
|
}
|
|
151
151
|
let { javaTests, lang } = opts;
|
package/lib/bin/reportXml.js
CHANGED
|
@@ -25,7 +25,7 @@ program
|
|
|
25
25
|
.option('--timelimit <time>', 'default time limit in seconds to kill a stuck process')
|
|
26
26
|
.option('--env-file <envfile>', 'Load environment variables from env file')
|
|
27
27
|
.action(async (pattern, opts) => {
|
|
28
|
-
if (!pattern.endsWith('.xml')
|
|
28
|
+
if (!pattern.endsWith('.xml')) {
|
|
29
29
|
pattern += '.xml';
|
|
30
30
|
}
|
|
31
31
|
let { javaTests, lang } = opts;
|
|
@@ -37,10 +37,7 @@ program
|
|
|
37
37
|
lang = lang?.toLowerCase();
|
|
38
38
|
if (javaTests === true || (lang === 'java' && !javaTests))
|
|
39
39
|
javaTests = 'src/test/java';
|
|
40
|
-
const runReader = new xmlReader_js_1.default({
|
|
41
|
-
javaTests,
|
|
42
|
-
lang,
|
|
43
|
-
});
|
|
40
|
+
const runReader = new xmlReader_js_1.default({ javaTests, lang });
|
|
44
41
|
const files = glob_1.glob.sync(pattern, { cwd: opts.dir || process.cwd() });
|
|
45
42
|
if (!files.length) {
|
|
46
43
|
console.log(constants_js_1.APP_PREFIX, `Report can't be created. No XML files found π₯`);
|
package/lib/bin/startTest.js
CHANGED
|
@@ -35,7 +35,7 @@ while (i < args.length) {
|
|
|
35
35
|
newArgs[0] = 'start';
|
|
36
36
|
}
|
|
37
37
|
else if (arg === '--finish') {
|
|
38
|
-
// Map --finish to finish command
|
|
38
|
+
// Map --finish to finish command
|
|
39
39
|
newArgs[0] = 'finish';
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
@@ -46,8 +46,8 @@ while (i < args.length) {
|
|
|
46
46
|
}
|
|
47
47
|
// Execute the main CLI with mapped arguments
|
|
48
48
|
const child = (0, node_child_process_1.spawn)(process.execPath, [cliPath, ...newArgs], {
|
|
49
|
-
stdio: 'inherit'
|
|
49
|
+
stdio: 'inherit'
|
|
50
50
|
});
|
|
51
|
-
child.on('exit', code => {
|
|
51
|
+
child.on('exit', (code) => {
|
|
52
52
|
process.exit(code);
|
|
53
53
|
});
|
package/lib/client.js
CHANGED
|
@@ -70,8 +70,8 @@ class Client {
|
|
|
70
70
|
this.pipeStore = {};
|
|
71
71
|
this.runId = '';
|
|
72
72
|
this.queue = Promise.resolve();
|
|
73
|
-
//
|
|
74
|
-
const pathToPackageJSON = path_1.default.join(
|
|
73
|
+
// @ts-ignore this line will be removed in compiled code, because __dirname is defined in commonjs
|
|
74
|
+
const pathToPackageJSON = path_1.default.join(__dirname, '../package.json');
|
|
75
75
|
try {
|
|
76
76
|
this.version = JSON.parse(fs_1.default.readFileSync(pathToPackageJSON).toString()).version;
|
|
77
77
|
console.log(constants_js_1.APP_PREFIX, `Testomatio Reporter v${this.version}`);
|
|
@@ -158,17 +158,6 @@ class Client {
|
|
|
158
158
|
* @returns {Promise<PipeResult[]>}
|
|
159
159
|
*/
|
|
160
160
|
async addTestRun(status, testData) {
|
|
161
|
-
if (!this.pipes || !this.pipes.length)
|
|
162
|
-
this.pipes = await (0, index_js_1.pipesFactory)(this.paramsForPipesFactory || {}, this.pipeStore);
|
|
163
|
-
// all pipes disabled, skipping
|
|
164
|
-
if (!this.pipes?.filter(p => p.isEnabled).length)
|
|
165
|
-
return [];
|
|
166
|
-
if (isTestShouldBeExculedFromReport(testData))
|
|
167
|
-
return [];
|
|
168
|
-
if (status === constants_js_1.STATUS.SKIPPED && process.env.TESTOMATIO_EXCLUDE_SKIPPED) {
|
|
169
|
-
debug('Skipping test from report', testData?.title);
|
|
170
|
-
return []; // do not log skipped tests
|
|
171
|
-
}
|
|
172
161
|
if (!testData)
|
|
173
162
|
testData = {
|
|
174
163
|
title: 'Unknown test',
|
|
@@ -181,9 +170,37 @@ class Client {
|
|
|
181
170
|
/**
|
|
182
171
|
* @type {TestData}
|
|
183
172
|
*/
|
|
184
|
-
const { rid, error = null,
|
|
173
|
+
const { rid, error = null, steps: originalSteps, title, suite_title, } = testData;
|
|
174
|
+
let steps = originalSteps;
|
|
175
|
+
const uploadedFiles = [];
|
|
176
|
+
const stackArtifactsEnabled = (0, utils_js_1.transformEnvVarToBoolean)(process.env.TESTOMATIO_STACK_ARTIFACTS);
|
|
177
|
+
let formattedSteps;
|
|
178
|
+
if (stackArtifactsEnabled) {
|
|
179
|
+
const timestamp = +new Date;
|
|
180
|
+
formattedSteps = Array.isArray(steps) ? steps.map(step => (0, utils_js_1.formatStep)(step)).flat().join('\n') : '';
|
|
181
|
+
if (error?.stack?.length > 5000) {
|
|
182
|
+
uploadedFiles.push(this.uploader.uploadFileAsBuffer(Buffer.from(error.stack, 'utf8'), [this.runId, rid, `stack_${timestamp}.log`]));
|
|
183
|
+
}
|
|
184
|
+
if (formattedSteps?.length > 10000) {
|
|
185
|
+
uploadedFiles.push(this.uploader.uploadFileAsBuffer(Buffer.from(JSON.stringify(steps, null, 2), 'utf8'), [this.runId, rid, `steps_${timestamp}.json`]));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (!this.pipes || !this.pipes.length)
|
|
189
|
+
this.pipes = await (0, index_js_1.pipesFactory)(this.paramsForPipesFactory || {}, this.pipeStore);
|
|
190
|
+
if (!this.pipes?.filter(p => p.isEnabled).length) {
|
|
191
|
+
if (uploadedFiles.length > 0) {
|
|
192
|
+
await Promise.all(uploadedFiles);
|
|
193
|
+
}
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
if (isTestShouldBeExculedFromReport(testData))
|
|
197
|
+
return [];
|
|
198
|
+
if (status === constants_js_1.STATUS.SKIPPED && process.env.TESTOMATIO_EXCLUDE_SKIPPED) {
|
|
199
|
+
debug('Skipping test from report', testData?.title);
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
const { time = 0, example = null, files = [], filesBuffers = [], code = null, file, suite_id, test_id, timestamp, links, manuallyAttachedArtifacts, overwrite, tags, } = testData;
|
|
185
203
|
let { message = '', meta = {} } = testData;
|
|
186
|
-
// stringify meta values and limit keys and values length to 255
|
|
187
204
|
meta = Object.entries(meta)
|
|
188
205
|
.filter(([, value]) => value !== null && value !== undefined)
|
|
189
206
|
.reduce((acc, [key, value]) => {
|
|
@@ -191,19 +208,29 @@ class Client {
|
|
|
191
208
|
acc[key] = value;
|
|
192
209
|
return acc;
|
|
193
210
|
}, {});
|
|
194
|
-
// Get links from storage using the test context
|
|
195
211
|
const testContext = suite_title ? `${suite_title} ${title}` : title;
|
|
196
212
|
let errorFormatted = '';
|
|
197
213
|
if (error) {
|
|
198
214
|
errorFormatted += this.formatError(error) || '';
|
|
199
215
|
message = error?.message;
|
|
200
216
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
217
|
+
if (stackArtifactsEnabled) {
|
|
218
|
+
if (error?.stack?.length > 5000)
|
|
219
|
+
errorFormatted = `[Large stack saved as artifact]`;
|
|
220
|
+
if (formattedSteps?.length > 10000)
|
|
221
|
+
steps = null;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
formattedSteps = Array.isArray(steps) ? steps.map(step => (0, utils_js_1.formatStep)(step)).flat().join('\n') : '';
|
|
225
|
+
}
|
|
226
|
+
let fullLogs = this.formatLogs({ error: errorFormatted, steps, logs: testData.logs });
|
|
227
|
+
if (stackArtifactsEnabled && fullLogs.length > 5000) {
|
|
228
|
+
const timestamp = +new Date;
|
|
229
|
+
uploadedFiles.push(this.uploader.uploadFileAsBuffer(Buffer.from(fullLogs, 'utf8'), [this.runId, rid, `logs_${timestamp}.log`]));
|
|
230
|
+
fullLogs = fullLogs.slice(0, 5000) + '\n\n[Full logs saved as artifact]';
|
|
231
|
+
}
|
|
204
232
|
if (manuallyAttachedArtifacts?.length)
|
|
205
233
|
files.push(...manuallyAttachedArtifacts);
|
|
206
|
-
const uploadedFiles = [];
|
|
207
234
|
for (let f of files) {
|
|
208
235
|
if (!f)
|
|
209
236
|
continue; // f === null
|
|
@@ -329,11 +356,7 @@ class Client {
|
|
|
329
356
|
*/
|
|
330
357
|
formatLogs({ error, steps, logs }) {
|
|
331
358
|
error = error?.trim();
|
|
332
|
-
logs = logs
|
|
333
|
-
?.trim()
|
|
334
|
-
.split('\n')
|
|
335
|
-
.map(l => (0, utils_js_1.truncate)(l))
|
|
336
|
-
.join('\n');
|
|
359
|
+
logs = logs?.trim().split('\n').map(l => (0, utils_js_1.truncate)(l)).join('\n');
|
|
337
360
|
if (Array.isArray(steps)) {
|
|
338
361
|
steps = steps
|
|
339
362
|
.map(step => (0, utils_js_1.formatStep)(step))
|
|
@@ -7,57 +7,24 @@ const path_1 = __importDefault(require("path"));
|
|
|
7
7
|
const adapter_js_1 = __importDefault(require("./adapter.js"));
|
|
8
8
|
class CSharpAdapter extends adapter_js_1.default {
|
|
9
9
|
formatTest(t) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
// Extract parameters as object with numeric keys for API
|
|
15
|
-
const params = exampleMatch[1].split(',').map(param => param.trim());
|
|
16
|
-
t.example = {};
|
|
17
|
-
params.forEach((param, index) => {
|
|
18
|
-
t.example[index] = param;
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
// For runs: keep full title with parameters for display
|
|
23
|
-
// The example field will be used for grouping on import
|
|
24
|
-
// Do NOT remove parameters from title
|
|
10
|
+
const title = t.title.replace(/\(.*?\)/, '').trim();
|
|
11
|
+
const example = t.title.match(/\((.*?)\)/);
|
|
12
|
+
if (example)
|
|
13
|
+
t.example = { ...example[1].split(',') };
|
|
25
14
|
const suite = t.suite_title.split('.');
|
|
26
15
|
t.suite_title = suite.pop();
|
|
27
16
|
t.file = namespaceToFileName(t.file);
|
|
17
|
+
t.title = title.trim();
|
|
28
18
|
return t;
|
|
29
19
|
}
|
|
30
20
|
getFilePath(t) {
|
|
31
|
-
|
|
32
|
-
return null;
|
|
33
|
-
// Normalize path separators for cross-platform compatibility
|
|
34
|
-
let filePath = t.file.replace(/\\/g, '/');
|
|
35
|
-
// If file already has .cs extension, use it directly
|
|
36
|
-
if (filePath.endsWith('.cs')) {
|
|
37
|
-
// Make relative path if it's absolute
|
|
38
|
-
if (path_1.default.isAbsolute(filePath)) {
|
|
39
|
-
// Try to find project-relative path
|
|
40
|
-
const cwd = process.cwd().replace(/\\/g, '/');
|
|
41
|
-
if (filePath.startsWith(cwd)) {
|
|
42
|
-
filePath = path_1.default.relative(cwd, filePath).replace(/\\/g, '/');
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
return filePath;
|
|
46
|
-
}
|
|
47
|
-
// Convert namespace path to file path
|
|
48
|
-
const fileName = namespaceToFileName(filePath);
|
|
21
|
+
const fileName = namespaceToFileName(t.file);
|
|
49
22
|
return fileName;
|
|
50
23
|
}
|
|
51
24
|
}
|
|
52
25
|
module.exports = CSharpAdapter;
|
|
53
26
|
function namespaceToFileName(fileName) {
|
|
54
|
-
if (!fileName)
|
|
55
|
-
return '';
|
|
56
|
-
// If already a .cs file path, clean it up
|
|
57
|
-
if (fileName.endsWith('.cs')) {
|
|
58
|
-
return fileName.replace(/\\/g, '/');
|
|
59
|
-
}
|
|
60
27
|
const fileParts = fileName.split('.');
|
|
61
28
|
fileParts[fileParts.length - 1] = fileParts[fileParts.length - 1]?.replace(/\$.*/, '');
|
|
62
|
-
return `${fileParts.join(
|
|
29
|
+
return `${fileParts.join(path_1.default.sep)}.cs`;
|
|
63
30
|
}
|
package/lib/pipe/debug.js
CHANGED
|
@@ -18,7 +18,7 @@ class DebugPipe {
|
|
|
18
18
|
this.isEnabled = !!process.env.TESTOMATIO_DEBUG || !!process.env.DEBUG;
|
|
19
19
|
if (this.isEnabled) {
|
|
20
20
|
this.batch = {
|
|
21
|
-
isEnabled: this.params.isBatchEnabled ??
|
|
21
|
+
isEnabled: this.params.isBatchEnabled ?? !process.env.TESTOMATIO_DISABLE_BATCH_UPLOAD ?? true,
|
|
22
22
|
intervalFunction: null,
|
|
23
23
|
intervalTime: 5000,
|
|
24
24
|
tests: [],
|
package/lib/pipe/testomatio.js
CHANGED
|
@@ -23,7 +23,7 @@ if (process.env.TESTOMATIO_RUN)
|
|
|
23
23
|
class TestomatioPipe {
|
|
24
24
|
constructor(params, store) {
|
|
25
25
|
this.batch = {
|
|
26
|
-
isEnabled: params?.isBatchEnabled ??
|
|
26
|
+
isEnabled: params?.isBatchEnabled ?? !process.env.TESTOMATIO_DISABLE_BATCH_UPLOAD ?? true,
|
|
27
27
|
intervalFunction: null, // will be created in createRun by setInterval function
|
|
28
28
|
intervalTime: 5000, // how often tests are sent
|
|
29
29
|
tests: [], // array of tests in batch
|
|
@@ -60,7 +60,7 @@ class TestomatioPipe {
|
|
|
60
60
|
retry: constants_js_1.REPORTER_REQUEST_RETRIES.retriesPerRequest,
|
|
61
61
|
retryDelay: constants_js_1.REPORTER_REQUEST_RETRIES.retryTimeout,
|
|
62
62
|
httpMethodsToRetry: ['GET', 'PUT', 'HEAD', 'OPTIONS', 'DELETE', 'POST'],
|
|
63
|
-
shouldRetry: error => {
|
|
63
|
+
shouldRetry: (error) => {
|
|
64
64
|
if (!error.response)
|
|
65
65
|
return false;
|
|
66
66
|
switch (error.response?.status) {
|
|
@@ -73,8 +73,8 @@ class TestomatioPipe {
|
|
|
73
73
|
break;
|
|
74
74
|
}
|
|
75
75
|
return error.response?.status >= 401; // Retry on 401+ and 5xx
|
|
76
|
-
}
|
|
77
|
-
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
78
|
});
|
|
79
79
|
this.isEnabled = true;
|
|
80
80
|
// do not finish this run (for parallel testing)
|
|
@@ -193,7 +193,7 @@ class TestomatioPipe {
|
|
|
193
193
|
method: 'PUT',
|
|
194
194
|
url: `/api/reporter/${this.runId}`,
|
|
195
195
|
data: runParams,
|
|
196
|
-
responseType: 'json'
|
|
196
|
+
responseType: 'json'
|
|
197
197
|
});
|
|
198
198
|
if (resp.data.artifacts)
|
|
199
199
|
(0, pipe_utils_js_1.setS3Credentials)(resp.data.artifacts);
|
|
@@ -206,7 +206,7 @@ class TestomatioPipe {
|
|
|
206
206
|
url: '/api/reporter',
|
|
207
207
|
data: runParams,
|
|
208
208
|
maxContentLength: Infinity,
|
|
209
|
-
responseType: 'json'
|
|
209
|
+
responseType: 'json'
|
|
210
210
|
});
|
|
211
211
|
this.runId = resp.data.uid;
|
|
212
212
|
this.runUrl = `${this.url}/${resp.data.url.split('/').splice(3).join('/')}`;
|
|
@@ -259,17 +259,15 @@ class TestomatioPipe {
|
|
|
259
259
|
this.#formatData(data);
|
|
260
260
|
const json = json_cycle_1.default.stringify(data);
|
|
261
261
|
debug('Adding test', json);
|
|
262
|
-
return this.client
|
|
263
|
-
.request({
|
|
262
|
+
return this.client.request({
|
|
264
263
|
method: 'POST',
|
|
265
264
|
url: `/api/reporter/${this.runId}/testrun`,
|
|
266
265
|
data: json,
|
|
267
266
|
headers: {
|
|
268
267
|
'Content-Type': 'application/json',
|
|
269
268
|
},
|
|
270
|
-
maxContentLength: Infinity
|
|
271
|
-
})
|
|
272
|
-
.catch(err => {
|
|
269
|
+
maxContentLength: Infinity
|
|
270
|
+
}).catch(err => {
|
|
273
271
|
this.requestFailures++;
|
|
274
272
|
this.notReportedTestsCount++;
|
|
275
273
|
if (err.response) {
|
|
@@ -314,21 +312,19 @@ class TestomatioPipe {
|
|
|
314
312
|
// get tests from batch and clear batch
|
|
315
313
|
const testsToSend = this.batch.tests.splice(0);
|
|
316
314
|
debug('π¨ Batch upload', testsToSend.length, 'tests');
|
|
317
|
-
return this.client
|
|
318
|
-
.request({
|
|
315
|
+
return this.client.request({
|
|
319
316
|
method: 'POST',
|
|
320
317
|
url: `/api/reporter/${this.runId}/testrun`,
|
|
321
318
|
data: {
|
|
322
319
|
api_key: this.apiKey,
|
|
323
320
|
tests: testsToSend,
|
|
324
|
-
batch_index: this.batch.batchIndex
|
|
321
|
+
batch_index: this.batch.batchIndex
|
|
325
322
|
},
|
|
326
323
|
headers: {
|
|
327
324
|
'Content-Type': 'application/json',
|
|
328
325
|
},
|
|
329
|
-
maxContentLength: Infinity
|
|
330
|
-
})
|
|
331
|
-
.catch(err => {
|
|
326
|
+
maxContentLength: Infinity
|
|
327
|
+
}).catch(err => {
|
|
332
328
|
this.requestFailures++;
|
|
333
329
|
this.notReportedTestsCount += testsToSend.length;
|
|
334
330
|
if (err.response) {
|
|
@@ -412,7 +408,7 @@ class TestomatioPipe {
|
|
|
412
408
|
status_event,
|
|
413
409
|
detach: params.detach,
|
|
414
410
|
tests: params.tests,
|
|
415
|
-
}
|
|
411
|
+
}
|
|
416
412
|
});
|
|
417
413
|
if (this.runUrl) {
|
|
418
414
|
console.log(constants_js_1.APP_PREFIX, 'π Report Saved. Report URL:', picocolors_1.default.magenta(this.runUrl));
|
|
@@ -424,7 +420,7 @@ class TestomatioPipe {
|
|
|
424
420
|
if (this.runUrl && this.proceed) {
|
|
425
421
|
const notFinishedMessage = picocolors_1.default.yellow(picocolors_1.default.bold('Run was not finished because of $TESTOMATIO_PROCEED'));
|
|
426
422
|
console.log(constants_js_1.APP_PREFIX, `π ${notFinishedMessage}. Report URL: ${picocolors_1.default.magenta(this.runUrl)}`);
|
|
427
|
-
console.log(constants_js_1.APP_PREFIX, `π¬ Run to finish it: TESTOMATIO_RUN=${this.runId} npx
|
|
423
|
+
console.log(constants_js_1.APP_PREFIX, `π¬ Run to finish it: TESTOMATIO_RUN=${this.runId} npx start-test-run --finish`);
|
|
428
424
|
}
|
|
429
425
|
if (this.hasUnmatchedTests) {
|
|
430
426
|
console.log('');
|
package/lib/reporter.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
export { Client };
|
|
2
|
+
export const STATUS: {
|
|
3
|
+
PASSED: string;
|
|
4
|
+
FAILED: string;
|
|
5
|
+
SKIPPED: string;
|
|
6
|
+
FINISHED: string;
|
|
7
|
+
};
|
|
1
8
|
export const artifact: (data: string | {
|
|
2
9
|
path: string;
|
|
3
10
|
type: string;
|
|
@@ -80,7 +87,7 @@ export const label: (key: string, value?: string | null) => void;
|
|
|
80
87
|
export const linkTest: (...testIds: string[]) => void;
|
|
81
88
|
export const linkJira: (...jiraIds: string[]) => void;
|
|
82
89
|
declare namespace _default {
|
|
83
|
-
let testomatioLogger: {
|
|
90
|
+
export let testomatioLogger: {
|
|
84
91
|
"__#13@#originalUserLogger": {
|
|
85
92
|
assert(condition?: boolean, ...data: any[]): void;
|
|
86
93
|
assert(value: any, message?: string, ...optionalParams: any[]): void;
|
|
@@ -148,13 +155,13 @@ declare namespace _default {
|
|
|
148
155
|
}): void;
|
|
149
156
|
prettyObjects: boolean;
|
|
150
157
|
};
|
|
151
|
-
let artifact: (data: string | {
|
|
158
|
+
export let artifact: (data: string | {
|
|
152
159
|
path: string;
|
|
153
160
|
type: string;
|
|
154
161
|
name: string;
|
|
155
162
|
}, context?: any) => void;
|
|
156
|
-
let log: (...args: any[]) => void;
|
|
157
|
-
let logger: {
|
|
163
|
+
export let log: (...args: any[]) => void;
|
|
164
|
+
export let logger: {
|
|
158
165
|
"__#13@#originalUserLogger": {
|
|
159
166
|
assert(condition?: boolean, ...data: any[]): void;
|
|
160
167
|
assert(value: any, message?: string, ...optionalParams: any[]): void;
|
|
@@ -222,13 +229,15 @@ declare namespace _default {
|
|
|
222
229
|
}): void;
|
|
223
230
|
prettyObjects: boolean;
|
|
224
231
|
};
|
|
225
|
-
let meta: (keyValue: {
|
|
232
|
+
export let meta: (keyValue: {
|
|
226
233
|
[key: string]: string;
|
|
227
234
|
} | string, value?: string | null) => void;
|
|
228
|
-
let step: (message: string) => void;
|
|
229
|
-
let label: (key: string, value?: string | null) => void;
|
|
230
|
-
let linkTest: (...testIds: string[]) => void;
|
|
231
|
-
let linkJira: (...jiraIds: string[]) => void;
|
|
235
|
+
export let step: (message: string) => void;
|
|
236
|
+
export let label: (key: string, value?: string | null) => void;
|
|
237
|
+
export let linkTest: (...testIds: string[]) => void;
|
|
238
|
+
export let linkJira: (...jiraIds: string[]) => void;
|
|
239
|
+
export { Client as TestomatioClient };
|
|
240
|
+
export { STATUS };
|
|
232
241
|
}
|
|
233
242
|
export default _default;
|
|
234
243
|
export type ArtifactFunction = typeof import("./reporter-functions.js").default.artifact;
|
|
@@ -237,3 +246,4 @@ export type LoggerService = typeof import("./services/index.js").services.logger
|
|
|
237
246
|
export type MetaFunction = typeof import("./reporter-functions.js").default.keyValue;
|
|
238
247
|
export type StepFunction = typeof import("./reporter-functions.js").default.step;
|
|
239
248
|
export type LabelFunction = typeof import("./reporter-functions.js").default.label;
|
|
249
|
+
import Client from './client.js';
|
package/lib/reporter.js
CHANGED
|
@@ -1,13 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.linkJira = exports.linkTest = exports.label = exports.step = exports.meta = exports.logger = exports.log = exports.artifact = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
39
|
+
exports.linkJira = exports.linkTest = exports.label = exports.step = exports.meta = exports.logger = exports.log = exports.artifact = exports.STATUS = exports.Client = void 0;
|
|
40
|
+
const client_js_1 = __importDefault(require("./client.js"));
|
|
41
|
+
exports.Client = client_js_1.default;
|
|
42
|
+
const TestomatioConstants = __importStar(require("./constants.js"));
|
|
9
43
|
const index_js_1 = require("./services/index.js");
|
|
10
44
|
const reporter_functions_js_1 = __importDefault(require("./reporter-functions.js"));
|
|
45
|
+
exports.STATUS = TestomatioConstants.STATUS;
|
|
11
46
|
exports.artifact = reporter_functions_js_1.default.artifact;
|
|
12
47
|
exports.log = reporter_functions_js_1.default.log;
|
|
13
48
|
exports.logger = index_js_1.services.logger;
|
|
@@ -37,6 +72,6 @@ module.exports = {
|
|
|
37
72
|
label: reporter_functions_js_1.default.label,
|
|
38
73
|
linkTest: reporter_functions_js_1.default.linkTest,
|
|
39
74
|
linkJira: reporter_functions_js_1.default.linkJira,
|
|
40
|
-
|
|
41
|
-
|
|
75
|
+
TestomatioClient: client_js_1.default,
|
|
76
|
+
STATUS: exports.STATUS,
|
|
42
77
|
};
|