apify-test-tools 0.10.2-beta.13 → 0.10.2-beta.15

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 (114) hide show
  1. package/.github/cli/apify-test-tools.mjs +123 -128
  2. package/.github/workflows/public_platform-tests-claude-investigate-and-fix.yaml +1 -1
  3. package/.github/workflows/public_platform-tests.yaml +36 -22
  4. package/.github/workflows/public_pr-build-test.yaml +7 -6
  5. package/.github/workflows/public_push-build-latest.yaml +6 -4
  6. package/.github/workflows/public_stale-issues.yaml +51 -0
  7. package/CHANGELOG.md +3 -0
  8. package/CONTRIBUTING.md +9 -7
  9. package/README.md +11 -12
  10. package/bin/actor-ids.ts +38 -0
  11. package/bin/build.ts +1 -1
  12. package/bin/git.ts +20 -92
  13. package/bin/main.ts +87 -73
  14. package/bin/notify.ts +198 -0
  15. package/bin/run-tests.ts +141 -0
  16. package/bin/slack.ts +16 -87
  17. package/bin/stdin-input.ts +98 -7
  18. package/bin/test-report.ts +141 -140
  19. package/bin/types.ts +0 -9
  20. package/dist/bin/actor-ids.d.ts +16 -0
  21. package/dist/bin/actor-ids.d.ts.map +1 -0
  22. package/dist/bin/actor-ids.js +24 -0
  23. package/dist/bin/actor-ids.js.map +1 -0
  24. package/dist/bin/build.js +1 -1
  25. package/dist/bin/build.js.map +1 -1
  26. package/dist/bin/git.d.ts +6 -16
  27. package/dist/bin/git.d.ts.map +1 -1
  28. package/dist/bin/git.js +15 -75
  29. package/dist/bin/git.js.map +1 -1
  30. package/dist/bin/main.js +80 -51
  31. package/dist/bin/main.js.map +1 -1
  32. package/dist/bin/notify.d.ts +35 -0
  33. package/dist/bin/notify.d.ts.map +1 -0
  34. package/dist/bin/notify.js +131 -0
  35. package/dist/bin/notify.js.map +1 -0
  36. package/dist/bin/run-tests.d.ts +21 -0
  37. package/dist/bin/run-tests.d.ts.map +1 -0
  38. package/dist/bin/run-tests.js +116 -0
  39. package/dist/bin/run-tests.js.map +1 -0
  40. package/dist/bin/slack.d.ts +2 -17
  41. package/dist/bin/slack.d.ts.map +1 -1
  42. package/dist/bin/slack.js +17 -58
  43. package/dist/bin/slack.js.map +1 -1
  44. package/dist/bin/stdin-input.d.ts +71 -9
  45. package/dist/bin/stdin-input.d.ts.map +1 -1
  46. package/dist/bin/stdin-input.js +76 -6
  47. package/dist/bin/stdin-input.js.map +1 -1
  48. package/dist/bin/test-report.d.ts +69 -8
  49. package/dist/bin/test-report.d.ts.map +1 -1
  50. package/dist/bin/test-report.js +76 -67
  51. package/dist/bin/test-report.js.map +1 -1
  52. package/dist/bin/types.d.ts +0 -8
  53. package/dist/bin/types.d.ts.map +1 -1
  54. package/dist/lib/lib.d.ts +0 -3
  55. package/dist/lib/lib.d.ts.map +1 -1
  56. package/dist/lib/lib.js +5 -10
  57. package/dist/lib/lib.js.map +1 -1
  58. package/dist/test/bundle/cli-bundle.test.js +40 -48
  59. package/dist/test/bundle/cli-bundle.test.js.map +1 -1
  60. package/dist/test/e2e/cli-bundle.e2e.test.js +15 -16
  61. package/dist/test/e2e/cli-bundle.e2e.test.js.map +1 -1
  62. package/dist/test/e2e/git-build-release.e2e.test.js +2 -2
  63. package/dist/test/e2e/git-build-release.e2e.test.js.map +1 -1
  64. package/dist/test/unit/bin/actor-ids.test.d.ts +2 -0
  65. package/dist/test/unit/bin/actor-ids.test.d.ts.map +1 -0
  66. package/dist/test/unit/bin/actor-ids.test.js +32 -0
  67. package/dist/test/unit/bin/actor-ids.test.js.map +1 -0
  68. package/dist/test/unit/bin/build-cli.test.js +8 -3
  69. package/dist/test/unit/bin/build-cli.test.js.map +1 -1
  70. package/dist/test/unit/bin/diff-changes.test.js +1 -1
  71. package/dist/test/unit/bin/diff-changes.test.js.map +1 -1
  72. package/dist/test/unit/bin/git.test.js +4 -142
  73. package/dist/test/unit/bin/git.test.js.map +1 -1
  74. package/dist/test/unit/bin/notify.test.d.ts +2 -0
  75. package/dist/test/unit/bin/notify.test.d.ts.map +1 -0
  76. package/dist/test/unit/bin/notify.test.js +222 -0
  77. package/dist/test/unit/bin/notify.test.js.map +1 -0
  78. package/dist/test/unit/bin/stdin-input.test.js +51 -9
  79. package/dist/test/unit/bin/stdin-input.test.js.map +1 -1
  80. package/dist/test/unit/bin/test-cli.test.d.ts +2 -0
  81. package/dist/test/unit/bin/test-cli.test.d.ts.map +1 -0
  82. package/dist/test/unit/bin/test-cli.test.js +115 -0
  83. package/dist/test/unit/bin/test-cli.test.js.map +1 -0
  84. package/dist/test/unit/bin/test-report.test.d.ts +2 -0
  85. package/dist/test/unit/bin/test-report.test.d.ts.map +1 -0
  86. package/dist/test/unit/bin/test-report.test.js +100 -0
  87. package/dist/test/unit/bin/test-report.test.js.map +1 -0
  88. package/dist/tsconfig.tsbuildinfo +1 -1
  89. package/docs/cli.md +131 -53
  90. package/docs/lib.md +21 -16
  91. package/docs/workflows.md +63 -23
  92. package/lib/lib.ts +5 -10
  93. package/package.json +1 -1
  94. package/test/bundle/cli-bundle.test.ts +47 -60
  95. package/test/e2e/cli-bundle.e2e.test.ts +18 -25
  96. package/test/e2e/git-build-release.e2e.test.ts +2 -2
  97. package/test/unit/bin/actor-ids.test.ts +43 -0
  98. package/test/unit/bin/build-cli.test.ts +9 -3
  99. package/test/unit/bin/diff-changes.test.ts +1 -1
  100. package/test/unit/bin/git.test.ts +3 -197
  101. package/test/unit/bin/notify.test.ts +299 -0
  102. package/test/unit/bin/stdin-input.test.ts +68 -9
  103. package/test/unit/bin/test-cli.test.ts +137 -0
  104. package/test/unit/bin/test-report.test.ts +118 -0
  105. package/dist/test/unit/bin/logging.test.d.ts +0 -2
  106. package/dist/test/unit/bin/logging.test.d.ts.map +0 -1
  107. package/dist/test/unit/bin/logging.test.js +0 -37
  108. package/dist/test/unit/bin/logging.test.js.map +0 -1
  109. package/dist/test/unit/bin/slack.test.d.ts +0 -2
  110. package/dist/test/unit/bin/slack.test.d.ts.map +0 -1
  111. package/dist/test/unit/bin/slack.test.js +0 -71
  112. package/dist/test/unit/bin/slack.test.js.map +0 -1
  113. package/test/unit/bin/logging.test.ts +0 -48
  114. package/test/unit/bin/slack.test.ts +0 -84
@@ -0,0 +1,222 @@
1
+ import { WebClient } from '@slack/web-api';
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import { formatReleaseMessage, formatTestMessage, notify } from '../../../bin/notify.js';
4
+ vi.mock('@slack/web-api', () => ({ WebClient: vi.fn() }));
5
+ // One token for both test reports and releases
6
+ const TOKEN = 'SLACK_BOT_TOKEN';
7
+ const postMessage = vi.fn();
8
+ const authTest = vi.fn();
9
+ const testCase = (name, overrides = {}) => ({
10
+ name,
11
+ file: 'test/platform/a.test.ts',
12
+ status: 'passed',
13
+ durationMs: 1,
14
+ failureMessages: [],
15
+ run: { actorId: 'owner/a', runId: name, runLink: `https://console.apify.com/view/runs/${name}` },
16
+ ...overrides,
17
+ });
18
+ const failing = (name, message = 'AssertionError: boom') => testCase(name, { status: 'failed', failureMessages: [message] });
19
+ const reportOf = (tests, errors = []) => {
20
+ const count = (status) => tests.filter((test) => test.status === status).length;
21
+ return {
22
+ kind: 'test-report',
23
+ version: 1,
24
+ success: count('failed') === 0 && errors.length === 0,
25
+ summary: { total: tests.length, passed: count('passed'), failed: count('failed'), skipped: count('skipped') },
26
+ tests,
27
+ errors,
28
+ };
29
+ };
30
+ const defaults = {
31
+ slackChannel: '#notif',
32
+ on: 'failure',
33
+ dryRun: false,
34
+ };
35
+ const notifyTests = async (report, overrides = {}) => notify({ ...defaults, title: 'Platform tests', input: { kind: 'tests', report }, ...overrides });
36
+ const release = (overrides = {}) => ({
37
+ changelog: '- Fixed a bug',
38
+ commits: [{ sha: '1', author: 'Test<test@example.com>', date: '', message: 'fix: bug' }],
39
+ ...overrides,
40
+ });
41
+ const notifyRelease = async (changes, overrides = {}) => notify({
42
+ ...defaults,
43
+ repoUrl: 'git@github.com:owner/repo',
44
+ input: { kind: 'release', changes },
45
+ ...overrides,
46
+ });
47
+ beforeEach(() => {
48
+ vi.stubEnv(TOKEN, 'token');
49
+ postMessage.mockResolvedValue({ ts: '1.1' });
50
+ vi.mocked(WebClient).mockImplementation(function () {
51
+ return { chat: { postMessage }, auth: { test: authTest } };
52
+ });
53
+ });
54
+ afterEach(() => {
55
+ vi.unstubAllEnvs();
56
+ vi.clearAllMocks();
57
+ });
58
+ describe('notify about tests', () => {
59
+ const failed = reportOf([testCase('ok'), failing('bad')]);
60
+ const passed = reportOf([testCase('ok')]);
61
+ it('posts failures to the channel', async () => {
62
+ await notifyTests(failed, { slackChannel: '#a' });
63
+ expect(postMessage.mock.calls.map(([message]) => message.channel)).toStrictEqual(['#a']);
64
+ });
65
+ it('puts the failures after the first in the thread', async () => {
66
+ await notifyTests(reportOf([failing('one'), failing('two'), failing('three')]));
67
+ expect(postMessage).toHaveBeenCalledTimes(2);
68
+ expect(postMessage.mock.calls[1][0]).toMatchObject({ channel: '#notif', thread_ts: '1.1' });
69
+ expect(postMessage.mock.calls[1][0].blocks).toHaveLength(2);
70
+ });
71
+ it('splits a long thread into replies Slack accepts', async () => {
72
+ await notifyTests(reportOf(Array.from({ length: 120 }, (_, i) => failing(`test ${i}`))));
73
+ const replies = postMessage.mock.calls.slice(1).map(([message]) => message.blocks.length);
74
+ expect(replies).toStrictEqual([50, 50, 19]);
75
+ });
76
+ it('posts nothing when the tests passed, but still checks the token', async () => {
77
+ vi.stubEnv(TOKEN, '');
78
+ await expect(notifyTests(passed)).rejects.toThrow(`${TOKEN} not defined`);
79
+ vi.stubEnv(TOKEN, 'token');
80
+ await notifyTests(passed);
81
+ expect(WebClient).toHaveBeenCalled();
82
+ expect(postMessage).not.toHaveBeenCalled();
83
+ });
84
+ it('posts passing runs too with on: always', async () => {
85
+ await notifyTests(passed, { on: 'always' });
86
+ expect(postMessage).toHaveBeenCalledWith({ channel: '#notif', text: '`Platform tests`: all 1 tests passed.' });
87
+ });
88
+ it('needs no token without a channel', async () => {
89
+ vi.stubEnv(TOKEN, '');
90
+ await notifyTests(failed, { slackChannel: '' });
91
+ expect(WebClient).not.toHaveBeenCalled();
92
+ });
93
+ it('verifies the token but posts nothing in a dry run', async () => {
94
+ await notifyTests(failed, { dryRun: true });
95
+ expect(authTest).toHaveBeenCalledTimes(1);
96
+ expect(postMessage).not.toHaveBeenCalled();
97
+ });
98
+ it('names the run and links the job as the caller passes them', async () => {
99
+ await notifyTests(failed, { title: 'Platform tests - Core', jobUrl: 'https://ci.example.com/jobs/42' });
100
+ expect(postMessage.mock.calls[0][0].text).toContain('`Platform tests - Core`: has 1 failed assertions. Failing test suites: 1/2. Check <https://ci.example.com/jobs/42|the job>.');
101
+ });
102
+ it('reads nothing from the CI environment: without a title or a link, there are none', async () => {
103
+ vi.stubEnv('GITHUB_WORKFLOW', 'Platform tests - Core');
104
+ vi.stubEnv('GITHUB_SERVER_URL', 'https://github.com');
105
+ vi.stubEnv('GITHUB_REPOSITORY', 'owner/repo');
106
+ vi.stubEnv('GITHUB_RUN_ID', '42');
107
+ await notifyTests(failed, { title: undefined });
108
+ expect(postMessage.mock.calls[0][0].text).toMatch(/^`-`: has 1 failed assertions\. Failing test suites: 1\/2\.\n/);
109
+ });
110
+ it('rejects the flags only a release uses', async () => {
111
+ await expect(notifyTests(failed, { repoUrl: 'x' })).rejects.toThrow("--repo-url can't be used with a test report");
112
+ expect(WebClient).not.toHaveBeenCalled();
113
+ });
114
+ });
115
+ describe('notify about a release', () => {
116
+ it('verifies the token but posts nothing in a dry run', async () => {
117
+ await notifyRelease(release(), { dryRun: true });
118
+ expect(authTest).toHaveBeenCalledTimes(1);
119
+ expect(postMessage).not.toHaveBeenCalled();
120
+ });
121
+ it('still requires the token in a dry run', async () => {
122
+ vi.stubEnv(TOKEN, '');
123
+ await expect(notifyRelease(release(), { dryRun: true })).rejects.toThrow(`${TOKEN} not defined`);
124
+ });
125
+ it('fails a dry run when Slack rejects the token', async () => {
126
+ authTest.mockRejectedValueOnce(new Error('An API error occurred: invalid_auth'));
127
+ await expect(notifyRelease(release(), { dryRun: true })).rejects.toThrow(`${TOKEN} was rejected by Slack`);
128
+ });
129
+ it('needs no token when no channel is passed', async () => {
130
+ vi.stubEnv(TOKEN, '');
131
+ await notifyRelease(release(), { slackChannel: undefined });
132
+ expect(WebClient).not.toHaveBeenCalled();
133
+ });
134
+ it('posts the changelog additions and the commits, linked to their commit pages', async () => {
135
+ await notifyRelease(release());
136
+ expect(postMessage).toHaveBeenCalledTimes(1);
137
+ expect(postMessage.mock.calls[0][0]).toStrictEqual({
138
+ channel: '#notif',
139
+ text: '*repo* – New release (by Test):\n\n- Fixed a bug\n\n*Commits*:\n' +
140
+ '1. <https://github.com/owner/repo/commit/1|fix: bug> – Test',
141
+ });
142
+ });
143
+ it('announces nothing, and needs no token, when there are no new commits', async () => {
144
+ vi.stubEnv(TOKEN, '');
145
+ await notifyRelease(release({ commits: [] }));
146
+ expect(WebClient).not.toHaveBeenCalled();
147
+ });
148
+ it('announces the release by the author of the newest commit, named after the repository', async () => {
149
+ const commit = (author, message) => ({ sha: '1', author, date: '', message });
150
+ await notifyRelease(release({
151
+ commits: [commit('Old<old@example.com>', 'fix: older'), commit('New<new@example.com>', 'feat: newer')],
152
+ }), { repoUrl: 'git@github.com:owner/my-repo' });
153
+ expect(postMessage).toHaveBeenCalledWith({
154
+ channel: '#notif',
155
+ text: expect.stringContaining('*my-repo* – New release (by New)'),
156
+ });
157
+ });
158
+ it('rejects the flags only tests use', async () => {
159
+ await expect(notifyRelease(release(), { on: 'always', title: 'T', jobUrl: 'https://job' })).rejects.toThrow("--on, --title, --job-url can't be used with a release");
160
+ });
161
+ });
162
+ describe('formatReleaseMessage', () => {
163
+ const commit = (sha, message, author = 'Dev<dev@example.com>') => ({
164
+ sha,
165
+ author,
166
+ date: '',
167
+ message,
168
+ });
169
+ it('lists every commit of a rebase merge, oldest first, and leaves out an empty changelog', () => {
170
+ const text = formatReleaseMessage({
171
+ commits: [commit('a1', 'feat: one'), commit('b2', 'fix: two', 'Last<last@example.com>')],
172
+ changelog: null,
173
+ }, 'https://github.com/owner/repo.git');
174
+ expect(text).toBe('*repo* – New release (by Last):\n\n*Commits*:\n' +
175
+ '1. <https://github.com/owner/repo/commit/a1|feat: one> – Dev\n' +
176
+ '2. <https://github.com/owner/repo/commit/b2|fix: two> – Last');
177
+ });
178
+ it('caps a commit title at 200 characters', () => {
179
+ const text = formatReleaseMessage({ commits: [commit('a1', 'x'.repeat(300))], changelog: null }, 'git@github.com:o/r');
180
+ expect(text).toContain(`|${'x'.repeat(199)}…>`);
181
+ });
182
+ it('escapes what Slack would read as markup, so a title cannot break its link', () => {
183
+ const text = formatReleaseMessage({ commits: [commit('a1', 'fix: <div> & co')], changelog: null }, 'git@github.com:o/r');
184
+ expect(text).toContain('|fix: &lt;div&gt; &amp; co>');
185
+ });
186
+ it('links nothing on a host other than GitHub', () => {
187
+ const text = formatReleaseMessage({ commits: [commit('a1', 'fix: bug')], changelog: null }, 'git@gitlab.com:o/r.git');
188
+ expect(text).toContain('1. fix: bug – Dev');
189
+ });
190
+ });
191
+ describe('formatTestMessage', () => {
192
+ it('leads with the counts and the first failure, linked to its run, and threads the rest', () => {
193
+ const twice = testCase('owner/a: twice', { status: 'failed', failureMessages: ['Error: one', 'Error: two'] });
194
+ const skipped = testCase('owner/a: skipped', { status: 'skipped', run: null });
195
+ const { text, details } = formatTestMessage({
196
+ report: reportOf([testCase('ok'), failing('owner/a: fails'), twice, skipped]),
197
+ title: 'Tests',
198
+ jobUrl: 'https://job',
199
+ });
200
+ // Every failure message counts as an assertion, every test (skipped too) in the total
201
+ expect(text).toBe('`Tests`: has 3 failed assertions. Failing test suites: 2/4. Check <https://job|the job>.\n\n' +
202
+ 'AssertionError: boom --- <https://console.apify.com/view/runs/owner/a: fails|owner/a>');
203
+ expect(details).toStrictEqual([
204
+ '• Error: one --- <https://console.apify.com/view/runs/owner/a: twice|owner/a>',
205
+ '• Error: two --- <https://console.apify.com/view/runs/owner/a: twice|owner/a>',
206
+ ]);
207
+ });
208
+ it('links nothing for a failure that started no run', () => {
209
+ const report = reportOf([testCase('standby', { status: 'failed', failureMessages: ['Error: x'], run: null })]);
210
+ expect(formatTestMessage({ report, title: 'T' }).text).toMatch(/\n\nError: x$/);
211
+ });
212
+ it('reports errors outside of tests, e.g. a test file that failed to load', () => {
213
+ const { text } = formatTestMessage({ report: reportOf([], ['b.test.ts: Cannot find package']), title: 'T' });
214
+ expect(text).toBe('`T`: has 0 failed assertions. Failing test suites: 0/0. Errors outside of tests: 1.\n\n' +
215
+ 'Error: b.test.ts: Cannot find package');
216
+ });
217
+ it('escapes what Slack would read as markup', () => {
218
+ const report = reportOf([failing('a', 'expected <div> & more')]);
219
+ expect(formatTestMessage({ report, title: 'T' }).text).toContain('expected &lt;div&gt; &amp; more');
220
+ });
221
+ });
222
+ //# sourceMappingURL=notify.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/notify.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { parseBuildInput, parseReleaseChanges } from '../../../bin/stdin-input.js';
2
+ import { parseBuildInput, parseNotifyInput, parseTestTargets } from '../../../bin/stdin-input.js';
3
3
  describe('parseBuildInput', () => {
4
4
  it('reads the Actors', () => {
5
5
  expect(parseBuildInput('{"actors":[{"actorFullName":"owner/a"}]}')).toStrictEqual({
@@ -23,8 +23,42 @@ describe('parseBuildInput', () => {
23
23
  expect(() => parseBuildInput('{"functionallyChangedActors":[{"actorFullName":"owner/a"}]}')).toThrow('is not the Actors to build');
24
24
  });
25
25
  });
26
- describe('parseReleaseChanges', () => {
26
+ describe('parseTestTargets', () => {
27
+ const build = { buildId: 'b', actorRawId: 'r', buildNumber: '0.99.1', actorFullName: 'owner/a' };
28
+ it('reads the output of build', () => {
29
+ expect(parseTestTargets(JSON.stringify([build]))).toStrictEqual([build]);
30
+ expect(parseTestTargets('[]')).toStrictEqual([]);
31
+ });
32
+ it('reads an Actor without a build, for its default build, ignoring the rest of get-actor-configs', () => {
33
+ const actorConfig = { actorFullName: 'owner/a', folder: 'actors/a', tokenEnvVar: 'APIFY_TOKEN_OWNER' };
34
+ expect(parseTestTargets(JSON.stringify([actorConfig]))).toStrictEqual([{ actorFullName: 'owner/a' }]);
35
+ });
36
+ it('reads an Actor given by its raw ID only', () => {
37
+ expect(parseTestTargets('[{"actorRawId":"r"}]')).toStrictEqual([{ actorRawId: 'r' }]);
38
+ });
39
+ it('rejects a dry-run plan, which built nothing', () => {
40
+ expect(() => parseTestTargets(JSON.stringify({ dryRun: true, builds: [build] }))).toThrow('is a dry-run plan');
41
+ });
42
+ it('rejects empty input and input that is not Actors', () => {
43
+ expect(() => parseTestTargets('')).toThrow('Expected the Actors to test as JSON on stdin, got nothing');
44
+ expect(() => parseTestTargets('{"actors":[]}')).toThrow('is not the Actors to test');
45
+ expect(() => parseTestTargets('[{"buildNumber":"0.99.1"}]')).toThrow('An Actor needs actorFullName or actorRawId');
46
+ expect(() => parseTestTargets('{oops')).toThrow('not valid JSON');
47
+ });
48
+ });
49
+ describe('parseNotifyInput', () => {
27
50
  const commit = { sha: '1'.repeat(40), author: 'Dev<dev@example.com>', date: 'Date', message: 'feat: foo' };
51
+ const report = {
52
+ kind: 'test-report',
53
+ version: 1,
54
+ success: true,
55
+ summary: { total: 0, passed: 0, failed: 0, skipped: 0 },
56
+ tests: [],
57
+ errors: [],
58
+ };
59
+ it('reads the output of test', () => {
60
+ expect(parseNotifyInput(JSON.stringify(report))).toStrictEqual({ kind: 'tests', report });
61
+ });
28
62
  it('reads what changed from a get-affected-actors document, ignoring the rest', () => {
29
63
  const document = {
30
64
  version: 1,
@@ -36,15 +70,23 @@ describe('parseReleaseChanges', () => {
36
70
  functionallyChangedActors: [{ actorFullName: 'owner/a' }],
37
71
  cosmeticallyChangedActors: [],
38
72
  };
39
- expect(parseReleaseChanges(JSON.stringify(document))).toStrictEqual({
40
- commits: [commit],
41
- changedFiles: ['src/main.ts'],
42
- changelog: '- Added foo',
73
+ expect(parseNotifyInput(JSON.stringify(document))).toStrictEqual({
74
+ kind: 'release',
75
+ changes: { commits: [commit], changelog: '- Added foo' },
43
76
  });
44
77
  });
45
- it('rejects empty input and input that is not a get-affected-actors document', () => {
46
- expect(() => parseReleaseChanges('')).toThrow('got nothing');
47
- expect(() => parseReleaseChanges('{"actors":[]}')).toThrow('not the output of get-affected-actors');
78
+ it('rejects empty input, which is what a failed command earlier in a pipe leaves behind', () => {
79
+ expect(() => parseNotifyInput('')).toThrow('Expected the output of test or get-affected-actors as JSON on stdin, got nothing');
80
+ });
81
+ it('rejects input that is neither, e.g. raw vitest JSON or builds', () => {
82
+ expect(() => parseNotifyInput('{"success":true,"testResults":[]}')).toThrow('is not the output of test or get-affected-actors');
83
+ expect(() => parseNotifyInput('[]')).toThrow('is not the output of test or get-affected-actors');
84
+ // A report is told by its kind, not by looking like one
85
+ expect(() => parseNotifyInput('{"tests":[],"summary":{}}')).toThrow('is not the output of test or get-affected-actors');
86
+ });
87
+ it('says which document it took a malformed input for', () => {
88
+ expect(() => parseNotifyInput('{"kind":"test-report","tests":[]}')).toThrow('is not the output of test (');
89
+ expect(() => parseNotifyInput('{"commits":[]}')).toThrow('is not the output of get-affected-actors (');
48
90
  });
49
91
  });
50
92
  //# sourceMappingURL=stdin-input.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdin-input.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/stdin-input.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stdin-input.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/stdin-input.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-cli.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/bin/test-cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { mkdir, mkdtemp, rm, symlink, writeFile } from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import process from 'node:process';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
8
+ import { compileCli } from './compiled-cli.js';
9
+ const projectRoot = fileURLToPath(new URL('../../../', import.meta.url));
10
+ let cliPath;
11
+ let cleanup;
12
+ let repoDir;
13
+ // Only what node needs, so the outer vitest's own variables don't reach the inner one. The fixture's tests never call
14
+ // Apify, so any token does.
15
+ const env = { PATH: process.env.PATH ?? '', HOME: os.tmpdir(), TESTER_APIFY_TOKEN: 'fake-token' };
16
+ const run = (args, input = '', cwd = repoDir, runEnv = env) => spawnSync(cliPath, args, { cwd, encoding: 'utf8', input, env: runEnv, stdio: ['pipe', 'pipe', 'pipe'] });
17
+ const build = { buildId: 'b1', actorRawId: 'raw1', buildNumber: '0.99.1', actorFullName: 'owner/a' };
18
+ // A consumer repository with the vitest it installed: one passing test that started a run, one failing
19
+ describe('test CLI', () => {
20
+ beforeAll(async () => {
21
+ ({ cliPath, cleanup } = await compileCli());
22
+ repoDir = await mkdtemp(path.join(os.tmpdir(), 'apify-test-cli-'));
23
+ await symlink(path.join(projectRoot, 'node_modules'), path.join(repoDir, 'node_modules'), 'dir');
24
+ await mkdir(path.join(repoDir, 'test/platform'), { recursive: true });
25
+ await writeFile(path.join(repoDir, 'test/platform/a.test.ts'), `import { expect, test } from 'vitest';
26
+
27
+ test('owner/a: works', ({ task }) => {
28
+ console.log('ENV', process.env.ACTOR_BUILDS ?? '-');
29
+ task.meta = { runId: 'run1', runLink: 'https://console.apify.com/view/runs/run1', actorId: 'owner/a' } as never;
30
+ });
31
+
32
+ test('owner/a: fails', () => {
33
+ expect(1).toBe(2);
34
+ });
35
+ `);
36
+ });
37
+ afterAll(async () => {
38
+ await cleanup?.();
39
+ if (repoDir)
40
+ await rm(repoDir, { recursive: true, force: true });
41
+ });
42
+ it('tests the builds on stdin, printing the report on stdout and the vitest output on stderr', () => {
43
+ const result = run(['test'], JSON.stringify([build]));
44
+ expect(result.status).toBe(1);
45
+ // Passed on to the lib as ACTOR_BUILDS, the fields in the order test reads them
46
+ const { actorFullName, buildId, actorRawId, buildNumber } = build;
47
+ expect(result.stderr).toContain(`ENV ${JSON.stringify([{ actorFullName, buildId, actorRawId, buildNumber }])}`);
48
+ expect(result.stderr).toContain('1) owner/a: works ... https://console.apify.com/view/runs/run1');
49
+ // Vitest's own output still comes through, without the note about the temporary JSON report
50
+ expect(result.stderr).toContain('Test Files');
51
+ expect(result.stderr).not.toContain('JSON report written to');
52
+ expect(JSON.parse(result.stdout)).toMatchObject({
53
+ kind: 'test-report',
54
+ version: 1,
55
+ success: false,
56
+ summary: { total: 2, passed: 1, failed: 1, skipped: 0 },
57
+ tests: [
58
+ { name: 'owner/a: works', file: 'test/platform/a.test.ts', status: 'passed', run: { runId: 'run1' } },
59
+ { name: 'owner/a: fails', status: 'failed', failureMessages: [expect.stringContaining('expected 1')] },
60
+ ],
61
+ errors: [],
62
+ });
63
+ });
64
+ it('tests an Actor without a build on its default build', () => {
65
+ // get-actor-configs lists no raw ID, test looks it up (see actor-ids.test.ts). Given here, it isn't, so
66
+ // the fake token is never sent to the API.
67
+ const actorConfig = {
68
+ actorFullName: 'owner/a',
69
+ actorRawId: 'raw1',
70
+ folder: 'actors/a',
71
+ tokenEnvVar: 'APIFY_TOKEN_OWNER',
72
+ };
73
+ const result = run(['test'], JSON.stringify([actorConfig]));
74
+ expect(result.status).toBe(1);
75
+ // Only the fields the lib reads reach it
76
+ expect(result.stderr).toContain('ENV [{"actorFullName":"owner/a","actorRawId":"raw1"}]');
77
+ expect(result.stderr).toContain('Testing 1 Actor(s): owner/a (default build)');
78
+ expect(JSON.parse(result.stdout)).toMatchObject({ success: false, summary: { passed: 1, failed: 1 } });
79
+ });
80
+ it('adds the reporters it is given to the default and JSON ones, also before the test files', () => {
81
+ const result = run(['--log-level', 'debug', 'test', '--reporter', 'dot', '--reporter', 'verbose', 'test/platform'], JSON.stringify([build]));
82
+ expect(result.stderr).toMatch(/Running vitest: \S+ run test\/platform --reporter=default --reporter=json --reporter=dot --reporter=verbose /);
83
+ expect(JSON.parse(result.stdout)).toMatchObject({ summary: { passed: 1, failed: 1 } });
84
+ });
85
+ it('fails without TESTER_APIFY_TOKEN instead of passing with every test skipped', () => {
86
+ const result = run(['test'], JSON.stringify([build]), repoDir, { ...env, TESTER_APIFY_TOKEN: '' });
87
+ expect(result.status).toBe(1);
88
+ expect(result.stderr).toContain('TESTER_APIFY_TOKEN is not set');
89
+ expect(result.stdout).toBe('');
90
+ });
91
+ it('fails on empty stdin instead of testing nothing', () => {
92
+ const result = run(['test']);
93
+ expect(result.status).toBe(1);
94
+ expect(result.stderr).toContain('Expected the Actors to test as JSON on stdin, got nothing');
95
+ expect(result.stdout).toBe('');
96
+ });
97
+ it('fails clearly where vitest is not installed', async () => {
98
+ const emptyDir = await mkdtemp(path.join(os.tmpdir(), 'apify-test-cli-empty-'));
99
+ try {
100
+ const result = run(['test'], '[]', emptyDir);
101
+ expect(result.status).toBe(1);
102
+ expect(result.stderr).toContain('vitest is not installed');
103
+ }
104
+ finally {
105
+ await rm(emptyDir, { recursive: true, force: true });
106
+ }
107
+ });
108
+ it('hands the report to notify', () => {
109
+ const report = run(['test'], JSON.stringify([build])).stdout;
110
+ const result = run(['notify'], report);
111
+ expect(result.status, result.stderr).toBe(0);
112
+ expect(result.stderr).toContain('Skipping notification, no --slack-channel passed');
113
+ });
114
+ });
115
+ //# sourceMappingURL=test-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-cli.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/test-cli.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=test-report.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-report.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/bin/test-report.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { toTestReport } from '../../../bin/test-report.js';
3
+ const cwd = '/repo';
4
+ const run = { actorId: 'owner/a', runId: 'run1', runLink: 'https://console.apify.com/view/runs/run1' };
5
+ const vitestReport = (testResults, success = false) => ({
6
+ success,
7
+ testResults,
8
+ });
9
+ describe('toTestReport', () => {
10
+ it('reads each test with its status, first failure lines and run', () => {
11
+ const report = toTestReport(vitestReport([
12
+ {
13
+ name: '/repo/test/platform/a.test.ts',
14
+ status: 'failed',
15
+ message: '',
16
+ assertionResults: [
17
+ {
18
+ fullName: 'owner/a: works',
19
+ status: 'passed',
20
+ duration: 12.6,
21
+ failureMessages: [],
22
+ meta: run,
23
+ },
24
+ {
25
+ fullName: 'owner/a: fails',
26
+ status: 'failed',
27
+ duration: 3,
28
+ // Every failure counts, also the same one twice (e.g. a retry)
29
+ failureMessages: ['AssertionError: boom\n at a.test.ts:1:1', 'AssertionError: boom\n'],
30
+ meta: {},
31
+ },
32
+ { fullName: 'owner/a: other', status: 'pending', failureMessages: null },
33
+ ],
34
+ },
35
+ ]), { cwd, exitCode: 1 });
36
+ expect(report).toStrictEqual({
37
+ kind: 'test-report',
38
+ version: 1,
39
+ success: false,
40
+ summary: { total: 3, passed: 1, failed: 1, skipped: 1 },
41
+ tests: [
42
+ {
43
+ name: 'owner/a: works',
44
+ file: 'test/platform/a.test.ts',
45
+ status: 'passed',
46
+ durationMs: 13,
47
+ failureMessages: [],
48
+ run,
49
+ },
50
+ {
51
+ name: 'owner/a: fails',
52
+ file: 'test/platform/a.test.ts',
53
+ status: 'failed',
54
+ durationMs: 3,
55
+ failureMessages: ['AssertionError: boom', 'AssertionError: boom'],
56
+ run: null,
57
+ },
58
+ {
59
+ name: 'owner/a: other',
60
+ file: 'test/platform/a.test.ts',
61
+ status: 'skipped',
62
+ durationMs: null,
63
+ failureMessages: [],
64
+ run: null,
65
+ },
66
+ ],
67
+ errors: [],
68
+ });
69
+ });
70
+ it('reports a test file that failed to load, which has no test to blame', () => {
71
+ const report = toTestReport(vitestReport([
72
+ {
73
+ name: '/repo/test/platform/b.test.ts',
74
+ status: 'failed',
75
+ message: "Cannot find package 'foo'\nmore",
76
+ assertionResults: [],
77
+ },
78
+ ]), { cwd, exitCode: 1 });
79
+ expect(report.success).toBe(false);
80
+ expect(report.errors).toStrictEqual(["test/platform/b.test.ts: Cannot find package 'foo'"]);
81
+ });
82
+ it('fails when vitest does, even if every test passed', () => {
83
+ const report = toTestReport(vitestReport([], true), { cwd, exitCode: 1 });
84
+ expect(report.success).toBe(false);
85
+ expect(report.errors).toStrictEqual(['Vitest exited with code 1, see its output above']);
86
+ });
87
+ it('passes when every test passed or was skipped', () => {
88
+ const report = toTestReport(vitestReport([
89
+ {
90
+ name: '/repo/test/platform/a.test.ts',
91
+ status: 'passed',
92
+ message: '',
93
+ assertionResults: [{ fullName: 'skipped', status: 'skipped', failureMessages: [] }],
94
+ },
95
+ ], true), { cwd, exitCode: 0 });
96
+ expect(report.success).toBe(true);
97
+ expect(report.summary).toStrictEqual({ total: 1, passed: 0, failed: 0, skipped: 1 });
98
+ });
99
+ });
100
+ //# sourceMappingURL=test-report.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-report.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/test-report.test.ts"],"names":[],"mappings":"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"}