@dev-blinq/cucumber-js 1.0.172-dev → 1.0.174-dev

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.
@@ -1,40 +1,40 @@
1
- import * as messages from "@cucumber/messages";
1
+ import * as messages from '@cucumber/messages';
2
2
  type JsonTimestamp = number;
3
- type JsonStepType = "Unknown" | "Context" | "Action" | "Outcome" | "Conjunction";
3
+ type JsonStepType = 'Unknown' | 'Context' | 'Action' | 'Outcome' | 'Conjunction';
4
4
  export type JsonResultUnknown = {
5
- status: "UNKNOWN";
5
+ status: 'UNKNOWN';
6
6
  };
7
7
  type JsonResultSkipped = {
8
- status: "SKIPPED";
8
+ status: 'SKIPPED';
9
9
  };
10
10
  type JsonResultUndefined = {
11
- status: "UNDEFINED";
11
+ status: 'UNDEFINED';
12
12
  };
13
13
  type JsonResultAmbiguous = {
14
- status: "AMBIGUOUS";
14
+ status: 'AMBIGUOUS';
15
15
  };
16
16
  export type JsonResultStarted = {
17
- status: "STARTED";
17
+ status: 'STARTED';
18
18
  startTime: JsonTimestamp;
19
19
  };
20
20
  type JsonResultPending = {
21
- status: "PENDING";
21
+ status: 'PENDING';
22
22
  startTime: JsonTimestamp;
23
23
  endTime: JsonTimestamp;
24
24
  };
25
25
  export type JsonResultPassed = {
26
- status: "PASSED";
26
+ status: 'PASSED';
27
27
  startTime: JsonTimestamp;
28
28
  endTime: JsonTimestamp;
29
29
  };
30
30
  export type JsonResultFailed = {
31
- status: "FAILED";
31
+ status: 'FAILED';
32
32
  startTime: JsonTimestamp;
33
33
  endTime: JsonTimestamp;
34
34
  message?: string;
35
35
  };
36
36
  export type JsonFixedByAi = {
37
- status: "FIXED_BY_AI";
37
+ status: 'FIXED_BY_AI';
38
38
  startTime: JsonTimestamp;
39
39
  endTime: JsonTimestamp;
40
40
  };
@@ -146,7 +146,9 @@ export default class ReportGenerator {
146
146
  getLogFileContent(): any;
147
147
  private getTestCaseResult;
148
148
  private onTestCaseFinished;
149
+ private readonly retryCount;
149
150
  private uploadTestCase;
151
+ private tryUpload;
150
152
  private writeTestCaseReportToDisk;
151
153
  private onTestRunFinished;
152
154
  }
@@ -34,16 +34,16 @@ const upload_serivce_1 = require("./upload_serivce");
34
34
  const fs_extra_1 = require("fs-extra");
35
35
  // type JsonException = messages.Exception
36
36
  const object_path_1 = __importDefault(require("object-path"));
37
- const URL = process.env.NODE_ENV_BLINQ === "dev"
38
- ? "https://dev.api.blinq.io/api/runs"
39
- : process.env.NODE_ENV_BLINQ === "local"
40
- ? "http://localhost:5001/api/runs"
41
- : process.env.NODE_ENV_BLINQ === "stage"
42
- ? "https://stage.api.blinq.io/api/runs"
43
- : process.env.NODE_ENV_BLINQ === "prod"
44
- ? "https://api.blinq.io/api/runs"
37
+ const URL = process.env.NODE_ENV_BLINQ === 'dev'
38
+ ? 'https://dev.api.blinq.io/api/runs'
39
+ : process.env.NODE_ENV_BLINQ === 'local'
40
+ ? 'http://localhost:5001/api/runs'
41
+ : process.env.NODE_ENV_BLINQ === 'stage'
42
+ ? 'https://stage.api.blinq.io/api/runs'
43
+ : process.env.NODE_ENV_BLINQ === 'prod'
44
+ ? 'https://api.blinq.io/api/runs'
45
45
  : !process.env.NODE_ENV_BLINQ
46
- ? "https://api.blinq.io/api/runs"
46
+ ? 'https://api.blinq.io/api/runs'
47
47
  : `${process.env.NODE_ENV_BLINQ}/api/runs`;
48
48
  const REPORT_SERVICE_URL = (_a = process.env.REPORT_SERVICE_URL) !== null && _a !== void 0 ? _a : URL;
49
49
  const BATCH_SIZE = 10;
@@ -53,12 +53,12 @@ class ReportGenerator {
53
53
  constructor() {
54
54
  this.report = {
55
55
  result: {
56
- status: "UNKNOWN",
56
+ status: 'UNKNOWN',
57
57
  },
58
58
  testCases: [],
59
59
  env: {
60
- name: "",
61
- baseUrl: "",
60
+ name: '',
61
+ baseUrl: '',
62
62
  },
63
63
  };
64
64
  this.gherkinDocumentMap = new Map();
@@ -73,45 +73,47 @@ class ReportGenerator {
73
73
  this.networkLog = [];
74
74
  this.stepLogs = [];
75
75
  this.stepNetworkLogs = [];
76
- this.runName = "";
77
- this.ariaSnapshot = "";
78
- this.initialAriaSnapshot = "";
76
+ this.runName = '';
77
+ this.ariaSnapshot = '';
78
+ this.initialAriaSnapshot = '';
79
79
  this.testCaseLog = [];
80
80
  this.loggingOverridden = false; // Flag to track if logging is overridden
81
81
  this.reportFolder = null;
82
82
  this.uploadService = new upload_serivce_1.RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);
83
+ this.retryCount = 3;
83
84
  }
84
85
  async handleMessage(envelope, reRunId) {
85
- if (envelope.meta && "runName" in envelope.meta) {
86
+ if (envelope.meta && 'runName' in envelope.meta) {
86
87
  this.runName = envelope.meta.runName;
87
88
  }
88
89
  const type = Object.keys(envelope)[0];
89
90
  switch (type) {
90
91
  // case "meta": { break}
91
92
  // case "source": { break}
92
- case "parseError": {
93
+ case 'parseError': {
93
94
  const parseError = envelope[type];
94
95
  this.handleParseError(parseError);
95
96
  break;
96
97
  }
97
- case "gherkinDocument": {
98
+ case 'gherkinDocument': {
98
99
  const doc = envelope[type];
99
100
  this.onGherkinDocument(doc);
100
101
  break;
101
102
  }
102
- case "pickle": {
103
+ case 'pickle': {
103
104
  const pickle = envelope[type];
104
105
  this.onPickle(pickle);
105
106
  break;
106
107
  }
107
108
  // case "stepDefinition": { break}
108
109
  // case "hook": { break} // Before Hook
109
- case "testRunStarted": {
110
+ case 'testRunStarted': {
110
111
  const testRunStarted = envelope[type];
111
112
  this.onTestRunStarted(testRunStarted);
113
+ await this.uploadService.createStatus('running');
112
114
  break;
113
115
  }
114
- case "testCase": {
116
+ case 'testCase': {
115
117
  const testCase = envelope[type];
116
118
  // Initialize the log storage
117
119
  this.testCaseLog = [];
@@ -135,36 +137,36 @@ class ReportGenerator {
135
137
  this.onTestCase(testCase);
136
138
  break;
137
139
  }
138
- case "testCaseStarted": {
140
+ case 'testCaseStarted': {
139
141
  const testCaseStarted = envelope[type];
140
142
  this.onTestCaseStarted(testCaseStarted);
141
143
  break;
142
144
  }
143
- case "testStepStarted": {
145
+ case 'testStepStarted': {
144
146
  const testStepStarted = envelope[type];
145
147
  this.onTestStepStarted(testStepStarted);
146
148
  break;
147
149
  }
148
- case "attachment": {
150
+ case 'attachment': {
149
151
  const attachment = envelope[type];
150
152
  this.onAttachment(attachment);
151
153
  break;
152
154
  }
153
- case "testStepFinished": {
155
+ case 'testStepFinished': {
154
156
  const testStepFinished = envelope[type];
155
157
  this.onTestStepFinished(testStepFinished);
156
158
  break;
157
159
  }
158
- case "testCaseFinished": {
160
+ case 'testCaseFinished': {
159
161
  const testCaseFinished = envelope[type];
160
162
  // Call the onTestCaseFinished method
161
163
  const result = await this.onTestCaseFinished(testCaseFinished, reRunId);
162
164
  return result;
163
165
  }
164
166
  // case "hook": { break} // After Hook
165
- case "testRunFinished": {
167
+ case 'testRunFinished': {
166
168
  const testRunFinished = envelope[type];
167
- this.onTestRunFinished(testRunFinished);
169
+ await this.onTestRunFinished(testRunFinished);
168
170
  break;
169
171
  }
170
172
  // case "parameterType" : { break}
@@ -178,7 +180,7 @@ class ReportGenerator {
178
180
  const { message } = parseError;
179
181
  const timestamp = new Date().getTime();
180
182
  this.report.result = {
181
- status: "FAILED",
183
+ status: 'FAILED',
182
184
  startTime: timestamp,
183
185
  endTime: timestamp,
184
186
  message: message,
@@ -221,7 +223,7 @@ class ReportGenerator {
221
223
  }
222
224
  onTestRunStarted(testRunStarted) {
223
225
  this.report.result = {
224
- status: "STARTED",
226
+ status: 'STARTED',
225
227
  startTime: this.getTimeStamp(testRunStarted.timestamp),
226
228
  };
227
229
  }
@@ -254,7 +256,8 @@ class ReportGenerator {
254
256
  for (const tableRow of examples.tableBody) {
255
257
  if (tableRow.id === exampleId) {
256
258
  for (let i = 0; i < examples.tableHeader.cells.length; i++) {
257
- parameters[examples.tableHeader.cells[i].value] = tableRow.cells[i].value;
259
+ parameters[examples.tableHeader.cells[i].value] =
260
+ tableRow.cells[i].value;
258
261
  }
259
262
  }
260
263
  }
@@ -292,7 +295,7 @@ class ReportGenerator {
292
295
  text: step.text,
293
296
  commands: [],
294
297
  result: {
295
- status: "UNKNOWN",
298
+ status: 'UNKNOWN',
296
299
  },
297
300
  networkData: [],
298
301
  webLog: [],
@@ -309,7 +312,7 @@ class ReportGenerator {
309
312
  parameters,
310
313
  steps,
311
314
  result: {
312
- status: "STARTED",
315
+ status: 'STARTED',
313
316
  startTime: this.getTimeStamp(timestamp),
314
317
  },
315
318
  webLog: [],
@@ -330,25 +333,25 @@ class ReportGenerator {
330
333
  return;
331
334
  const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
332
335
  stepProgess.result = {
333
- status: "STARTED",
336
+ status: 'STARTED',
334
337
  startTime: this.getTimeStamp(timestamp),
335
338
  };
336
339
  }
337
340
  onAttachment(attachment) {
338
341
  const { testStepId, body, mediaType } = attachment;
339
- if (mediaType === "text/plain") {
340
- this.reportFolder = body.replaceAll("\\", "/");
342
+ if (mediaType === 'text/plain') {
343
+ this.reportFolder = body.replaceAll('\\', '/');
341
344
  return;
342
345
  }
343
- if (mediaType === "application/json+snapshot-before") {
346
+ if (mediaType === 'application/json+snapshot-before') {
344
347
  this.initialAriaSnapshot = body;
345
348
  return;
346
349
  }
347
- if (mediaType === "application/json+snapshot-after") {
350
+ if (mediaType === 'application/json+snapshot-after') {
348
351
  this.ariaSnapshot = body;
349
352
  return;
350
353
  }
351
- if (mediaType === "application/json+env") {
354
+ if (mediaType === 'application/json+env') {
352
355
  const data = JSON.parse(body);
353
356
  this.report.env = data;
354
357
  this.report.testCases.map((testCase) => {
@@ -356,14 +359,14 @@ class ReportGenerator {
356
359
  return testCase;
357
360
  });
358
361
  }
359
- if (mediaType === "application/json+log") {
362
+ if (mediaType === 'application/json+log') {
360
363
  const log = JSON.parse(body);
361
364
  if (this.logs.length < 1000) {
362
365
  this.logs.push(log);
363
366
  this.stepLogs.push(log);
364
367
  }
365
368
  }
366
- if (mediaType === "application/json+network") {
369
+ if (mediaType === 'application/json+network') {
367
370
  const networkLog = JSON.parse(body);
368
371
  if (this.networkLog.length < 1000)
369
372
  this.networkLog.push(networkLog);
@@ -373,29 +376,29 @@ class ReportGenerator {
373
376
  if (testStep.pickleStepId === undefined)
374
377
  return;
375
378
  const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
376
- if (mediaType === "application/json") {
379
+ if (mediaType === 'application/json') {
377
380
  const command = JSON.parse(body);
378
381
  stepProgess.commands.push(command);
379
382
  }
380
- else if (mediaType === "application/json+trace") {
383
+ else if (mediaType === 'application/json+trace') {
381
384
  const data = JSON.parse(body);
382
385
  stepProgess.traceFilePath = data.traceFilePath;
383
386
  }
384
- if (mediaType === "application/json+bruno") {
387
+ if (mediaType === 'application/json+bruno') {
385
388
  try {
386
389
  const data = JSON.parse(body);
387
390
  stepProgess.brunoData = data;
388
391
  }
389
392
  catch (error) {
390
- console.error("Error parsing bruno data:", error);
393
+ console.error('Error parsing bruno data:', error);
391
394
  }
392
395
  }
393
396
  }
394
397
  getFailedTestStepResult({ commands, startTime, endTime, result, }) {
395
398
  for (const command of commands) {
396
- if (command.result.status === "FAILED") {
399
+ if (command.result.status === 'FAILED') {
397
400
  return {
398
- status: "FAILED",
401
+ status: 'FAILED',
399
402
  message: command.result.message,
400
403
  startTime,
401
404
  endTime,
@@ -403,7 +406,7 @@ class ReportGenerator {
403
406
  }
404
407
  }
405
408
  return {
406
- status: "FAILED",
409
+ status: 'FAILED',
407
410
  startTime,
408
411
  endTime,
409
412
  message: result.message,
@@ -413,26 +416,26 @@ class ReportGenerator {
413
416
  const { testStepId, testStepResult, timestamp } = testStepFinished;
414
417
  const testStep = this.testStepMap.get(testStepId);
415
418
  if (testStep.pickleStepId === undefined) {
416
- if (testStepResult.status === "FAILED") {
419
+ if (testStepResult.status === 'FAILED') {
417
420
  console.error(`Before/After hook failed with message: ${testStepResult.message}`);
418
421
  }
419
422
  return;
420
423
  }
421
- if (testStepResult.status === "UNDEFINED") {
424
+ if (testStepResult.status === 'UNDEFINED') {
422
425
  const step = this.stepReportMap.get(testStep.pickleStepId);
423
- const stepName = step ? step.keyword + " " + step.text : "Undefined step";
426
+ const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step';
424
427
  const undefinedCommand = {
425
428
  testStepId: testStepId,
426
429
  body: JSON.stringify({
427
- type: "error",
428
- text: "Undefined step: " + stepName,
430
+ type: 'error',
431
+ text: 'Undefined step: ' + stepName,
429
432
  result: {
430
- status: "FAILED",
433
+ status: 'FAILED',
431
434
  startTime: this.getTimeStamp(timestamp),
432
435
  endTime: this.getTimeStamp(timestamp),
433
436
  },
434
437
  }),
435
- mediaType: "application/json",
438
+ mediaType: 'application/json',
436
439
  contentEncoding: messages.AttachmentContentEncoding.IDENTITY,
437
440
  };
438
441
  this.onAttachment(undefinedCommand);
@@ -445,14 +448,14 @@ class ReportGenerator {
445
448
  if (reportFolder === null) {
446
449
  throw new Error('"reportFolder" is "null". Failed to run BVT hooks. Please retry after running "Generate All" or "Record Scenario" ');
447
450
  }
448
- if (fs_1.default.existsSync(path_1.default.join(reportFolder, "data.json"))) {
449
- data = JSON.parse(fs_1.default.readFileSync(path_1.default.join(reportFolder, "data.json"), "utf8"));
451
+ if (fs_1.default.existsSync(path_1.default.join(reportFolder, 'data.json'))) {
452
+ data = JSON.parse(fs_1.default.readFileSync(path_1.default.join(reportFolder, 'data.json'), 'utf8'));
450
453
  }
451
454
  }
452
455
  catch (error) {
453
- console.log("Error reading data.json");
456
+ console.log('Error reading data.json');
454
457
  }
455
- if (testStepResult.status === "FAILED") {
458
+ if (testStepResult.status === 'FAILED') {
456
459
  stepProgess.result = this.getFailedTestStepResult({
457
460
  commands: stepProgess.commands,
458
461
  startTime: prevStepResult.startTime,
@@ -470,7 +473,7 @@ class ReportGenerator {
470
473
  stepProgess.webLog = this.stepLogs;
471
474
  stepProgess.networkData = this.stepNetworkLogs;
472
475
  stepProgess.ariaSnapshot = this.ariaSnapshot;
473
- this.ariaSnapshot = "";
476
+ this.ariaSnapshot = '';
474
477
  this.stepNetworkLogs = [];
475
478
  this.stepLogs = [];
476
479
  if (Object.keys(data).length > 0) {
@@ -479,18 +482,19 @@ class ReportGenerator {
479
482
  const parameters = this.testCaseReportMap.get(id).parameters;
480
483
  const _parameters = {};
481
484
  Object.keys(parameters).map((key) => {
482
- if (parameters[key].startsWith("{{") && parameters[key].endsWith("}}")) {
483
- const path = parameters[key].slice(2, -2).split(".");
485
+ if (parameters[key].startsWith('{{') &&
486
+ parameters[key].endsWith('}}')) {
487
+ const path = parameters[key].slice(2, -2).split('.');
484
488
  let value = String(object_path_1.default.get(data, path));
485
489
  if (value) {
486
- if (value.startsWith("secret:")) {
487
- value = "secret:****";
490
+ if (value.startsWith('secret:')) {
491
+ value = 'secret:****';
488
492
  }
489
- else if (value.startsWith("totp:")) {
490
- value = "totp:****";
493
+ else if (value.startsWith('totp:')) {
494
+ value = 'totp:****';
491
495
  }
492
- else if (value.startsWith("mask:")) {
493
- value = "mask:****";
496
+ else if (value.startsWith('mask:')) {
497
+ value = 'mask:****';
494
498
  }
495
499
  _parameters[key] = value;
496
500
  }
@@ -523,7 +527,7 @@ class ReportGenerator {
523
527
  if (process.env.PROJECT_PATH) {
524
528
  projectPath = process.env.PROJECT_PATH;
525
529
  }
526
- const logFolder = path_1.default.join(projectPath, "logs", "web");
530
+ const logFolder = path_1.default.join(projectPath, 'logs', 'web');
527
531
  if (!fs_1.default.existsSync(logFolder)) {
528
532
  return [];
529
533
  }
@@ -535,7 +539,7 @@ class ReportGenerator {
535
539
  return [];
536
540
  }
537
541
  try {
538
- const logFileContent = fs_1.default.readFileSync(path_1.default.join(logFolder, `${nextId - 1}.json`), "utf8");
542
+ const logFileContent = fs_1.default.readFileSync(path_1.default.join(logFolder, `${nextId - 1}.json`), 'utf8');
539
543
  return JSON.parse(logFileContent);
540
544
  }
541
545
  catch (error) {
@@ -545,23 +549,23 @@ class ReportGenerator {
545
549
  getTestCaseResult(steps) {
546
550
  for (const step of steps) {
547
551
  switch (step.result.status) {
548
- case "FAILED":
552
+ case 'FAILED':
549
553
  return {
550
554
  status: step.result.status,
551
555
  message: step.result.message,
552
556
  // exception: step.result.exception,
553
557
  };
554
- case "AMBIGUOUS":
555
- case "UNDEFINED":
556
- case "PENDING":
558
+ case 'AMBIGUOUS':
559
+ case 'UNDEFINED':
560
+ case 'PENDING':
557
561
  return {
558
- status: "FAILED",
562
+ status: 'FAILED',
559
563
  message: `step "${step.text}" is ${step.result.status}`,
560
564
  };
561
565
  }
562
566
  }
563
567
  return {
564
- status: "PASSED",
568
+ status: 'PASSED',
565
569
  };
566
570
  }
567
571
  async onTestCaseFinished(testCaseFinished, reRunId) {
@@ -579,7 +583,7 @@ class ReportGenerator {
579
583
  testProgress.webLog = this.logs;
580
584
  testProgress.networkLog = this.networkLog;
581
585
  testProgress.initialAriaSnapshot = this.initialAriaSnapshot;
582
- this.initialAriaSnapshot = "";
586
+ this.initialAriaSnapshot = '';
583
587
  this.networkLog = [];
584
588
  this.logs = [];
585
589
  if (this.testCaseLog && this.testCaseLog.length > 0) {
@@ -609,18 +613,39 @@ class ReportGenerator {
609
613
  }
610
614
  }
611
615
  async uploadTestCase(testCase, rerunId) {
612
- let runId = "";
613
- let projectId = "";
616
+ let data = null;
617
+ for (let attempt = 1; attempt <= this.retryCount; attempt++) {
618
+ try {
619
+ data = await this.tryUpload(testCase, rerunId);
620
+ break;
621
+ }
622
+ catch (e) {
623
+ console.error(`Attempt ${attempt} to upload testcase failed:`, e);
624
+ if (attempt === this.retryCount) {
625
+ console.error('All retry attempts failed, failed to upload testcase.');
626
+ }
627
+ else {
628
+ const waitTime = 1000 * 2 ** (attempt - 1); //? exponential backoff: 1s, 2s, 4s...
629
+ await new Promise((r) => setTimeout(r, waitTime));
630
+ }
631
+ }
632
+ }
633
+ return data;
634
+ }
635
+ async tryUpload(testCase, rerunId) {
636
+ let runId = '';
637
+ let projectId = '';
614
638
  if (!process.env.UPLOADING_TEST_CASE) {
615
- process.env.UPLOADING_TEST_CASE = "[]";
639
+ process.env.UPLOADING_TEST_CASE = '[]';
616
640
  }
617
641
  const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE);
618
642
  const randomID = Math.random().toString(36).substring(7);
619
643
  anyRemArr.push(randomID);
620
- let data;
621
644
  process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr);
622
645
  try {
623
- if (process.env.RUN_ID && process.env.PROJECT_ID && !process.env.IGNORE_ENV_VARIABLES) {
646
+ if (process.env.RUN_ID &&
647
+ process.env.PROJECT_ID &&
648
+ !process.env.IGNORE_ENV_VARIABLES) {
624
649
  runId = process.env.RUN_ID;
625
650
  projectId = process.env.PROJECT_ID;
626
651
  }
@@ -633,24 +658,21 @@ class ReportGenerator {
633
658
  process.env.PROJECT_ID = projectId;
634
659
  }
635
660
  }
636
- data = await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder, rerunId);
661
+ const data = await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder, rerunId);
637
662
  this.writeTestCaseReportToDisk(testCase);
638
- }
639
- catch (e) {
640
- console.error("Error uploading test case:", e);
663
+ return data;
641
664
  }
642
665
  finally {
643
666
  const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE);
644
667
  arrRem.splice(arrRem.indexOf(randomID), 1);
645
668
  process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem);
646
669
  }
647
- return data ? data : null;
648
670
  }
649
671
  writeTestCaseReportToDisk(testCase) {
650
672
  var _a;
651
673
  const reportFolder = (_a = this.reportFolder) !== null && _a !== void 0 ? _a : process.env.TESTCASE_REPORT_FOLDER_PATH;
652
674
  if (!reportFolder) {
653
- console.error("Report folder is not defined");
675
+ console.error('Report folder is not defined');
654
676
  return;
655
677
  }
656
678
  try {
@@ -666,19 +688,20 @@ class ReportGenerator {
666
688
  fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));
667
689
  }
668
690
  catch (error) {
669
- console.error("Error writing test case report to disk:", error);
691
+ console.error('Error writing test case report to disk:', error);
670
692
  }
671
693
  }
672
- onTestRunFinished(testRunFinished) {
694
+ async onTestRunFinished(testRunFinished) {
673
695
  const { timestamp, success, message } = testRunFinished;
674
696
  const prevResult = this.report.result;
675
697
  this.report.result = {
676
- status: success ? "PASSED" : "FAILED",
698
+ status: success ? 'PASSED' : 'FAILED',
677
699
  startTime: prevResult.startTime,
678
700
  endTime: this.getTimeStamp(timestamp),
679
701
  message,
680
702
  // exception,
681
703
  };
704
+ await this.uploadService.createStatus(success ? 'passed' : 'failed');
682
705
  }
683
706
  }
684
707
  exports.default = ReportGenerator;
@@ -1 +1 @@
1
- {"version":3,"file":"report_generator.js","sourceRoot":"","sources":["../../../src/formatter/helpers/report_generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from \"@cucumber/messages\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { RunUploadService } from \"./upload_serivce\";\nimport { writeFileSync } from \"fs-extra\";\n// type JsonException = messages.Exception\nimport objectPath from \"object-path\";\ntype JsonTimestamp = number; //messages.Timestamp\ntype JsonStepType = \"Unknown\" | \"Context\" | \"Action\" | \"Outcome\" | \"Conjunction\";\n\nconst URL =\n process.env.NODE_ENV_BLINQ === \"dev\"\n ? \"https://dev.api.blinq.io/api/runs\"\n : process.env.NODE_ENV_BLINQ === \"local\"\n ? \"http://localhost:5001/api/runs\"\n : process.env.NODE_ENV_BLINQ === \"stage\"\n ? \"https://stage.api.blinq.io/api/runs\"\n : process.env.NODE_ENV_BLINQ === \"prod\"\n ? \"https://api.blinq.io/api/runs\"\n : !process.env.NODE_ENV_BLINQ\n ? \"https://api.blinq.io/api/runs\"\n : `${process.env.NODE_ENV_BLINQ}/api/runs`;\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL;\nconst BATCH_SIZE = 10;\nconst MAX_RETRIES = 3;\nconst REPORT_SERVICE_TOKEN = process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN;\nexport type JsonResultUnknown = {\n status: \"UNKNOWN\";\n};\ntype JsonResultSkipped = {\n status: \"SKIPPED\";\n};\ntype JsonResultUndefined = {\n status: \"UNDEFINED\";\n};\ntype JsonResultAmbiguous = {\n status: \"AMBIGUOUS\";\n};\nexport type JsonResultStarted = {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n};\ntype JsonResultPending = {\n status: \"PENDING\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n};\nexport type JsonResultPassed = {\n status: \"PASSED\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n};\nexport type JsonResultFailed = {\n status: \"FAILED\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n message?: string;\n // exception?: JsonException\n};\nexport type JsonFixedByAi = {\n status: \"FIXED_BY_AI\";\n startTime: JsonTimestamp;\n endTime: JsonTimestamp;\n};\n\ntype JsonCommandResult = JsonResultPassed | JsonResultFailed;\ntype JsonStepResult =\n | JsonResultUnknown\n | JsonResultSkipped\n | JsonResultUndefined\n | JsonResultAmbiguous\n | JsonResultStarted\n | JsonResultPending\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi;\nexport type JsonTestResult =\n | JsonResultUnknown\n | JsonResultStarted\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi;\ntype JsonReportResult = JsonTestResult;\n\ntype JsonCommand = {\n type: string;\n value?: string;\n text: string;\n screenshotId?: string;\n result: JsonCommandResult;\n netWorkLog?: any[];\n};\ntype webLog = {\n type: string;\n text: string;\n location: string;\n time: string;\n};\nexport type JsonStep = {\n keyword: string;\n type: JsonStepType;\n text: string;\n commands: JsonCommand[];\n result: JsonStepResult;\n webLog: webLog[];\n networkData: any[];\n data?: any;\n ariaSnapshot: string;\n traceFilePath?: string;\n brunoData?: any;\n};\nexport type RetrainStats = {\n result: JsonTestResult;\n totalSteps: number;\n upload_id: string;\n local_id: number;\n};\nexport type JsonTestProgress = {\n id: string;\n featureName: string;\n uri: string;\n scenarioName: string;\n parameters: Record<string, string>;\n steps: JsonStep[];\n result: JsonTestResult;\n retrainStats?: RetrainStats;\n initialAriaSnapshot?: string;\n webLog: any;\n networkLog: any;\n logFileId?: string; \n env: {\n name: string;\n baseUrl: string;\n };\n};\n\nexport type JsonReport = {\n testCases: JsonTestProgress[];\n result: JsonReportResult;\n env: {\n name: string;\n baseUrl: string;\n };\n};\n\ninterface MetaMessage extends messages.Meta {\n runName: string;\n}\ninterface EnvelopeWithMetaMessage extends messages.Envelope {\n meta: MetaMessage;\n}\nexport default class ReportGenerator {\n private report: JsonReport = {\n result: {\n status: \"UNKNOWN\",\n },\n testCases: [] as JsonTestProgress[],\n env: {\n name: \"\",\n baseUrl: \"\",\n },\n };\n private gherkinDocumentMap = new Map<string, messages.GherkinDocument>();\n private stepMap = new Map<string, messages.Step>();\n private pickleMap = new Map<string, messages.Pickle>();\n private testCaseMap = new Map<string, messages.TestCase>();\n private testStepMap = new Map<string, messages.TestStep>();\n private stepReportMap = new Map<string, JsonStep>();\n private testCaseReportMap = new Map<string, JsonTestProgress>();\n private scenarioIterationCountMap = new Map<string, number>();\n private logs: webLog[] = [];\n private networkLog: any[] = [];\n private stepLogs: webLog[] = [];\n private stepNetworkLogs: any[] = [];\n private runName = \"\";\n private ariaSnapshot = \"\";\n private initialAriaSnapshot = \"\";\n private testCaseLog: string[] = [];\n private loggingOverridden: boolean = false; // Flag to track if logging is overridden\n reportFolder: null | string = null;\n private uploadService = new RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);\n\n async handleMessage(envelope: EnvelopeWithMetaMessage | messages.Envelope, reRunId?: string): Promise<any> {\n if (envelope.meta && \"runName\" in envelope.meta) {\n this.runName = envelope.meta.runName;\n }\n const type = Object.keys(envelope)[0] as keyof messages.Envelope;\n switch (type) {\n // case \"meta\": { break}\n // case \"source\": { break}\n case \"parseError\": {\n const parseError = envelope[type];\n this.handleParseError(parseError);\n break;\n }\n case \"gherkinDocument\": {\n const doc = envelope[type];\n this.onGherkinDocument(doc);\n break;\n }\n case \"pickle\": {\n const pickle = envelope[type];\n this.onPickle(pickle);\n break;\n }\n // case \"stepDefinition\": { break}\n // case \"hook\": { break} // Before Hook\n case \"testRunStarted\": {\n const testRunStarted = envelope[type];\n this.onTestRunStarted(testRunStarted);\n break;\n }\n case \"testCase\": {\n const testCase = envelope[type];\n \n // Initialize the log storage\n this.testCaseLog = [];\n \n if (!this.loggingOverridden) {\n this.loggingOverridden = true;\n\n // Store the original process.stdout.write, and process.stderr.write\n const originalStdoutWrite = process.stdout.write;\n const originalStderrWrite = process.stderr.write;\n\n // Override process.stdout.write\n process.stdout.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString());\n return originalStdoutWrite.call(process.stdout, chunk, ...args);\n };\n\n // Override process.stderr.write\n process.stderr.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString());\n return originalStderrWrite.call(process.stderr, chunk, ...args);\n };\n }\n \n // Call the onTestCase method\n this.onTestCase(testCase);\n\n break;\n }\n case \"testCaseStarted\": {\n const testCaseStarted = envelope[type];\n this.onTestCaseStarted(testCaseStarted);\n break;\n }\n case \"testStepStarted\": {\n const testStepStarted = envelope[type];\n this.onTestStepStarted(testStepStarted);\n break;\n }\n case \"attachment\": {\n const attachment = envelope[type];\n this.onAttachment(attachment);\n break;\n }\n case \"testStepFinished\": {\n const testStepFinished = envelope[type];\n this.onTestStepFinished(testStepFinished);\n break;\n }\n case \"testCaseFinished\": {\n const testCaseFinished = envelope[type];\n \n // Call the onTestCaseFinished method\n const result = await this.onTestCaseFinished(testCaseFinished, reRunId); \n return result;\n }\n // case \"hook\": { break} // After Hook\n case \"testRunFinished\": {\n const testRunFinished = envelope[type];\n this.onTestRunFinished(testRunFinished);\n break;\n }\n\n // case \"parameterType\" : { break}\n // case \"undefinedParameterType\": { break}\n }\n }\n getReport() {\n return this.report;\n }\n private handleParseError(parseError: messages.ParseError) {\n const { message } = parseError;\n const timestamp = new Date().getTime();\n this.report.result = {\n status: \"FAILED\",\n startTime: timestamp,\n endTime: timestamp,\n message: message,\n };\n }\n\n private onGherkinDocument(doc: messages.GherkinDocument) {\n this.gherkinDocumentMap.set(doc.uri, doc);\n doc.feature.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n } else if (child.rule) {\n child.rule.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step);\n });\n }\n });\n }\n });\n }\n private onPickle(pickle: messages.Pickle) {\n this.pickleMap.set(pickle.id, pickle);\n }\n private getTimeStamp(timestamp: messages.Timestamp) {\n return timestamp.seconds * 1000 + timestamp.nanos / 1000000;\n }\n private onTestRunStarted(testRunStarted: messages.TestRunStarted) {\n this.report.result = {\n status: \"STARTED\",\n startTime: this.getTimeStamp(testRunStarted.timestamp),\n };\n }\n private onTestCase(testCase: messages.TestCase) {\n this.testCaseMap.set(testCase.id, testCase);\n testCase.testSteps.forEach((testStep) => {\n this.testStepMap.set(testStep.id, testStep);\n });\n }\n private _findScenario(doc: messages.GherkinDocument, scenarioId: string) {\n for (const child of doc.feature.children) {\n if (child.scenario && child.scenario.id === scenarioId) {\n return child.scenario;\n }\n if (child.rule) {\n for (const scenario of child.rule.children) {\n if (scenario.scenario && scenario.scenario.id === scenarioId) {\n return scenario.scenario;\n }\n }\n }\n }\n throw new Error(`scenario \"${scenarioId}\" not found`);\n }\n private _getParameters(scenario: messages.Scenario, exampleId: string) {\n const parameters: Record<string, string> = {};\n if (scenario.examples.length === 0) return parameters;\n for (const examples of scenario.examples) {\n for (const tableRow of examples.tableBody) {\n if (tableRow.id === exampleId) {\n for (let i = 0; i < examples.tableHeader.cells.length; i++) {\n parameters[examples.tableHeader.cells[i].value] = tableRow.cells[i].value;\n }\n }\n }\n }\n return parameters;\n }\n private onTestCaseStarted(testCaseStarted: messages.TestCaseStarted) {\n const { testCaseId, id, timestamp } = testCaseStarted;\n const testCase = this.testCaseMap.get(testCaseId);\n if (testCase === undefined) throw new Error(`testCase with id ${testCaseId} not found`);\n const pickle = this.pickleMap.get(testCase.pickleId);\n if (pickle === undefined) throw new Error(`pickle with id ${testCase.pickleId} not found`);\n\n const doc = this.gherkinDocumentMap.get(pickle.uri);\n if (doc === undefined) throw new Error(`gherkinDocument with uri ${pickle.uri} not found`);\n const featureName = doc.feature.name;\n\n const scenarioId = pickle.astNodeIds[0];\n const scenario = this._findScenario(doc, scenarioId);\n const scenarioName = scenario.name;\n if (!this.scenarioIterationCountMap.has(scenarioId)) {\n this.scenarioIterationCountMap.set(scenarioId, 1);\n }\n const parameters = this._getParameters(scenario, pickle.astNodeIds[1]);\n console.log(\n `Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(\n scenarioId\n )} with parameters:\\n${JSON.stringify(parameters, null, 4)}\\n \n `\n );\n this.scenarioIterationCountMap.set(scenarioId, this.scenarioIterationCountMap.get(scenarioId) + 1);\n const steps: JsonStep[] = pickle.steps.map((pickleStep) => {\n const stepId = pickleStep.astNodeIds[0];\n const step = this.stepMap.get(stepId);\n this.stepReportMap.set(pickleStep.id, {\n type: step.keywordType,\n keyword: step.keyword,\n text: step.text,\n commands: [],\n result: {\n status: \"UNKNOWN\",\n },\n networkData: [],\n webLog: [],\n data: {},\n ariaSnapshot: this.ariaSnapshot,\n });\n return this.stepReportMap.get(pickleStep.id);\n });\n this.testCaseReportMap.set(id, {\n id,\n uri: pickle.uri,\n featureName,\n scenarioName,\n parameters,\n steps,\n result: {\n status: \"STARTED\",\n startTime: this.getTimeStamp(timestamp),\n },\n webLog: [],\n networkLog: [],\n env: {\n name: this.report.env.name,\n baseUrl: this.report.env.baseUrl,\n },\n });\n this.report.testCases.push(this.testCaseReportMap.get(id));\n }\n private onTestStepStarted(testStepStarted: messages.TestStepStarted) {\n const { testStepId, timestamp } = testStepStarted;\n const testStep = this.testStepMap.get(testStepId);\n if (testStep === undefined) throw new Error(`testStep with id ${testStepId} not found`);\n if (testStep.pickleStepId === undefined) return;\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId);\n stepProgess.result = {\n status: \"STARTED\",\n startTime: this.getTimeStamp(timestamp),\n };\n }\n private onAttachment(attachment: messages.Attachment) {\n const { testStepId, body, mediaType } = attachment;\n if (mediaType === \"text/plain\") {\n this.reportFolder = body.replaceAll(\"\\\\\", \"/\");\n return;\n }\n if (mediaType === \"application/json+snapshot-before\") {\n this.initialAriaSnapshot = body;\n return;\n }\n if (mediaType === \"application/json+snapshot-after\") {\n this.ariaSnapshot = body;\n return;\n }\n if (mediaType === \"application/json+env\") {\n const data = JSON.parse(body);\n this.report.env = data;\n this.report.testCases.map((testCase) => {\n testCase.env = data;\n return testCase;\n });\n }\n if (mediaType === \"application/json+log\") {\n const log: webLog = JSON.parse(body);\n if (this.logs.length < 1000) {\n this.logs.push(log);\n this.stepLogs.push(log);\n }\n }\n if (mediaType === \"application/json+network\") {\n const networkLog = JSON.parse(body);\n if (this.networkLog.length < 1000) this.networkLog.push(networkLog);\n this.stepNetworkLogs.push(networkLog);\n }\n const testStep = this.testStepMap.get(testStepId);\n if (testStep.pickleStepId === undefined) return;\n\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId);\n if (mediaType === \"application/json\") {\n const command: JsonCommand = JSON.parse(body);\n stepProgess.commands.push(command);\n } else if (mediaType === \"application/json+trace\") {\n const data = JSON.parse(body);\n stepProgess.traceFilePath = data.traceFilePath;\n }\n\n if (mediaType === \"application/json+bruno\") {\n try {\n const data = JSON.parse(body);\n stepProgess.brunoData = data;\n } catch (error) {\n console.error(\"Error parsing bruno data:\", error);\n }\n }\n }\n private getFailedTestStepResult({\n commands,\n startTime,\n endTime,\n result,\n }: {\n commands: JsonCommand[];\n startTime: number;\n endTime: number;\n result: messages.TestStepResult;\n }): JsonStepResult {\n for (const command of commands) {\n if (command.result.status === \"FAILED\") {\n return {\n status: \"FAILED\",\n message: command.result.message,\n startTime,\n endTime,\n } as const;\n }\n }\n return {\n status: \"FAILED\",\n startTime,\n endTime,\n message: result.message,\n };\n }\n private onTestStepFinished(testStepFinished: messages.TestStepFinished) {\n const { testStepId, testStepResult, timestamp } = testStepFinished;\n const testStep = this.testStepMap.get(testStepId);\n if (testStep.pickleStepId === undefined) {\n if (testStepResult.status === \"FAILED\") {\n console.error(`Before/After hook failed with message: ${testStepResult.message}`);\n }\n return;\n }\n if (testStepResult.status === \"UNDEFINED\") {\n const step = this.stepReportMap.get(testStep.pickleStepId);\n const stepName = step ? step.keyword + \" \" + step.text : \"Undefined step\";\n const undefinedCommand: messages.Attachment = {\n testStepId: testStepId,\n body: JSON.stringify({\n type: \"error\",\n text: \"Undefined step: \" + stepName,\n result: {\n status: \"FAILED\",\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n }),\n mediaType: \"application/json\",\n contentEncoding: messages.AttachmentContentEncoding.IDENTITY,\n };\n this.onAttachment(undefinedCommand);\n }\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId);\n const prevStepResult = stepProgess.result as {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n };\n let data = {};\n try {\n const reportFolder = this.reportFolder;\n if (reportFolder === null) {\n throw new Error(\n '\"reportFolder\" is \"null\". Failed to run BVT hooks. Please retry after running \"Generate All\" or \"Record Scenario\" '\n );\n }\n if (fs.existsSync(path.join(reportFolder, \"data.json\"))) {\n data = JSON.parse(fs.readFileSync(path.join(reportFolder, \"data.json\"), \"utf8\"));\n }\n } catch (error) {\n console.log(\"Error reading data.json\");\n }\n if (testStepResult.status === \"FAILED\") {\n stepProgess.result = this.getFailedTestStepResult({\n commands: stepProgess.commands,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n result: testStepResult,\n });\n } else {\n stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n };\n }\n\n stepProgess.webLog = this.stepLogs;\n stepProgess.networkData = this.stepNetworkLogs;\n stepProgess.ariaSnapshot = this.ariaSnapshot;\n this.ariaSnapshot = \"\";\n this.stepNetworkLogs = [];\n this.stepLogs = [];\n if (Object.keys(data).length > 0) {\n stepProgess.data = data;\n const id = testStepFinished.testCaseStartedId;\n const parameters = this.testCaseReportMap.get(id).parameters;\n const _parameters: typeof parameters = {};\n Object.keys(parameters).map((key) => {\n if (parameters[key].startsWith(\"{{\") && parameters[key].endsWith(\"}}\")) {\n const path = parameters[key].slice(2, -2).split(\".\");\n let value = String(objectPath.get(data, path));\n if (value) {\n if (value.startsWith(\"secret:\")) {\n value = \"secret:****\";\n } else if (value.startsWith(\"totp:\")) {\n value = \"totp:****\";\n } else if (value.startsWith(\"mask:\")) {\n value = \"mask:****\";\n }\n _parameters[key] = value;\n }\n } else {\n _parameters[key] = parameters[key];\n }\n });\n this.report.testCases.find((testCase) => {\n return testCase.id === id;\n }).parameters = _parameters;\n }\n\n // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n // if (!fs.existsSync(this.reportFolder)) {\n // fs.mkdirSync(this.reportFolder)\n // }\n // const reportFilePath = path.join(\n // this.reportFolder,\n // `report.json`\n // )\n // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))\n // return undefined\n // // } else {\n // // return await this.uploadTestCase(testProgress, reRunId)\n // }\n }\n getLogFileContent() {\n let projectPath = process.cwd();\n if (process.env.PROJECT_PATH) {\n projectPath = process.env.PROJECT_PATH;\n }\n const logFolder = path.join(projectPath, \"logs\", \"web\");\n if (!fs.existsSync(logFolder)) {\n return [];\n }\n let nextId = 1;\n while (fs.existsSync(path.join(logFolder, `${nextId}.json`))) {\n nextId++;\n }\n if (nextId === 1) {\n return [];\n }\n try {\n const logFileContent = fs.readFileSync(path.join(logFolder, `${nextId - 1}.json`), \"utf8\");\n return JSON.parse(logFileContent);\n } catch (error) {\n return [];\n }\n }\n private getTestCaseResult(steps: JsonStep[]) {\n for (const step of steps) {\n switch (step.result.status) {\n case \"FAILED\":\n return {\n status: step.result.status,\n message: step.result.message,\n // exception: step.result.exception,\n } as const;\n case \"AMBIGUOUS\":\n case \"UNDEFINED\":\n case \"PENDING\":\n return {\n status: \"FAILED\",\n message: `step \"${step.text}\" is ${step.result.status}`,\n } as const;\n }\n }\n return {\n status: \"PASSED\",\n } as const;\n }\n private async onTestCaseFinished(testCaseFinished: messages.TestCaseFinished, reRunId?: string) {\n const { testCaseStartedId, timestamp } = testCaseFinished;\n const testProgress = this.testCaseReportMap.get(testCaseStartedId);\n const prevResult = testProgress.result as {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n };\n const steps = Object.values(testProgress.steps);\n const result = this.getTestCaseResult(steps);\n const endTime = this.getTimeStamp(timestamp);\n testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime,\n };\n testProgress.webLog = this.logs;\n testProgress.networkLog = this.networkLog;\n testProgress.initialAriaSnapshot = this.initialAriaSnapshot;\n this.initialAriaSnapshot = \"\";\n this.networkLog = [];\n this.logs = [];\n\n if (this.testCaseLog && this.testCaseLog.length > 0) {\n // Create the logs directory\n const logsDir = path.join(this.reportFolder, 'editorLogs');\n const fileName = `testCaseLog_${testCaseStartedId}.log`;\n const filePath = path.join(logsDir, fileName);\n \n // Ensure the logs directory exists\n fs.mkdirSync(logsDir, { recursive: true });\n \n // Write the logs to the file\n fs.writeFileSync(filePath, this.testCaseLog.join('\\n'), 'utf8');\n \n // Store this ID in the testProgress object so it can be accessed later\n testProgress.logFileId = testCaseStartedId;\n }\n this.testCaseLog = [];\n\n if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH;\n if (!fs.existsSync(this.reportFolder)) {\n fs.mkdirSync(this.reportFolder);\n }\n const reportFilePath = path.join(this.reportFolder, `${endTime}_${testProgress.scenarioName}.json`);\n writeFileSync(reportFilePath, JSON.stringify(testProgress, null, 2));\n return undefined;\n } else {\n return await this.uploadTestCase(testProgress, reRunId);\n }\n }\n private async uploadTestCase(testCase: JsonTestProgress, rerunId?: string) {\n let runId = \"\";\n let projectId = \"\";\n if (!process.env.UPLOADING_TEST_CASE) {\n process.env.UPLOADING_TEST_CASE = \"[]\";\n }\n const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[];\n const randomID = Math.random().toString(36).substring(7);\n anyRemArr.push(randomID);\n let data;\n process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr);\n try {\n if (process.env.RUN_ID && process.env.PROJECT_ID && !process.env.IGNORE_ENV_VARIABLES) {\n runId = process.env.RUN_ID;\n projectId = process.env.PROJECT_ID;\n } else {\n const runDoc = await this.uploadService.createRunDocument(this.runName);\n runId = runDoc._id;\n projectId = runDoc.project_id;\n if (!process.env.IGNORE_ENV_VARIABLES) {\n process.env.RUN_ID = runId;\n process.env.PROJECT_ID = projectId;\n }\n }\n data = await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder, rerunId);\n this.writeTestCaseReportToDisk(testCase);\n } catch (e) {\n console.error(\"Error uploading test case:\", e);\n } finally {\n const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[];\n arrRem.splice(arrRem.indexOf(randomID), 1);\n process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem);\n }\n return data ? data : null;\n }\n private writeTestCaseReportToDisk(testCase: JsonTestProgress) {\n const reportFolder = this.reportFolder ?? process.env.TESTCASE_REPORT_FOLDER_PATH;\n if (!reportFolder) {\n console.error(\"Report folder is not defined\");\n return;\n }\n try {\n let i = 0;\n while (fs.existsSync(path.join(reportFolder, `${i}`))) {\n i++;\n }\n fs.mkdirSync(path.join(reportFolder, `${i}`));\n //exclude network log from the saved report\n const networkLog = testCase.networkLog;\n delete testCase.networkLog;\n fs.writeFileSync(path.join(reportFolder, `${i}`, `report.json`), JSON.stringify(testCase, null, 2));\n fs.writeFileSync(path.join(reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));\n } catch (error) {\n console.error(\"Error writing test case report to disk:\", error);\n }\n }\n private onTestRunFinished(testRunFinished: messages.TestRunFinished) {\n const { timestamp, success, message } = testRunFinished;\n const prevResult = this.report.result as {\n status: \"STARTED\";\n startTime: JsonTimestamp;\n };\n this.report.result = {\n status: success ? \"PASSED\" : \"FAILED\",\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message,\n // exception,\n };\n }\n}\n"]}
1
+ {"version":3,"file":"report_generator.js","sourceRoot":"","sources":["../../../src/formatter/helpers/report_generator.ts"],"names":[],"mappings":"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","sourcesContent":["import * as messages from '@cucumber/messages'\nimport fs from 'fs'\nimport path from 'path'\nimport { RunUploadService } from './upload_serivce'\nimport { writeFileSync } from 'fs-extra'\n// type JsonException = messages.Exception\nimport objectPath from 'object-path'\ntype JsonTimestamp = number //messages.Timestamp\ntype JsonStepType = 'Unknown' | 'Context' | 'Action' | 'Outcome' | 'Conjunction'\n\nconst URL =\n process.env.NODE_ENV_BLINQ === 'dev'\n ? 'https://dev.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'local'\n ? 'http://localhost:5001/api/runs'\n : process.env.NODE_ENV_BLINQ === 'stage'\n ? 'https://stage.api.blinq.io/api/runs'\n : process.env.NODE_ENV_BLINQ === 'prod'\n ? 'https://api.blinq.io/api/runs'\n : !process.env.NODE_ENV_BLINQ\n ? 'https://api.blinq.io/api/runs'\n : `${process.env.NODE_ENV_BLINQ}/api/runs`\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL\nconst BATCH_SIZE = 10\nconst MAX_RETRIES = 3\nconst REPORT_SERVICE_TOKEN =\n process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN\nexport type JsonResultUnknown = {\n status: 'UNKNOWN'\n}\ntype JsonResultSkipped = {\n status: 'SKIPPED'\n}\ntype JsonResultUndefined = {\n status: 'UNDEFINED'\n}\ntype JsonResultAmbiguous = {\n status: 'AMBIGUOUS'\n}\nexport type JsonResultStarted = {\n status: 'STARTED'\n startTime: JsonTimestamp\n}\ntype JsonResultPending = {\n status: 'PENDING'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultPassed = {\n status: 'PASSED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\nexport type JsonResultFailed = {\n status: 'FAILED'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n message?: string\n // exception?: JsonException\n}\nexport type JsonFixedByAi = {\n status: 'FIXED_BY_AI'\n startTime: JsonTimestamp\n endTime: JsonTimestamp\n}\n\ntype JsonCommandResult = JsonResultPassed | JsonResultFailed\ntype JsonStepResult =\n | JsonResultUnknown\n | JsonResultSkipped\n | JsonResultUndefined\n | JsonResultAmbiguous\n | JsonResultStarted\n | JsonResultPending\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\nexport type JsonTestResult =\n | JsonResultUnknown\n | JsonResultStarted\n | JsonResultPassed\n | JsonResultFailed\n | JsonFixedByAi\ntype JsonReportResult = JsonTestResult\n\ntype JsonCommand = {\n type: string\n value?: string\n text: string\n screenshotId?: string\n result: JsonCommandResult\n netWorkLog?: any[]\n}\ntype webLog = {\n type: string\n text: string\n location: string\n time: string\n}\nexport type JsonStep = {\n keyword: string\n type: JsonStepType\n text: string\n commands: JsonCommand[]\n result: JsonStepResult\n webLog: webLog[]\n networkData: any[]\n data?: any\n ariaSnapshot: string\n traceFilePath?: string\n brunoData?: any\n}\nexport type RetrainStats = {\n result: JsonTestResult\n totalSteps: number\n upload_id: string\n local_id: number\n}\nexport type JsonTestProgress = {\n id: string\n featureName: string\n uri: string\n scenarioName: string\n parameters: Record<string, string>\n steps: JsonStep[]\n result: JsonTestResult\n retrainStats?: RetrainStats\n initialAriaSnapshot?: string\n webLog: any\n networkLog: any\n logFileId?: string\n env: {\n name: string\n baseUrl: string\n }\n}\n\nexport type JsonReport = {\n testCases: JsonTestProgress[]\n result: JsonReportResult\n env: {\n name: string\n baseUrl: string\n }\n}\n\ninterface MetaMessage extends messages.Meta {\n runName: string\n}\ninterface EnvelopeWithMetaMessage extends messages.Envelope {\n meta: MetaMessage\n}\nexport default class ReportGenerator {\n private report: JsonReport = {\n result: {\n status: 'UNKNOWN',\n },\n testCases: [] as JsonTestProgress[],\n env: {\n name: '',\n baseUrl: '',\n },\n }\n private gherkinDocumentMap = new Map<string, messages.GherkinDocument>()\n private stepMap = new Map<string, messages.Step>()\n private pickleMap = new Map<string, messages.Pickle>()\n private testCaseMap = new Map<string, messages.TestCase>()\n private testStepMap = new Map<string, messages.TestStep>()\n private stepReportMap = new Map<string, JsonStep>()\n private testCaseReportMap = new Map<string, JsonTestProgress>()\n private scenarioIterationCountMap = new Map<string, number>()\n private logs: webLog[] = []\n private networkLog: any[] = []\n private stepLogs: webLog[] = []\n private stepNetworkLogs: any[] = []\n private runName = ''\n private ariaSnapshot = ''\n private initialAriaSnapshot = ''\n private testCaseLog: string[] = []\n private loggingOverridden: boolean = false // Flag to track if logging is overridden\n reportFolder: null | string = null\n private uploadService = new RunUploadService(\n REPORT_SERVICE_URL,\n REPORT_SERVICE_TOKEN\n )\n\n async handleMessage(\n envelope: EnvelopeWithMetaMessage | messages.Envelope,\n reRunId?: string\n ): Promise<any> {\n if (envelope.meta && 'runName' in envelope.meta) {\n this.runName = envelope.meta.runName\n }\n const type = Object.keys(envelope)[0] as keyof messages.Envelope\n switch (type) {\n // case \"meta\": { break}\n // case \"source\": { break}\n case 'parseError': {\n const parseError = envelope[type]\n this.handleParseError(parseError)\n break\n }\n case 'gherkinDocument': {\n const doc = envelope[type]\n this.onGherkinDocument(doc)\n break\n }\n case 'pickle': {\n const pickle = envelope[type]\n this.onPickle(pickle)\n break\n }\n // case \"stepDefinition\": { break}\n // case \"hook\": { break} // Before Hook\n case 'testRunStarted': {\n const testRunStarted = envelope[type]\n this.onTestRunStarted(testRunStarted)\n await this.uploadService.createStatus('running')\n break\n }\n case 'testCase': {\n const testCase = envelope[type]\n\n // Initialize the log storage\n this.testCaseLog = []\n\n if (!this.loggingOverridden) {\n this.loggingOverridden = true\n\n // Store the original process.stdout.write, and process.stderr.write\n const originalStdoutWrite = process.stdout.write\n const originalStderrWrite = process.stderr.write\n\n // Override process.stdout.write\n process.stdout.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString())\n return originalStdoutWrite.call(process.stdout, chunk, ...args)\n }\n\n // Override process.stderr.write\n process.stderr.write = (chunk: any, ...args: any[]) => {\n this.testCaseLog.push(chunk.toString())\n return originalStderrWrite.call(process.stderr, chunk, ...args)\n }\n }\n\n // Call the onTestCase method\n this.onTestCase(testCase)\n\n break\n }\n case 'testCaseStarted': {\n const testCaseStarted = envelope[type]\n this.onTestCaseStarted(testCaseStarted)\n break\n }\n case 'testStepStarted': {\n const testStepStarted = envelope[type]\n this.onTestStepStarted(testStepStarted)\n break\n }\n case 'attachment': {\n const attachment = envelope[type]\n this.onAttachment(attachment)\n break\n }\n case 'testStepFinished': {\n const testStepFinished = envelope[type]\n this.onTestStepFinished(testStepFinished)\n break\n }\n case 'testCaseFinished': {\n const testCaseFinished = envelope[type]\n\n // Call the onTestCaseFinished method\n const result = await this.onTestCaseFinished(testCaseFinished, reRunId)\n return result\n }\n // case \"hook\": { break} // After Hook\n case 'testRunFinished': {\n const testRunFinished = envelope[type]\n await this.onTestRunFinished(testRunFinished)\n break\n }\n\n // case \"parameterType\" : { break}\n // case \"undefinedParameterType\": { break}\n }\n }\n getReport() {\n return this.report\n }\n private handleParseError(parseError: messages.ParseError) {\n const { message } = parseError\n const timestamp = new Date().getTime()\n this.report.result = {\n status: 'FAILED',\n startTime: timestamp,\n endTime: timestamp,\n message: message,\n }\n }\n\n private onGherkinDocument(doc: messages.GherkinDocument) {\n this.gherkinDocumentMap.set(doc.uri, doc)\n doc.feature.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.rule) {\n child.rule.children.forEach((child) => {\n if (child.scenario) {\n child.scenario.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n } else if (child.background) {\n child.background.steps.forEach((step) => {\n this.stepMap.set(step.id, step)\n })\n }\n })\n }\n })\n }\n private onPickle(pickle: messages.Pickle) {\n this.pickleMap.set(pickle.id, pickle)\n }\n private getTimeStamp(timestamp: messages.Timestamp) {\n return timestamp.seconds * 1000 + timestamp.nanos / 1000000\n }\n private onTestRunStarted(testRunStarted: messages.TestRunStarted) {\n this.report.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(testRunStarted.timestamp),\n }\n }\n private onTestCase(testCase: messages.TestCase) {\n this.testCaseMap.set(testCase.id, testCase)\n testCase.testSteps.forEach((testStep) => {\n this.testStepMap.set(testStep.id, testStep)\n })\n }\n private _findScenario(doc: messages.GherkinDocument, scenarioId: string) {\n for (const child of doc.feature.children) {\n if (child.scenario && child.scenario.id === scenarioId) {\n return child.scenario\n }\n if (child.rule) {\n for (const scenario of child.rule.children) {\n if (scenario.scenario && scenario.scenario.id === scenarioId) {\n return scenario.scenario\n }\n }\n }\n }\n throw new Error(`scenario \"${scenarioId}\" not found`)\n }\n private _getParameters(scenario: messages.Scenario, exampleId: string) {\n const parameters: Record<string, string> = {}\n if (scenario.examples.length === 0) return parameters\n for (const examples of scenario.examples) {\n for (const tableRow of examples.tableBody) {\n if (tableRow.id === exampleId) {\n for (let i = 0; i < examples.tableHeader.cells.length; i++) {\n parameters[examples.tableHeader.cells[i].value] =\n tableRow.cells[i].value\n }\n }\n }\n }\n return parameters\n }\n private onTestCaseStarted(testCaseStarted: messages.TestCaseStarted) {\n const { testCaseId, id, timestamp } = testCaseStarted\n const testCase = this.testCaseMap.get(testCaseId)\n if (testCase === undefined)\n throw new Error(`testCase with id ${testCaseId} not found`)\n const pickle = this.pickleMap.get(testCase.pickleId)\n if (pickle === undefined)\n throw new Error(`pickle with id ${testCase.pickleId} not found`)\n\n const doc = this.gherkinDocumentMap.get(pickle.uri)\n if (doc === undefined)\n throw new Error(`gherkinDocument with uri ${pickle.uri} not found`)\n const featureName = doc.feature.name\n\n const scenarioId = pickle.astNodeIds[0]\n const scenario = this._findScenario(doc, scenarioId)\n const scenarioName = scenario.name\n if (!this.scenarioIterationCountMap.has(scenarioId)) {\n this.scenarioIterationCountMap.set(scenarioId, 1)\n }\n const parameters = this._getParameters(scenario, pickle.astNodeIds[1])\n console.log(\n `Running scenario ${scenarioName} iteration ${this.scenarioIterationCountMap.get(\n scenarioId\n )} with parameters:\\n${JSON.stringify(parameters, null, 4)}\\n \n `\n )\n this.scenarioIterationCountMap.set(\n scenarioId,\n this.scenarioIterationCountMap.get(scenarioId) + 1\n )\n const steps: JsonStep[] = pickle.steps.map((pickleStep) => {\n const stepId = pickleStep.astNodeIds[0]\n const step = this.stepMap.get(stepId)\n this.stepReportMap.set(pickleStep.id, {\n type: step.keywordType,\n keyword: step.keyword,\n text: step.text,\n commands: [],\n result: {\n status: 'UNKNOWN',\n },\n networkData: [],\n webLog: [],\n data: {},\n ariaSnapshot: this.ariaSnapshot,\n })\n return this.stepReportMap.get(pickleStep.id)\n })\n this.testCaseReportMap.set(id, {\n id,\n uri: pickle.uri,\n featureName,\n scenarioName,\n parameters,\n steps,\n result: {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n },\n webLog: [],\n networkLog: [],\n env: {\n name: this.report.env.name,\n baseUrl: this.report.env.baseUrl,\n },\n })\n this.report.testCases.push(this.testCaseReportMap.get(id))\n }\n private onTestStepStarted(testStepStarted: messages.TestStepStarted) {\n const { testStepId, timestamp } = testStepStarted\n const testStep = this.testStepMap.get(testStepId)\n if (testStep === undefined)\n throw new Error(`testStep with id ${testStepId} not found`)\n if (testStep.pickleStepId === undefined) return\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n stepProgess.result = {\n status: 'STARTED',\n startTime: this.getTimeStamp(timestamp),\n }\n }\n private onAttachment(attachment: messages.Attachment) {\n const { testStepId, body, mediaType } = attachment\n if (mediaType === 'text/plain') {\n this.reportFolder = body.replaceAll('\\\\', '/')\n return\n }\n if (mediaType === 'application/json+snapshot-before') {\n this.initialAriaSnapshot = body\n return\n }\n if (mediaType === 'application/json+snapshot-after') {\n this.ariaSnapshot = body\n return\n }\n if (mediaType === 'application/json+env') {\n const data = JSON.parse(body)\n this.report.env = data\n this.report.testCases.map((testCase) => {\n testCase.env = data\n return testCase\n })\n }\n if (mediaType === 'application/json+log') {\n const log: webLog = JSON.parse(body)\n if (this.logs.length < 1000) {\n this.logs.push(log)\n this.stepLogs.push(log)\n }\n }\n if (mediaType === 'application/json+network') {\n const networkLog = JSON.parse(body)\n if (this.networkLog.length < 1000) this.networkLog.push(networkLog)\n this.stepNetworkLogs.push(networkLog)\n }\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) return\n\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n if (mediaType === 'application/json') {\n const command: JsonCommand = JSON.parse(body)\n stepProgess.commands.push(command)\n } else if (mediaType === 'application/json+trace') {\n const data = JSON.parse(body)\n stepProgess.traceFilePath = data.traceFilePath\n }\n\n if (mediaType === 'application/json+bruno') {\n try {\n const data = JSON.parse(body)\n stepProgess.brunoData = data\n } catch (error) {\n console.error('Error parsing bruno data:', error)\n }\n }\n }\n private getFailedTestStepResult({\n commands,\n startTime,\n endTime,\n result,\n }: {\n commands: JsonCommand[]\n startTime: number\n endTime: number\n result: messages.TestStepResult\n }): JsonStepResult {\n for (const command of commands) {\n if (command.result.status === 'FAILED') {\n return {\n status: 'FAILED',\n message: command.result.message,\n startTime,\n endTime,\n } as const\n }\n }\n return {\n status: 'FAILED',\n startTime,\n endTime,\n message: result.message,\n }\n }\n private onTestStepFinished(testStepFinished: messages.TestStepFinished) {\n const { testStepId, testStepResult, timestamp } = testStepFinished\n const testStep = this.testStepMap.get(testStepId)\n if (testStep.pickleStepId === undefined) {\n if (testStepResult.status === 'FAILED') {\n console.error(\n `Before/After hook failed with message: ${testStepResult.message}`\n )\n }\n return\n }\n if (testStepResult.status === 'UNDEFINED') {\n const step = this.stepReportMap.get(testStep.pickleStepId)\n const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step'\n const undefinedCommand: messages.Attachment = {\n testStepId: testStepId,\n body: JSON.stringify({\n type: 'error',\n text: 'Undefined step: ' + stepName,\n result: {\n status: 'FAILED',\n startTime: this.getTimeStamp(timestamp),\n endTime: this.getTimeStamp(timestamp),\n },\n }),\n mediaType: 'application/json',\n contentEncoding: messages.AttachmentContentEncoding.IDENTITY,\n }\n this.onAttachment(undefinedCommand)\n }\n const stepProgess = this.stepReportMap.get(testStep.pickleStepId)\n const prevStepResult = stepProgess.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n let data = {}\n try {\n const reportFolder = this.reportFolder\n if (reportFolder === null) {\n throw new Error(\n '\"reportFolder\" is \"null\". Failed to run BVT hooks. Please retry after running \"Generate All\" or \"Record Scenario\" '\n )\n }\n if (fs.existsSync(path.join(reportFolder, 'data.json'))) {\n data = JSON.parse(\n fs.readFileSync(path.join(reportFolder, 'data.json'), 'utf8')\n )\n }\n } catch (error) {\n console.log('Error reading data.json')\n }\n if (testStepResult.status === 'FAILED') {\n stepProgess.result = this.getFailedTestStepResult({\n commands: stepProgess.commands,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n result: testStepResult,\n })\n } else {\n stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n }\n }\n\n stepProgess.webLog = this.stepLogs\n stepProgess.networkData = this.stepNetworkLogs\n stepProgess.ariaSnapshot = this.ariaSnapshot\n this.ariaSnapshot = ''\n this.stepNetworkLogs = []\n this.stepLogs = []\n if (Object.keys(data).length > 0) {\n stepProgess.data = data\n const id = testStepFinished.testCaseStartedId\n const parameters = this.testCaseReportMap.get(id).parameters\n const _parameters: typeof parameters = {}\n Object.keys(parameters).map((key) => {\n if (\n parameters[key].startsWith('{{') &&\n parameters[key].endsWith('}}')\n ) {\n const path = parameters[key].slice(2, -2).split('.')\n let value = String(objectPath.get(data, path))\n if (value) {\n if (value.startsWith('secret:')) {\n value = 'secret:****'\n } else if (value.startsWith('totp:')) {\n value = 'totp:****'\n } else if (value.startsWith('mask:')) {\n value = 'mask:****'\n }\n _parameters[key] = value\n }\n } else {\n _parameters[key] = parameters[key]\n }\n })\n this.report.testCases.find((testCase) => {\n return testCase.id === id\n }).parameters = _parameters\n }\n\n // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n // if (!fs.existsSync(this.reportFolder)) {\n // fs.mkdirSync(this.reportFolder)\n // }\n // const reportFilePath = path.join(\n // this.reportFolder,\n // `report.json`\n // )\n // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))\n // return undefined\n // // } else {\n // // return await this.uploadTestCase(testProgress, reRunId)\n // }\n }\n getLogFileContent() {\n let projectPath = process.cwd()\n if (process.env.PROJECT_PATH) {\n projectPath = process.env.PROJECT_PATH\n }\n const logFolder = path.join(projectPath, 'logs', 'web')\n if (!fs.existsSync(logFolder)) {\n return []\n }\n let nextId = 1\n while (fs.existsSync(path.join(logFolder, `${nextId}.json`))) {\n nextId++\n }\n if (nextId === 1) {\n return []\n }\n try {\n const logFileContent = fs.readFileSync(\n path.join(logFolder, `${nextId - 1}.json`),\n 'utf8'\n )\n return JSON.parse(logFileContent)\n } catch (error) {\n return []\n }\n }\n private getTestCaseResult(steps: JsonStep[]) {\n for (const step of steps) {\n switch (step.result.status) {\n case 'FAILED':\n return {\n status: step.result.status,\n message: step.result.message,\n // exception: step.result.exception,\n } as const\n case 'AMBIGUOUS':\n case 'UNDEFINED':\n case 'PENDING':\n return {\n status: 'FAILED',\n message: `step \"${step.text}\" is ${step.result.status}`,\n } as const\n }\n }\n return {\n status: 'PASSED',\n } as const\n }\n private async onTestCaseFinished(\n testCaseFinished: messages.TestCaseFinished,\n reRunId?: string\n ) {\n const { testCaseStartedId, timestamp } = testCaseFinished\n const testProgress = this.testCaseReportMap.get(testCaseStartedId)\n const prevResult = testProgress.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n const steps = Object.values(testProgress.steps)\n const result = this.getTestCaseResult(steps)\n const endTime = this.getTimeStamp(timestamp)\n testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime,\n }\n testProgress.webLog = this.logs\n testProgress.networkLog = this.networkLog\n testProgress.initialAriaSnapshot = this.initialAriaSnapshot\n this.initialAriaSnapshot = ''\n this.networkLog = []\n this.logs = []\n\n if (this.testCaseLog && this.testCaseLog.length > 0) {\n // Create the logs directory\n const logsDir = path.join(this.reportFolder, 'editorLogs')\n const fileName = `testCaseLog_${testCaseStartedId}.log`\n const filePath = path.join(logsDir, fileName)\n\n // Ensure the logs directory exists\n fs.mkdirSync(logsDir, { recursive: true })\n\n // Write the logs to the file\n fs.writeFileSync(filePath, this.testCaseLog.join('\\n'), 'utf8')\n\n // Store this ID in the testProgress object so it can be accessed later\n testProgress.logFileId = testCaseStartedId\n }\n this.testCaseLog = []\n\n if (process.env.TESTCASE_REPORT_FOLDER_PATH) {\n this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!fs.existsSync(this.reportFolder)) {\n fs.mkdirSync(this.reportFolder)\n }\n const reportFilePath = path.join(\n this.reportFolder,\n `${endTime}_${testProgress.scenarioName}.json`\n )\n writeFileSync(reportFilePath, JSON.stringify(testProgress, null, 2))\n return undefined\n } else {\n return await this.uploadTestCase(testProgress, reRunId)\n }\n }\n private readonly retryCount = 3\n\n private async uploadTestCase(testCase: JsonTestProgress, rerunId?: string) {\n let data = null\n for (let attempt = 1; attempt <= this.retryCount; attempt++) {\n try {\n data = await this.tryUpload(testCase, rerunId);\n break;\n } catch (e) {\n console.error(`Attempt ${attempt} to upload testcase failed:`, e);\n if (attempt === this.retryCount) {\n console.error('All retry attempts failed, failed to upload testcase.');\n } else {\n const waitTime = 1000 * 2 ** (attempt - 1); //? exponential backoff: 1s, 2s, 4s...\n await new Promise((r) => setTimeout(r, waitTime));\n }\n }\n }\n return data;\n }\n\n private async tryUpload(testCase: JsonTestProgress, rerunId?: string) {\n let runId = ''\n let projectId = ''\n if (!process.env.UPLOADING_TEST_CASE) {\n process.env.UPLOADING_TEST_CASE = '[]'\n }\n const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n const randomID = Math.random().toString(36).substring(7)\n anyRemArr.push(randomID)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr)\n try {\n if (\n process.env.RUN_ID &&\n process.env.PROJECT_ID &&\n !process.env.IGNORE_ENV_VARIABLES\n ) {\n runId = process.env.RUN_ID\n projectId = process.env.PROJECT_ID\n } else {\n const runDoc = await this.uploadService.createRunDocument(this.runName)\n runId = runDoc._id\n projectId = runDoc.project_id\n if (!process.env.IGNORE_ENV_VARIABLES) {\n process.env.RUN_ID = runId\n process.env.PROJECT_ID = projectId\n }\n }\n const data = await this.uploadService.uploadTestCase(\n testCase,\n runId,\n projectId,\n this.reportFolder,\n rerunId\n )\n this.writeTestCaseReportToDisk(testCase)\n return data\n } finally {\n const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE) as string[]\n arrRem.splice(arrRem.indexOf(randomID), 1)\n process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem)\n }\n }\n\n private writeTestCaseReportToDisk(testCase: JsonTestProgress) {\n const reportFolder =\n this.reportFolder ?? process.env.TESTCASE_REPORT_FOLDER_PATH\n if (!reportFolder) {\n console.error('Report folder is not defined')\n return\n }\n try {\n let i = 0\n while (fs.existsSync(path.join(reportFolder, `${i}`))) {\n i++\n }\n fs.mkdirSync(path.join(reportFolder, `${i}`))\n //exclude network log from the saved report\n const networkLog = testCase.networkLog\n delete testCase.networkLog\n fs.writeFileSync(\n path.join(reportFolder, `${i}`, `report.json`),\n JSON.stringify(testCase, null, 2)\n )\n fs.writeFileSync(\n path.join(reportFolder, `${i}`, `network.json`),\n JSON.stringify(networkLog, null, 2)\n )\n } catch (error) {\n console.error('Error writing test case report to disk:', error)\n }\n }\n private async onTestRunFinished(testRunFinished: messages.TestRunFinished) {\n const { timestamp, success, message } = testRunFinished\n const prevResult = this.report.result as {\n status: 'STARTED'\n startTime: JsonTimestamp\n }\n this.report.result = {\n status: success ? 'PASSED' : 'FAILED',\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message,\n // exception,\n }\n await this.uploadService.createStatus(success ? 'passed' : 'failed')\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import FormData from "form-data";
2
- import { JsonTestProgress } from "./report_generator";
1
+ import FormData from 'form-data';
2
+ import { JsonTestProgress } from './report_generator';
3
3
  export interface RootCauseProps {
4
4
  status: boolean;
5
5
  analysis: string;
@@ -22,5 +22,6 @@ declare class RunUploadService {
22
22
  uploadFile(filePath: string, preSignedUrl: string): Promise<boolean>;
23
23
  uploadComplete(runId: string, projectId: string): Promise<void>;
24
24
  modifyTestCase(runId: string, projectId: string, testProgressReport: JsonTestProgress): Promise<void>;
25
+ createStatus(status: string): Promise<void>;
25
26
  }
26
27
  export { RunUploadService };
@@ -22,68 +22,68 @@ class RunUploadService {
22
22
  }
23
23
  async createRunDocument(name) {
24
24
  try {
25
- const runDocResult = await axios_client_1.axiosClient.post(this.runsApiBaseURL + "/cucumber-runs/create", {
26
- name: name ? name : "TEST",
25
+ const runDocResult = await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/cucumber-runs/create', {
26
+ name: name ? name : 'TEST',
27
27
  }, {
28
28
  headers: {
29
- Authorization: "Bearer " + this.accessToken,
30
- "x-source": "cucumber_js",
29
+ Authorization: 'Bearer ' + this.accessToken,
30
+ 'x-source': 'cucumber_js',
31
31
  },
32
32
  });
33
33
  if (runDocResult.status !== 200) {
34
- throw new Error("Failed to create run document in the server");
34
+ throw new Error('Failed to create run document in the server');
35
35
  }
36
36
  if (runDocResult.data.status !== true) {
37
- throw new Error("Failed to create run document in the server");
37
+ throw new Error('Failed to create run document in the server');
38
38
  }
39
39
  return runDocResult.data.run;
40
40
  }
41
41
  catch (error) {
42
42
  if (error.response && error.response.status === 403) {
43
- console.log("Warning: Your trial plan has ended. Cannot create or upload reports.");
43
+ console.log('Warning: Your trial plan has ended. Cannot create or upload reports.');
44
44
  process.exit(1);
45
45
  }
46
- throw new Error("Failed to create run document in the server: " + error);
46
+ throw new Error('Failed to create run document in the server: ' + error);
47
47
  }
48
48
  }
49
49
  async upload(formData) {
50
- const response = await axios_client_1.axiosClient.post(this.runsApiBaseURL + "/cucumber-runs/upload", formData, {
50
+ const response = await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/cucumber-runs/upload', formData, {
51
51
  headers: {
52
52
  ...formData.getHeaders(),
53
- Authorization: "Bearer " + this.accessToken,
54
- "x-source": "cucumber_js",
53
+ Authorization: 'Bearer ' + this.accessToken,
54
+ 'x-source': 'cucumber_js',
55
55
  },
56
56
  });
57
57
  if (response.status === 401) {
58
- console.log("Warning: Your trial plan has ended. Cannot upload reports and perform retraining");
59
- throw new Error("Warning: Your trial plan has ended. Cannot upload reports and perform retraining");
58
+ console.log('Warning: Your trial plan has ended. Cannot upload reports and perform retraining');
59
+ throw new Error('Warning: Your trial plan has ended. Cannot upload reports and perform retraining');
60
60
  }
61
61
  if (response.status !== 200) {
62
- throw new Error("Failed to upload run to the server");
62
+ throw new Error('Failed to upload run to the server');
63
63
  }
64
64
  if (response.data.status !== true) {
65
- throw new Error("Failed to upload run to the server");
65
+ throw new Error('Failed to upload run to the server');
66
66
  }
67
67
  }
68
68
  async getPreSignedUrls(fileUris, runId) {
69
- const response = await axios_client_1.axiosClient.post(this.runsApiBaseURL + "/cucumber-runs/generateuploadurls", {
69
+ const response = await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/cucumber-runs/generateuploadurls', {
70
70
  fileUris,
71
71
  runId,
72
72
  }, {
73
73
  headers: {
74
- Authorization: "Bearer " + this.accessToken,
75
- "x-source": "cucumber_js",
74
+ Authorization: 'Bearer ' + this.accessToken,
75
+ 'x-source': 'cucumber_js',
76
76
  },
77
77
  });
78
78
  if (response.status === 403) {
79
- console.log("Warning: Your trial plan has ended. Cannot upload reports and perform retraining");
80
- throw new Error("Warning: Your trial plan has ended. Cannot upload reports and perform retraining");
79
+ console.log('Warning: Your trial plan has ended. Cannot upload reports and perform retraining');
80
+ throw new Error('Warning: Your trial plan has ended. Cannot upload reports and perform retraining');
81
81
  }
82
82
  if (response.status !== 200) {
83
- throw new Error("Failed to get pre-signed urls for the files");
83
+ throw new Error('Failed to get pre-signed urls for the files');
84
84
  }
85
85
  if (response.data.status !== true) {
86
- throw new Error("Failed to get pre-signed urls for the files");
86
+ throw new Error('Failed to get pre-signed urls for the files');
87
87
  }
88
88
  return response.data.uploadUrls;
89
89
  }
@@ -93,15 +93,15 @@ class RunUploadService {
93
93
  for (const step of testCaseReport.steps) {
94
94
  for (const command of step.commands) {
95
95
  if (command.screenshotId) {
96
- fileUris.push("screenshots" + "/" + String(command.screenshotId) + ".png");
96
+ fileUris.push('screenshots' + '/' + String(command.screenshotId) + '.png');
97
97
  }
98
98
  }
99
99
  if (step.traceFilePath) {
100
- fileUris.push("trace" + "/" + step.traceFilePath);
100
+ fileUris.push('trace' + '/' + step.traceFilePath);
101
101
  }
102
102
  }
103
103
  if (testCaseReport.logFileId) {
104
- fileUris.push("editorLogs" + "/" + "testCaseLog_" + testCaseReport.logFileId + ".log");
104
+ fileUris.push('editorLogs' + '/' + 'testCaseLog_' + testCaseReport.logFileId + '.log');
105
105
  }
106
106
  // console.log({ fileUris })
107
107
  const preSignedUrls = await this.getPreSignedUrls(fileUris, runId);
@@ -124,21 +124,21 @@ class RunUploadService {
124
124
  return;
125
125
  }
126
126
  }
127
- console.error("Failed to upload file:", fileUri);
127
+ console.error('Failed to upload file:', fileUri);
128
128
  }));
129
129
  }
130
130
  // writeFileSync("report.json", JSON.stringify(testCaseReport, null, 2))
131
- const { data } = await axios_client_1.axiosClient.post(this.runsApiBaseURL + "/cucumber-runs/createNewTestCase", {
131
+ const { data } = await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/cucumber-runs/createNewTestCase', {
132
132
  runId,
133
133
  projectId,
134
134
  testProgressReport: testCaseReport,
135
- browser: process.env.BROWSER ? process.env.BROWSER : "chromium",
136
- mode: process.env.MODE === "cloud" ? "cloud" : "local",
135
+ browser: process.env.BROWSER ? process.env.BROWSER : 'chromium',
136
+ mode: process.env.MODE === 'cloud' ? 'cloud' : 'local',
137
137
  rerunId,
138
138
  }, {
139
139
  headers: {
140
- Authorization: "Bearer " + this.accessToken,
141
- "x-source": "cucumber_js",
140
+ Authorization: 'Bearer ' + this.accessToken,
141
+ 'x-source': 'cucumber_js',
142
142
  },
143
143
  });
144
144
  try {
@@ -146,9 +146,9 @@ class RunUploadService {
146
146
  event: constants_1.ActionEvents.upload_report,
147
147
  }, {
148
148
  headers: {
149
- Authorization: "Bearer " + this.accessToken,
150
- "x-source": "cucumber_js",
151
- "x-bvt-project-id": projectId,
149
+ Authorization: 'Bearer ' + this.accessToken,
150
+ 'x-source': 'cucumber_js',
151
+ 'x-bvt-project-id': projectId,
152
152
  },
153
153
  });
154
154
  }
@@ -171,14 +171,14 @@ class RunUploadService {
171
171
  const fileSize = fileStats.size;
172
172
  await axios_client_1.axiosClient.put(preSignedUrl, fileStream, {
173
173
  headers: {
174
- "Content-Type": "application/octet-stream",
175
- "Content-Length": fileSize,
174
+ 'Content-Type': 'application/octet-stream',
175
+ 'Content-Length': fileSize,
176
176
  },
177
177
  });
178
178
  }
179
179
  catch (error) {
180
- if (process.env.NODE_ENV_BLINQ === "dev") {
181
- console.error("Error uploading file:", error);
180
+ if (process.env.NODE_ENV_BLINQ === 'dev') {
181
+ console.error('Error uploading file:', error);
182
182
  }
183
183
  success = false;
184
184
  }
@@ -188,31 +188,31 @@ class RunUploadService {
188
188
  return success;
189
189
  }
190
190
  async uploadComplete(runId, projectId) {
191
- const response = await axios_client_1.axiosClient.post(this.runsApiBaseURL + "/cucumber-runs/uploadCompletion", {
191
+ const response = await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/cucumber-runs/uploadCompletion', {
192
192
  runId,
193
193
  projectId,
194
- browser: process.env.BROWSER ? process.env.BROWSER : "chromium",
195
- mode: process.env.MODE === "cloud" ? "cloud" : "local",
194
+ browser: process.env.BROWSER ? process.env.BROWSER : 'chromium',
195
+ mode: process.env.MODE === 'cloud' ? 'cloud' : 'local',
196
196
  }, {
197
197
  headers: {
198
- Authorization: "Bearer " + this.accessToken,
199
- "x-source": "cucumber_js",
198
+ Authorization: 'Bearer ' + this.accessToken,
199
+ 'x-source': 'cucumber_js',
200
200
  },
201
201
  });
202
202
  if (response.status !== 200) {
203
- throw new Error("Failed to mark run as complete");
203
+ throw new Error('Failed to mark run as complete');
204
204
  }
205
205
  if (response.data.status !== true) {
206
- throw new Error("Failed to mark run as complete");
206
+ throw new Error('Failed to mark run as complete');
207
207
  }
208
208
  try {
209
209
  await axios_client_1.axiosClient.post(`${constants_1.SERVICES_URI.STORAGE}/event`, {
210
210
  event: constants_1.ActionEvents.upload_report,
211
211
  }, {
212
212
  headers: {
213
- Authorization: "Bearer " + this.accessToken,
214
- "x-source": "cucumber_js",
215
- "x-bvt-project-id": projectId,
213
+ Authorization: 'Bearer ' + this.accessToken,
214
+ 'x-source': 'cucumber_js',
215
+ 'x-bvt-project-id': projectId,
216
216
  },
217
217
  });
218
218
  }
@@ -222,21 +222,21 @@ class RunUploadService {
222
222
  }
223
223
  async modifyTestCase(runId, projectId, testProgressReport) {
224
224
  try {
225
- const res = await axios_client_1.axiosClient.post(this.runsApiBaseURL + "/cucumber-runs/modifyTestCase", {
225
+ const res = await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/cucumber-runs/modifyTestCase', {
226
226
  runId,
227
227
  projectId,
228
228
  testProgressReport,
229
229
  }, {
230
230
  headers: {
231
- Authorization: "Bearer " + this.accessToken,
232
- "x-source": "cucumber_js",
231
+ Authorization: 'Bearer ' + this.accessToken,
232
+ 'x-source': 'cucumber_js',
233
233
  },
234
234
  });
235
235
  if (res.status !== 200) {
236
- throw new Error("");
236
+ throw new Error('');
237
237
  }
238
238
  if (res.data.status !== true) {
239
- throw new Error("");
239
+ throw new Error('');
240
240
  }
241
241
  (0, bvt_analysis_formatter_1.logReportLink)(runId, projectId, testProgressReport.result);
242
242
  }
@@ -244,6 +244,25 @@ class RunUploadService {
244
244
  console.error(`failed to modify the test case: ${testProgressReport.id} ${e}`);
245
245
  }
246
246
  }
247
+ async createStatus(status) {
248
+ if (!process.env.UUID) {
249
+ return;
250
+ }
251
+ try {
252
+ await axios_client_1.axiosClient.post(this.runsApiBaseURL + '/scenarios/status', {
253
+ status: { status },
254
+ uuid: process.env.UUID,
255
+ }, {
256
+ headers: {
257
+ Authorization: 'Bearer ' + this.accessToken,
258
+ 'x-source': 'cucumber_js',
259
+ },
260
+ });
261
+ }
262
+ catch (error) {
263
+ console.log('Failed to send status to the server, ignoring it');
264
+ }
265
+ }
247
266
  }
248
267
  exports.RunUploadService = RunUploadService;
249
268
  //# sourceMappingURL=upload_serivce.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload_serivce.js","sourceRoot":"","sources":["../../../src/formatter/helpers/upload_serivce.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport FormData from \"form-data\";\nimport { createReadStream, existsSync, write, writeFileSync } from \"fs\";\nimport fs from \"fs/promises\";\n\nimport { JsonReport, JsonTestProgress } from \"./report_generator\";\nimport { axiosClient } from \"../../configuration/axios_client\";\nimport path from \"path\";\nimport { logReportLink } from \"../bvt_analysis_formatter\";\nimport { ActionEvents, SERVICES_URI } from \"./constants\";\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL;\nconst BATCH_SIZE = 10;\nconst MAX_RETRIES = 3;\nconst REPORT_SERVICE_TOKEN = process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN;\n\nexport interface RootCauseProps {\n status: boolean;\n analysis: string;\n failedStep: number;\n failClass: string;\n}\n\nexport interface FinishTestCaseResponse {\n status: true;\n rootCause: RootCauseProps;\n report: JsonTestProgress;\n}\n\nclass RunUploadService {\n constructor(private runsApiBaseURL: string, private accessToken: string) {}\n async createRunDocument(name: string) {\n try {\n const runDocResult = await axiosClient.post(\n this.runsApiBaseURL + \"/cucumber-runs/create\",\n {\n name: name ? name : \"TEST\",\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n },\n }\n );\n if (runDocResult.status !== 200) {\n throw new Error(\"Failed to create run document in the server\");\n }\n if (runDocResult.data.status !== true) {\n throw new Error(\"Failed to create run document in the server\");\n }\n return runDocResult.data.run;\n } catch (error) {\n if (error.response && error.response.status === 403) {\n console.log(\"Warning: Your trial plan has ended. Cannot create or upload reports.\");\n process.exit(1);\n }\n throw new Error(\"Failed to create run document in the server: \" + error);\n }\n }\n async upload(formData: FormData) {\n const response = await axiosClient.post(this.runsApiBaseURL + \"/cucumber-runs/upload\", formData, {\n headers: {\n ...formData.getHeaders(),\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n },\n });\n if (response.status === 401) {\n console.log(\"Warning: Your trial plan has ended. Cannot upload reports and perform retraining\");\n throw new Error(\"Warning: Your trial plan has ended. Cannot upload reports and perform retraining\");\n }\n if (response.status !== 200) {\n throw new Error(\"Failed to upload run to the server\");\n }\n if (response.data.status !== true) {\n throw new Error(\"Failed to upload run to the server\");\n }\n }\n async getPreSignedUrls(fileUris: string[], runId: string) {\n const response = await axiosClient.post(\n this.runsApiBaseURL + \"/cucumber-runs/generateuploadurls\",\n {\n fileUris,\n runId,\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n },\n }\n );\n if (response.status === 403) {\n console.log(\"Warning: Your trial plan has ended. Cannot upload reports and perform retraining\");\n throw new Error(\"Warning: Your trial plan has ended. Cannot upload reports and perform retraining\");\n }\n if (response.status !== 200) {\n throw new Error(\"Failed to get pre-signed urls for the files\");\n }\n if (response.data.status !== true) {\n throw new Error(\"Failed to get pre-signed urls for the files\");\n }\n\n return response.data.uploadUrls;\n }\n\n async uploadTestCase(\n testCaseReport: JsonTestProgress,\n runId: string,\n projectId: string,\n reportFolder: string,\n rerunId?: string\n ) {\n const fileUris = [];\n //iterate over all the files in the JsonCommand.screenshotId and insert them into the fileUris array\n for (const step of testCaseReport.steps) {\n for (const command of step.commands) {\n if (command.screenshotId) {\n fileUris.push(\"screenshots\" + \"/\" + String(command.screenshotId) + \".png\");\n }\n }\n if (step.traceFilePath) {\n fileUris.push(\"trace\" + \"/\" + step.traceFilePath);\n }\n }\n if (testCaseReport.logFileId) {\n fileUris.push(\"editorLogs\" + \"/\" + \"testCaseLog_\" + testCaseReport.logFileId + \".log\");\n }\n // console.log({ fileUris })\n const preSignedUrls = await this.getPreSignedUrls(fileUris, runId);\n //upload all the files in the fileUris array\n try {\n for (let i = 0; i < fileUris.length; i += BATCH_SIZE) {\n const batch = fileUris.slice(i, Math.min(i + BATCH_SIZE, fileUris.length));\n await Promise.all(\n batch\n .filter((fileUri) => preSignedUrls[fileUri])\n .map(async (fileUri) => {\n for (let j = 0; j < MAX_RETRIES; j++) {\n if (existsSync(path.join(reportFolder, fileUri))) {\n const success = await this.uploadFile(path.join(reportFolder, fileUri), preSignedUrls[fileUri]);\n if (success) {\n return;\n }\n }\n const success = await this.uploadFile(\n path.join(reportFolder, fileUri),\n preSignedUrls[fileUri]\n )\n if (success) {\n return\n }\n }\n console.error(\"Failed to upload file:\", fileUri);\n })\n );\n }\n\n // writeFileSync(\"report.json\", JSON.stringify(testCaseReport, null, 2))\n const { data } = await axiosClient.post<FinishTestCaseResponse>(\n this.runsApiBaseURL + \"/cucumber-runs/createNewTestCase\",\n {\n runId,\n projectId,\n testProgressReport: testCaseReport,\n browser: process.env.BROWSER ? process.env.BROWSER : \"chromium\",\n mode: process.env.MODE === \"cloud\" ? \"cloud\" : \"local\",\n rerunId,\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n },\n }\n );\n\n try {\n await axiosClient.post(\n `${SERVICES_URI.STORAGE}/event`,\n {\n event: ActionEvents.upload_report,\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n \"x-bvt-project-id\": projectId,\n },\n }\n );\n } catch (error) {\n // no event tracking\n }\n logReportLink(runId, projectId, testCaseReport.result);\n return data;\n } catch (e) {\n console.error(`failed to upload the test case: ${testCaseReport.id} ${e}`);\n return null;\n }\n }\n async uploadFile(filePath: string, preSignedUrl: string) {\n const fileStream = createReadStream(filePath);\n let success = true;\n try {\n const fileStats = await fs.stat(filePath);\n const fileSize = fileStats.size;\n\n await axiosClient.put(preSignedUrl, fileStream, {\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Length\": fileSize,\n },\n });\n } catch (error) {\n if (process.env.NODE_ENV_BLINQ === \"dev\") {\n console.error(\"Error uploading file:\", error);\n }\n success = false;\n } finally {\n fileStream.close();\n }\n return success;\n }\n async uploadComplete(runId: string, projectId: string) {\n const response = await axiosClient.post(\n this.runsApiBaseURL + \"/cucumber-runs/uploadCompletion\",\n {\n runId,\n projectId,\n browser: process.env.BROWSER ? process.env.BROWSER : \"chromium\",\n mode: process.env.MODE === \"cloud\" ? \"cloud\" : \"local\",\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n },\n }\n );\n if (response.status !== 200) {\n throw new Error(\"Failed to mark run as complete\");\n }\n if (response.data.status !== true) {\n throw new Error(\"Failed to mark run as complete\");\n }\n\n try {\n await axiosClient.post(\n `${SERVICES_URI.STORAGE}/event`,\n {\n event: ActionEvents.upload_report,\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n \"x-bvt-project-id\": projectId,\n },\n }\n );\n } catch (error) {\n // no event tracking\n }\n }\n async modifyTestCase(runId: string, projectId: string, testProgressReport: JsonTestProgress) {\n try {\n const res = await axiosClient.post(\n this.runsApiBaseURL + \"/cucumber-runs/modifyTestCase\",\n {\n runId,\n projectId,\n testProgressReport,\n },\n {\n headers: {\n Authorization: \"Bearer \" + this.accessToken,\n \"x-source\": \"cucumber_js\",\n },\n }\n );\n if (res.status !== 200) {\n throw new Error(\"\");\n }\n if (res.data.status !== true) {\n throw new Error(\"\");\n }\n logReportLink(runId, projectId, testProgressReport.result);\n } catch (e) {\n console.error(`failed to modify the test case: ${testProgressReport.id} ${e}`);\n }\n }\n}\n\nexport { RunUploadService };\n"]}
1
+ {"version":3,"file":"upload_serivce.js","sourceRoot":"","sources":["../../../src/formatter/helpers/upload_serivce.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport FormData from 'form-data'\nimport { createReadStream, existsSync, write, writeFileSync } from 'fs'\nimport fs from 'fs/promises'\n\nimport { JsonReport, JsonTestProgress } from './report_generator'\nimport { axiosClient } from '../../configuration/axios_client'\nimport path from 'path'\nimport { logReportLink } from '../bvt_analysis_formatter'\nimport { ActionEvents, SERVICES_URI } from './constants'\n\nconst REPORT_SERVICE_URL = process.env.REPORT_SERVICE_URL ?? URL\nconst BATCH_SIZE = 10\nconst MAX_RETRIES = 3\nconst REPORT_SERVICE_TOKEN =\n process.env.TOKEN ?? process.env.REPORT_SERVICE_TOKEN\n\nexport interface RootCauseProps {\n status: boolean\n analysis: string\n failedStep: number\n failClass: string\n}\n\nexport interface FinishTestCaseResponse {\n status: true\n rootCause: RootCauseProps\n report: JsonTestProgress\n}\n\nclass RunUploadService {\n constructor(private runsApiBaseURL: string, private accessToken: string) {}\n async createRunDocument(name: string) {\n try {\n const runDocResult = await axiosClient.post(\n this.runsApiBaseURL + '/cucumber-runs/create',\n {\n name: name ? name : 'TEST',\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n if (runDocResult.status !== 200) {\n throw new Error('Failed to create run document in the server')\n }\n if (runDocResult.data.status !== true) {\n throw new Error('Failed to create run document in the server')\n }\n return runDocResult.data.run\n } catch (error) {\n if (error.response && error.response.status === 403) {\n console.log(\n 'Warning: Your trial plan has ended. Cannot create or upload reports.'\n )\n process.exit(1)\n }\n throw new Error('Failed to create run document in the server: ' + error)\n }\n }\n async upload(formData: FormData) {\n const response = await axiosClient.post(\n this.runsApiBaseURL + '/cucumber-runs/upload',\n formData,\n {\n headers: {\n ...formData.getHeaders(),\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n if (response.status === 401) {\n console.log(\n 'Warning: Your trial plan has ended. Cannot upload reports and perform retraining'\n )\n throw new Error(\n 'Warning: Your trial plan has ended. Cannot upload reports and perform retraining'\n )\n }\n if (response.status !== 200) {\n throw new Error('Failed to upload run to the server')\n }\n if (response.data.status !== true) {\n throw new Error('Failed to upload run to the server')\n }\n }\n async getPreSignedUrls(fileUris: string[], runId: string) {\n const response = await axiosClient.post(\n this.runsApiBaseURL + '/cucumber-runs/generateuploadurls',\n {\n fileUris,\n runId,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n if (response.status === 403) {\n console.log(\n 'Warning: Your trial plan has ended. Cannot upload reports and perform retraining'\n )\n throw new Error(\n 'Warning: Your trial plan has ended. Cannot upload reports and perform retraining'\n )\n }\n if (response.status !== 200) {\n throw new Error('Failed to get pre-signed urls for the files')\n }\n if (response.data.status !== true) {\n throw new Error('Failed to get pre-signed urls for the files')\n }\n\n return response.data.uploadUrls\n }\n\n async uploadTestCase(\n testCaseReport: JsonTestProgress,\n runId: string,\n projectId: string,\n reportFolder: string,\n rerunId?: string\n ) {\n const fileUris = []\n //iterate over all the files in the JsonCommand.screenshotId and insert them into the fileUris array\n for (const step of testCaseReport.steps) {\n for (const command of step.commands) {\n if (command.screenshotId) {\n fileUris.push(\n 'screenshots' + '/' + String(command.screenshotId) + '.png'\n )\n }\n }\n if (step.traceFilePath) {\n fileUris.push('trace' + '/' + step.traceFilePath)\n }\n }\n if (testCaseReport.logFileId) {\n fileUris.push(\n 'editorLogs' + '/' + 'testCaseLog_' + testCaseReport.logFileId + '.log'\n )\n }\n // console.log({ fileUris })\n const preSignedUrls = await this.getPreSignedUrls(fileUris, runId)\n //upload all the files in the fileUris array\n try {\n for (let i = 0; i < fileUris.length; i += BATCH_SIZE) {\n const batch = fileUris.slice(\n i,\n Math.min(i + BATCH_SIZE, fileUris.length)\n )\n await Promise.all(\n batch\n .filter((fileUri) => preSignedUrls[fileUri])\n .map(async (fileUri) => {\n for (let j = 0; j < MAX_RETRIES; j++) {\n if (existsSync(path.join(reportFolder, fileUri))) {\n const success = await this.uploadFile(\n path.join(reportFolder, fileUri),\n preSignedUrls[fileUri]\n )\n if (success) {\n return\n }\n }\n const success = await this.uploadFile(\n path.join(reportFolder, fileUri),\n preSignedUrls[fileUri]\n )\n if (success) {\n return\n }\n }\n console.error('Failed to upload file:', fileUri)\n })\n )\n }\n\n // writeFileSync(\"report.json\", JSON.stringify(testCaseReport, null, 2))\n const { data } = await axiosClient.post<FinishTestCaseResponse>(\n this.runsApiBaseURL + '/cucumber-runs/createNewTestCase',\n {\n runId,\n projectId,\n testProgressReport: testCaseReport,\n browser: process.env.BROWSER ? process.env.BROWSER : 'chromium',\n mode: process.env.MODE === 'cloud' ? 'cloud' : 'local',\n rerunId,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n\n try {\n await axiosClient.post(\n `${SERVICES_URI.STORAGE}/event`,\n {\n event: ActionEvents.upload_report,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n 'x-bvt-project-id': projectId,\n },\n }\n )\n } catch (error) {\n // no event tracking\n }\n logReportLink(runId, projectId, testCaseReport.result)\n return data\n } catch (e) {\n console.error(`failed to upload the test case: ${testCaseReport.id} ${e}`)\n return null\n }\n }\n async uploadFile(filePath: string, preSignedUrl: string) {\n const fileStream = createReadStream(filePath)\n let success = true\n try {\n const fileStats = await fs.stat(filePath)\n const fileSize = fileStats.size\n\n await axiosClient.put(preSignedUrl, fileStream, {\n headers: {\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': fileSize,\n },\n })\n } catch (error) {\n if (process.env.NODE_ENV_BLINQ === 'dev') {\n console.error('Error uploading file:', error)\n }\n success = false\n } finally {\n fileStream.close()\n }\n return success\n }\n async uploadComplete(runId: string, projectId: string) {\n const response = await axiosClient.post(\n this.runsApiBaseURL + '/cucumber-runs/uploadCompletion',\n {\n runId,\n projectId,\n browser: process.env.BROWSER ? process.env.BROWSER : 'chromium',\n mode: process.env.MODE === 'cloud' ? 'cloud' : 'local',\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n if (response.status !== 200) {\n throw new Error('Failed to mark run as complete')\n }\n if (response.data.status !== true) {\n throw new Error('Failed to mark run as complete')\n }\n\n try {\n await axiosClient.post(\n `${SERVICES_URI.STORAGE}/event`,\n {\n event: ActionEvents.upload_report,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n 'x-bvt-project-id': projectId,\n },\n }\n )\n } catch (error) {\n // no event tracking\n }\n }\n async modifyTestCase(\n runId: string,\n projectId: string,\n testProgressReport: JsonTestProgress\n ) {\n try {\n const res = await axiosClient.post(\n this.runsApiBaseURL + '/cucumber-runs/modifyTestCase',\n {\n runId,\n projectId,\n testProgressReport,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n if (res.status !== 200) {\n throw new Error('')\n }\n if (res.data.status !== true) {\n throw new Error('')\n }\n logReportLink(runId, projectId, testProgressReport.result)\n } catch (e) {\n console.error(\n `failed to modify the test case: ${testProgressReport.id} ${e}`\n )\n }\n }\n async createStatus(status: string) {\n if (!process.env.UUID) {\n return\n }\n\n try {\n await axiosClient.post(\n this.runsApiBaseURL + '/scenarios/status',\n {\n status: { status },\n uuid: process.env.UUID,\n },\n {\n headers: {\n Authorization: 'Bearer ' + this.accessToken,\n 'x-source': 'cucumber_js',\n },\n }\n )\n } catch (error) {\n console.log('Failed to send status to the server, ignoring it')\n }\n }\n}\n\nexport { RunUploadService }\n"]}
package/lib/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "1.0.172-dev";
1
+ export declare const version = "1.0.174-dev";
package/lib/version.js CHANGED
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = void 0;
4
4
  // Generated by genversion.
5
- exports.version = '1.0.172-dev';
5
+ exports.version = '1.0.174-dev';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,aAAa,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '1.0.172-dev'\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":";;;AAAA,2BAA2B;AACd,QAAA,OAAO,GAAG,aAAa,CAAA","sourcesContent":["// Generated by genversion.\nexport const version = '1.0.174-dev'\n"]}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "gherkin",
9
9
  "tests"
10
10
  ],
11
- "version": "1.0.172-dev",
11
+ "version": "1.0.174-dev",
12
12
  "homepage": "https://github.com/blinq-io/cucumber-js",
13
13
  "author": "blinq.io",
14
14
  "contributors": [