@testomatio/reporter 2.0.1-beta.5-timestamp → 2.0.1-beta.6

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 (149) hide show
  1. package/README.md +1 -0
  2. package/lib/adapter/codecept.d.ts +2 -0
  3. package/lib/adapter/codecept.js +293 -335
  4. package/lib/adapter/cucumber/current.d.ts +14 -0
  5. package/lib/adapter/cucumber/current.js +195 -203
  6. package/lib/adapter/cucumber/legacy.d.ts +0 -0
  7. package/lib/adapter/cucumber/legacy.js +130 -155
  8. package/lib/adapter/cucumber.d.ts +2 -0
  9. package/lib/adapter/cucumber.js +5 -16
  10. package/lib/adapter/cypress-plugin/index.d.ts +2 -0
  11. package/lib/adapter/cypress-plugin/index.js +91 -105
  12. package/lib/adapter/jasmine.d.ts +11 -0
  13. package/lib/adapter/jasmine.js +54 -53
  14. package/lib/adapter/jest.d.ts +13 -0
  15. package/lib/adapter/jest.js +97 -99
  16. package/lib/adapter/mocha.d.ts +2 -0
  17. package/lib/adapter/mocha.js +112 -141
  18. package/lib/adapter/nightwatch.d.ts +4 -0
  19. package/lib/adapter/nightwatch.js +80 -0
  20. package/lib/adapter/playwright.d.ts +14 -0
  21. package/lib/adapter/playwright.js +199 -231
  22. package/lib/adapter/vitest.d.ts +35 -0
  23. package/lib/adapter/vitest.js +150 -149
  24. package/lib/adapter/webdriver.d.ts +24 -0
  25. package/lib/adapter/webdriver.js +144 -121
  26. package/lib/bin/cli.d.ts +2 -0
  27. package/lib/bin/cli.js +229 -211
  28. package/lib/bin/reportXml.d.ts +2 -0
  29. package/lib/bin/reportXml.js +51 -52
  30. package/lib/bin/startTest.d.ts +2 -0
  31. package/lib/bin/startTest.js +83 -95
  32. package/lib/bin/uploadArtifacts.d.ts +2 -0
  33. package/lib/bin/uploadArtifacts.js +56 -61
  34. package/lib/client.d.ts +76 -0
  35. package/lib/client.js +429 -465
  36. package/lib/config.d.ts +1 -0
  37. package/lib/config.js +18 -23
  38. package/lib/constants.d.ts +25 -0
  39. package/lib/constants.js +50 -44
  40. package/lib/data-storage.d.ts +34 -0
  41. package/lib/data-storage.js +216 -188
  42. package/lib/junit-adapter/adapter.d.ts +9 -0
  43. package/lib/junit-adapter/adapter.js +17 -20
  44. package/lib/junit-adapter/csharp.d.ts +5 -0
  45. package/lib/junit-adapter/csharp.js +28 -14
  46. package/lib/junit-adapter/index.d.ts +3 -0
  47. package/lib/junit-adapter/index.js +27 -25
  48. package/lib/junit-adapter/java.d.ts +5 -0
  49. package/lib/junit-adapter/java.js +41 -53
  50. package/lib/junit-adapter/javascript.d.ts +4 -0
  51. package/lib/junit-adapter/javascript.js +30 -27
  52. package/lib/junit-adapter/python.d.ts +5 -0
  53. package/lib/junit-adapter/python.js +38 -37
  54. package/lib/junit-adapter/ruby.d.ts +4 -0
  55. package/lib/junit-adapter/ruby.js +11 -8
  56. package/lib/output.d.ts +11 -0
  57. package/lib/output.js +44 -52
  58. package/lib/package.json +3 -0
  59. package/lib/pipe/bitbucket.d.ts +25 -0
  60. package/lib/pipe/bitbucket.js +223 -230
  61. package/lib/pipe/csv.d.ts +47 -0
  62. package/lib/pipe/csv.js +113 -126
  63. package/lib/pipe/debug.d.ts +29 -0
  64. package/lib/pipe/debug.js +125 -99
  65. package/lib/pipe/github.d.ts +30 -0
  66. package/lib/pipe/github.js +218 -213
  67. package/lib/pipe/gitlab.d.ts +25 -0
  68. package/lib/pipe/gitlab.js +183 -206
  69. package/lib/pipe/html.d.ts +35 -0
  70. package/lib/pipe/html.js +258 -321
  71. package/lib/pipe/index.d.ts +1 -0
  72. package/lib/pipe/index.js +94 -66
  73. package/lib/pipe/testomatio.d.ts +71 -0
  74. package/lib/pipe/testomatio.js +429 -474
  75. package/lib/replay.d.ts +31 -0
  76. package/lib/replay.js +255 -0
  77. package/lib/reporter-functions.d.ts +34 -0
  78. package/lib/reporter-functions.js +28 -26
  79. package/lib/reporter.d.ts +232 -0
  80. package/lib/reporter.js +34 -29
  81. package/lib/services/artifacts.d.ts +33 -0
  82. package/lib/services/artifacts.js +55 -51
  83. package/lib/services/index.d.ts +9 -0
  84. package/lib/services/index.js +14 -12
  85. package/lib/services/key-values.d.ts +27 -0
  86. package/lib/services/key-values.js +56 -53
  87. package/lib/services/logger.d.ts +64 -0
  88. package/lib/services/logger.js +226 -245
  89. package/lib/template/testomatio.hbs +1026 -1366
  90. package/lib/uploader.d.ts +60 -0
  91. package/lib/uploader.js +295 -364
  92. package/lib/utils/pipe_utils.d.ts +41 -0
  93. package/lib/utils/pipe_utils.js +89 -85
  94. package/lib/utils/utils.d.ts +54 -0
  95. package/lib/utils/utils.js +398 -307
  96. package/lib/xmlReader.d.ts +92 -0
  97. package/lib/xmlReader.js +525 -532
  98. package/package.json +64 -21
  99. package/src/adapter/codecept.js +373 -0
  100. package/src/adapter/cucumber/current.js +228 -0
  101. package/src/adapter/cucumber/legacy.js +158 -0
  102. package/src/adapter/cucumber.js +4 -0
  103. package/src/adapter/cypress-plugin/index.js +110 -0
  104. package/src/adapter/jasmine.js +60 -0
  105. package/src/adapter/jest.js +107 -0
  106. package/src/adapter/mocha.cjs +2 -0
  107. package/src/adapter/mocha.js +156 -0
  108. package/src/adapter/nightwatch.js +88 -0
  109. package/src/adapter/playwright.js +254 -0
  110. package/src/adapter/vitest.js +183 -0
  111. package/src/adapter/webdriver.js +142 -0
  112. package/src/bin/cli.js +348 -0
  113. package/src/bin/reportXml.js +77 -0
  114. package/src/bin/startTest.js +124 -0
  115. package/src/bin/uploadArtifacts.js +91 -0
  116. package/src/client.js +515 -0
  117. package/src/config.js +30 -0
  118. package/src/constants.js +53 -0
  119. package/src/data-storage.js +204 -0
  120. package/src/junit-adapter/adapter.js +23 -0
  121. package/src/junit-adapter/csharp.js +28 -0
  122. package/src/junit-adapter/index.js +28 -0
  123. package/src/junit-adapter/java.js +58 -0
  124. package/src/junit-adapter/javascript.js +31 -0
  125. package/src/junit-adapter/python.js +42 -0
  126. package/src/junit-adapter/ruby.js +10 -0
  127. package/src/output.js +57 -0
  128. package/src/pipe/bitbucket.js +252 -0
  129. package/src/pipe/csv.js +140 -0
  130. package/src/pipe/debug.js +125 -0
  131. package/src/pipe/github.js +232 -0
  132. package/src/pipe/gitlab.js +247 -0
  133. package/src/pipe/html.js +373 -0
  134. package/src/pipe/index.js +71 -0
  135. package/src/pipe/testomatio.js +504 -0
  136. package/src/replay.js +262 -0
  137. package/src/reporter-functions.js +55 -0
  138. package/src/reporter.cjs_decprecated +21 -0
  139. package/src/reporter.js +33 -0
  140. package/src/services/artifacts.js +59 -0
  141. package/src/services/index.js +13 -0
  142. package/src/services/key-values.js +59 -0
  143. package/src/services/logger.js +315 -0
  144. package/src/template/emptyData.svg +23 -0
  145. package/src/template/testomatio.hbs +1081 -0
  146. package/src/uploader.js +376 -0
  147. package/src/utils/pipe_utils.js +119 -0
  148. package/src/utils/utils.js +416 -0
  149. package/src/xmlReader.js +614 -0
@@ -0,0 +1,13 @@
1
+ export class JestReporter {
2
+ constructor(globalConfig: any, options: any);
3
+ _globalConfig: any;
4
+ _options: any;
5
+ client: TestomatClient;
6
+ onRunStart(): void;
7
+ onTestStart(testFile: any): void;
8
+ onTestCaseStart(test: any, testCase: any): void;
9
+ onTestResult(test: any, testResult: any): void;
10
+ onRunComplete(contexts: any, results: any): void;
11
+ }
12
+ export default JestReporter;
13
+ import TestomatClient from '../client.js';
@@ -1,105 +1,103 @@
1
- const chalk = require('chalk');
2
- const TestomatClient = require('../client');
3
- const { STATUS, TESTOMAT_TMP_STORAGE_DIR } = require('../constants');
4
- const { getTestomatIdFromTestTitle, ansiRegExp, fileSystem } = require('../utils/utils');
5
- const { services } = require('../services');
6
- const debug = require('debug')('@testomatio/reporter:adapter-jest');
7
- const path = require('path');
8
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.JestReporter = void 0;
7
+ const picocolors_1 = __importDefault(require("picocolors"));
8
+ const client_js_1 = __importDefault(require("../client.js"));
9
+ const constants_js_1 = require("../constants.js");
10
+ const utils_js_1 = require("../utils/utils.js");
11
+ const index_js_1 = require("../services/index.js");
12
+ const path_1 = __importDefault(require("path"));
13
+ const debug_1 = __importDefault(require("debug"));
14
+ const debug = (0, debug_1.default)('@testomatio/reporter:adapter-jest');
9
15
  class JestReporter {
10
- constructor(globalConfig, options) {
11
- this._globalConfig = globalConfig;
12
- this._options = options;
13
-
14
- this.client = new TestomatClient({ apiKey: options?.apiKey });
15
- this.client.createRun();
16
- }
17
-
18
- onRunStart() {
19
- // clear tmp dir
20
- fileSystem.clearDir(TESTOMAT_TMP_STORAGE_DIR);
21
- }
22
-
23
- // start of test file (including beforeAll)
24
- onTestStart(testFile) {
25
- debug('Start running test file:', testFile.path);
26
- services.setContext(testFile.path);
27
- }
28
-
29
- // start of the test (including beforeEach)
30
- onTestCaseStart(test, testCase) {
31
- debug('Start running test:', testCase.fullName);
32
- services.setContext(testCase.fullName);
33
- }
34
-
35
- // end of test file! (there is also onTestCaseResult listener)
36
- onTestResult(test, testResult) {
37
- if (!this.client) return;
38
-
39
- const { testResults } = testResult;
40
- for (const result of testResults) {
41
- let error;
42
- let steps;
43
- const { status, title, duration, failureMessages } = result;
44
- if (failureMessages[0]) {
45
- let errorMessage = failureMessages[0].replace(ansiRegExp(), '');
46
- errorMessage = errorMessage.split('\n')[0];
47
- error = new Error(errorMessage);
48
- steps = failureMessages[0];
49
- }
50
- const testId = getTestomatIdFromTestTitle(title);
51
-
52
- // suite titles from most outer to most inner, separated by space
53
- let fullSuiteTitle = testResult.ancestorTitles?.join(' ');
54
- // if no suite titles, use file name
55
- if (!fullSuiteTitle && testResult.testFilePath) fullSuiteTitle = path.basename(testResult.testFilePath);
56
-
57
- const logs = getTestLogs(result);
58
- const artifacts = services.artifacts.get(result.fullName);
59
- const keyValues = services.keyValues.get(result.fullName);
60
-
61
- const deducedStatus = status === 'pending' ? 'skipped' : status;
62
- // In jest if test is not matched with test name pattern it is considered as skipped.
63
- // So adding a check if it is skipped for real or because of test pattern
64
- if (!this._globalConfig.testNamePattern || deducedStatus !== 'skipped') {
65
- this.client.addTestRun(deducedStatus, {
66
- test_id: testId,
67
- suite_title: fullSuiteTitle,
68
- error,
69
- steps,
70
- title,
71
- time: duration,
72
- logs,
73
- manuallyAttachedArtifacts: artifacts,
74
- meta: keyValues,
75
- });
76
- }
16
+ constructor(globalConfig, options) {
17
+ this._globalConfig = globalConfig;
18
+ this._options = options;
19
+ this.client = new client_js_1.default({ apiKey: options?.apiKey });
20
+ this.client.createRun();
21
+ }
22
+ onRunStart() {
23
+ // clear tmp dir
24
+ utils_js_1.fileSystem.clearDir(constants_js_1.TESTOMAT_TMP_STORAGE_DIR);
25
+ }
26
+ // start of test file (including beforeAll)
27
+ onTestStart(testFile) {
28
+ debug('Start running test file:', testFile.path);
29
+ index_js_1.services.setContext(testFile.path);
30
+ }
31
+ // start of the test (including beforeEach)
32
+ onTestCaseStart(test, testCase) {
33
+ debug('Start running test:', testCase.fullName);
34
+ index_js_1.services.setContext(testCase.fullName);
35
+ }
36
+ // end of test file! (there is also onTestCaseResult listener)
37
+ onTestResult(test, testResult) {
38
+ if (!this.client)
39
+ return;
40
+ const { testResults } = testResult;
41
+ for (const result of testResults) {
42
+ let error;
43
+ let steps;
44
+ const { status, title, duration, failureMessages } = result;
45
+ if (failureMessages[0]) {
46
+ let errorMessage = failureMessages[0].replace((0, utils_js_1.ansiRegExp)(), '');
47
+ errorMessage = errorMessage.split('\n')[0];
48
+ error = new Error(errorMessage);
49
+ steps = failureMessages[0];
50
+ }
51
+ const testId = (0, utils_js_1.getTestomatIdFromTestTitle)(title);
52
+ // suite titles from most outer to most inner, separated by space
53
+ let fullSuiteTitle = testResult.ancestorTitles?.join(' ');
54
+ // if no suite titles, use file name
55
+ if (!fullSuiteTitle && testResult.testFilePath)
56
+ fullSuiteTitle = path_1.default.basename(testResult.testFilePath);
57
+ const logs = getTestLogs(result);
58
+ const artifacts = index_js_1.services.artifacts.get(result.fullName);
59
+ const keyValues = index_js_1.services.keyValues.get(result.fullName);
60
+ const deducedStatus = status === 'pending' ? 'skipped' : status;
61
+ // In jest if test is not matched with test name pattern it is considered as skipped.
62
+ // So adding a check if it is skipped for real or because of test pattern
63
+ if (!this._globalConfig.testNamePattern || deducedStatus !== 'skipped') {
64
+ this.client.addTestRun(deducedStatus, {
65
+ test_id: testId,
66
+ suite_title: fullSuiteTitle,
67
+ error,
68
+ steps,
69
+ title,
70
+ time: duration,
71
+ logs,
72
+ manuallyAttachedArtifacts: artifacts,
73
+ meta: keyValues,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ onRunComplete(contexts, results) {
79
+ if (!this.client)
80
+ return;
81
+ const { numFailedTests } = results;
82
+ const status = numFailedTests === 0 ? 'passed' : 'failed';
83
+ this.client.updateRunStatus(status);
77
84
  }
78
- }
79
-
80
- onRunComplete(contexts, results) {
81
- if (!this.client) return;
82
-
83
- const { numFailedTests } = results;
84
- const status = numFailedTests === 0 ? STATUS.PASSED : STATUS.FAILED;
85
- this.client.updateRunStatus(status);
86
- }
87
85
  }
88
-
86
+ exports.JestReporter = JestReporter;
89
87
  function getTestLogs(testResult) {
90
- const suiteLogsArr = services.logger.getLogs(testResult.testFilePath);
91
- const suiteLogs = suiteLogsArr ? suiteLogsArr.join('\n').trim() : '';
92
- const testLogsArr = services.logger.getLogs(testResult.fullName);
93
- const testLogs = testLogsArr ? testLogsArr.join('\n').trim() : '';
94
-
95
- let logs = '';
96
- if (suiteLogs) {
97
- logs += `${chalk.bold('\t--- Suite ---')}\n${suiteLogs}`;
98
- }
99
- if (testLogs) {
100
- logs += `\n${chalk.bold('\t--- Test ---')}\n${testLogs}`;
101
- }
102
- return logs;
88
+ const suiteLogsArr = index_js_1.services.logger.getLogs(testResult.testFilePath);
89
+ const suiteLogs = suiteLogsArr ? suiteLogsArr.join('\n').trim() : '';
90
+ const testLogsArr = index_js_1.services.logger.getLogs(testResult.fullName);
91
+ const testLogs = testLogsArr ? testLogsArr.join('\n').trim() : '';
92
+ let logs = '';
93
+ if (suiteLogs) {
94
+ logs += `${picocolors_1.default.bold('\t--- Suite ---')}\n${suiteLogs}`;
95
+ }
96
+ if (testLogs) {
97
+ logs += `\n${picocolors_1.default.bold('\t--- Test ---')}\n${testLogs}`;
98
+ }
99
+ return logs;
103
100
  }
104
-
105
101
  module.exports = JestReporter;
102
+
103
+ module.exports.JestReporter = JestReporter;
@@ -0,0 +1,2 @@
1
+ export default MochaReporter;
2
+ declare function MochaReporter(runner: any, opts: any): void;
@@ -1,154 +1,125 @@
1
- // eslint-disable-next-line global-require, import/no-extraneous-dependencies
2
- const Mocha = require('mocha');
3
- const chalk = require('chalk');
4
- const TestomatClient = require('../client');
5
- const { STATUS, TESTOMAT_TMP_STORAGE_DIR } = require('../constants');
6
- const { getTestomatIdFromTestTitle, fileSystem } = require('../utils/utils');
7
- const config = require('../config');
8
- const { services } = require('../services');
9
-
10
- const {
11
- EVENT_RUN_BEGIN,
12
- EVENT_RUN_END,
13
- EVENT_TEST_FAIL,
14
- EVENT_TEST_PASS,
15
- EVENT_TEST_PENDING,
16
- EVENT_SUITE_BEGIN,
17
- EVENT_SUITE_END,
18
- EVENT_TEST_BEGIN,
19
- EVENT_TEST_END,
20
- } = Mocha.Runner.constants;
21
-
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const mocha_1 = __importDefault(require("mocha"));
7
+ const client_js_1 = __importDefault(require("../client.js"));
8
+ const constants_js_1 = require("../constants.js");
9
+ const utils_js_1 = require("../utils/utils.js");
10
+ const config_js_1 = require("../config.js");
11
+ const index_js_1 = require("../services/index.js");
12
+ const picocolors_1 = __importDefault(require("picocolors"));
13
+ const { EVENT_RUN_BEGIN, EVENT_RUN_END, EVENT_TEST_FAIL, EVENT_TEST_PASS, EVENT_TEST_PENDING, EVENT_SUITE_BEGIN, EVENT_SUITE_END, EVENT_TEST_BEGIN, EVENT_TEST_END, } = mocha_1.default.Runner.constants;
22
14
  function MochaReporter(runner, opts) {
23
- Mocha.reporters.Base.call(this, runner);
24
- let passes = 0;
25
- let failures = 0;
26
- let skipped = 0;
27
-
28
- const apiKey = opts?.reporterOptions?.apiKey || config.TESTOMATIO;
29
-
30
- const client = new TestomatClient({ apiKey });
31
-
32
- runner.on(EVENT_RUN_BEGIN, () => {
33
- client.createRun();
34
-
35
- // clear dir with artifacts/logs
36
- fileSystem.clearDir(TESTOMAT_TMP_STORAGE_DIR);
37
- });
38
-
39
- runner.on(EVENT_SUITE_BEGIN, async suite => {
40
- services.setContext(suite.fullTitle());
41
- });
42
-
43
- runner.on(EVENT_SUITE_END, async () => {
44
- services.setContext(null);
45
- });
46
-
47
- runner.on(EVENT_TEST_BEGIN, async test => {
48
- services.setContext(test.fullTitle());
49
- });
50
-
51
- runner.on(EVENT_TEST_END, async () => {
52
- services.setContext(null);
53
- });
54
-
55
- runner.on(EVENT_TEST_PASS, async test => {
56
- passes += 1;
57
-
58
- console.log(chalk.bold.green('✔'), test.fullTitle());
59
- const testId = getTestomatIdFromTestTitle(test.title);
60
-
61
- const logs = getTestLogs(test);
62
- const artifacts = services.artifacts.get(test.fullTitle());
63
- const keyValues = services.keyValues.get(test.fullTitle());
64
-
65
- client.addTestRun(STATUS.PASSED, {
66
- test_id: testId,
67
- suite_title: getSuiteTitle(test),
68
- title: getTestName(test),
69
- code: process.env.TESTOMATIO_UPDATE_CODE ? test.body.toString() : '',
70
- file: getFile(test),
71
- time: test.duration,
72
- logs,
73
- manuallyAttachedArtifacts: artifacts,
74
- meta: keyValues,
15
+ mocha_1.default.reporters.Base.call(this, runner);
16
+ let passes = 0;
17
+ let failures = 0;
18
+ let skipped = 0;
19
+ // let artifactStore;
20
+ const apiKey = opts?.reporterOptions?.apiKey || config_js_1.config.TESTOMATIO;
21
+ const client = new client_js_1.default({ apiKey });
22
+ runner.on(EVENT_RUN_BEGIN, () => {
23
+ client.createRun();
24
+ // clear dir with artifacts/logs
25
+ utils_js_1.fileSystem.clearDir(constants_js_1.TESTOMAT_TMP_STORAGE_DIR);
75
26
  });
76
- });
77
-
78
- runner.on(EVENT_TEST_PENDING, test => {
79
- skipped += 1;
80
- console.log('skip: %s', test.fullTitle());
81
- const testId = getTestomatIdFromTestTitle(test.title);
82
- client.addTestRun(STATUS.SKIPPED, {
83
- title: getTestName(test),
84
- suite_title: getSuiteTitle(test),
85
- code: process.env.TESTOMATIO_UPDATE_CODE ? test.body.toString() : '',
86
- file: getFile(test),
87
- test_id: testId,
88
- time: test.duration,
27
+ runner.on(EVENT_SUITE_BEGIN, async (suite) => {
28
+ index_js_1.services.setContext(suite.fullTitle());
89
29
  });
90
- });
91
-
92
- runner.on(EVENT_TEST_FAIL, async (test, err) => {
93
- failures += 1;
94
- console.log(chalk.bold.red('✖'), test.fullTitle(), chalk.gray(err.message));
95
- const testId = getTestomatIdFromTestTitle(test.title);
96
-
97
- const logs = getTestLogs(test);
98
-
99
- client.addTestRun(STATUS.FAILED, {
100
- error: err,
101
- suite_title: getSuiteTitle(test),
102
- file: getFile(test),
103
- test_id: testId,
104
- title: getTestName(test),
105
- code: process.env.TESTOMATIO_UPDATE_CODE ? test.body.toString() : '',
106
- time: test.duration,
107
- logs,
30
+ runner.on(EVENT_SUITE_END, async () => {
31
+ index_js_1.services.setContext(null);
32
+ });
33
+ runner.on(EVENT_TEST_BEGIN, async (test) => {
34
+ index_js_1.services.setContext(test.fullTitle());
35
+ });
36
+ runner.on(EVENT_TEST_END, async () => {
37
+ index_js_1.services.setContext(null);
38
+ });
39
+ runner.on(EVENT_TEST_PASS, async (test) => {
40
+ passes += 1;
41
+ console.log(picocolors_1.default.bold(picocolors_1.default.green('✔')), test.fullTitle());
42
+ const testId = (0, utils_js_1.getTestomatIdFromTestTitle)(test.title);
43
+ const logs = getTestLogs(test);
44
+ const artifacts = index_js_1.services.artifacts.get(test.fullTitle());
45
+ const keyValues = index_js_1.services.keyValues.get(test.fullTitle());
46
+ client.addTestRun(constants_js_1.STATUS.PASSED, {
47
+ test_id: testId,
48
+ suite_title: getSuiteTitle(test),
49
+ title: getTestName(test),
50
+ code: process.env.TESTOMATIO_UPDATE_CODE ? test.body.toString() : '',
51
+ file: getFile(test),
52
+ time: test.duration,
53
+ logs,
54
+ manuallyAttachedArtifacts: artifacts,
55
+ meta: keyValues,
56
+ });
57
+ });
58
+ runner.on(EVENT_TEST_PENDING, test => {
59
+ skipped += 1;
60
+ console.log('skip: %s', test.fullTitle());
61
+ const testId = (0, utils_js_1.getTestomatIdFromTestTitle)(test.title);
62
+ client.addTestRun(constants_js_1.STATUS.SKIPPED, {
63
+ title: getTestName(test),
64
+ suite_title: getSuiteTitle(test),
65
+ code: process.env.TESTOMATIO_UPDATE_CODE ? test.body.toString() : '',
66
+ file: getFile(test),
67
+ test_id: testId,
68
+ time: test.duration,
69
+ });
70
+ });
71
+ runner.on(EVENT_TEST_FAIL, async (test, err) => {
72
+ failures += 1;
73
+ console.log(picocolors_1.default.bold(picocolors_1.default.red('✖')), test.fullTitle(), picocolors_1.default.gray(err.message));
74
+ const testId = (0, utils_js_1.getTestomatIdFromTestTitle)(test.title);
75
+ const logs = getTestLogs(test);
76
+ client.addTestRun(constants_js_1.STATUS.FAILED, {
77
+ error: err,
78
+ suite_title: getSuiteTitle(test),
79
+ file: getFile(test),
80
+ test_id: testId,
81
+ title: getTestName(test),
82
+ code: process.env.TESTOMATIO_UPDATE_CODE ? test.body.toString() : '',
83
+ time: test.duration,
84
+ logs,
85
+ });
86
+ });
87
+ runner.on(EVENT_RUN_END, () => {
88
+ const status = failures === 0 ? constants_js_1.STATUS.PASSED : constants_js_1.STATUS.FAILED;
89
+ console.log(picocolors_1.default.bold(status), `${passes} passed, ${failures} failed, ${skipped} skipped`);
90
+ // @ts-ignore
91
+ client.updateRunStatus(status);
108
92
  });
109
- });
110
-
111
- runner.on(EVENT_RUN_END, () => {
112
- const status = failures === 0 ? STATUS.PASSED : STATUS.FAILED;
113
- console.log(chalk.bold(status), `${passes} passed, ${failures} failed, ${skipped} skipped`);
114
- client.updateRunStatus(status);
115
- });
116
93
  }
117
-
118
94
  function getTestLogs(test) {
119
- const suiteLogsArr = services.logger.getLogs(test.parent.fullTitle());
120
- const suiteLogs = suiteLogsArr ? suiteLogsArr.join('\n').trim() : '';
121
- const testLogsArr = services.logger.getLogs(test.fullTitle());
122
- const testLogs = testLogsArr ? testLogsArr.join('\n').trim() : '';
123
-
124
- let logs = '';
125
- if (suiteLogs) {
126
- logs += `${chalk.bold('\t--- BeforeSuite ---')}\n${suiteLogs}`;
127
- }
128
- if (testLogs) {
129
- logs += `\n${chalk.bold('\t--- Test ---')}\n${testLogs}`;
130
- }
131
- return logs;
95
+ const suiteLogsArr = index_js_1.services.logger.getLogs(test.parent.fullTitle());
96
+ const suiteLogs = suiteLogsArr ? suiteLogsArr.join('\n').trim() : '';
97
+ const testLogsArr = index_js_1.services.logger.getLogs(test.fullTitle());
98
+ const testLogs = testLogsArr ? testLogsArr.join('\n').trim() : '';
99
+ let logs = '';
100
+ if (suiteLogs) {
101
+ logs += `${picocolors_1.default.bold('\t--- BeforeSuite ---')}\n${suiteLogs}`;
102
+ }
103
+ if (testLogs) {
104
+ logs += `\n${picocolors_1.default.bold('\t--- Test ---')}\n${testLogs}`;
105
+ }
106
+ return logs;
132
107
  }
133
-
134
- // To have this reporter "extend" a built-in reporter uncomment the following line:
135
- Mocha.utils.inherits(MochaReporter, Mocha.reporters.Spec);
136
-
137
- module.exports = MochaReporter;
138
-
139
108
  function getSuiteTitle(test, pathArr = []) {
140
- if (test.parent.parent) getSuiteTitle(test.parent, pathArr);
141
-
142
- pathArr.push(test.parent.title);
143
-
144
- return pathArr.filter(t => !!t)[0];
109
+ if (test.parent.parent)
110
+ getSuiteTitle(test.parent, pathArr);
111
+ pathArr.push(test.parent.title);
112
+ return pathArr.filter(t => !!t)[0];
145
113
  }
146
-
147
114
  function getFile(test) {
148
- return test.parent.file?.replace(process.cwd(), '');
115
+ return test.parent.file?.replace(process.cwd(), '');
149
116
  }
150
-
151
117
  function getTestName(test) {
152
- if (process.env.TESTOMATIO_CREATE === 'fulltitle') return test.fullTitle();
153
- return test.title;
118
+ if (process.env.TESTOMATIO_CREATE === 'fulltitle')
119
+ return test.fullTitle();
120
+ return test.title;
154
121
  }
122
+ // To have this reporter "extend" a built-in reporter uncomment the following line:
123
+ // @ts-ignore
124
+ mocha_1.default.utils.inherits(MochaReporter, mocha_1.default.reporters.Spec);
125
+ module.exports = MochaReporter;
@@ -0,0 +1,4 @@
1
+ declare namespace _default {
2
+ function write(results: any, options: any, done: any): Promise<void>;
3
+ }
4
+ export default _default;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const client_js_1 = __importDefault(require("../client.js"));
7
+ const config_js_1 = require("../config.js");
8
+ const constants_js_1 = require("../constants.js");
9
+ const utils_js_1 = require("../utils/utils.js");
10
+ const apiKey = config_js_1.config.TESTOMATIO;
11
+ const client = new client_js_1.default({ apiKey });
12
+ module.exports = {
13
+ write: async (results, options, done) => {
14
+ await client.createRun();
15
+ const testFiles = results.modules;
16
+ for (const fileName in testFiles) {
17
+ // in nightwatch: object containing tests from a single file
18
+ const testModule = testFiles[fileName];
19
+ // passed and failed tests (tests with assertions)
20
+ const completedTests = testModule.completed;
21
+ // skipped tests (skipped by user or tests without assertions)
22
+ const skippedTests = testModule.skipped;
23
+ const tags = testModule.tags || [];
24
+ // if test file contains multiple suites, the last suite name is used as a name 🤷‍♂️
25
+ // no other places which contain suite name (even inside test object)
26
+ const suiteTitle = testModule.name;
27
+ for (const testTitle in completedTests) {
28
+ const test = completedTests[testTitle];
29
+ let status;
30
+ switch (test.status) {
31
+ case 'pass':
32
+ status = constants_js_1.STATUS.PASSED;
33
+ break;
34
+ case 'fail':
35
+ status = constants_js_1.STATUS.FAILED;
36
+ break;
37
+ // probably not required (because skipped tests are in separate array), but just in case
38
+ case 'skip':
39
+ status = constants_js_1.STATUS.SKIPPED;
40
+ console.info('Skipped test is in completed tests array:', test, 'Not expected behavior.');
41
+ break;
42
+ default:
43
+ console.error('Test status processing error:', test.status);
44
+ }
45
+ const testId = (0, utils_js_1.getTestomatIdFromTestTitle)(testTitle);
46
+ client.addTestRun(status, {
47
+ error: { name: test.assertions?.[0]?.name, message: test.assertions?.[0]?.message, stack: test.stackTrace },
48
+ file: testModule.modulePath?.replace(process.cwd(), ''),
49
+ message: test.assertions?.[0]?.message,
50
+ rid: `${testModule.uuid || ''}_${testTitle || ''}`,
51
+ stack: test.stackTrace,
52
+ suite_title: suiteTitle,
53
+ tags,
54
+ test_id: testId,
55
+ time: test.timeMs,
56
+ title: testTitle,
57
+ });
58
+ }
59
+ // just array with skipped tests titles, no any other info
60
+ for (const testTitle of skippedTests) {
61
+ client.addTestRun(constants_js_1.STATUS.SKIPPED, {
62
+ suite_title: suiteTitle,
63
+ tags,
64
+ rid: `${testModule.uuid || ''}_${testTitle || ''}`,
65
+ title: testTitle,
66
+ });
67
+ }
68
+ }
69
+ /**
70
+ * @type {'passed' | 'failed' | 'finished'}
71
+ */
72
+ let runStatus = 'finished';
73
+ if (results.failed)
74
+ runStatus = 'failed';
75
+ else if (results.passed)
76
+ runStatus = 'passed';
77
+ await client.updateRunStatus(runStatus);
78
+ done();
79
+ },
80
+ };
@@ -0,0 +1,14 @@
1
+ export default PlaywrightReporter;
2
+ declare class PlaywrightReporter {
3
+ constructor(config?: {});
4
+ client: TestomatioClient;
5
+ uploads: any[];
6
+ onBegin(config: any, suite: any): void;
7
+ suite: any;
8
+ config: any;
9
+ onTestBegin(testInfo: any): void;
10
+ onTestEnd(test: any, result: any): void;
11
+ onEnd(result: any): Promise<void>;
12
+ #private;
13
+ }
14
+ import TestomatioClient from '../client.js';