@dev-blinq/cucumber-js 1.0.86-dev → 1.0.86-stage

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/bin/download-install.js +40 -13
  2. package/lib/configuration/axios_client.js +1 -1
  3. package/lib/configuration/axios_client.js.map +1 -1
  4. package/lib/formatter/api.d.ts +2 -0
  5. package/lib/formatter/api.js +59 -0
  6. package/lib/formatter/api.js.map +1 -0
  7. package/lib/formatter/bvt_analysis_formatter.d.ts +13 -1
  8. package/lib/formatter/bvt_analysis_formatter.js +197 -72
  9. package/lib/formatter/bvt_analysis_formatter.js.map +1 -1
  10. package/lib/formatter/feature_data_format.js +15 -2
  11. package/lib/formatter/feature_data_format.js.map +1 -1
  12. package/lib/formatter/helpers/constants.d.ts +50 -0
  13. package/lib/formatter/helpers/constants.js +60 -0
  14. package/lib/formatter/helpers/constants.js.map +1 -0
  15. package/lib/formatter/helpers/report_generator.d.ts +31 -2
  16. package/lib/formatter/helpers/report_generator.js +334 -16
  17. package/lib/formatter/helpers/report_generator.js.map +1 -1
  18. package/lib/formatter/helpers/test_case_attempt_formatter.js +1 -1
  19. package/lib/formatter/helpers/test_case_attempt_formatter.js.map +1 -1
  20. package/lib/formatter/helpers/upload_serivce.d.ts +16 -2
  21. package/lib/formatter/helpers/upload_serivce.js +176 -16
  22. package/lib/formatter/helpers/upload_serivce.js.map +1 -1
  23. package/lib/formatter/helpers/uploader.d.ts +2 -1
  24. package/lib/formatter/helpers/uploader.js +59 -5
  25. package/lib/formatter/helpers/uploader.js.map +1 -1
  26. package/lib/formatter/summary_formatter.js +4 -0
  27. package/lib/formatter/summary_formatter.js.map +1 -1
  28. package/lib/runtime/test_case_runner.d.ts +1 -0
  29. package/lib/runtime/test_case_runner.js +10 -1
  30. package/lib/runtime/test_case_runner.js.map +1 -1
  31. package/lib/version.d.ts +1 -1
  32. package/lib/version.js +1 -1
  33. package/lib/version.js.map +1 -1
  34. package/package.json +4 -2
@@ -1,10 +1,54 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
28
+ var _a, _b;
5
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
+ const messages = __importStar(require("@cucumber/messages"));
6
31
  const fs_1 = __importDefault(require("fs"));
7
32
  const path_1 = __importDefault(require("path"));
33
+ const upload_serivce_1 = require("./upload_serivce");
34
+ const fs_extra_1 = require("fs-extra");
35
+ // type JsonException = messages.Exception
36
+ const object_path_1 = __importDefault(require("object-path"));
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
+ : !process.env.NODE_ENV_BLINQ
46
+ ? 'https://api.blinq.io/api/runs'
47
+ : `${process.env.NODE_ENV_BLINQ}/api/runs`;
48
+ const REPORT_SERVICE_URL = (_a = process.env.REPORT_SERVICE_URL) !== null && _a !== void 0 ? _a : URL;
49
+ const BATCH_SIZE = 10;
50
+ const MAX_RETRIES = 3;
51
+ const REPORT_SERVICE_TOKEN = (_b = process.env.TOKEN) !== null && _b !== void 0 ? _b : process.env.REPORT_SERVICE_TOKEN;
8
52
  class ReportGenerator {
9
53
  constructor() {
10
54
  this.report = {
@@ -27,9 +71,21 @@ class ReportGenerator {
27
71
  this.scenarioIterationCountMap = new Map();
28
72
  this.logs = [];
29
73
  this.networkLog = [];
74
+ this.stepLogs = [];
75
+ this.stepNetworkLogs = [];
76
+ this.runName = '';
77
+ this.ariaSnapshot = '';
78
+ this.initialAriaSnapshot = '';
79
+ this.testCaseLog = [];
80
+ this.loggingOverridden = false; // Flag to track if logging is overridden
30
81
  this.reportFolder = null;
82
+ this.uploadService = new upload_serivce_1.RunUploadService(REPORT_SERVICE_URL, REPORT_SERVICE_TOKEN);
83
+ this.retryCount = 3;
31
84
  }
32
- handleMessage(envelope) {
85
+ async handleMessage(envelope, reRunId) {
86
+ if (envelope.meta && 'runName' in envelope.meta) {
87
+ this.runName = envelope.meta.runName;
88
+ }
33
89
  const type = Object.keys(envelope)[0];
34
90
  switch (type) {
35
91
  // case "meta": { break}
@@ -54,10 +110,30 @@ class ReportGenerator {
54
110
  case 'testRunStarted': {
55
111
  const testRunStarted = envelope[type];
56
112
  this.onTestRunStarted(testRunStarted);
113
+ await this.uploadService.createStatus('running');
57
114
  break;
58
115
  }
59
116
  case 'testCase': {
60
117
  const testCase = envelope[type];
118
+ // Initialize the log storage
119
+ this.testCaseLog = [];
120
+ if (!this.loggingOverridden) {
121
+ this.loggingOverridden = true;
122
+ // Store the original process.stdout.write, and process.stderr.write
123
+ const originalStdoutWrite = process.stdout.write;
124
+ const originalStderrWrite = process.stderr.write;
125
+ // Override process.stdout.write
126
+ process.stdout.write = (chunk, ...args) => {
127
+ this.testCaseLog.push(chunk.toString());
128
+ return originalStdoutWrite.call(process.stdout, chunk, ...args);
129
+ };
130
+ // Override process.stderr.write
131
+ process.stderr.write = (chunk, ...args) => {
132
+ this.testCaseLog.push(chunk.toString());
133
+ return originalStderrWrite.call(process.stderr, chunk, ...args);
134
+ };
135
+ }
136
+ // Call the onTestCase method
61
137
  this.onTestCase(testCase);
62
138
  break;
63
139
  }
@@ -83,13 +159,14 @@ class ReportGenerator {
83
159
  }
84
160
  case 'testCaseFinished': {
85
161
  const testCaseFinished = envelope[type];
86
- this.onTestCaseFinished(testCaseFinished);
87
- break;
162
+ // Call the onTestCaseFinished method
163
+ const result = await this.onTestCaseFinished(testCaseFinished, reRunId);
164
+ return result;
88
165
  }
89
166
  // case "hook": { break} // After Hook
90
167
  case 'testRunFinished': {
91
168
  const testRunFinished = envelope[type];
92
- this.onTestRunFinished(testRunFinished);
169
+ await this.onTestRunFinished(testRunFinished);
93
170
  break;
94
171
  }
95
172
  // case "parameterType" : { break}
@@ -220,6 +297,10 @@ class ReportGenerator {
220
297
  result: {
221
298
  status: 'UNKNOWN',
222
299
  },
300
+ networkData: [],
301
+ webLog: [],
302
+ data: {},
303
+ ariaSnapshot: this.ariaSnapshot,
223
304
  });
224
305
  return this.stepReportMap.get(pickleStep.id);
225
306
  });
@@ -236,6 +317,10 @@ class ReportGenerator {
236
317
  },
237
318
  webLog: [],
238
319
  networkLog: [],
320
+ env: {
321
+ name: this.report.env.name,
322
+ baseUrl: this.report.env.baseUrl,
323
+ },
239
324
  });
240
325
  this.report.testCases.push(this.testCaseReportMap.get(id));
241
326
  }
@@ -258,17 +343,34 @@ class ReportGenerator {
258
343
  this.reportFolder = body.replaceAll('\\', '/');
259
344
  return;
260
345
  }
346
+ if (mediaType === 'application/json+snapshot-before') {
347
+ this.initialAriaSnapshot = body;
348
+ return;
349
+ }
350
+ if (mediaType === 'application/json+snapshot-after') {
351
+ this.ariaSnapshot = body;
352
+ return;
353
+ }
261
354
  if (mediaType === 'application/json+env') {
262
355
  const data = JSON.parse(body);
263
356
  this.report.env = data;
357
+ this.report.testCases.map((testCase) => {
358
+ testCase.env = data;
359
+ return testCase;
360
+ });
264
361
  }
265
362
  if (mediaType === 'application/json+log') {
266
363
  const log = JSON.parse(body);
267
- this.logs.push(log);
364
+ if (this.logs.length < 1000) {
365
+ this.logs.push(log);
366
+ this.stepLogs.push(log);
367
+ }
268
368
  }
269
369
  if (mediaType === 'application/json+network') {
270
370
  const networkLog = JSON.parse(body);
271
- this.networkLog.push(networkLog);
371
+ if (this.networkLog.length < 1000)
372
+ this.networkLog.push(networkLog);
373
+ this.stepNetworkLogs.push(networkLog);
272
374
  }
273
375
  const testStep = this.testStepMap.get(testStepId);
274
376
  if (testStep.pickleStepId === undefined)
@@ -278,6 +380,37 @@ class ReportGenerator {
278
380
  const command = JSON.parse(body);
279
381
  stepProgess.commands.push(command);
280
382
  }
383
+ else if (mediaType === 'application/json+trace') {
384
+ const data = JSON.parse(body);
385
+ stepProgess.traceFilePath = data.traceFilePath;
386
+ }
387
+ if (mediaType === 'application/json+bruno') {
388
+ try {
389
+ const data = JSON.parse(body);
390
+ stepProgess.brunoData = data;
391
+ }
392
+ catch (error) {
393
+ console.error('Error parsing bruno data:', error);
394
+ }
395
+ }
396
+ }
397
+ getFailedTestStepResult({ commands, startTime, endTime, result, }) {
398
+ for (const command of commands) {
399
+ if (command.result.status === 'FAILED') {
400
+ return {
401
+ status: 'FAILED',
402
+ message: command.result.message,
403
+ startTime,
404
+ endTime,
405
+ };
406
+ }
407
+ }
408
+ return {
409
+ status: 'FAILED',
410
+ startTime,
411
+ endTime,
412
+ message: result.message,
413
+ };
281
414
  }
282
415
  onTestStepFinished(testStepFinished) {
283
416
  const { testStepId, testStepResult, timestamp } = testStepFinished;
@@ -288,6 +421,25 @@ class ReportGenerator {
288
421
  }
289
422
  return;
290
423
  }
424
+ if (testStepResult.status === 'UNDEFINED') {
425
+ const step = this.stepReportMap.get(testStep.pickleStepId);
426
+ const stepName = step ? step.keyword + ' ' + step.text : 'Undefined step';
427
+ const undefinedCommand = {
428
+ testStepId: testStepId,
429
+ body: JSON.stringify({
430
+ type: 'error',
431
+ text: 'Undefined step: ' + stepName,
432
+ result: {
433
+ status: 'FAILED',
434
+ startTime: this.getTimeStamp(timestamp),
435
+ endTime: this.getTimeStamp(timestamp),
436
+ },
437
+ }),
438
+ mediaType: 'application/json',
439
+ contentEncoding: messages.AttachmentContentEncoding.IDENTITY,
440
+ };
441
+ this.onAttachment(undefinedCommand);
442
+ }
291
443
  const stepProgess = this.stepReportMap.get(testStep.pickleStepId);
292
444
  const prevStepResult = stepProgess.result;
293
445
  let data = {};
@@ -303,16 +455,72 @@ class ReportGenerator {
303
455
  catch (error) {
304
456
  console.log('Error reading data.json');
305
457
  }
306
- stepProgess.result = {
307
- status: testStepResult.status,
308
- startTime: prevStepResult.startTime,
309
- endTime: this.getTimeStamp(timestamp),
310
- message: testStepResult.message,
311
- // exception: testStepResult.exception,
312
- };
458
+ if (testStepResult.status === 'FAILED') {
459
+ stepProgess.result = this.getFailedTestStepResult({
460
+ commands: stepProgess.commands,
461
+ startTime: prevStepResult.startTime,
462
+ endTime: this.getTimeStamp(timestamp),
463
+ result: testStepResult,
464
+ });
465
+ }
466
+ else {
467
+ stepProgess.result = {
468
+ status: testStepResult.status,
469
+ startTime: prevStepResult.startTime,
470
+ endTime: this.getTimeStamp(timestamp),
471
+ };
472
+ }
473
+ stepProgess.webLog = this.stepLogs;
474
+ stepProgess.networkData = this.stepNetworkLogs;
475
+ stepProgess.ariaSnapshot = this.ariaSnapshot;
476
+ this.ariaSnapshot = '';
477
+ this.stepNetworkLogs = [];
478
+ this.stepLogs = [];
313
479
  if (Object.keys(data).length > 0) {
314
480
  stepProgess.data = data;
481
+ const id = testStepFinished.testCaseStartedId;
482
+ const parameters = this.testCaseReportMap.get(id).parameters;
483
+ const _parameters = {};
484
+ Object.keys(parameters).map((key) => {
485
+ if (parameters[key].startsWith('{{') &&
486
+ parameters[key].endsWith('}}')) {
487
+ const path = parameters[key].slice(2, -2).split('.');
488
+ let value = String(object_path_1.default.get(data, path));
489
+ if (value) {
490
+ if (value.startsWith('secret:')) {
491
+ value = 'secret:****';
492
+ }
493
+ else if (value.startsWith('totp:')) {
494
+ value = 'totp:****';
495
+ }
496
+ else if (value.startsWith('mask:')) {
497
+ value = 'mask:****';
498
+ }
499
+ _parameters[key] = value;
500
+ }
501
+ }
502
+ else {
503
+ _parameters[key] = parameters[key];
504
+ }
505
+ });
506
+ this.report.testCases.find((testCase) => {
507
+ return testCase.id === id;
508
+ }).parameters = _parameters;
315
509
  }
510
+ // if (process.env.TESTCASE_REPORT_FOLDER_PATH) {
511
+ // this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH
512
+ // if (!fs.existsSync(this.reportFolder)) {
513
+ // fs.mkdirSync(this.reportFolder)
514
+ // }
515
+ // const reportFilePath = path.join(
516
+ // this.reportFolder,
517
+ // `report.json`
518
+ // )
519
+ // writeFileSync(reportFilePath, JSON.stringify(this.report, null, 2))
520
+ // return undefined
521
+ // // } else {
522
+ // // return await this.uploadTestCase(testProgress, reRunId)
523
+ // }
316
524
  }
317
525
  getLogFileContent() {
318
526
  let projectPath = process.cwd();
@@ -360,21 +568,130 @@ class ReportGenerator {
360
568
  status: 'PASSED',
361
569
  };
362
570
  }
363
- onTestCaseFinished(testCaseFinished) {
571
+ async onTestCaseFinished(testCaseFinished, reRunId) {
364
572
  const { testCaseStartedId, timestamp } = testCaseFinished;
365
573
  const testProgress = this.testCaseReportMap.get(testCaseStartedId);
366
574
  const prevResult = testProgress.result;
367
575
  const steps = Object.values(testProgress.steps);
368
576
  const result = this.getTestCaseResult(steps);
577
+ const endTime = this.getTimeStamp(timestamp);
369
578
  testProgress.result = {
370
579
  ...result,
371
580
  startTime: prevResult.startTime,
372
- endTime: this.getTimeStamp(timestamp),
581
+ endTime,
373
582
  };
374
583
  testProgress.webLog = this.logs;
375
584
  testProgress.networkLog = this.networkLog;
585
+ testProgress.initialAriaSnapshot = this.initialAriaSnapshot;
586
+ this.initialAriaSnapshot = '';
587
+ this.networkLog = [];
588
+ this.logs = [];
589
+ if (this.testCaseLog && this.testCaseLog.length > 0) {
590
+ // Create the logs directory
591
+ const logsDir = path_1.default.join(this.reportFolder, 'editorLogs');
592
+ const fileName = `testCaseLog_${testCaseStartedId}.log`;
593
+ const filePath = path_1.default.join(logsDir, fileName);
594
+ // Ensure the logs directory exists
595
+ fs_1.default.mkdirSync(logsDir, { recursive: true });
596
+ // Write the logs to the file
597
+ fs_1.default.writeFileSync(filePath, this.testCaseLog.join('\n'), 'utf8');
598
+ // Store this ID in the testProgress object so it can be accessed later
599
+ testProgress.logFileId = testCaseStartedId;
600
+ }
601
+ this.testCaseLog = [];
602
+ if (process.env.TESTCASE_REPORT_FOLDER_PATH) {
603
+ this.reportFolder = process.env.TESTCASE_REPORT_FOLDER_PATH;
604
+ if (!fs_1.default.existsSync(this.reportFolder)) {
605
+ fs_1.default.mkdirSync(this.reportFolder);
606
+ }
607
+ const reportFilePath = path_1.default.join(this.reportFolder, `${endTime}_${testProgress.scenarioName}.json`);
608
+ (0, fs_extra_1.writeFileSync)(reportFilePath, JSON.stringify(testProgress, null, 2));
609
+ return undefined;
610
+ }
611
+ else {
612
+ return await this.uploadTestCase(testProgress, reRunId);
613
+ }
614
+ }
615
+ async uploadTestCase(testCase, rerunId) {
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 = '';
638
+ if (!process.env.UPLOADING_TEST_CASE) {
639
+ process.env.UPLOADING_TEST_CASE = '[]';
640
+ }
641
+ const anyRemArr = JSON.parse(process.env.UPLOADING_TEST_CASE);
642
+ const randomID = Math.random().toString(36).substring(7);
643
+ anyRemArr.push(randomID);
644
+ process.env.UPLOADING_TEST_CASE = JSON.stringify(anyRemArr);
645
+ try {
646
+ if (process.env.RUN_ID &&
647
+ process.env.PROJECT_ID &&
648
+ !process.env.IGNORE_ENV_VARIABLES) {
649
+ runId = process.env.RUN_ID;
650
+ projectId = process.env.PROJECT_ID;
651
+ }
652
+ else {
653
+ const runDoc = await this.uploadService.createRunDocument(this.runName);
654
+ runId = runDoc._id;
655
+ projectId = runDoc.project_id;
656
+ if (!process.env.IGNORE_ENV_VARIABLES) {
657
+ process.env.RUN_ID = runId;
658
+ process.env.PROJECT_ID = projectId;
659
+ }
660
+ }
661
+ const data = await this.uploadService.uploadTestCase(testCase, runId, projectId, this.reportFolder, rerunId);
662
+ this.writeTestCaseReportToDisk(testCase);
663
+ return data;
664
+ }
665
+ finally {
666
+ const arrRem = JSON.parse(process.env.UPLOADING_TEST_CASE);
667
+ arrRem.splice(arrRem.indexOf(randomID), 1);
668
+ process.env.UPLOADING_TEST_CASE = JSON.stringify(arrRem);
669
+ }
670
+ }
671
+ writeTestCaseReportToDisk(testCase) {
672
+ var _a;
673
+ const reportFolder = (_a = this.reportFolder) !== null && _a !== void 0 ? _a : process.env.TESTCASE_REPORT_FOLDER_PATH;
674
+ if (!reportFolder) {
675
+ console.error('Report folder is not defined');
676
+ return;
677
+ }
678
+ try {
679
+ let i = 0;
680
+ while (fs_1.default.existsSync(path_1.default.join(reportFolder, `${i}`))) {
681
+ i++;
682
+ }
683
+ fs_1.default.mkdirSync(path_1.default.join(reportFolder, `${i}`));
684
+ //exclude network log from the saved report
685
+ const networkLog = testCase.networkLog;
686
+ delete testCase.networkLog;
687
+ fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `report.json`), JSON.stringify(testCase, null, 2));
688
+ fs_1.default.writeFileSync(path_1.default.join(reportFolder, `${i}`, `network.json`), JSON.stringify(networkLog, null, 2));
689
+ }
690
+ catch (error) {
691
+ console.error('Error writing test case report to disk:', error);
692
+ }
376
693
  }
377
- onTestRunFinished(testRunFinished) {
694
+ async onTestRunFinished(testRunFinished) {
378
695
  const { timestamp, success, message } = testRunFinished;
379
696
  const prevResult = this.report.result;
380
697
  this.report.result = {
@@ -384,6 +701,7 @@ class ReportGenerator {
384
701
  message,
385
702
  // exception,
386
703
  };
704
+ await this.uploadService.createStatus(success ? 'passed' : 'failed');
387
705
  }
388
706
  }
389
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'\n// type JsonException = messages.Exception\ntype JsonTimestamp = number //messages.Timestamp\ntype JsonStepType = 'Unknown' | 'Context' | 'Action' | 'Outcome' | 'Conjunction'\n\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 webLog?: webLog[]\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 data?: 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 webLog: any\n networkLog: any\n}\n\nexport type JsonReport = {\n testCases: JsonTestProgress[]\n result: JsonReportResult\n env: {\n name: string\n baseUrl: string\n }\n}\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 reportFolder: null | string = null\n\n handleMessage(envelope: messages.Envelope) {\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 this.onTestCase(testCase)\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 this.onTestCaseFinished(testCaseFinished)\n break\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 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 })\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 })\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+env') {\n const data = JSON.parse(body)\n this.report.env = data\n }\n if (mediaType === 'application/json+log') {\n const log: webLog = JSON.parse(body)\n this.logs.push(log)\n }\n if (mediaType === 'application/json+network') {\n const networkLog = JSON.parse(body)\n this.networkLog.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 }\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 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 stepProgess.result = {\n status: testStepResult.status,\n startTime: prevStepResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n message: testStepResult.message,\n // exception: testStepResult.exception,\n }\n if (Object.keys(data).length > 0) {\n stepProgess.data = data\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 onTestCaseFinished(testCaseFinished: messages.TestCaseFinished) {\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 testProgress.result = {\n ...result,\n startTime: prevResult.startTime,\n endTime: this.getTimeStamp(timestamp),\n }\n testProgress.webLog = this.logs\n testProgress.networkLog = this.networkLog\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"]}