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

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
@@ -1,231 +1,236 @@
1
- const debug = require('debug')('@testomatio/reporter:pipe:github');
2
- const path = require('path');
3
- const chalk = require('chalk');
4
- const humanizeDuration = require('humanize-duration');
5
- const merge = require('lodash.merge');
6
- const { Octokit } = require('@octokit/rest');
7
- const { APP_PREFIX, testomatLogoURL } = require('../constants');
8
- const { ansiRegExp, isSameTest } = require('../utils/utils');
9
- const { statusEmoji, fullName } = require('../utils/pipe_utils');
10
-
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const debug_1 = __importDefault(require("debug"));
40
+ const path_1 = __importDefault(require("path"));
41
+ const picocolors_1 = __importDefault(require("picocolors"));
42
+ const humanize_duration_1 = __importDefault(require("humanize-duration"));
43
+ const lodash_merge_1 = __importDefault(require("lodash.merge"));
44
+ const constants_js_1 = require("../constants.js");
45
+ const utils_js_1 = require("../utils/utils.js");
46
+ const pipe_utils_js_1 = require("../utils/pipe_utils.js");
47
+ const debug = (0, debug_1.default)('@testomatio/reporter:pipe:github');
11
48
  /**
12
- * @typedef {import('../../types').Pipe} Pipe
13
- * @typedef {import('../../types').TestData} TestData
49
+ * @typedef {import('../../types/types.js').Pipe} Pipe
50
+ * @typedef {import('../../types/types.js').TestData} TestData
14
51
  * @class GitHubPipe
15
52
  * @implements {Pipe}
16
53
  */
17
54
  class GitHubPipe {
18
- constructor(params, store = {}) {
19
- this.isEnabled = false;
20
- this.store = store;
21
- this.tests = [];
22
- this.token = params.GH_PAT || process.env.GH_PAT;
23
- this.ref = process.env.GITHUB_REF;
24
- this.repo = process.env.GITHUB_REPOSITORY;
25
- this.jobKey = `${process.env.GITHUB_WORKFLOW || ''} / ${process.env.GITHUB_JOB || ''}`;
26
- this.hiddenCommentData = `<!--- testomat.io report ${this.jobKey} -->`;
27
-
28
- debug('GitHub Pipe: ', this.token ? 'TOKEN' : '*no token*', 'Ref:', this.ref, 'Repo:', this.repo);
29
-
30
- if (!this.token || !this.ref || !this.repo) return;
31
- this.isEnabled = true;
32
- const matchedIssue = this.ref.match(/refs\/pull\/(\d+)\/merge/);
33
- if (!matchedIssue) return;
34
- this.issue = parseInt(matchedIssue[1], 10);
35
-
36
- this.start = new Date();
37
-
38
- debug('GitHub Pipe: Enabled');
39
- }
40
-
41
- // TODO: to using SET opts as argument => prepareRun(opts)
42
- async prepareRun() {}
43
-
44
- async createRun() {}
45
-
46
- addTest(test) {
47
- if (!this.isEnabled) return;
48
- debug('Adding test:', test);
49
-
50
- const index = this.tests.findIndex(t => isSameTest(t, test));
51
- // update if they were already added
52
- if (index >= 0) {
53
- this.tests[index] = merge(this.tests[index], test);
54
- return;
55
+ constructor(params, store = {}) {
56
+ this.isEnabled = false;
57
+ this.store = store;
58
+ this.tests = [];
59
+ this.token = params.GH_PAT || process.env.GH_PAT;
60
+ this.ref = process.env.GITHUB_REF;
61
+ this.repo = process.env.GITHUB_REPOSITORY;
62
+ this.jobKey = `${process.env.GITHUB_WORKFLOW || ''} / ${process.env.GITHUB_JOB || ''}`;
63
+ this.hiddenCommentData = `<!--- testomat.io report ${this.jobKey} -->`;
64
+ debug('GitHub Pipe: ', this.token ? 'TOKEN' : '*no token*', 'Ref:', this.ref, 'Repo:', this.repo);
65
+ if (!this.token || !this.ref || !this.repo)
66
+ return;
67
+ this.isEnabled = true;
68
+ const matchedIssue = this.ref.match(/refs\/pull\/(\d+)\/merge/);
69
+ if (!matchedIssue)
70
+ return;
71
+ this.issue = parseInt(matchedIssue[1], 10);
72
+ this.start = new Date();
73
+ debug('GitHub Pipe: Enabled');
55
74
  }
56
-
57
- this.tests.push(test);
58
- }
59
-
60
- async finishRun(runParams) {
61
- if (!this.isEnabled) return;
62
- if (!this.issue) return;
63
-
64
- if (runParams.tests) runParams.tests.forEach(t => this.addTest(t));
65
-
66
- this.octokit = new Octokit({
67
- auth: this.token,
68
- });
69
-
70
- const [owner, repo] = (this.repo || '').split('/');
71
- if (!(owner || repo)) return;
72
-
73
- // ... create a comment on GitHub
74
- const passedCount = this.tests.filter(t => t.status === 'passed').length;
75
- const failedCount = this.tests.filter(t => t.status === 'failed').length;
76
- const skippedCount = this.tests.filter(t => t.status === 'skipped').length;
77
-
78
- let summary = `${this.hiddenCommentData}
79
-
80
- | [![Testomat.io Report](${testomatLogoURL})](https://testomat.io) | ${statusEmoji(
81
- runParams.status,
82
- )} ${`${process.env.GITHUB_JOB} ${runParams.status}`.toUpperCase()} |
75
+ // TODO: to using SET opts as argument => prepareRun(opts)
76
+ async prepareRun() { }
77
+ async createRun() { }
78
+ addTest(test) {
79
+ if (!this.isEnabled)
80
+ return;
81
+ debug('Adding test:', test);
82
+ const index = this.tests.findIndex(t => (0, utils_js_1.isSameTest)(t, test));
83
+ // update if they were already added
84
+ if (index >= 0) {
85
+ this.tests[index] = (0, lodash_merge_1.default)(this.tests[index], test);
86
+ return;
87
+ }
88
+ this.tests.push(test);
89
+ }
90
+ async finishRun(runParams) {
91
+ if (!this.isEnabled)
92
+ return;
93
+ if (!this.issue)
94
+ return;
95
+ if (runParams.tests)
96
+ runParams.tests.forEach(t => this.addTest(t));
97
+ const { Octokit } = await Promise.resolve().then(() => __importStar(require('@octokit/rest')));
98
+ this.octokit = new Octokit({
99
+ auth: this.token,
100
+ });
101
+ const [owner, repo] = (this.repo || '').split('/');
102
+ if (!(owner || repo))
103
+ return;
104
+ // ... create a comment on GitHub
105
+ const passedCount = this.tests.filter(t => t.status === 'passed').length;
106
+ const failedCount = this.tests.filter(t => t.status === 'failed').length;
107
+ const skippedCount = this.tests.filter(t => t.status === 'skipped').length;
108
+ let summary = `${this.hiddenCommentData}
109
+
110
+ | [![Testomat.io Report](${constants_js_1.testomatLogoURL})](https://testomat.io) | ${(0, pipe_utils_js_1.statusEmoji)(runParams.status)} ${`${process.env.GITHUB_JOB} ${runParams.status}`.toUpperCase()} |
83
111
  | --- | --- |
84
112
  | Tests | ✔️ **${this.tests.length}** tests run |
85
- | Summary | ${failedCount ? `${statusEmoji('failed')} **${failedCount}** failed; ` : ''} ${statusEmoji(
86
- 'passed',
87
- )} **${passedCount}** passed; **${statusEmoji('skipped')}** ${skippedCount} skipped |
88
- | Duration | 🕐 **${humanizeDuration(
89
- parseInt(
90
- this.tests.reduce((a, t) => a + (t.run_time || 0), 0),
91
- 10,
92
- ),
93
- {
94
- maxDecimalPoints: 0,
95
- },
96
- )}** |`;
97
-
98
- if (this.store.runUrl) {
99
- summary += `\n| Testomat.io Report | 📊 [Run #${this.store.runId}](${this.store.runUrl}) | `;
100
- }
101
- if (process.env.GITHUB_WORKFLOW) {
102
- summary += `\n| Job | 🗂️ [${this.jobKey}](${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${
103
- this.repo
104
- }/actions/runs/${process.env.GITHUB_RUN_ID}) | `;
105
- }
106
- if (process.env.RUNNER_OS) {
107
- summary += `\n| Operating System | 🖥️ \`${process.env.RUNNER_OS}\` ${process.env.RUNNER_ARCH || ''} | `;
108
- }
109
-
110
- const failures = this.tests
111
- .filter(t => t.status === 'failed')
112
- .slice(0, 20)
113
- .map(t => {
114
- let text = `#### ${statusEmoji('failed')} ${fullName(t)} `;
115
- text += '\n\n';
116
- if (t.message)
117
- text += `> ${t.message
118
- .replace(/[^\x20-\x7E]/g, '')
119
- .replace(ansiRegExp(), '')
120
- .trim()}\n`;
121
- if (t.stack) text += `\`\`\`diff\n${t.stack.replace(ansiRegExp(), '').trim()}\n\`\`\`\n`;
122
-
123
- if (t.artifacts && t.artifacts.length && !process.env.TESTOMATIO_PRIVATE_ARTIFACTS) {
124
- t.artifacts
125
- .filter(f => !!f)
126
- .filter(f => f.endsWith('.png'))
127
- .forEach(f => {
128
- if (f.endsWith('.png')) {
129
- text += `![](${f})\n`;
130
- return text;
131
- }
132
- text += `[📄 ${path.basename(f)}](${f})\n`;
133
- return text;
113
+ | Summary | ${failedCount ? `${(0, pipe_utils_js_1.statusEmoji)('failed')} **${failedCount}** failed; ` : ''} ${(0, pipe_utils_js_1.statusEmoji)('passed')} **${passedCount}** passed; **${(0, pipe_utils_js_1.statusEmoji)('skipped')}** ${skippedCount} skipped |
114
+ | Duration | 🕐 **${(0, humanize_duration_1.default)(parseInt(this.tests.reduce((a, t) => a + (t.run_time || 0), 0), 10), {
115
+ maxDecimalPoints: 0,
116
+ })}** |`;
117
+ if (this.store.runUrl) {
118
+ summary += `\n| Testomat.io Report | 📊 [Run #${this.store.runId}](${this.store.runUrl}) | `;
119
+ }
120
+ if (process.env.GITHUB_WORKFLOW) {
121
+ summary += `\n| Job | 🗂️ [${this.jobKey}](${process.env.GITHUB_SERVER_URL || 'https://github.com'}/${this.repo}/actions/runs/${process.env.GITHUB_RUN_ID}) | `;
122
+ }
123
+ if (process.env.RUNNER_OS) {
124
+ summary += `\n| Operating System | 🖥️ \`${process.env.RUNNER_OS}\` ${process.env.RUNNER_ARCH || ''} | `;
125
+ }
126
+ const failures = this.tests
127
+ .filter(t => t.status === 'failed')
128
+ .slice(0, 20)
129
+ .map(t => {
130
+ let text = `#### ${(0, pipe_utils_js_1.statusEmoji)('failed')} ${(0, pipe_utils_js_1.fullName)(t)} `;
131
+ text += '\n\n';
132
+ if (t.message)
133
+ text += `> ${t.message
134
+ .replace(/[^\x20-\x7E]/g, '')
135
+ .replace((0, utils_js_1.ansiRegExp)(), '')
136
+ .trim()}\n`;
137
+ if (t.stack)
138
+ text += `\`\`\`diff\n${t.stack.replace((0, utils_js_1.ansiRegExp)(), '').trim()}\n\`\`\`\n`;
139
+ if (t.artifacts && t.artifacts.length && !process.env.TESTOMATIO_PRIVATE_ARTIFACTS) {
140
+ t.artifacts
141
+ .filter(f => !!f)
142
+ .filter(f => f.endsWith('.png'))
143
+ .forEach(f => {
144
+ if (f.endsWith('.png')) {
145
+ text += `![](${f})\n`;
146
+ return text;
147
+ }
148
+ text += `[📄 ${path_1.default.basename(f)}](${f})\n`;
149
+ return text;
150
+ });
151
+ }
152
+ text += '\n---\n';
153
+ return text;
154
+ });
155
+ let body = summary;
156
+ if (failures.length) {
157
+ body += `\n<details>\n<summary><h3>🟥 Failures (${failures.length})</h4></summary>\n\n${failures.join('\n')}\n`;
158
+ if (failures.length > 20) {
159
+ body += '\n> Notice\n> Only first 20 failures shown*';
160
+ }
161
+ body += '\n\n</details>';
162
+ }
163
+ if (this.tests.length > 0) {
164
+ body += '\n<details>\n<summary><h3>🐢 Slowest Tests</h3></summary>\n\n';
165
+ body += this.tests
166
+ .sort((a, b) => b?.run_time - a?.run_time)
167
+ .slice(0, 5)
168
+ .map(t => `* ${(0, pipe_utils_js_1.fullName)(t)} (${(0, humanize_duration_1.default)(parseFloat(t.run_time))})`)
169
+ .join('\n');
170
+ body += '\n</details>';
171
+ }
172
+ await deletePreviousReport(this.octokit, owner, repo, this.issue, this.hiddenCommentData);
173
+ // add report as comment
174
+ try {
175
+ debug('Adding comment\n', body);
176
+ const resp = await this.octokit.rest.issues.createComment({
177
+ owner,
178
+ repo,
179
+ issue_number: this.issue,
180
+ body,
134
181
  });
182
+ const url = resp.data?.html_url;
183
+ debug('Comment URL:', url);
184
+ this.store.githubUrl = url;
185
+ console.log(constants_js_1.APP_PREFIX, picocolors_1.default.yellow('GitHub'), `Report created: ${picocolors_1.default.magenta(url)}`);
186
+ }
187
+ catch (err) {
188
+ console.log(constants_js_1.APP_PREFIX, picocolors_1.default.yellow('GitHub'), `Couldn't create GitHub report ${err}`);
135
189
  }
136
-
137
- text += '\n---\n';
138
-
139
- return text;
140
- });
141
-
142
- let body = summary;
143
-
144
- if (failures.length) {
145
- body += `\n<details>\n<summary><h3>🟥 Failures (${failures.length})</h4></summary>\n\n${failures.join('\n')}\n`;
146
- if (failures.length > 20) {
147
- body += '\n> Notice\n> Only first 20 failures shown*';
148
- }
149
- body += '\n\n</details>';
150
- }
151
-
152
- if (this.tests.length > 0) {
153
- body += '\n<details>\n<summary><h3>🐢 Slowest Tests</h3></summary>\n\n';
154
- body += this.tests
155
- // eslint-disable-next-line no-unsafe-optional-chaining
156
- .sort((a, b) => b?.run_time - a?.run_time)
157
- .slice(0, 5)
158
- .map(t => `* ${fullName(t)} (${humanizeDuration(parseFloat(t.run_time))})`)
159
- .join('\n');
160
- body += '\n</details>';
161
190
  }
162
-
163
- await deletePreviousReport(this.octokit, owner, repo, this.issue, this.hiddenCommentData);
164
-
165
- // add report as comment
166
- try {
167
- debug('Adding comment\n', body);
168
- const resp = await this.octokit.rest.issues.createComment({
169
- owner,
170
- repo,
171
- issue_number: this.issue,
172
- body,
173
- });
174
-
175
- const url = resp.data?.html_url;
176
- debug('Comment URL:', url);
177
- this.store.githubUrl = url;
178
-
179
- console.log(APP_PREFIX, chalk.yellow('GitHub'), `Report created: ${chalk.magenta(url)}`);
180
- } catch (err) {
181
- console.log(APP_PREFIX, chalk.yellow('GitHub'), `Couldn't create GitHub report ${err}`);
191
+ toString() {
192
+ return 'GitHub Reporter';
182
193
  }
183
- }
184
-
185
- toString() {
186
- return 'GitHub Reporter';
187
- }
188
194
  }
189
-
190
195
  async function deletePreviousReport(octokit, owner, repo, issue, hiddenCommentData) {
191
- if (process.env.GH_KEEP_OUTDATED_REPORTS) return;
192
-
193
- // get comments
194
- let comments = [];
195
- try {
196
- const response = await octokit.rest.issues.listComments({
197
- owner,
198
- repo,
199
- issue_number: issue,
200
- });
201
- comments = response.data;
202
- } catch (e) {
203
- console.error('Error while attempt to retrieve comments on GitHub Pull Request:\n', e);
204
- }
205
-
206
- if (!comments.length) return;
207
-
208
- for (const comment of comments) {
209
- // if comment was left by the same workflow
210
- if (comment.body.includes(hiddenCommentData)) {
211
- try {
212
- // delete previous comment
213
- await octokit.rest.issues.deleteComment({
214
- owner,
215
- repo,
216
- issue_number: issue,
217
- comment_id: comment.id,
196
+ if (process.env.GH_KEEP_OUTDATED_REPORTS)
197
+ return;
198
+ // get comments
199
+ let comments = [];
200
+ try {
201
+ const response = await octokit.rest.issues.listComments({
202
+ owner,
203
+ repo,
204
+ issue_number: issue,
218
205
  });
219
- } catch (e) {
220
- console.warn(`Can't delete previously added comment with testomat.io report. Ignore.`);
221
- }
222
-
223
- // pass next env var if need to clear all previous reports;
224
- // only the last one is removed by default
225
- if (!process.env.GITHUB_REMOVE_ALL_OUTDATED_REPORTS) break;
226
- // TODO: in case of many reports should implement pagination
206
+ comments = response.data;
207
+ }
208
+ catch (e) {
209
+ console.error('Error while attempt to retrieve comments on GitHub Pull Request:\n', e);
210
+ }
211
+ if (!comments.length)
212
+ return;
213
+ for (const comment of comments) {
214
+ // if comment was left by the same workflow
215
+ if (comment.body.includes(hiddenCommentData)) {
216
+ try {
217
+ // delete previous comment
218
+ await octokit.rest.issues.deleteComment({
219
+ owner,
220
+ repo,
221
+ issue_number: issue,
222
+ comment_id: comment.id,
223
+ });
224
+ }
225
+ catch (e) {
226
+ console.warn(`Can't delete previously added comment with testomat.io report. Ignore.`);
227
+ }
228
+ // pass next env var if need to clear all previous reports;
229
+ // only the last one is removed by default
230
+ if (!process.env.GITHUB_REMOVE_ALL_OUTDATED_REPORTS)
231
+ break;
232
+ // TODO: in case of many reports should implement pagination
233
+ }
227
234
  }
228
- }
229
235
  }
230
-
231
236
  module.exports = GitHubPipe;
@@ -0,0 +1,25 @@
1
+ export default GitLabPipe;
2
+ export type Pipe = import("../../types/types.js").Pipe;
3
+ export type TestData = import("../../types/types.js").TestData;
4
+ /**
5
+ * @class GitLabPipe
6
+ * @typedef {import('../../types/types.js').Pipe} Pipe
7
+ * @typedef {import('../../types/types.js').TestData} TestData
8
+ */
9
+ declare class GitLabPipe {
10
+ constructor(params: any, store?: {});
11
+ isEnabled: boolean;
12
+ ENV: NodeJS.ProcessEnv;
13
+ store: {};
14
+ tests: any[];
15
+ token: any;
16
+ hiddenCommentData: string;
17
+ client: Gaxios;
18
+ prepareRun(): Promise<void>;
19
+ createRun(): Promise<void>;
20
+ addTest(test: any): void;
21
+ finishRun(runParams: any): Promise<void>;
22
+ toString(): string;
23
+ updateRun(): void;
24
+ }
25
+ import { Gaxios } from 'gaxios';