apify-test-tools 0.10.2-beta.3 → 0.10.2-beta.5

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 (107) hide show
  1. package/.github/cli/apify-test-tools.mjs +117 -118
  2. package/.github/scripts/run-with-apify-tokens.mjs +1 -1
  3. package/.github/workflows/public_pr-build-test.yaml +25 -25
  4. package/.github/workflows/public_push-build-latest.yaml +20 -4
  5. package/CHANGELOG.md +6 -0
  6. package/CONTRIBUTING.md +4 -1
  7. package/README.md +104 -56
  8. package/bin/affected-actors.ts +135 -103
  9. package/bin/build.ts +53 -38
  10. package/bin/diff-changes.ts +7 -6
  11. package/bin/diff-json-schema.ts +5 -6
  12. package/bin/git.ts +24 -69
  13. package/bin/main.ts +46 -80
  14. package/bin/slack.ts +15 -4
  15. package/bin/stdin-input.ts +65 -0
  16. package/bin/types.ts +6 -0
  17. package/dist/bin/affected-actors.d.ts +23 -27
  18. package/dist/bin/affected-actors.d.ts.map +1 -1
  19. package/dist/bin/affected-actors.js +111 -65
  20. package/dist/bin/affected-actors.js.map +1 -1
  21. package/dist/bin/build.d.ts +11 -5
  22. package/dist/bin/build.d.ts.map +1 -1
  23. package/dist/bin/build.js +43 -23
  24. package/dist/bin/build.js.map +1 -1
  25. package/dist/bin/diff-changes.d.ts +4 -3
  26. package/dist/bin/diff-changes.d.ts.map +1 -1
  27. package/dist/bin/diff-changes.js +4 -4
  28. package/dist/bin/diff-changes.js.map +1 -1
  29. package/dist/bin/diff-json-schema.d.ts +2 -2
  30. package/dist/bin/diff-json-schema.d.ts.map +1 -1
  31. package/dist/bin/diff-json-schema.js +1 -4
  32. package/dist/bin/diff-json-schema.js.map +1 -1
  33. package/dist/bin/git.d.ts +7 -15
  34. package/dist/bin/git.d.ts.map +1 -1
  35. package/dist/bin/git.js +23 -61
  36. package/dist/bin/git.js.map +1 -1
  37. package/dist/bin/main.js +39 -71
  38. package/dist/bin/main.js.map +1 -1
  39. package/dist/bin/slack.d.ts +6 -3
  40. package/dist/bin/slack.d.ts.map +1 -1
  41. package/dist/bin/slack.js +13 -1
  42. package/dist/bin/slack.js.map +1 -1
  43. package/dist/bin/stdin-input.d.ts +17 -0
  44. package/dist/bin/stdin-input.d.ts.map +1 -0
  45. package/dist/bin/stdin-input.js +54 -0
  46. package/dist/bin/stdin-input.js.map +1 -0
  47. package/dist/bin/types.d.ts +5 -0
  48. package/dist/bin/types.d.ts.map +1 -1
  49. package/dist/test/bundle/cli-bundle.test.js +32 -11
  50. package/dist/test/bundle/cli-bundle.test.js.map +1 -1
  51. package/dist/test/e2e/cli-bundle.e2e.test.js +23 -57
  52. package/dist/test/e2e/cli-bundle.e2e.test.js.map +1 -1
  53. package/dist/test/e2e/git-build-release.e2e.test.d.ts +2 -0
  54. package/dist/test/e2e/git-build-release.e2e.test.d.ts.map +1 -0
  55. package/dist/test/e2e/git-build-release.e2e.test.js +87 -0
  56. package/dist/test/e2e/git-build-release.e2e.test.js.map +1 -0
  57. package/dist/test/e2e/helpers.d.ts +37 -0
  58. package/dist/test/e2e/helpers.d.ts.map +1 -0
  59. package/dist/test/e2e/helpers.js +57 -0
  60. package/dist/test/e2e/helpers.js.map +1 -0
  61. package/dist/test/unit/bin/affected-actors-cli.test.d.ts +2 -0
  62. package/dist/test/unit/bin/affected-actors-cli.test.d.ts.map +1 -0
  63. package/dist/test/unit/bin/affected-actors-cli.test.js +161 -0
  64. package/dist/test/unit/bin/affected-actors-cli.test.js.map +1 -0
  65. package/dist/test/unit/bin/affected-actors.test.js +68 -87
  66. package/dist/test/unit/bin/affected-actors.test.js.map +1 -1
  67. package/dist/test/unit/bin/build-cli.test.d.ts +2 -0
  68. package/dist/test/unit/bin/build-cli.test.d.ts.map +1 -0
  69. package/dist/test/unit/bin/build-cli.test.js +44 -0
  70. package/dist/test/unit/bin/build-cli.test.js.map +1 -0
  71. package/dist/test/unit/bin/build.test.js +61 -4
  72. package/dist/test/unit/bin/build.test.js.map +1 -1
  73. package/dist/test/unit/bin/compiled-cli.d.ts +6 -0
  74. package/dist/test/unit/bin/compiled-cli.d.ts.map +1 -0
  75. package/dist/test/unit/bin/compiled-cli.js +16 -0
  76. package/dist/test/unit/bin/compiled-cli.js.map +1 -0
  77. package/dist/test/unit/bin/diff-changes.test.js +55 -55
  78. package/dist/test/unit/bin/diff-changes.test.js.map +1 -1
  79. package/dist/test/unit/bin/diff.test.js +25 -28
  80. package/dist/test/unit/bin/diff.test.js.map +1 -1
  81. package/dist/test/unit/bin/git.test.js +28 -108
  82. package/dist/test/unit/bin/git.test.js.map +1 -1
  83. package/dist/test/unit/bin/slack.test.js +19 -2
  84. package/dist/test/unit/bin/slack.test.js.map +1 -1
  85. package/dist/test/unit/bin/stdin-input.test.d.ts +2 -0
  86. package/dist/test/unit/bin/stdin-input.test.d.ts.map +1 -0
  87. package/dist/test/unit/bin/stdin-input.test.js +50 -0
  88. package/dist/test/unit/bin/stdin-input.test.js.map +1 -0
  89. package/dist/test/unit/should-built-and-test.test.js +18 -21
  90. package/dist/test/unit/should-built-and-test.test.js.map +1 -1
  91. package/dist/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +1 -1
  93. package/test/bundle/cli-bundle.test.ts +47 -11
  94. package/test/e2e/cli-bundle.e2e.test.ts +47 -77
  95. package/test/e2e/git-build-release.e2e.test.ts +113 -0
  96. package/test/e2e/helpers.ts +82 -0
  97. package/test/unit/bin/affected-actors-cli.test.ts +193 -0
  98. package/test/unit/bin/affected-actors.test.ts +86 -94
  99. package/test/unit/bin/build-cli.test.ts +55 -0
  100. package/test/unit/bin/build.test.ts +71 -3
  101. package/test/unit/bin/compiled-cli.ts +17 -0
  102. package/test/unit/bin/diff-changes.test.ts +55 -55
  103. package/test/unit/bin/diff.test.ts +25 -28
  104. package/test/unit/bin/git.test.ts +35 -132
  105. package/test/unit/bin/slack.test.ts +21 -2
  106. package/test/unit/bin/stdin-input.test.ts +61 -0
  107. package/test/unit/should-built-and-test.test.ts +19 -22
@@ -0,0 +1,161 @@
1
+ import { execFileSync, spawnSync } from 'node:child_process';
2
+ import { mkdir, mkdtemp, rm, 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 { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from 'vitest';
7
+ import { compileCli } from './compiled-cli.js';
8
+ // `get-affected-actors --base` on real git histories. Actors a and c share `src/`, b is standalone.
9
+ // `main` is the base branch and `feature` the PR branch, checked out like in the PR workflow.
10
+ const CONFIG = {
11
+ actors: [
12
+ {
13
+ folder: 'actors/a',
14
+ actorFullName: 'owner/actor-a',
15
+ tokenEnvVar: 'T',
16
+ overrideActorContext: ['actors/a', 'src'],
17
+ },
18
+ {
19
+ folder: 'actors/c',
20
+ actorFullName: 'owner/actor-c',
21
+ tokenEnvVar: 'T',
22
+ overrideActorContext: ['actors/c', 'src'],
23
+ },
24
+ { folder: 'actors/b', actorFullName: 'owner/actor-b', tokenEnvVar: 'T' },
25
+ ],
26
+ };
27
+ // Only what node and git need, so nothing from the developer's git config leaks in
28
+ const env = { PATH: process.env.PATH ?? '', HOME: os.tmpdir() };
29
+ const gitEnv = {
30
+ ...env,
31
+ GIT_AUTHOR_NAME: 'Tester',
32
+ GIT_AUTHOR_EMAIL: 'tester@example.com',
33
+ GIT_COMMITTER_NAME: 'Tester',
34
+ GIT_COMMITTER_EMAIL: 'tester@example.com',
35
+ };
36
+ let cliPath;
37
+ let cleanup;
38
+ let repoDir;
39
+ const git = (...args) => execFileSync('git', args, { cwd: repoDir, env: gitEnv, encoding: 'utf8' }).trim();
40
+ const writeFiles = async (content, files) => {
41
+ for (const file of files) {
42
+ await mkdir(path.dirname(path.join(repoDir, file)), { recursive: true });
43
+ await writeFile(path.join(repoDir, file), `${content}\n`);
44
+ }
45
+ };
46
+ /** Commits a change to each file and returns the commit. */
47
+ const commit = async (message, ...files) => {
48
+ await writeFiles(message, files);
49
+ git('add', '-A');
50
+ git('commit', '-q', '-m', message);
51
+ return git('rev-parse', 'HEAD');
52
+ };
53
+ /** Commits on `main`, then checks `feature` out again. */
54
+ const commitOnMain = async (message, ...files) => {
55
+ git('checkout', '-q', 'main');
56
+ await commit(message, ...files);
57
+ git('checkout', '-q', 'feature');
58
+ };
59
+ const runGetAffectedActors = (...args) => {
60
+ const result = spawnSync(cliPath, ['get-affected-actors', ...args], { cwd: repoDir, env, encoding: 'utf8' });
61
+ expect(result.status, result.stderr).toBe(0);
62
+ return JSON.parse(result.stdout);
63
+ };
64
+ const getAffectedActors = (...args) => {
65
+ const document = runGetAffectedActors(...args);
66
+ const names = (actors) => actors.map(({ actorFullName }) => actorFullName.replace('owner/actor-', '')).sort();
67
+ return {
68
+ functional: names(document.functionallyChangedActors),
69
+ cosmetic: names(document.cosmeticallyChangedActors),
70
+ };
71
+ };
72
+ describe('get-affected-actors CLI on real git histories', () => {
73
+ beforeAll(async () => {
74
+ ({ cliPath, cleanup } = await compileCli());
75
+ });
76
+ afterAll(async () => {
77
+ await cleanup?.();
78
+ });
79
+ beforeEach(async () => {
80
+ repoDir = await mkdtemp(path.join(os.tmpdir(), 'apify-affected-actors-'));
81
+ git('init', '-q', '-b', 'main');
82
+ await writeFile(path.join(repoDir, 'apify-test-tools.config.json'), JSON.stringify(CONFIG));
83
+ for (const { folder } of CONFIG.actors) {
84
+ await mkdir(path.join(repoDir, folder, '.actor'), { recursive: true });
85
+ await writeFile(path.join(repoDir, folder, '.actor/actor.json'), JSON.stringify({ actorSpecification: 1, name: `actor-${path.basename(folder)}`, version: '0.1' }));
86
+ }
87
+ await commit('chore: init', 'src/shared.ts', 'actors/a/main.ts', 'actors/b/main.ts', 'actors/c/main.ts');
88
+ git('checkout', '-q', '-b', 'feature');
89
+ });
90
+ afterEach(async () => {
91
+ if (repoDir)
92
+ await rm(repoDir, { recursive: true, force: true });
93
+ });
94
+ it("tests only what changed since the last validated commit, on the branch's own commits", async () => {
95
+ const validated = await commit('feat(a): validated change', 'actors/a/main.ts');
96
+ await commit('feat(c): new change, docs for a', 'actors/c/main.ts', 'actors/a/README.md');
97
+ // A is still the validated code, only its README changed since
98
+ expect(getAffectedActors('--base', 'main', '--since', validated)).toStrictEqual({
99
+ functional: ['c'],
100
+ cosmetic: ['a'],
101
+ });
102
+ });
103
+ it('tests nothing after merging cosmetic changes from base', async () => {
104
+ const validated = await commit('feat(a): validated change', 'actors/a/main.ts');
105
+ await commitOnMain('docs: readme and changelog', 'actors/a/README.md', 'CHANGELOG.md');
106
+ git('merge', '-q', '--no-edit', 'main');
107
+ expect(getAffectedActors('--base', 'main', '--since', validated)).toStrictEqual({
108
+ functional: [],
109
+ cosmetic: ['a'],
110
+ });
111
+ });
112
+ it("tests the Actors where base's functional change meets the branch's after a merge", async () => {
113
+ const validated = await commit('feat(a): validated change', 'actors/a/main.ts');
114
+ await commitOnMain('feat: shared change', 'src/shared.ts');
115
+ git('merge', '-q', '--no-edit', 'main');
116
+ // Base changed A and C. A can interact with the branch's change, C only has base's, which base validated
117
+ expect(getAffectedActors('--base', 'main', '--since', validated)).toStrictEqual({
118
+ functional: ['a'],
119
+ cosmetic: [],
120
+ });
121
+ });
122
+ it('leaves out Actors that only base changed', async () => {
123
+ await commit('feat: shared change', 'src/shared.ts');
124
+ await commitOnMain('feat(b): base change', 'actors/b/main.ts');
125
+ git('merge', '-q', '--no-edit', 'main');
126
+ expect(getAffectedActors('--base', 'main')).toStrictEqual({ functional: ['a', 'c'], cosmetic: [] });
127
+ });
128
+ it('counts code changed in the merge commit itself', async () => {
129
+ await commit('docs(a): readme', 'actors/a/README.md');
130
+ await commitOnMain('feat(b): base change', 'actors/b/main.ts');
131
+ git('merge', '-q', '--no-commit', '--no-ff', 'main');
132
+ await writeFiles('changed while merging', ['actors/c/main.ts']);
133
+ git('add', '-A');
134
+ git('commit', '-q', '--no-edit');
135
+ expect(getAffectedActors('--base', 'main')).toStrictEqual({ functional: ['c'], cosmetic: ['a'] });
136
+ });
137
+ it('tests nothing after a rebase onto base changes to other Actors', async () => {
138
+ const validated = await commit('feat(a): validated change', 'actors/a/main.ts');
139
+ await commitOnMain('feat(b): base change', 'actors/b/main.ts');
140
+ git('rebase', '-q', 'main');
141
+ expect(getAffectedActors('--base', 'main', '--since', validated)).toStrictEqual({
142
+ functional: [],
143
+ cosmetic: [],
144
+ });
145
+ });
146
+ it('checks the whole branch on a rerun or when --since is not in the history', async () => {
147
+ await commit('feat(a): validated change', 'actors/a/main.ts');
148
+ const head = await commit('docs(a): readme', 'actors/a/README.md');
149
+ const wholeBranch = { functional: ['a'], cosmetic: [] };
150
+ expect(getAffectedActors('--base', 'main', '--since', head)).toStrictEqual(wholeBranch);
151
+ expect(getAffectedActors('--base', 'main', '--since', 'e'.repeat(40))).toStrictEqual(wholeBranch);
152
+ });
153
+ it('reports nothing for an empty range', async () => {
154
+ const nothing = { commits: [], changedFiles: [], functionallyChangedActors: [], cosmeticallyChangedActors: [] };
155
+ // The branch has no commits of its own yet
156
+ expect(runGetAffectedActors('--base', 'main')).toMatchObject(nothing);
157
+ // A release with nothing new since the last one
158
+ expect(runGetAffectedActors('--since', git('rev-parse', 'HEAD'))).toMatchObject(nothing);
159
+ });
160
+ });
161
+ //# sourceMappingURL=affected-actors-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"affected-actors-cli.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/affected-actors-cli.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { getAffectedActors, toAffectedActorsDocument } from '../../../bin/affected-actors.js';
2
+ import { getAffectedActors } from '../../../bin/affected-actors.js';
3
3
  import * as DiffChanges from '../../../bin/diff-changes.js';
4
4
  import * as Git from '../../../bin/git.js';
5
5
  import * as LoadConfig from '../../../bin/utils/config/load-config.js';
@@ -20,86 +20,95 @@ describe('getAffectedActors', () => {
20
20
  .spyOn(DiffChanges, 'getChangedActors')
21
21
  .mockResolvedValue({ functional: [actorA], cosmetic: [actorB] });
22
22
  vi.spyOn(Git, 'resolveCommitSha').mockResolvedValue(headSha);
23
- vi.spyOn(Git, 'resolveBranchName').mockResolvedValue('feature');
24
23
  vi.spyOn(Git, 'getChangedFilesBetween').mockResolvedValue(changedFiles);
25
24
  vi.spyOn(Git, 'getChangelogAdditions').mockResolvedValue('- Added foo');
26
25
  });
27
26
  it('requires --base or --since', async () => {
28
- const options = { head: 'HEAD', ...selection };
27
+ const options = { ...selection };
29
28
  await expect(getAffectedActors(options)).rejects.toThrow('Pass --base, --since, or both');
30
29
  // An empty --since (e.g. from an empty cache file) counts as not passed
31
30
  await expect(getAffectedActors({ ...options, since: '' })).rejects.toThrow('Pass --base, --since, or both');
32
31
  });
33
32
  describe('with --base', () => {
34
- let getCommitsSpy;
33
+ const mergeBaseSha = 'b'.repeat(40);
34
+ let commitsBetweenSpy;
35
35
  beforeEach(() => {
36
- vi.spyOn(Git, 'hasMergeFromTarget').mockResolvedValue(false);
37
- getCommitsSpy = vi.spyOn(Git, 'getCommits').mockResolvedValue(commits);
36
+ vi.spyOn(Git, 'getMergeBase').mockResolvedValue(mergeBaseSha);
37
+ commitsBetweenSpy = vi.spyOn(Git, 'getCommitsBetween').mockResolvedValue(commits);
38
38
  });
39
- it('inspects the branch commits after --since', async () => {
40
- const result = await getAffectedActors({
41
- head: 'origin/feature',
42
- base: 'origin/master',
43
- since: sinceSha,
44
- ...selection,
45
- });
39
+ it("inspects the branch's own changes, from where it forked from or last merged --base", async () => {
40
+ const findCommitSpy = vi.spyOn(Git, 'findCommitSha');
41
+ const result = await getAffectedActors({ base: 'origin/master', ...selection });
46
42
  expect(result).toStrictEqual({
47
- headSha,
48
- ref: 'feature',
43
+ version: 1,
44
+ head: headSha,
49
45
  commits,
50
46
  changedFiles,
51
47
  changelog: '- Added foo',
52
- functionallyChangedActors: [actorA],
53
- cosmeticallyChangedActors: [actorB],
54
- });
55
- expect(getCommitsSpy).toHaveBeenCalledWith({
56
- sourceBranch: 'origin/feature',
57
- targetBranch: 'origin/master',
58
- baseCommit: sinceSha,
48
+ // Only the names, the config file stays the source of truth for the rest
49
+ functionallyChangedActors: [{ actorFullName: 'owner/a' }],
50
+ cosmeticallyChangedActors: [{ actorFullName: 'owner/b' }],
59
51
  });
60
- // From the parent of the oldest commit to the newest one, for the files and the changelog alike
61
- expect(Git.getChangedFilesBetween).toHaveBeenCalledWith(`${commits[0].sha}~`, commits[1].sha);
62
- expect(Git.getChangelogAdditions).toHaveBeenCalledWith(`${commits[0].sha}~`, commits[1].sha, changedFiles);
52
+ expect(Git.getMergeBase).toHaveBeenCalledWith('origin/master', 'HEAD');
53
+ expect(Git.getChangedFilesBetween).toHaveBeenCalledWith(mergeBaseSha, headSha);
54
+ expect(Git.getChangelogAdditions).toHaveBeenCalledWith(mergeBaseSha, headSha, changedFiles);
55
+ expect(commitsBetweenSpy).toHaveBeenCalledWith(mergeBaseSha, headSha);
63
56
  expect(changedActorsSpy).toHaveBeenCalledWith({
64
57
  filepathsChanged: changedFiles,
65
58
  actorConfigs: [actorA, actorB],
66
- commits,
59
+ range: { fromRef: mergeBaseSha, toRef: headSha },
67
60
  });
61
+ expect(findCommitSpy).not.toHaveBeenCalled();
68
62
  });
69
- describe('when the branch merged --base in', () => {
63
+ describe('and --since', () => {
64
+ const sinceFiles = ['README.md'];
70
65
  beforeEach(() => {
71
- vi.spyOn(Git, 'hasMergeFromTarget').mockResolvedValue(true);
72
- vi.spyOn(Git, 'getBranchOnlyChangedFiles').mockResolvedValue(['own-file']);
66
+ vi.spyOn(Git, 'findCommitSha').mockResolvedValue(sinceSha);
67
+ vi.spyOn(Git, 'getChangedFilesBetween').mockImplementation(async (fromRef) => fromRef === sinceSha ? sinceFiles : changedFiles);
73
68
  });
74
- const getWithOwnChanges = async (own) => {
75
- changedActorsSpy.mockImplementation(async ({ filepathsChanged }) => filepathsChanged[0] === 'own-file' ? own : { functional: [actorA], cosmetic: [actorB] });
76
- return getAffectedActors({ head: 'feature', base: 'master', since: sinceSha, ...selection });
69
+ const getNarrowed = async (branch, sinceValidated) => {
70
+ changedActorsSpy.mockImplementation(async ({ range }) => range.fromRef === sinceSha ? sinceValidated : branch);
71
+ const result = await getAffectedActors({ base: 'origin/master', since: sinceSha, ...selection });
72
+ return {
73
+ functional: result.functionallyChangedActors.map(({ actorFullName }) => actorFullName),
74
+ cosmetic: result.cosmeticallyChangedActors.map(({ actorFullName }) => actorFullName),
75
+ };
77
76
  };
78
- it("classifies the branch's own files against the whole branch, ignoring --since", async () => {
79
- await getWithOwnChanges({ functional: [actorA], cosmetic: [] });
77
+ it('classifies the changes since --since separately', async () => {
78
+ await getNarrowed({ functional: [actorA], cosmetic: [] }, { functional: [actorA], cosmetic: [] });
80
79
  expect(changedActorsSpy).toHaveBeenCalledWith({
81
- filepathsChanged: ['own-file'],
80
+ filepathsChanged: sinceFiles,
82
81
  actorConfigs: [actorA, actorB],
83
- commits,
82
+ range: { fromRef: sinceSha, toRef: headSha },
84
83
  });
85
- expect(getCommitsSpy).toHaveBeenCalledWith({ sourceBranch: 'feature', targetBranch: 'master' });
86
84
  });
87
- it('reports everything when the branch has functional changes of its own', async () => {
88
- const result = await getWithOwnChanges({ functional: [actorA], cosmetic: [] });
89
- expect(result.functionallyChangedActors).toStrictEqual([actorA]);
90
- expect(result.cosmeticallyChangedActors).toStrictEqual([actorB]);
85
+ it('still describes the whole branch', async () => {
86
+ const result = await getAffectedActors({ base: 'origin/master', since: sinceSha, ...selection });
87
+ expect(result.commits).toStrictEqual(commits);
88
+ expect(result.changedFiles).toStrictEqual(changedFiles);
91
89
  });
92
- it('reports only cosmetic Actors when its own changes are only cosmetic', async () => {
93
- const result = await getWithOwnChanges({ functional: [], cosmetic: [actorB] });
94
- expect(result.functionallyChangedActors).toStrictEqual([]);
95
- expect(result.cosmeticallyChangedActors).toStrictEqual([actorB]);
90
+ it('retests an Actor whose validated change meets a new functional change', async () => {
91
+ await expect(getNarrowed({ functional: [actorA], cosmetic: [] }, { functional: [actorA], cosmetic: [] })).resolves.toStrictEqual({ functional: ['owner/a'], cosmetic: [] });
96
92
  });
97
- it('reports nothing when it has no changes of its own', async () => {
98
- const result = await getWithOwnChanges({ functional: [], cosmetic: [] });
99
- expect(result.functionallyChangedActors).toStrictEqual([]);
100
- expect(result.cosmeticallyChangedActors).toStrictEqual([]);
101
- // The range is still reported
102
- expect(result.commits).toStrictEqual(commits);
93
+ it('leaves out Actors that only the branch changed before --since or only --base changed', async () => {
94
+ await expect(getNarrowed({ functional: [actorA], cosmetic: [] }, { functional: [actorB], cosmetic: [] })).resolves.toStrictEqual({ functional: [], cosmetic: [] });
95
+ });
96
+ it('takes the less impactful change when the two disagree', async () => {
97
+ // A validated functional change, then only cosmetic changes (e.g. a README merged in from base)
98
+ await expect(getNarrowed({ functional: [actorA], cosmetic: [] }, { functional: [], cosmetic: [actorA] })).resolves.toStrictEqual({ functional: [], cosmetic: ['owner/a'] });
99
+ // A functional change merged in from base, while the branch only changes the README
100
+ await expect(getNarrowed({ functional: [], cosmetic: [actorA] }, { functional: [actorA], cosmetic: [] })).resolves.toStrictEqual({ functional: [], cosmetic: ['owner/a'] });
101
+ });
102
+ it.each([
103
+ ['is HEAD (a rerun)', headSha],
104
+ ['is not in the local history', undefined],
105
+ ])('checks the whole branch when --since %s', async (_, found) => {
106
+ vi.spyOn(Git, 'findCommitSha').mockResolvedValue(found);
107
+ const result = await getAffectedActors({ base: 'origin/master', since: sinceSha, ...selection });
108
+ expect(result.functionallyChangedActors).toStrictEqual([{ actorFullName: 'owner/a' }]);
109
+ // With no usable validated commit, the "since" diff falls back to the same range as the
110
+ // base diff, so getChangedActors runs twice for identical ranges instead of once.
111
+ expect(changedActorsSpy).toHaveBeenCalledTimes(2);
103
112
  });
104
113
  });
105
114
  });
@@ -110,51 +119,23 @@ describe('getAffectedActors', () => {
110
119
  resolveBaseSpy = vi.spyOn(Git, 'resolveReleaseBaseCommit').mockResolvedValue(sinceSha);
111
120
  commitsBetweenSpy = vi.spyOn(Git, 'getCommitsBetween').mockResolvedValue(commits);
112
121
  });
113
- it('inspects everything after --since up to --head', async () => {
114
- const result = await getAffectedActors({ head: 'release', since: 'HEAD~2', ...selection });
122
+ it('inspects everything after --since up to HEAD', async () => {
123
+ const result = await getAffectedActors({ since: 'HEAD~2', ...selection });
115
124
  expect(result).toStrictEqual({
116
- headSha,
117
- ref: 'feature',
125
+ version: 1,
126
+ head: headSha,
118
127
  commits,
119
128
  changedFiles,
120
129
  changelog: '- Added foo',
121
- functionallyChangedActors: [actorA],
122
- cosmeticallyChangedActors: [actorB],
130
+ // Only the names, the config file stays the source of truth for the rest
131
+ functionallyChangedActors: [{ actorFullName: 'owner/a' }],
132
+ cosmeticallyChangedActors: [{ actorFullName: 'owner/b' }],
123
133
  });
124
- expect(resolveBaseSpy).toHaveBeenCalledWith('HEAD~2', 'release');
134
+ expect(resolveBaseSpy).toHaveBeenCalledWith('HEAD~2');
125
135
  expect(commitsBetweenSpy).toHaveBeenCalledWith(sinceSha, headSha);
126
136
  expect(Git.getChangedFilesBetween).toHaveBeenCalledWith(sinceSha, headSha);
127
137
  expect(Git.getChangelogAdditions).toHaveBeenCalledWith(sinceSha, headSha, changedFiles);
128
138
  });
129
- it('has no commits when head is the --since commit', async () => {
130
- resolveBaseSpy.mockResolvedValue(headSha);
131
- const result = await getAffectedActors({ head: 'HEAD', since: headSha, ...selection });
132
- expect(result.commits).toStrictEqual([]);
133
- // Empty `git log x..x` output doesn't parse as a commit, so it's never run
134
- expect(commitsBetweenSpy).not.toHaveBeenCalled();
135
- });
136
- });
137
- });
138
- describe('toAffectedActorsDocument', () => {
139
- it('keeps only the Actor names, the config file stays the source of truth for the rest', () => {
140
- expect(toAffectedActorsDocument({
141
- headSha,
142
- ref: null,
143
- commits,
144
- changedFiles: ['src/main.ts'],
145
- changelog: null,
146
- functionallyChangedActors: [actorA],
147
- cosmeticallyChangedActors: [actorB],
148
- })).toStrictEqual({
149
- version: 1,
150
- ref: null,
151
- head: headSha,
152
- commits,
153
- changedFiles: ['src/main.ts'],
154
- changelog: null,
155
- functionallyChangedActors: [{ actorFullName: 'owner/a' }],
156
- cosmeticallyChangedActors: [{ actorFullName: 'owner/b' }],
157
- });
158
139
  });
159
140
  });
160
141
  //# sourceMappingURL=affected-actors.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"affected-actors.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/affected-actors.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"affected-actors.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/affected-actors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=build-cli.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-cli.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/bin/build-cli.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import process from 'node:process';
3
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
4
+ import { compileCli } from './compiled-cli.js';
5
+ let cliPath;
6
+ let cleanup;
7
+ const run = (command, input, env = process.env) => spawnSync(cliPath, command, { encoding: 'utf8', input, stdio: ['pipe', 'pipe', 'pipe'], env });
8
+ const runBuild = (input, args = ['--version-number', '0.99']) => run(['build', ...args], input);
9
+ describe('build and notify-release CLI', () => {
10
+ beforeAll(async () => {
11
+ ({ cliPath, cleanup } = await compileCli());
12
+ });
13
+ afterAll(async () => {
14
+ await cleanup?.();
15
+ });
16
+ it('builds nothing for an empty list and prints an empty build list', () => {
17
+ const result = runBuild('{"actors":[]}');
18
+ expect(result.status, result.stderr).toBe(0);
19
+ expect(JSON.parse(result.stdout)).toStrictEqual([]);
20
+ });
21
+ it('fails on empty stdin instead of building nothing', () => {
22
+ const result = runBuild('');
23
+ expect(result.status).toBe(1);
24
+ expect(result.stderr).toContain('Expected the Actors to build as JSON on stdin, got nothing');
25
+ expect(result.stdout).toBe('');
26
+ });
27
+ it('rejects a malformed --version-number', () => {
28
+ const result = runBuild('{"actors":[]}', ['--version-number', 'latest']);
29
+ expect(result.status).toBe(1);
30
+ expect(result.stderr).toContain('--version-number must look like 0.1 or be "default"');
31
+ });
32
+ it('requires --version-number', () => {
33
+ const result = runBuild('{"actors":[]}', []);
34
+ expect(result.status).toBe(1);
35
+ expect(result.stderr).toContain('Missing required argument: version-number');
36
+ });
37
+ it('notify-release announces nothing when there are no new commits', () => {
38
+ const document = { commits: [], changedFiles: [], changelog: null, functionallyChangedActors: [] };
39
+ const result = run(['notify-release'], JSON.stringify(document));
40
+ expect(result.status, result.stderr).toBe(0);
41
+ expect(result.stderr).toContain('No new commits, so there is no release to announce');
42
+ });
43
+ });
44
+ //# sourceMappingURL=build-cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-cli.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/build-cli.test.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,9 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { ActorSourceType, ApifyClient } from 'apify-client';
5
5
  import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
6
- import { assertRepoUrlMatchesDefaultVersion, deleteOldBuilds, resolveDefaultVersion, runBuilds, } from '../../../bin/build.js';
6
+ import { ApifyBuilder, assertRepoUrlMatchesDefaultVersion, buildActors, deleteOldBuilds, resolveDefaultVersion, runBuilds, } from '../../../bin/build.js';
7
+ import * as Git from '../../../bin/git.js';
8
+ import { logger } from '../../../bin/logger.js';
7
9
  import { ExistingDir, ExistingFile, RelativeDir } from '../../../bin/utils/path/repo-relative.js';
8
10
  // Only the client is faked, so the tests exercise the real builder code against a stubbed API
9
11
  vi.mock('apify-client', async (importOriginal) => {
@@ -52,6 +54,62 @@ describe('assertRepoUrlMatchesDefaultVersion', () => {
52
54
  expect(() => assertRepoUrlMatchesDefaultVersion(ACTOR, undefined, REPO_URL)).toThrow('no longer exists');
53
55
  });
54
56
  });
57
+ describe('runBuilds version number', () => {
58
+ // Only the name and folder of the Actor matter here, the builder is stubbed
59
+ const actorConfig = { actorFullName: ACTOR, folder: { isRoot: () => true } };
60
+ // Restored after each test, so the stub never reaches the tests that run the real builder
61
+ afterEach(() => {
62
+ vi.mocked(ApifyBuilder.fromActorConfig).mockRestore();
63
+ });
64
+ const dryRunBuild = async (versionNumber, actorInfo = makeActorInfo()) => {
65
+ vi.spyOn(ApifyBuilder, 'fromActorConfig').mockReturnValue({
66
+ getActorInfo: async () => actorInfo,
67
+ });
68
+ const result = await runBuilds({
69
+ actorConfigs: [actorConfig],
70
+ versionNumber,
71
+ repoUrl: REPO_URL,
72
+ shouldVerifyRepoUrl: false,
73
+ branch: 'master',
74
+ dryRun: true,
75
+ });
76
+ if (Array.isArray(result))
77
+ throw new Error('A dry run must return a plan, not builds');
78
+ return result.builds[0].versionNumber;
79
+ };
80
+ it('builds the version it is given', async () => {
81
+ await expect(dryRunBuild('0.99')).resolves.toBe('0.99');
82
+ });
83
+ it("resolves default to the version the Actor's default build tag points to", async () => {
84
+ await expect(dryRunBuild('default')).resolves.toBe('0.1');
85
+ });
86
+ it('warns when the default version does not give its builds the default build tag', async () => {
87
+ const warnSpy = vi.spyOn(logger, 'warn').mockImplementation(() => undefined);
88
+ await dryRunBuild('default');
89
+ // The fixture's version 0.1 has no build tag of its own
90
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('users keep running the previous build'));
91
+ });
92
+ it('does not warn when the default version gives its builds the default build tag', async () => {
93
+ const warnSpy = vi.spyOn(logger, 'warn').mockImplementation(() => undefined);
94
+ const versions = [{ versionNumber: '0.1', buildTag: 'latest', sourceType: ActorSourceType.GitRepo }];
95
+ await dryRunBuild('default', makeActorInfo({ versions }));
96
+ expect(warnSpy).not.toHaveBeenCalled();
97
+ });
98
+ });
99
+ describe('buildActors', () => {
100
+ it('builds nothing and needs no branch or repository when there are no Actors', async () => {
101
+ const branchSpy = vi.spyOn(Git, 'getCurrentBranch');
102
+ const repoSpy = vi.spyOn(Git, 'resolveRepoUrl');
103
+ await expect(buildActors({ actorConfigs: [], versionNumber: '0.99', dryRun: false })).resolves.toStrictEqual([]);
104
+ // A dry run keeps the dry-run shape even with nothing to build
105
+ await expect(buildActors({ actorConfigs: [], versionNumber: '0.99', dryRun: true })).resolves.toStrictEqual({
106
+ dryRun: true,
107
+ builds: [],
108
+ });
109
+ expect(branchSpy).not.toHaveBeenCalled();
110
+ expect(repoSpy).not.toHaveBeenCalled();
111
+ });
112
+ });
55
113
  describe('dry run', () => {
56
114
  const TOKEN_ENV_VAR = 'APIFY_TOKEN_OWNER';
57
115
  const originalCwd = process.cwd();
@@ -112,7 +170,7 @@ describe('dry run', () => {
112
170
  shouldVerifyRepoUrl: true,
113
171
  branch: 'feature',
114
172
  dryRun: true,
115
- useDockerCache: false,
173
+ versionNumber: '0.99',
116
174
  });
117
175
  it('should return a build plan without creating versions or builds', async () => {
118
176
  expect(await runDryBuilds()).toEqual({
@@ -122,7 +180,6 @@ describe('dry run', () => {
122
180
  actorFullName: ACTOR,
123
181
  versionNumber: '0.99',
124
182
  gitRepoUrl: `${REPO_URL}#feature:actors/a`,
125
- useDockerCache: false,
126
183
  },
127
184
  ],
128
185
  });
@@ -140,7 +197,7 @@ describe('dry run', () => {
140
197
  shouldVerifyRepoUrl: true,
141
198
  branch: 'feature',
142
199
  dryRun: true,
143
- useDockerCache: false,
200
+ versionNumber: '0.99',
144
201
  })).rejects.toThrow('Repository mismatch');
145
202
  });
146
203
  it('should not delete old builds', async () => {