@dev-blinq/cucumber-js 1.0.96 → 1.0.97-stage
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/bin/download-install.js +14 -2
- package/lib/cli/validate_node_engine_version.js +3 -1
- package/lib/cli/validate_node_engine_version.js.map +1 -1
- package/lib/formatter/api.js +7 -1
- package/lib/formatter/api.js.map +1 -1
- package/lib/formatter/bvt_analysis_formatter.d.ts +11 -1
- package/lib/formatter/bvt_analysis_formatter.js +132 -51
- package/lib/formatter/bvt_analysis_formatter.js.map +1 -1
- package/lib/formatter/feature_data_format.js +0 -1
- package/lib/formatter/feature_data_format.js.map +1 -1
- package/lib/formatter/helpers/constants.d.ts +6 -0
- package/lib/formatter/helpers/constants.js +13 -3
- package/lib/formatter/helpers/constants.js.map +1 -1
- package/lib/formatter/helpers/report_generator.d.ts +13 -1
- package/lib/formatter/helpers/report_generator.js +186 -21
- package/lib/formatter/helpers/report_generator.js.map +1 -1
- package/lib/formatter/helpers/upload_serivce.d.ts +14 -1
- package/lib/formatter/helpers/upload_serivce.js +55 -6
- package/lib/formatter/helpers/upload_serivce.js.map +1 -1
- package/lib/formatter/helpers/uploader.js +11 -14
- package/lib/formatter/helpers/uploader.js.map +1 -1
- package/lib/formatter/summary_formatter.js +4 -0
- package/lib/formatter/summary_formatter.js.map +1 -1
- package/lib/runtime/test_case_runner.d.ts +1 -0
- package/lib/runtime/test_case_runner.js +10 -1
- package/lib/runtime/test_case_runner.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +3 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ActionEvents = exports.SERVICES_URI = exports.STAGE = exports.PROD = exports.DEV = exports.LOCAL = void 0;
|
|
3
|
+
exports.ActionEvents = exports.SERVICES_URI = exports.CUSTOM = exports.STAGE = exports.PROD = exports.DEV = exports.LOCAL = void 0;
|
|
4
4
|
exports.LOCAL = {
|
|
5
5
|
SSO: 'http://localhost:5000/api/auth',
|
|
6
6
|
WORKSPACE: 'http://localhost:6000/api/workspace',
|
|
@@ -25,13 +25,23 @@ exports.STAGE = {
|
|
|
25
25
|
RUNS: 'https://stage.api.blinq.io/api/runs',
|
|
26
26
|
STORAGE: 'https://stage.api.blinq.io/api/storage',
|
|
27
27
|
};
|
|
28
|
+
exports.CUSTOM = {
|
|
29
|
+
SSO: `${process.env.NODE_ENV_BLINQ}/api/auth`,
|
|
30
|
+
WORKSPACE: `${process.env.NODE_ENV_BLINQ}/api/workspace`,
|
|
31
|
+
RUNS: `${process.env.NODE_ENV_BLINQ}/api/runs`,
|
|
32
|
+
STORAGE: `${process.env.NODE_ENV_BLINQ}/api/storage`,
|
|
33
|
+
};
|
|
28
34
|
exports.SERVICES_URI = process.env.NODE_ENV_BLINQ === 'local'
|
|
29
35
|
? exports.LOCAL // eslint-disable-line
|
|
30
36
|
: process.env.NODE_ENV_BLINQ === 'dev'
|
|
31
37
|
? exports.DEV // eslint-disable-line
|
|
32
38
|
: process.env.NODE_ENV_BLINQ === 'stage'
|
|
33
|
-
? exports.STAGE
|
|
34
|
-
:
|
|
39
|
+
? exports.STAGE // eslint-disable-line
|
|
40
|
+
: process.env.NODE_ENV_BLINQ === 'prod'
|
|
41
|
+
? exports.PROD // eslint-disable-line
|
|
42
|
+
: !process.env.NODE_ENV_BLINQ
|
|
43
|
+
? exports.PROD // eslint-disable-line
|
|
44
|
+
: exports.CUSTOM; // eslint-disable-line
|
|
35
45
|
var ActionEvents;
|
|
36
46
|
(function (ActionEvents) {
|
|
37
47
|
ActionEvents["record_scenario"] = "record_scenario";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/formatter/helpers/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,KAAK,GAAG;IACnB,GAAG,EAAE,gCAAgC;IACrC,SAAS,EAAE,qCAAqC;IAChD,IAAI,EAAE,gCAAgC;IACtC,OAAO,EAAE,mCAAmC;CAC7C,CAAA;AACY,QAAA,GAAG,GAAG;IACjB,GAAG,EAAE,mCAAmC;IACxC,SAAS,EAAE,wCAAwC;IACnD,IAAI,EAAE,mCAAmC;IACzC,OAAO,EAAE,sCAAsC;CAChD,CAAA;AACY,QAAA,IAAI,GAAG;IAClB,GAAG,EAAE,+BAA+B;IACpC,SAAS,EAAE,oCAAoC;IAC/C,IAAI,EAAE,+BAA+B;IACrC,OAAO,EAAE,kCAAkC;CAC5C,CAAA;AACY,QAAA,KAAK,GAAG;IACnB,GAAG,EAAE,qCAAqC;IAC1C,SAAS,EAAE,0CAA0C;IACrD,IAAI,EAAE,qCAAqC;IAC3C,OAAO,EAAE,wCAAwC;CAClD,CAAA;AAEY,QAAA,YAAY,GACvB,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;IACpC,CAAC,CAAC,aAAK,CAAC,sBAAsB;IAC9B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,KAAK;QACtC,CAAC,CAAC,WAAG,CAAC,sBAAsB;QAC5B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;YACxC,CAAC,CAAC,aAAK;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/formatter/helpers/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,KAAK,GAAG;IACnB,GAAG,EAAE,gCAAgC;IACrC,SAAS,EAAE,qCAAqC;IAChD,IAAI,EAAE,gCAAgC;IACtC,OAAO,EAAE,mCAAmC;CAC7C,CAAA;AACY,QAAA,GAAG,GAAG;IACjB,GAAG,EAAE,mCAAmC;IACxC,SAAS,EAAE,wCAAwC;IACnD,IAAI,EAAE,mCAAmC;IACzC,OAAO,EAAE,sCAAsC;CAChD,CAAA;AACY,QAAA,IAAI,GAAG;IAClB,GAAG,EAAE,+BAA+B;IACpC,SAAS,EAAE,oCAAoC;IAC/C,IAAI,EAAE,+BAA+B;IACrC,OAAO,EAAE,kCAAkC;CAC5C,CAAA;AACY,QAAA,KAAK,GAAG;IACnB,GAAG,EAAE,qCAAqC;IAC1C,SAAS,EAAE,0CAA0C;IACrD,IAAI,EAAE,qCAAqC;IAC3C,OAAO,EAAE,wCAAwC;CAClD,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW;IAC7C,SAAS,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,gBAAgB;IACxD,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,WAAW;IAC9C,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,cAAc;CACrD,CAAA;AAEY,QAAA,YAAY,GACvB,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;IACpC,CAAC,CAAC,aAAK,CAAC,sBAAsB;IAC9B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,KAAK;QACtC,CAAC,CAAC,WAAG,CAAC,sBAAsB;QAC5B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,OAAO;YACxC,CAAC,CAAC,aAAK,CAAC,sBAAsB;YAC9B,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,MAAM;gBACvC,CAAC,CAAC,YAAI,CAAC,sBAAsB;gBAC7B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;oBAC7B,CAAC,CAAC,YAAI,CAAC,sBAAsB;oBAC7B,CAAC,CAAC,cAAM,CAAA,CAAC,sBAAsB;AAEnC,IAAY,YAaX;AAbD,WAAY,YAAY;IACtB,mDAAmC,CAAA;IACnC,mDAAmC,CAAA;IACnC,+CAA+B,CAAA;IAC/B,+DAA+C,CAAA;IAC/C,yDAAyC,CAAA;IACzC,qDAAqC,CAAA;IACrC,uDAAuC,CAAA;IACvC,+CAA+B,CAAA;IAC/B,uDAAuC,CAAA;IACvC,uDAAuC,CAAA;IACvC,+CAA+B,CAAA;IAC/B,+CAA+B,CAAA;AACjC,CAAC,EAbW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAavB","sourcesContent":["export const LOCAL = {\n SSO: 'http://localhost:5000/api/auth',\n WORKSPACE: 'http://localhost:6000/api/workspace',\n RUNS: 'http://localhost:5001/api/runs',\n STORAGE: 'http://localhost:5050/api/storage',\n}\nexport const DEV = {\n SSO: 'https://dev.api.blinq.io/api/auth',\n WORKSPACE: 'https://dev.api.blinq.io/api/workspace',\n RUNS: 'https://dev.api.blinq.io/api/runs',\n STORAGE: 'https://dev.api.blinq.io/api/storage',\n}\nexport const PROD = {\n SSO: 'https://api.blinq.io/api/auth',\n WORKSPACE: 'https://api.blinq.io/api/workspace',\n RUNS: 'https://api.blinq.io/api/runs',\n STORAGE: 'https://api.blinq.io/api/storage',\n}\nexport const STAGE = {\n SSO: 'https://stage.api.blinq.io/api/auth',\n WORKSPACE: 'https://stage.api.blinq.io/api/workspace',\n RUNS: 'https://stage.api.blinq.io/api/runs',\n STORAGE: 'https://stage.api.blinq.io/api/storage',\n}\n\nexport const CUSTOM = {\n SSO: `${process.env.NODE_ENV_BLINQ}/api/auth`,\n WORKSPACE: `${process.env.NODE_ENV_BLINQ}/api/workspace`,\n RUNS: `${process.env.NODE_ENV_BLINQ}/api/runs`,\n STORAGE: `${process.env.NODE_ENV_BLINQ}/api/storage`,\n}\n\nexport const SERVICES_URI =\n process.env.NODE_ENV_BLINQ === 'local'\n ? LOCAL // eslint-disable-line\n : process.env.NODE_ENV_BLINQ === 'dev'\n ? DEV // eslint-disable-line\n : process.env.NODE_ENV_BLINQ === 'stage'\n ? STAGE // eslint-disable-line\n : process.env.NODE_ENV_BLINQ === 'prod'\n ? PROD // eslint-disable-line\n : !process.env.NODE_ENV_BLINQ\n ? PROD // eslint-disable-line\n : CUSTOM // eslint-disable-line\n\nexport enum ActionEvents {\n record_scenario = 'record_scenario',\n download_editor = 'download_editor',\n launch_editor = 'launch_editor',\n click_start_recording = 'click_start_recording',\n click_run_scenario = 'click_run_scenario',\n publish_scenario = 'publish_scenario',\n click_ai_generate = 'click_ai_generate',\n click_run_all = 'click_run_all',\n click_open_vscode = 'click_open_vscode',\n error_open_vscode = 'error_open_vscode',\n cli_run_tests = 'cli_run_tests',\n upload_report = 'upload_report',\n}\n"]}
|
|
@@ -65,6 +65,10 @@ export type JsonStep = {
|
|
|
65
65
|
webLog: webLog[];
|
|
66
66
|
networkData: any[];
|
|
67
67
|
data?: any;
|
|
68
|
+
ariaSnapshot: string;
|
|
69
|
+
traceFilePath?: string;
|
|
70
|
+
brunoData?: any;
|
|
71
|
+
interceptResults?: any;
|
|
68
72
|
};
|
|
69
73
|
export type RetrainStats = {
|
|
70
74
|
result: JsonTestResult;
|
|
@@ -81,8 +85,10 @@ export type JsonTestProgress = {
|
|
|
81
85
|
steps: JsonStep[];
|
|
82
86
|
result: JsonTestResult;
|
|
83
87
|
retrainStats?: RetrainStats;
|
|
88
|
+
initialAriaSnapshot?: string;
|
|
84
89
|
webLog: any;
|
|
85
90
|
networkLog: any;
|
|
91
|
+
logFileId?: string;
|
|
86
92
|
env: {
|
|
87
93
|
name: string;
|
|
88
94
|
baseUrl: string;
|
|
@@ -117,9 +123,13 @@ export default class ReportGenerator {
|
|
|
117
123
|
private stepLogs;
|
|
118
124
|
private stepNetworkLogs;
|
|
119
125
|
private runName;
|
|
126
|
+
private ariaSnapshot;
|
|
127
|
+
private initialAriaSnapshot;
|
|
128
|
+
private testCaseLog;
|
|
129
|
+
private loggingOverridden;
|
|
120
130
|
reportFolder: null | string;
|
|
121
131
|
private uploadService;
|
|
122
|
-
handleMessage(envelope: EnvelopeWithMetaMessage): Promise<
|
|
132
|
+
handleMessage(envelope: EnvelopeWithMetaMessage | messages.Envelope, reRunId?: string): Promise<any>;
|
|
123
133
|
getReport(): JsonReport;
|
|
124
134
|
private handleParseError;
|
|
125
135
|
private onGherkinDocument;
|
|
@@ -137,7 +147,9 @@ export default class ReportGenerator {
|
|
|
137
147
|
getLogFileContent(): any;
|
|
138
148
|
private getTestCaseResult;
|
|
139
149
|
private onTestCaseFinished;
|
|
150
|
+
private readonly retryCount;
|
|
140
151
|
private uploadTestCase;
|
|
152
|
+
private tryUpload;
|
|
141
153
|
private writeTestCaseReportToDisk;
|
|
142
154
|
private onTestRunFinished;
|
|
143
155
|
}
|
|
@@ -31,13 +31,20 @@ const messages = __importStar(require("@cucumber/messages"));
|
|
|
31
31
|
const fs_1 = __importDefault(require("fs"));
|
|
32
32
|
const path_1 = __importDefault(require("path"));
|
|
33
33
|
const upload_serivce_1 = require("./upload_serivce");
|
|
34
|
+
const fs_extra_1 = require("fs-extra");
|
|
35
|
+
// type JsonException = messages.Exception
|
|
36
|
+
const object_path_1 = __importDefault(require("object-path"));
|
|
34
37
|
const URL = process.env.NODE_ENV_BLINQ === 'dev'
|
|
35
38
|
? 'https://dev.api.blinq.io/api/runs'
|
|
36
39
|
: process.env.NODE_ENV_BLINQ === 'local'
|
|
37
40
|
? 'http://localhost:5001/api/runs'
|
|
38
41
|
: process.env.NODE_ENV_BLINQ === 'stage'
|
|
39
42
|
? 'https://stage.api.blinq.io/api/runs'
|
|
40
|
-
:
|
|
43
|
+
: process.env.NODE_ENV_BLINQ === 'prod'
|
|
44
|
+
? 'https://api.blinq.io/api/runs'
|
|
45
|
+
: !process.env.NODE_ENV_BLINQ
|
|
46
|
+
? 'https://api.blinq.io/api/runs'
|
|
47
|
+
: `${process.env.NODE_ENV_BLINQ}/api/runs`;
|
|
41
48
|
const REPORT_SERVICE_URL = (_a = process.env.REPORT_SERVICE_URL) !== null && _a !== void 0 ? _a : URL;
|
|
42
49
|
const BATCH_SIZE = 10;
|
|
43
50
|
const MAX_RETRIES = 3;
|
|
@@ -67,11 +74,16 @@ class ReportGenerator {
|
|
|
67
74
|
this.stepLogs = [];
|
|
68
75
|
this.stepNetworkLogs = [];
|
|
69
76
|
this.runName = '';
|
|
77
|
+
this.ariaSnapshot = '';
|
|
78
|
+
this.initialAriaSnapshot = '';
|
|
79
|
+
this.testCaseLog = [];
|
|
80
|
+
this.loggingOverridden = false; // Flag to track if logging is overridden
|
|
70
81
|
this.reportFolder = null;
|
|
71
82
|
this.uploadService = new upload_serivce_1.RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);
|
|
83
|
+
this.retryCount = 3;
|
|
72
84
|
}
|
|
73
|
-
async handleMessage(envelope) {
|
|
74
|
-
if (envelope.meta && envelope.meta
|
|
85
|
+
async handleMessage(envelope, reRunId) {
|
|
86
|
+
if (envelope.meta && 'runName' in envelope.meta) {
|
|
75
87
|
this.runName = envelope.meta.runName;
|
|
76
88
|
}
|
|
77
89
|
const type = Object.keys(envelope)[0];
|
|
@@ -98,10 +110,30 @@ class ReportGenerator {
|
|
|
98
110
|
case 'testRunStarted': {
|
|
99
111
|
const testRunStarted = envelope[type];
|
|
100
112
|
this.onTestRunStarted(testRunStarted);
|
|
113
|
+
await this.uploadService.createStatus('running');
|
|
101
114
|
break;
|
|
102
115
|
}
|
|
103
116
|
case 'testCase': {
|
|
104
117
|
const testCase = envelope[type];
|
|
118
|
+
// Initialize the log storage
|
|
119
|
+
this.testCaseLog = [];
|
|
120
|
+
if (!this.loggingOverridden) {
|
|
121
|
+
this.loggingOverridden = true;
|
|
122
|
+
// Store the original process.stdout.write, and process.stderr.write
|
|
123
|
+
const originalStdoutWrite = process.stdout.write;
|
|
124
|
+
const originalStderrWrite = process.stderr.write;
|
|
125
|
+
// Override process.stdout.write
|
|
126
|
+
process.stdout.write = (chunk, ...args) => {
|
|
127
|
+
this.testCaseLog.push(chunk.toString());
|
|
128
|
+
return originalStdoutWrite.call(process.stdout, chunk, ...args);
|
|
129
|
+
};
|
|
130
|
+
// Override process.stderr.write
|
|
131
|
+
process.stderr.write = (chunk, ...args) => {
|
|
132
|
+
this.testCaseLog.push(chunk.toString());
|
|
133
|
+
return originalStderrWrite.call(process.stderr, chunk, ...args);
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// Call the onTestCase method
|
|
105
137
|
this.onTestCase(testCase);
|
|
106
138
|
break;
|
|
107
139
|
}
|
|
@@ -127,13 +159,14 @@ class ReportGenerator {
|
|
|
127
159
|
}
|
|
128
160
|
case 'testCaseFinished': {
|
|
129
161
|
const testCaseFinished = envelope[type];
|
|
130
|
-
|
|
131
|
-
|
|
162
|
+
// Call the onTestCaseFinished method
|
|
163
|
+
const result = await this.onTestCaseFinished(testCaseFinished, reRunId);
|
|
164
|
+
return result;
|
|
132
165
|
}
|
|
133
166
|
// case "hook": { break} // After Hook
|
|
134
167
|
case 'testRunFinished': {
|
|
135
168
|
const testRunFinished = envelope[type];
|
|
136
|
-
this.onTestRunFinished(testRunFinished);
|
|
169
|
+
await this.onTestRunFinished(testRunFinished);
|
|
137
170
|
break;
|
|
138
171
|
}
|
|
139
172
|
// case "parameterType" : { break}
|
|
@@ -266,6 +299,8 @@ class ReportGenerator {
|
|
|
266
299
|
},
|
|
267
300
|
networkData: [],
|
|
268
301
|
webLog: [],
|
|
302
|
+
data: {},
|
|
303
|
+
ariaSnapshot: this.ariaSnapshot,
|
|
269
304
|
});
|
|
270
305
|
return this.stepReportMap.get(pickleStep.id);
|
|
271
306
|
});
|
|
@@ -308,6 +343,14 @@ class ReportGenerator {
|
|
|
308
343
|
this.reportFolder = body.replaceAll('\\', '/');
|
|
309
344
|
return;
|
|
310
345
|
}
|
|
346
|
+
if (mediaType === 'application/json+snapshot-before') {
|
|
347
|
+
this.initialAriaSnapshot = body;
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (mediaType === 'application/json+snapshot-after') {
|
|
351
|
+
this.ariaSnapshot = body;
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
311
354
|
if (mediaType === 'application/json+env') {
|
|
312
355
|
const data = JSON.parse(body);
|
|
313
356
|
this.report.env = data;
|
|
@@ -337,8 +380,30 @@ class ReportGenerator {
|
|
|
337
380
|
const command = JSON.parse(body);
|
|
338
381
|
stepProgess.commands.push(command);
|
|
339
382
|
}
|
|
383
|
+
else if (mediaType === 'application/json+trace') {
|
|
384
|
+
const data = JSON.parse(body);
|
|
385
|
+
stepProgess.traceFilePath = data.traceFilePath;
|
|
386
|
+
}
|
|
387
|
+
if (mediaType === 'application/json+bruno') {
|
|
388
|
+
try {
|
|
389
|
+
const data = JSON.parse(body);
|
|
390
|
+
stepProgess.brunoData = data;
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
console.error('Error parsing bruno data:', error);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (mediaType === 'application/json+intercept-results') {
|
|
397
|
+
try {
|
|
398
|
+
const data = JSON.parse(body);
|
|
399
|
+
stepProgess.interceptResults = data;
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
console.error('Error parsing intercept results:', error);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
340
405
|
}
|
|
341
|
-
getFailedTestStepResult({ commands, startTime, endTime, result }) {
|
|
406
|
+
getFailedTestStepResult({ commands, startTime, endTime, result, }) {
|
|
342
407
|
for (const command of commands) {
|
|
343
408
|
if (command.result.status === 'FAILED') {
|
|
344
409
|
return {
|
|
@@ -404,7 +469,7 @@ class ReportGenerator {
|
|
|
404
469
|
commands: stepProgess.commands,
|
|
405
470
|
startTime: prevStepResult.startTime,
|
|
406
471
|
endTime: this.getTimeStamp(timestamp),
|
|
407
|
-
result: testStepResult
|
|
472
|
+
result: testStepResult,
|
|
408
473
|
});
|
|
409
474
|
}
|
|
410
475
|
else {
|
|
@@ -416,11 +481,56 @@ class ReportGenerator {
|
|
|
416
481
|
}
|
|
417
482
|
stepProgess.webLog = this.stepLogs;
|
|
418
483
|
stepProgess.networkData = this.stepNetworkLogs;
|
|
484
|
+
stepProgess.ariaSnapshot = this.ariaSnapshot;
|
|
485
|
+
this.ariaSnapshot = '';
|
|
419
486
|
this.stepNetworkLogs = [];
|
|
420
487
|
this.stepLogs = [];
|
|
421
488
|
if (Object.keys(data).length > 0) {
|
|
422
489
|
stepProgess.data = data;
|
|
490
|
+
const id = testStepFinished.testCaseStartedId;
|
|
491
|
+
const parameters = this.testCaseReportMap.get(id).parameters;
|
|
492
|
+
const _parameters = {};
|
|
493
|
+
Object.keys(parameters).map((key) => {
|
|
494
|
+
var _a;
|
|
495
|
+
if (parameters[key].startsWith('{{') &&
|
|
496
|
+
parameters[key].endsWith('}}')) {
|
|
497
|
+
const path = parameters[key].slice(2, -2).split('.');
|
|
498
|
+
let value = String((_a = object_path_1.default.get(data, path)) !== null && _a !== void 0 ? _a : parameters[key]);
|
|
499
|
+
if (value) {
|
|
500
|
+
if (value.startsWith('secret:')) {
|
|
501
|
+
value = 'secret:****';
|
|
502
|
+
}
|
|
503
|
+
else if (value.startsWith('totp:')) {
|
|
504
|
+
value = 'totp:****';
|
|
505
|
+
}
|
|
506
|
+
else if (value.startsWith('mask:')) {
|
|
507
|
+
value = 'mask:****';
|
|
508
|
+
}
|
|
509
|
+
_parameters[key] = value;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
else {
|
|
513
|
+
_parameters[key] = parameters[key];
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
this.report.testCases.find((testCase) => {
|
|
517
|
+
return testCase.id === id;
|
|
518
|
+
}).parameters = _parameters;
|
|
423
519
|
}
|
|
520
|
+
// if (process.env.TESTCASE_REPORT_FOLDER_PATH) {
|
|
521
|
+
// this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH
|
|
522
|
+
// if (!fs.existsSync(this.reportFolder)) {
|
|
523
|
+
// fs.mkdirSync(this.reportFolder)
|
|
524
|
+
// }
|
|
525
|
+
// const reportFilePath = path.join(
|
|
526
|
+
// this.reportFolder,
|
|
527
|
+
// `report.json`
|
|
528
|
+
// )
|
|
529
|
+
// writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))
|
|
530
|
+
// return undefined
|
|
531
|
+
// // } else {
|
|
532
|
+
// // return await this.uploadTestCase(testProgress, reRunId)
|
|
533
|
+
// }
|
|
424
534
|
}
|
|
425
535
|
getLogFileContent() {
|
|
426
536
|
let projectPath = process.cwd();
|
|
@@ -468,24 +578,74 @@ class ReportGenerator {
|
|
|
468
578
|
status: 'PASSED',
|
|
469
579
|
};
|
|
470
580
|
}
|
|
471
|
-
async onTestCaseFinished(testCaseFinished) {
|
|
581
|
+
async onTestCaseFinished(testCaseFinished, reRunId) {
|
|
472
582
|
const { testCaseStartedId, timestamp } = testCaseFinished;
|
|
473
583
|
const testProgress = this.testCaseReportMap.get(testCaseStartedId);
|
|
474
584
|
const prevResult = testProgress.result;
|
|
475
585
|
const steps = Object.values(testProgress.steps);
|
|
476
586
|
const result = this.getTestCaseResult(steps);
|
|
587
|
+
if (result.status === 'PASSED' && reRunId) {
|
|
588
|
+
this.uploadService.updateProjectAnalytics(process.env.PROJECT_ID);
|
|
589
|
+
}
|
|
590
|
+
const endTime = this.getTimeStamp(timestamp);
|
|
477
591
|
testProgress.result = {
|
|
478
592
|
...result,
|
|
479
593
|
startTime: prevResult.startTime,
|
|
480
|
-
endTime
|
|
594
|
+
endTime,
|
|
481
595
|
};
|
|
482
596
|
testProgress.webLog = this.logs;
|
|
483
597
|
testProgress.networkLog = this.networkLog;
|
|
598
|
+
testProgress.initialAriaSnapshot = this.initialAriaSnapshot;
|
|
599
|
+
this.initialAriaSnapshot = '';
|
|
484
600
|
this.networkLog = [];
|
|
485
601
|
this.logs = [];
|
|
486
|
-
|
|
602
|
+
if (this.testCaseLog && this.testCaseLog.length > 0) {
|
|
603
|
+
// Create the logs directory
|
|
604
|
+
const logsDir = path_1.default.join(this.reportFolder, 'editorLogs');
|
|
605
|
+
const fileName = `testCaseLog_${testCaseStartedId}.log`;
|
|
606
|
+
const filePath = path_1.default.join(logsDir, fileName);
|
|
607
|
+
// Ensure the logs directory exists
|
|
608
|
+
fs_1.default.mkdirSync(logsDir, { recursive: true });
|
|
609
|
+
// Write the logs to the file
|
|
610
|
+
fs_1.default.writeFileSync(filePath, this.testCaseLog.join('\n'), 'utf8');
|
|
611
|
+
// Store this ID in the testProgress object so it can be accessed later
|
|
612
|
+
testProgress.logFileId = testCaseStartedId;
|
|
613
|
+
}
|
|
614
|
+
this.testCaseLog = [];
|
|
615
|
+
if (process.env.TESTCASE_REPORT_FOLDER_PATH) {
|
|
616
|
+
this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH;
|
|
617
|
+
if (!fs_1.default.existsSync(this.reportFolder)) {
|
|
618
|
+
fs_1.default.mkdirSync(this.reportFolder);
|
|
619
|
+
}
|
|
620
|
+
const reportFilePath = path_1.default.join(this.reportFolder, `${endTime}_${testProgress.scenarioName}.json`);
|
|
621
|
+
(0, fs_extra_1.writeFileSync)(reportFilePath, JSON.stringify(testProgress, null, 2));
|
|
622
|
+
return undefined;
|
|
623
|
+
}
|
|
624
|
+
else {
|
|
625
|
+
return await this.uploadTestCase(testProgress, reRunId);
|
|
626
|
+
}
|
|
487
627
|
}
|
|
488
|
-
async uploadTestCase(testCase) {
|
|
628
|
+
async uploadTestCase(testCase, rerunId) {
|
|
629
|
+
let data = null;
|
|
630
|
+
for (let attempt = 1; attempt <= this.retryCount; attempt++) {
|
|
631
|
+
try {
|
|
632
|
+
data = await this.tryUpload(testCase, rerunId);
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
catch (e) {
|
|
636
|
+
console.error(`Attempt ${attempt} to upload testcase failed:`, e);
|
|
637
|
+
if (attempt === this.retryCount) {
|
|
638
|
+
console.error('All retry attempts failed, failed to upload testcase.');
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
const waitTime = 1000 * 2 ** (attempt - 1); //? exponential backoff: 1s, 2s, 4s...
|
|
642
|
+
await new Promise((r) => setTimeout(r, waitTime));
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
return data;
|
|
647
|
+
}
|
|
648
|
+
async tryUpload(testCase, rerunId) {
|
|
489
649
|
let runId = '';
|
|
490
650
|
let projectId = '';
|
|
491
651
|
if (!process.env.UPLOADING_TEST_CASE) {
|
|
@@ -511,11 +671,9 @@ class ReportGenerator {
|
|
|
511
671
|
process.env.PROJECT_ID = projectId;
|
|
512
672
|
}
|
|
513
673
|
}
|
|
514
|
-
await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder);
|
|
674
|
+
const data = await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder, rerunId);
|
|
515
675
|
this.writeTestCaseReportToDisk(testCase);
|
|
516
|
-
|
|
517
|
-
catch (e) {
|
|
518
|
-
console.error('Error uploading test case:', e);
|
|
676
|
+
return data;
|
|
519
677
|
}
|
|
520
678
|
finally {
|
|
521
679
|
const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE);
|
|
@@ -524,23 +682,29 @@ class ReportGenerator {
|
|
|
524
682
|
}
|
|
525
683
|
}
|
|
526
684
|
writeTestCaseReportToDisk(testCase) {
|
|
685
|
+
var _a;
|
|
686
|
+
const reportFolder = (_a = this.reportFolder) !== null && _a !== void 0 ? _a : process.env.TESTCASE_REPORT_FOLDER_PATH;
|
|
687
|
+
if (!reportFolder) {
|
|
688
|
+
console.error('Report folder is not defined');
|
|
689
|
+
return;
|
|
690
|
+
}
|
|
527
691
|
try {
|
|
528
692
|
let i = 0;
|
|
529
|
-
while (fs_1.default.existsSync(path_1.default.join(
|
|
693
|
+
while (fs_1.default.existsSync(path_1.default.join(reportFolder, `${i}`))) {
|
|
530
694
|
i++;
|
|
531
695
|
}
|
|
532
|
-
fs_1.default.mkdirSync(path_1.default.join(
|
|
696
|
+
fs_1.default.mkdirSync(path_1.default.join(reportFolder, `${i}`));
|
|
533
697
|
//exclude network log from the saved report
|
|
534
698
|
const networkLog = testCase.networkLog;
|
|
535
699
|
delete testCase.networkLog;
|
|
536
|
-
fs_1.default.writeFileSync(path_1.default.join(
|
|
537
|
-
fs_1.default.writeFileSync(path_1.default.join(
|
|
700
|
+
fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `report.json`), JSON.stringify(testCase, null, 2));
|
|
701
|
+
fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));
|
|
538
702
|
}
|
|
539
703
|
catch (error) {
|
|
540
704
|
console.error('Error writing test case report to disk:', error);
|
|
541
705
|
}
|
|
542
706
|
}
|
|
543
|
-
onTestRunFinished(testRunFinished) {
|
|
707
|
+
async onTestRunFinished(testRunFinished) {
|
|
544
708
|
const { timestamp, success, message } = testRunFinished;
|
|
545
709
|
const prevResult = this.report.result;
|
|
546
710
|
this.report.result = {
|
|
@@ -550,6 +714,7 @@ class ReportGenerator {
|
|
|
550
714
|
message,
|
|
551
715
|
// exception,
|
|
552
716
|
};
|
|
717
|
+
await this.uploadService.createStatus(success ? 'passed' : 'failed');
|
|
553
718
|
}
|
|
554
719
|
}
|
|
555
720
|
exports.default = ReportGenerator;
|