apify-test-tools 0.8.6 → 0.9.0-beta.0

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 (79) hide show
  1. package/README.md +83 -13
  2. package/bin/build-from-local.ts +35 -34
  3. package/bin/build.ts +55 -59
  4. package/bin/diff-changes.ts +166 -125
  5. package/bin/dockerignore.ts +50 -0
  6. package/bin/main.ts +7 -7
  7. package/bin/path-utils.ts +13 -0
  8. package/bin/test-report.ts +5 -5
  9. package/bin/types.ts +17 -5
  10. package/bin/utils.ts +124 -95
  11. package/dist/bin/build-from-local.d.ts +2 -2
  12. package/dist/bin/build-from-local.d.ts.map +1 -1
  13. package/dist/bin/build-from-local.js +33 -28
  14. package/dist/bin/build-from-local.js.map +1 -1
  15. package/dist/bin/build.d.ts +5 -8
  16. package/dist/bin/build.d.ts.map +1 -1
  17. package/dist/bin/build.js +49 -56
  18. package/dist/bin/build.js.map +1 -1
  19. package/dist/bin/diff-changes.d.ts +0 -6
  20. package/dist/bin/diff-changes.d.ts.map +1 -1
  21. package/dist/bin/diff-changes.js +129 -89
  22. package/dist/bin/diff-changes.js.map +1 -1
  23. package/dist/bin/dockerignore.d.ts +17 -0
  24. package/dist/bin/dockerignore.d.ts.map +1 -0
  25. package/dist/bin/dockerignore.js +41 -0
  26. package/dist/bin/dockerignore.js.map +1 -0
  27. package/dist/bin/main.js +7 -7
  28. package/dist/bin/main.js.map +1 -1
  29. package/dist/bin/path-utils.d.ts +4 -0
  30. package/dist/bin/path-utils.d.ts.map +1 -0
  31. package/dist/bin/path-utils.js +9 -0
  32. package/dist/bin/path-utils.js.map +1 -0
  33. package/dist/bin/test-report.js +3 -3
  34. package/dist/bin/test-report.js.map +1 -1
  35. package/dist/bin/types.d.ts +15 -4
  36. package/dist/bin/types.d.ts.map +1 -1
  37. package/dist/bin/utils.d.ts +2 -19
  38. package/dist/bin/utils.d.ts.map +1 -1
  39. package/dist/bin/utils.js +82 -81
  40. package/dist/bin/utils.js.map +1 -1
  41. package/dist/lib/lib.d.ts +10 -4
  42. package/dist/lib/lib.d.ts.map +1 -1
  43. package/dist/lib/lib.js +28 -22
  44. package/dist/lib/lib.js.map +1 -1
  45. package/dist/lib/types.d.ts +2 -2
  46. package/dist/lib/types.d.ts.map +1 -1
  47. package/dist/lib/utils.d.ts +1 -1
  48. package/dist/lib/utils.d.ts.map +1 -1
  49. package/dist/lib/utils.js +4 -4
  50. package/dist/lib/utils.js.map +1 -1
  51. package/dist/test/unit/bin/build-from-local.test.js +55 -86
  52. package/dist/test/unit/bin/build-from-local.test.js.map +1 -1
  53. package/dist/test/unit/bin/diff-changes.test.js +358 -36
  54. package/dist/test/unit/bin/diff-changes.test.js.map +1 -1
  55. package/dist/test/unit/bin/dockerignore.test.d.ts +2 -0
  56. package/dist/test/unit/bin/dockerignore.test.d.ts.map +1 -0
  57. package/dist/test/unit/bin/dockerignore.test.js +102 -0
  58. package/dist/test/unit/bin/dockerignore.test.js.map +1 -0
  59. package/dist/test/unit/bin/path-utils.test.d.ts +2 -0
  60. package/dist/test/unit/bin/path-utils.test.d.ts.map +1 -0
  61. package/dist/test/unit/bin/path-utils.test.js +14 -0
  62. package/dist/test/unit/bin/path-utils.test.js.map +1 -0
  63. package/dist/test/unit/bin/utils.test.d.ts +2 -0
  64. package/dist/test/unit/bin/utils.test.d.ts.map +1 -0
  65. package/dist/test/unit/bin/utils.test.js +292 -0
  66. package/dist/test/unit/bin/utils.test.js.map +1 -0
  67. package/dist/test/unit/should-built-and-test.test.js +83 -32
  68. package/dist/test/unit/should-built-and-test.test.js.map +1 -1
  69. package/dist/tsconfig.tsbuildinfo +1 -1
  70. package/lib/lib.ts +28 -22
  71. package/lib/types.ts +2 -2
  72. package/lib/utils.ts +4 -4
  73. package/package.json +62 -61
  74. package/test/unit/bin/build-from-local.test.ts +62 -121
  75. package/test/unit/bin/diff-changes.test.ts +397 -41
  76. package/test/unit/bin/dockerignore.test.ts +123 -0
  77. package/test/unit/bin/path-utils.test.ts +17 -0
  78. package/test/unit/bin/utils.test.ts +342 -0
  79. package/test/unit/should-built-and-test.test.ts +89 -32
@@ -1,37 +1,30 @@
1
1
  import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { getChangedActors, maybeParseActorFolder } from '../../../bin/diff-changes.js';
2
+ import { getChangedActors } from '../../../bin/diff-changes.js';
3
3
  import * as DiffJsonSchema from '../../../bin/diff-json-schema.js';
4
- const miniActor = { actorName: 'foo/bar', folder: 'actors/foo_bar', isStandalone: false };
4
+ import * as Dockerignore from '../../../bin/dockerignore.js';
5
+ const miniActor = {
6
+ actorFullName: 'foo/bar',
7
+ folder: 'actors/foo_bar',
8
+ tokenEnvVar: 'APIFY_TOKEN_FOO',
9
+ dockerContextDir: '',
10
+ contextPaths: [''],
11
+ };
5
12
  const standaloneActor = {
6
- actorName: 'standalone',
13
+ actorFullName: 'owner/standalone',
7
14
  folder: 'standalone-actors/standalone',
8
- isStandalone: true,
15
+ tokenEnvVar: 'APIFY_TOKEN_OWNER',
16
+ dockerContextDir: 'standalone-actors/standalone',
17
+ contextPaths: ['standalone-actors/standalone'],
9
18
  };
10
19
  const actorConfigs = [miniActor, standaloneActor];
20
+ const amazonActor = {
21
+ actorFullName: 'junglee/amazon-crawler',
22
+ folder: 'actors/junglee_Amazon-crawler',
23
+ tokenEnvVar: 'APIFY_TOKEN_JUNGLEE',
24
+ dockerContextDir: '',
25
+ contextPaths: ['actors/junglee_Amazon-crawler', 'code', 'shared'],
26
+ };
11
27
  const commits = [{ sha: 'Commit1', author: '', date: '', message: '' }];
12
- describe('maybeParseActorFolder', () => {
13
- it('returns actorName for actors/ path', () => {
14
- expect(maybeParseActorFolder('actors/foo_bar/actor.json')).toEqual({
15
- isActorFolder: true,
16
- actorName: 'foo/bar',
17
- });
18
- });
19
- it('returns actorName for standalone-actors/ path', () => {
20
- expect(maybeParseActorFolder('standalone-actors/my_actor/main.ts')).toEqual({
21
- isActorFolder: true,
22
- actorName: 'my/actor',
23
- });
24
- });
25
- it('returns false for top-level file', () => {
26
- expect(maybeParseActorFolder('package.json')).toEqual({ isActorFolder: false });
27
- });
28
- it('returns false for path with no file inside actor folder', () => {
29
- expect(maybeParseActorFolder('actors/foo_bar')).toEqual({ isActorFolder: false });
30
- });
31
- it('returns false for unrelated folder', () => {
32
- expect(maybeParseActorFolder('src/utils.ts')).toEqual({ isActorFolder: false });
33
- });
34
- });
35
28
  describe('getChangedActors', () => {
36
29
  beforeEach(() => {
37
30
  vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(false);
@@ -76,7 +69,7 @@ describe('getChangedActors', () => {
76
69
  it('returns actor when isLatest and JSON file has only cosmetic changes', () => {
77
70
  vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(true);
78
71
  const result = getChangedActors({
79
- filepathsChanged: ['actors/foo_bar/actor.json'],
72
+ filepathsChanged: ['actors/foo_bar/.actor/actor.json'],
80
73
  actorConfigs,
81
74
  commits,
82
75
  isLatest: true,
@@ -86,7 +79,7 @@ describe('getChangedActors', () => {
86
79
  it('does not return actor when not isLatest and JSON file has only cosmetic changes', () => {
87
80
  vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(true);
88
81
  const result = getChangedActors({
89
- filepathsChanged: ['actors/foo_bar/actor.json'],
82
+ filepathsChanged: ['actors/foo_bar/.actor/actor.json'],
90
83
  actorConfigs,
91
84
  commits,
92
85
  isLatest: false,
@@ -96,13 +89,34 @@ describe('getChangedActors', () => {
96
89
  it('returns actor when JSON file has functional changes', () => {
97
90
  vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(false);
98
91
  const result = getChangedActors({
99
- filepathsChanged: ['actors/foo_bar/actor.json'],
92
+ filepathsChanged: ['actors/foo_bar/.actor/actor.json'],
100
93
  actorConfigs,
101
94
  commits,
102
95
  });
103
96
  expect(result).toEqual([miniActor]);
104
97
  });
105
- it('returns all non-standalone actors when a non-actor-folder functional file changes', () => {
98
+ it('JSON file in actor folder but outside .actor/ is functional, not checked for cosmetic', () => {
99
+ vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(true);
100
+ const result = getChangedActors({
101
+ filepathsChanged: ['actors/foo_bar/package.json'],
102
+ actorConfigs,
103
+ commits,
104
+ isLatest: false,
105
+ });
106
+ expect(result).toEqual([miniActor]);
107
+ expect(DiffJsonSchema.isCosmeticOnlyJsonSchemaChange).not.toHaveBeenCalled();
108
+ });
109
+ it('JSON file under .actor/ inside actor folder is checked for cosmetic changes', () => {
110
+ vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(true);
111
+ const result = getChangedActors({
112
+ filepathsChanged: ['actors/foo_bar/.actor/input_schema.json'],
113
+ actorConfigs,
114
+ commits,
115
+ isLatest: true,
116
+ });
117
+ expect(result).toEqual([miniActor]);
118
+ });
119
+ it('does not trigger narrow-context actor when shared file changes', () => {
106
120
  const result = getChangedActors({
107
121
  filepathsChanged: ['shared/utils.ts'],
108
122
  actorConfigs,
@@ -111,17 +125,26 @@ describe('getChangedActors', () => {
111
125
  expect(result).toContainEqual(miniActor);
112
126
  expect(result).not.toContainEqual(standaloneActor);
113
127
  });
114
- it('does not include standalone actor in all-actors expansion from changelog', () => {
128
+ it('root-level changelog outside any actor folder is cosmetic for every actor when isLatest', () => {
115
129
  const result = getChangedActors({
116
130
  filepathsChanged: ['CHANGELOG.md'],
117
131
  actorConfigs,
118
132
  commits,
119
133
  isLatest: true,
120
134
  });
121
- expect(result).toContainEqual(miniActor);
122
- expect(result).not.toContainEqual(standaloneActor);
135
+ expect(result).toEqual(expect.arrayContaining([miniActor, standaloneActor]));
136
+ expect(result).toHaveLength(2);
123
137
  });
124
- it('includes standalone actor when its own folder changes', () => {
138
+ it('root-level changelog is not cosmetic-triggered when not isLatest', () => {
139
+ const result = getChangedActors({
140
+ filepathsChanged: ['CHANGELOG.md'],
141
+ actorConfigs,
142
+ commits,
143
+ isLatest: false,
144
+ });
145
+ expect(result).toEqual([]);
146
+ });
147
+ it('triggers narrow-context actor when its own folder changes', () => {
125
148
  const result = getChangedActors({
126
149
  filepathsChanged: ['standalone-actors/standalone/src/main.ts'],
127
150
  actorConfigs,
@@ -138,7 +161,7 @@ describe('getChangedActors', () => {
138
161
  expect(result).toHaveLength(1);
139
162
  expect(result).toContainEqual(miniActor);
140
163
  });
141
- it('handles mixed changes: returns both mini and standalone actors', () => {
164
+ it('handles mixed changes: returns both broad and narrow-context actors', () => {
142
165
  const result = getChangedActors({
143
166
  filepathsChanged: ['actors/foo_bar/src/main.ts', 'standalone-actors/standalone/Dockerfile'],
144
167
  actorConfigs,
@@ -147,6 +170,44 @@ describe('getChangedActors', () => {
147
170
  expect(result).toContainEqual(miniActor);
148
171
  expect(result).toContainEqual(standaloneActor);
149
172
  });
173
+ it('matches folder where folder name differs from actor name', () => {
174
+ const ownerlessActor = {
175
+ actorFullName: 'myteam/shopify-scraper',
176
+ folder: 'actors/shopify',
177
+ tokenEnvVar: 'APIFY_TOKEN_MYTEAM',
178
+ dockerContextDir: '',
179
+ contextPaths: [''],
180
+ };
181
+ const result = getChangedActors({
182
+ filepathsChanged: ['actors/shopify/src/main.ts'],
183
+ actorConfigs: [ownerlessActor],
184
+ commits,
185
+ });
186
+ expect(result).toEqual([ownerlessActor]);
187
+ });
188
+ it('in single-actor repo, .actor/ changes trigger builds', () => {
189
+ const rootActor = {
190
+ actorFullName: 'myteam/my-actor',
191
+ folder: '',
192
+ tokenEnvVar: 'BUILDER_APIFY_TOKEN',
193
+ dockerContextDir: '',
194
+ contextPaths: [''],
195
+ };
196
+ const result = getChangedActors({
197
+ filepathsChanged: ['.actor/actor.json'],
198
+ actorConfigs: [rootActor],
199
+ commits,
200
+ });
201
+ expect(result).toEqual([rootActor]);
202
+ });
203
+ it('in multi-actor repo, .actor/ changes only trigger broad-context actors', () => {
204
+ const result = getChangedActors({
205
+ filepathsChanged: ['.actor/actor.json'],
206
+ actorConfigs,
207
+ commits,
208
+ });
209
+ expect(result).toEqual([miniActor]);
210
+ });
150
211
  it('file paths are matched case-insensitively', () => {
151
212
  const result = getChangedActors({
152
213
  filepathsChanged: ['Actors/FOO_BAR/Main.ts'],
@@ -155,5 +216,266 @@ describe('getChangedActors', () => {
155
216
  });
156
217
  expect(result).toEqual([miniActor]);
157
218
  });
219
+ it('triggers actor with contextPaths override when file matches an override path', () => {
220
+ const overrideActor = {
221
+ actorFullName: 'team/override-actor',
222
+ folder: 'actors/override',
223
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
224
+ dockerContextDir: 'actors/override',
225
+ contextPaths: ['actors/override', 'packages'],
226
+ };
227
+ const result = getChangedActors({
228
+ filepathsChanged: ['packages/shared/utils.ts'],
229
+ actorConfigs: [overrideActor],
230
+ commits,
231
+ });
232
+ expect(result).toEqual([overrideActor]);
233
+ });
234
+ it('does not trigger actor with contextPaths override when file is outside all override paths', () => {
235
+ const overrideActor = {
236
+ actorFullName: 'team/override-actor',
237
+ folder: 'actors/override',
238
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
239
+ dockerContextDir: 'actors/override',
240
+ contextPaths: ['actors/override', 'packages'],
241
+ };
242
+ const result = getChangedActors({
243
+ filepathsChanged: ['other-dir/file.ts'],
244
+ actorConfigs: [overrideActor],
245
+ commits,
246
+ });
247
+ expect(result).toEqual([]);
248
+ });
249
+ it('broad-context actor skips files in sibling actor folders', () => {
250
+ const actorA = {
251
+ actorFullName: 'team/actor-a',
252
+ folder: 'actors/a',
253
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
254
+ dockerContextDir: '',
255
+ contextPaths: [''],
256
+ };
257
+ const actorB = {
258
+ actorFullName: 'team/actor-b',
259
+ folder: 'actors/b',
260
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
261
+ dockerContextDir: '',
262
+ contextPaths: [''],
263
+ };
264
+ const result = getChangedActors({
265
+ filepathsChanged: ['actors/b/src/main.ts'],
266
+ actorConfigs: [actorA, actorB],
267
+ commits,
268
+ });
269
+ expect(result).toEqual([actorB]);
270
+ });
271
+ it('root actor (folder="") is excluded from sibling actor folder files', () => {
272
+ const rootActor = {
273
+ actorFullName: 'team/root',
274
+ folder: '',
275
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
276
+ dockerContextDir: '',
277
+ contextPaths: [''],
278
+ };
279
+ const childActor = {
280
+ actorFullName: 'team/child',
281
+ folder: 'actors/child',
282
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
283
+ dockerContextDir: 'actors/child',
284
+ contextPaths: ['actors/child'],
285
+ };
286
+ const result = getChangedActors({
287
+ filepathsChanged: ['actors/child/src/main.ts'],
288
+ actorConfigs: [rootActor, childActor],
289
+ commits,
290
+ });
291
+ expect(result).not.toContainEqual(rootActor);
292
+ expect(result).toContainEqual(childActor);
293
+ });
294
+ it('root actor (folder="") sees files outside any actor folder', () => {
295
+ const rootActor = {
296
+ actorFullName: 'team/root',
297
+ folder: '',
298
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
299
+ dockerContextDir: '',
300
+ contextPaths: [''],
301
+ };
302
+ const childActor = {
303
+ actorFullName: 'team/child',
304
+ folder: 'actors/child',
305
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
306
+ dockerContextDir: 'actors/child',
307
+ contextPaths: ['actors/child'],
308
+ };
309
+ const result = getChangedActors({
310
+ filepathsChanged: ['lib/shared-utils.ts'],
311
+ actorConfigs: [rootActor, childActor],
312
+ commits,
313
+ });
314
+ expect(result).toContainEqual(rootActor);
315
+ expect(result).not.toContainEqual(childActor);
316
+ });
317
+ it('file matched by .dockerignore is treated as ignored', () => {
318
+ vi.spyOn(Dockerignore, 'loadDockerIgnore').mockReturnValue((filePath) => filePath === 'actors/foo_bar/node_modules/foo.js');
319
+ const result = getChangedActors({
320
+ filepathsChanged: ['actors/foo_bar/node_modules/foo.js'],
321
+ actorConfigs: [miniActor],
322
+ commits,
323
+ });
324
+ expect(result).toEqual([]);
325
+ });
326
+ it('file not matched by .dockerignore is classified normally', () => {
327
+ vi.spyOn(Dockerignore, 'loadDockerIgnore').mockReturnValue((filePath) => filePath.includes('node_modules'));
328
+ const result = getChangedActors({
329
+ filepathsChanged: ['actors/foo_bar/src/main.ts'],
330
+ actorConfigs: [miniActor],
331
+ commits,
332
+ });
333
+ expect(result).toEqual([miniActor]);
334
+ });
335
+ it('JSON file in context but outside actor folder is functional (not checked for cosmetic)', () => {
336
+ vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(true);
337
+ const result = getChangedActors({
338
+ filepathsChanged: ['lib/config.json'],
339
+ actorConfigs: [miniActor],
340
+ commits,
341
+ });
342
+ expect(result).toEqual([miniActor]);
343
+ });
344
+ it('README outside actor folder but inside context is ignored (not cosmetic)', () => {
345
+ const result = getChangedActors({
346
+ filepathsChanged: ['docs/README.md'],
347
+ actorConfigs: [miniActor],
348
+ commits,
349
+ isLatest: true,
350
+ });
351
+ expect(result).toEqual([]);
352
+ });
353
+ it('README inside actor folder is cosmetic', () => {
354
+ const result = getChangedActors({
355
+ filepathsChanged: ['actors/foo_bar/README.md'],
356
+ actorConfigs: [miniActor],
357
+ commits,
358
+ isLatest: true,
359
+ });
360
+ expect(result).toEqual([miniActor]);
361
+ });
362
+ it('hoists a standalone actor own top-level dev file relative to its context before checking the ignore list', () => {
363
+ const result = getChangedActors({
364
+ filepathsChanged: ['standalone-actors/standalone/.eslintrc'],
365
+ actorConfigs,
366
+ commits,
367
+ });
368
+ expect(result).toEqual([]);
369
+ });
370
+ it('does not special-case code/ and shared/ prefixes anymore — must be declared via overrideActorContext', () => {
371
+ const result = getChangedActors({
372
+ filepathsChanged: ['code/.eslintrc'],
373
+ actorConfigs: [miniActor],
374
+ commits,
375
+ });
376
+ expect(result).toEqual([miniActor]);
377
+ });
378
+ it('ignores code/.eslintrc when "code" is declared via overrideActorContext', () => {
379
+ const result = getChangedActors({
380
+ filepathsChanged: ['code/.eslintrc'],
381
+ actorConfigs: [amazonActor],
382
+ commits,
383
+ });
384
+ expect(result).toEqual([]);
385
+ });
386
+ it('shared/Dockerfile declared via overrideActorContext is functional', () => {
387
+ const result = getChangedActors({
388
+ filepathsChanged: ['shared/Dockerfile'],
389
+ actorConfigs: [amazonActor],
390
+ commits,
391
+ });
392
+ expect(result).toEqual([amazonActor]);
393
+ });
394
+ it('code/README.md declared via overrideActorContext is ignored (outside actor folder)', () => {
395
+ const result = getChangedActors({
396
+ filepathsChanged: ['code/README.md'],
397
+ actorConfigs: [amazonActor],
398
+ commits,
399
+ isLatest: true,
400
+ });
401
+ expect(result).toEqual([]);
402
+ });
403
+ });
404
+ describe('getChangedActors logging', () => {
405
+ beforeEach(() => {
406
+ vi.spyOn(DiffJsonSchema, 'isCosmeticOnlyJsonSchemaChange').mockReturnValue(false);
407
+ vi.spyOn(console, 'error').mockImplementation(() => undefined);
408
+ });
409
+ it('logs a single "specific" group for a single actor with one functional file', () => {
410
+ getChangedActors({
411
+ filepathsChanged: ['actors/foo_bar/src/main.ts'],
412
+ actorConfigs: [miniActor],
413
+ commits,
414
+ });
415
+ expect(console.error).toHaveBeenCalledWith('[DIFF]: Changes specific to actor foo/bar: actors/foo_bar/src/main.ts');
416
+ expect(console.error).toHaveBeenCalledWith('[DIFF]: Actors to be built and tested: foo/bar');
417
+ });
418
+ it('logs a single "shared" group when two actors are triggered by the exact same file', () => {
419
+ const actorA = {
420
+ actorFullName: 'team/actor-a',
421
+ folder: 'actors/a',
422
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
423
+ dockerContextDir: '',
424
+ contextPaths: ['', 'shared'],
425
+ };
426
+ const actorB = {
427
+ actorFullName: 'team/actor-b',
428
+ folder: 'actors/b',
429
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
430
+ dockerContextDir: '',
431
+ contextPaths: ['', 'shared'],
432
+ };
433
+ getChangedActors({
434
+ filepathsChanged: ['shared/shared.ts'],
435
+ actorConfigs: [actorA, actorB],
436
+ commits,
437
+ });
438
+ expect(console.error).toHaveBeenCalledWith('[DIFF]: Shared changes for actors team/actor-a, team/actor-b: shared/shared.ts');
439
+ expect(console.error).not.toHaveBeenCalledWith(expect.stringContaining('Changes specific to actor'));
440
+ expect(console.error).toHaveBeenCalledWith('[DIFF]: Actors to be built and tested: team/actor-a, team/actor-b');
441
+ });
442
+ it('logs shared and specific groups in descending-size order for partial overlap across actors', () => {
443
+ const actorA = {
444
+ actorFullName: 'team/actor-a',
445
+ folder: 'actors/a',
446
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
447
+ dockerContextDir: '',
448
+ contextPaths: [''],
449
+ };
450
+ const actorB = {
451
+ actorFullName: 'team/actor-b',
452
+ folder: 'actors/b',
453
+ tokenEnvVar: 'APIFY_TOKEN_TEAM',
454
+ dockerContextDir: '',
455
+ contextPaths: [''],
456
+ };
457
+ getChangedActors({
458
+ filepathsChanged: ['shared.ts', 'actors/a/a-only.ts', 'actors/b/b-only.ts'],
459
+ actorConfigs: [actorA, actorB],
460
+ commits,
461
+ });
462
+ const errorCalls = console.error.mock.calls.map((call) => call[0]);
463
+ expect(errorCalls).toEqual([
464
+ '[DIFF]: Shared changes for actors team/actor-a, team/actor-b: shared.ts',
465
+ '[DIFF]: Changes specific to actor team/actor-a: actors/a/a-only.ts',
466
+ '[DIFF]: Changes specific to actor team/actor-b: actors/b/b-only.ts',
467
+ '[DIFF]: Actors to be built and tested: team/actor-a, team/actor-b',
468
+ ]);
469
+ });
470
+ it('logs no group lines when zero actors changed', () => {
471
+ getChangedActors({
472
+ filepathsChanged: ['.gitignore', 'README.md'],
473
+ actorConfigs,
474
+ commits,
475
+ });
476
+ expect(console.error).not.toHaveBeenCalledWith(expect.stringContaining('Shared changes'));
477
+ expect(console.error).not.toHaveBeenCalledWith(expect.stringContaining('Changes specific to'));
478
+ expect(console.error).toHaveBeenCalledWith('[DIFF]: No relevant files changed, skipping builds and tests');
479
+ });
158
480
  });
159
481
  //# sourceMappingURL=diff-changes.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff-changes.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/diff-changes.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff-changes.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/diff-changes.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dockerignore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerignore.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/bin/dockerignore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import path from 'node:path';
2
+ import { afterEach, describe, expect, it, vi } from 'vitest';
3
+ import { buildDockerIgnoreMatcher, loadDockerIgnore } from '../../../bin/dockerignore.js';
4
+ const { fsMock } = vi.hoisted(() => ({
5
+ fsMock: {
6
+ readFileSync: vi.fn(),
7
+ },
8
+ }));
9
+ vi.mock('node:fs', () => ({ default: fsMock }));
10
+ afterEach(() => vi.restoreAllMocks());
11
+ describe('loadDockerIgnore', () => {
12
+ it('returns no-op matcher when .dockerignore is absent', () => {
13
+ fsMock.readFileSync.mockImplementation(() => {
14
+ throw new Error('ENOENT');
15
+ });
16
+ const matcher = loadDockerIgnore('actors/my-actor');
17
+ expect(matcher('actors/my-actor/src/main.ts')).toBe(false);
18
+ expect(matcher('actors/my-actor/node_modules/foo.js')).toBe(false);
19
+ });
20
+ it('matches files listed in .dockerignore', () => {
21
+ fsMock.readFileSync.mockReturnValue('node_modules\n*.log\n');
22
+ const matcher = loadDockerIgnore('');
23
+ expect(matcher('node_modules/foo/bar.js')).toBe(true);
24
+ expect(matcher('debug.log')).toBe(true);
25
+ });
26
+ it('does not match files not in .dockerignore', () => {
27
+ fsMock.readFileSync.mockReturnValue('node_modules\n');
28
+ const matcher = loadDockerIgnore('');
29
+ expect(matcher('src/main.ts')).toBe(false);
30
+ });
31
+ it.each(['dist', 'dist/'])('handles directory pattern "%s"', (pattern) => {
32
+ fsMock.readFileSync.mockReturnValue(`${pattern}\n`);
33
+ const matcher = loadDockerIgnore('');
34
+ expect(matcher('dist/bundle.js')).toBe(true);
35
+ expect(matcher('src/dist-utils.ts')).toBe(false);
36
+ });
37
+ it('handles negation patterns', () => {
38
+ fsMock.readFileSync.mockReturnValue('*.log\n!important.log\n');
39
+ const matcher = loadDockerIgnore('');
40
+ expect(matcher('debug.log')).toBe(true);
41
+ expect(matcher('important.log')).toBe(false);
42
+ });
43
+ it('strips dockerContextDir prefix before matching', () => {
44
+ fsMock.readFileSync.mockReturnValue('node_modules\n');
45
+ const matcher = loadDockerIgnore('actors/shopify');
46
+ expect(matcher('actors/shopify/node_modules/foo.js')).toBe(true);
47
+ expect(matcher('actors/shopify/src/main.ts')).toBe(false);
48
+ });
49
+ it('returns false for files outside dockerContextDir', () => {
50
+ fsMock.readFileSync.mockReturnValue('*\n');
51
+ const matcher = loadDockerIgnore('actors/shopify');
52
+ expect(matcher('other-actor/src/main.ts')).toBe(false);
53
+ });
54
+ it('reads .dockerignore from the resolved, absolute dockerContextDir root', () => {
55
+ fsMock.readFileSync.mockReturnValue('');
56
+ loadDockerIgnore('actors/shopify');
57
+ expect(fsMock.readFileSync).toHaveBeenCalledWith(path.join(path.resolve('actors/shopify'), '.dockerignore'), 'utf-8');
58
+ });
59
+ it('reads .dockerignore from the resolved repo root when dockerContextDir is empty', () => {
60
+ fsMock.readFileSync.mockReturnValue('');
61
+ loadDockerIgnore('');
62
+ expect(fsMock.readFileSync).toHaveBeenCalledWith(path.join(path.resolve(''), '.dockerignore'), 'utf-8');
63
+ });
64
+ it('handles comments and blank lines', () => {
65
+ fsMock.readFileSync.mockReturnValue('# this is a comment\n\nnode_modules\n');
66
+ const matcher = loadDockerIgnore('');
67
+ expect(matcher('node_modules/foo.js')).toBe(true);
68
+ expect(matcher('src/main.ts')).toBe(false);
69
+ });
70
+ it('normalizes a leading "./" in patterns, which Docker treats as a no-op', () => {
71
+ // The common real-world .dockerignore style: every pattern prefixed with "./",
72
+ // including a negation re-including one of the otherwise-matched files.
73
+ fsMock.readFileSync.mockReturnValue('./node_modules\n./*.log\n!./keep.log\n');
74
+ const matcher = loadDockerIgnore('');
75
+ expect(matcher('node_modules/foo.js')).toBe(true);
76
+ expect(matcher('debug.log')).toBe(true);
77
+ expect(matcher('keep.log')).toBe(false);
78
+ expect(matcher('main.js')).toBe(false);
79
+ });
80
+ });
81
+ describe('buildDockerIgnoreMatcher', () => {
82
+ it('treats paths as already relative to absoluteRootDir when hoistFrom is left at its default', () => {
83
+ fsMock.readFileSync.mockReturnValue('test/\n*.log\n');
84
+ const matcher = buildDockerIgnoreMatcher('/repo/actors/shopify');
85
+ expect(matcher('test/fixture.json')).toBe(true);
86
+ expect(matcher('debug.log')).toBe(true);
87
+ expect(matcher('main.js')).toBe(false);
88
+ });
89
+ it('reads .dockerignore from the given absoluteRootDir', () => {
90
+ fsMock.readFileSync.mockReturnValue('');
91
+ buildDockerIgnoreMatcher('/repo/actors/shopify');
92
+ expect(fsMock.readFileSync).toHaveBeenCalledWith('/repo/actors/shopify/.dockerignore', 'utf-8');
93
+ });
94
+ it('returns no-op matcher when .dockerignore is absent', () => {
95
+ fsMock.readFileSync.mockImplementation(() => {
96
+ throw new Error('ENOENT');
97
+ });
98
+ const matcher = buildDockerIgnoreMatcher('/repo/actors/shopify');
99
+ expect(matcher('main.js')).toBe(false);
100
+ });
101
+ });
102
+ //# sourceMappingURL=dockerignore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerignore.test.js","sourceRoot":"","sources":["../../../../test/unit/bin/dockerignore.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=path-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-utils.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/bin/path-utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { findContainingScope, hoistPath, isPathWithinScope } from '../../../bin/path-utils.js';
3
+ describe('path-utils', () => {
4
+ it('isPathWithinScope matches a scope entry that names an exact file, not just a directory prefix', () => {
5
+ expect(isPathWithinScope('shared/utils.ts', 'shared/utils.ts')).toBe(true);
6
+ });
7
+ it('findContainingScope picks the exact-file entry out of a list of scope paths', () => {
8
+ expect(findContainingScope('shared/utils.ts', ['actors/foo', 'shared/utils.ts'])).toBe('shared/utils.ts');
9
+ });
10
+ it('hoistPath resolves an exact-file scope match to an empty string, not an out-of-bounds slice', () => {
11
+ expect(hoistPath('shared/utils.ts', 'shared/utils.ts')).toBe('');
12
+ });
13
+ });
14
+ //# sourceMappingURL=path-utils.test.js.map