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

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 (148) hide show
  1. package/lib/adapter/codecept.js +335 -293
  2. package/lib/adapter/cucumber/current.js +203 -195
  3. package/lib/adapter/cucumber/legacy.js +155 -130
  4. package/lib/adapter/cucumber.js +16 -5
  5. package/lib/adapter/cypress-plugin/index.js +105 -91
  6. package/lib/adapter/jasmine.js +53 -54
  7. package/lib/adapter/jest.js +99 -97
  8. package/lib/adapter/mocha.js +141 -112
  9. package/lib/adapter/playwright.js +231 -199
  10. package/lib/adapter/vitest.js +149 -150
  11. package/lib/adapter/webdriver.js +121 -144
  12. package/lib/bin/cli.js +211 -229
  13. package/lib/bin/reportXml.js +52 -51
  14. package/lib/bin/startTest.js +95 -83
  15. package/lib/bin/uploadArtifacts.js +61 -56
  16. package/lib/client.js +465 -424
  17. package/lib/config.js +23 -18
  18. package/lib/constants.js +44 -50
  19. package/lib/data-storage.js +188 -216
  20. package/lib/junit-adapter/adapter.js +20 -17
  21. package/lib/junit-adapter/csharp.js +14 -28
  22. package/lib/junit-adapter/index.js +25 -27
  23. package/lib/junit-adapter/java.js +53 -41
  24. package/lib/junit-adapter/javascript.js +27 -30
  25. package/lib/junit-adapter/python.js +37 -38
  26. package/lib/junit-adapter/ruby.js +8 -11
  27. package/lib/output.js +52 -44
  28. package/lib/pipe/bitbucket.js +230 -223
  29. package/lib/pipe/csv.js +126 -113
  30. package/lib/pipe/debug.js +99 -118
  31. package/lib/pipe/github.js +213 -218
  32. package/lib/pipe/gitlab.js +206 -183
  33. package/lib/pipe/html.js +321 -258
  34. package/lib/pipe/index.js +66 -94
  35. package/lib/pipe/testomatio.js +474 -429
  36. package/lib/reporter-functions.js +26 -28
  37. package/lib/reporter.js +29 -34
  38. package/lib/services/artifacts.js +51 -55
  39. package/lib/services/index.js +12 -14
  40. package/lib/services/key-values.js +53 -56
  41. package/lib/services/logger.js +245 -226
  42. package/lib/template/testomatio.hbs +1366 -1026
  43. package/lib/uploader.js +364 -295
  44. package/lib/utils/pipe_utils.js +85 -89
  45. package/lib/utils/utils.js +307 -398
  46. package/lib/xmlReader.js +532 -525
  47. package/package.json +21 -64
  48. package/lib/adapter/codecept.d.ts +0 -2
  49. package/lib/adapter/cucumber/current.d.ts +0 -14
  50. package/lib/adapter/cucumber/legacy.d.ts +0 -0
  51. package/lib/adapter/cucumber.d.ts +0 -2
  52. package/lib/adapter/cypress-plugin/index.d.ts +0 -2
  53. package/lib/adapter/jasmine.d.ts +0 -11
  54. package/lib/adapter/jest.d.ts +0 -13
  55. package/lib/adapter/mocha.d.ts +0 -2
  56. package/lib/adapter/nightwatch.d.ts +0 -4
  57. package/lib/adapter/nightwatch.js +0 -80
  58. package/lib/adapter/playwright.d.ts +0 -14
  59. package/lib/adapter/vitest.d.ts +0 -35
  60. package/lib/adapter/webdriver.d.ts +0 -24
  61. package/lib/bin/cli.d.ts +0 -2
  62. package/lib/bin/reportXml.d.ts +0 -2
  63. package/lib/bin/startTest.d.ts +0 -2
  64. package/lib/bin/uploadArtifacts.d.ts +0 -2
  65. package/lib/client.d.ts +0 -76
  66. package/lib/config.d.ts +0 -1
  67. package/lib/constants.d.ts +0 -25
  68. package/lib/data-storage.d.ts +0 -34
  69. package/lib/junit-adapter/adapter.d.ts +0 -9
  70. package/lib/junit-adapter/csharp.d.ts +0 -5
  71. package/lib/junit-adapter/index.d.ts +0 -3
  72. package/lib/junit-adapter/java.d.ts +0 -5
  73. package/lib/junit-adapter/javascript.d.ts +0 -4
  74. package/lib/junit-adapter/python.d.ts +0 -5
  75. package/lib/junit-adapter/ruby.d.ts +0 -4
  76. package/lib/output.d.ts +0 -11
  77. package/lib/package.json +0 -3
  78. package/lib/pipe/bitbucket.d.ts +0 -25
  79. package/lib/pipe/csv.d.ts +0 -47
  80. package/lib/pipe/debug.d.ts +0 -29
  81. package/lib/pipe/github.d.ts +0 -30
  82. package/lib/pipe/gitlab.d.ts +0 -25
  83. package/lib/pipe/html.d.ts +0 -35
  84. package/lib/pipe/index.d.ts +0 -1
  85. package/lib/pipe/testomatio.d.ts +0 -71
  86. package/lib/replay.d.ts +0 -31
  87. package/lib/replay.js +0 -237
  88. package/lib/reporter-functions.d.ts +0 -34
  89. package/lib/reporter.d.ts +0 -232
  90. package/lib/services/artifacts.d.ts +0 -33
  91. package/lib/services/index.d.ts +0 -9
  92. package/lib/services/key-values.d.ts +0 -27
  93. package/lib/services/logger.d.ts +0 -64
  94. package/lib/uploader.d.ts +0 -60
  95. package/lib/utils/pipe_utils.d.ts +0 -41
  96. package/lib/utils/utils.d.ts +0 -54
  97. package/lib/xmlReader.d.ts +0 -92
  98. package/src/adapter/codecept.js +0 -373
  99. package/src/adapter/cucumber/current.js +0 -228
  100. package/src/adapter/cucumber/legacy.js +0 -158
  101. package/src/adapter/cucumber.js +0 -4
  102. package/src/adapter/cypress-plugin/index.js +0 -110
  103. package/src/adapter/jasmine.js +0 -60
  104. package/src/adapter/jest.js +0 -107
  105. package/src/adapter/mocha.cjs +0 -2
  106. package/src/adapter/mocha.js +0 -156
  107. package/src/adapter/nightwatch.js +0 -88
  108. package/src/adapter/playwright.js +0 -254
  109. package/src/adapter/vitest.js +0 -183
  110. package/src/adapter/webdriver.js +0 -142
  111. package/src/bin/cli.js +0 -348
  112. package/src/bin/reportXml.js +0 -77
  113. package/src/bin/startTest.js +0 -124
  114. package/src/bin/uploadArtifacts.js +0 -91
  115. package/src/client.js +0 -508
  116. package/src/config.js +0 -30
  117. package/src/constants.js +0 -53
  118. package/src/data-storage.js +0 -204
  119. package/src/junit-adapter/adapter.js +0 -23
  120. package/src/junit-adapter/csharp.js +0 -28
  121. package/src/junit-adapter/index.js +0 -28
  122. package/src/junit-adapter/java.js +0 -58
  123. package/src/junit-adapter/javascript.js +0 -31
  124. package/src/junit-adapter/python.js +0 -42
  125. package/src/junit-adapter/ruby.js +0 -10
  126. package/src/output.js +0 -57
  127. package/src/pipe/bitbucket.js +0 -252
  128. package/src/pipe/csv.js +0 -140
  129. package/src/pipe/debug.js +0 -119
  130. package/src/pipe/github.js +0 -232
  131. package/src/pipe/gitlab.js +0 -247
  132. package/src/pipe/html.js +0 -373
  133. package/src/pipe/index.js +0 -71
  134. package/src/pipe/testomatio.js +0 -504
  135. package/src/replay.js +0 -245
  136. package/src/reporter-functions.js +0 -55
  137. package/src/reporter.cjs_decprecated +0 -21
  138. package/src/reporter.js +0 -33
  139. package/src/services/artifacts.js +0 -59
  140. package/src/services/index.js +0 -13
  141. package/src/services/key-values.js +0 -59
  142. package/src/services/logger.js +0 -315
  143. package/src/template/emptyData.svg +0 -23
  144. package/src/template/testomatio.hbs +0 -1081
  145. package/src/uploader.js +0 -376
  146. package/src/utils/pipe_utils.js +0 -119
  147. package/src/utils/utils.js +0 -416
  148. package/src/xmlReader.js +0 -614
@@ -1,236 +1,231 @@
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');
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
+
48
11
  /**
49
- * @typedef {import('../../types/types.js').Pipe} Pipe
50
- * @typedef {import('../../types/types.js').TestData} TestData
12
+ * @typedef {import('../../types').Pipe} Pipe
13
+ * @typedef {import('../../types').TestData} TestData
51
14
  * @class GitHubPipe
52
15
  * @implements {Pipe}
53
16
  */
54
17
  class GitHubPipe {
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');
74
- }
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);
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;
89
55
  }
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()} |
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()} |
111
83
  | --- | --- |
112
84
  | Tests | ✔️ **${this.tests.length}** tests run |
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,
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;
181
134
  });
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}`);
189
135
  }
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>';
190
150
  }
191
- toString() {
192
- return 'GitHub Reporter';
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
+ }
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}`);
193
182
  }
183
+ }
184
+
185
+ toString() {
186
+ return 'GitHub Reporter';
187
+ }
194
188
  }
189
+
195
190
  async function deletePreviousReport(octokit, owner, repo, issue, hiddenCommentData) {
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,
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,
205
218
  });
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
- }
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
234
227
  }
228
+ }
235
229
  }
230
+
236
231
  module.exports = GitHubPipe;