apify-test-tools 0.9.1-beta.5 → 0.9.1-beta.7
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.
- package/.github/actionlint.yaml +12 -0
- package/.github/actions/checkout-restore-dependencies/action.yaml +120 -0
- package/.github/review-prompt.md +154 -0
- package/.github/scripts/check-major-tag-refs.mjs +72 -0
- package/.github/scripts/check-package-version-bump.mjs +74 -0
- package/.github/scripts/run-with-apify-tokens.mjs +104 -0
- package/.github/workflows/_check_code.yaml +16 -0
- package/.github/workflows/_move_major_tag.yaml +100 -0
- package/.github/workflows/_update_release_metadata.yaml +12 -0
- package/.github/workflows/manual_move_major_tag.yaml +26 -0
- package/.github/workflows/manual_release_stable.yaml +12 -0
- package/.github/workflows/on_master.yaml +11 -0
- package/.github/workflows/on_pull_request.yaml +49 -1
- package/.github/workflows/public_claude.yaml +101 -0
- package/.github/workflows/public_platform-tests-claude-investigate-and-fix.yaml +208 -0
- package/.github/workflows/public_platform-tests.yaml +75 -0
- package/.github/workflows/public_pr-build-test.yaml +197 -0
- package/.github/workflows/public_push-build-latest.yaml +57 -0
- package/.github/workflows/public_review.yaml +114 -0
- package/.github/workflows-package-version +1 -0
- package/.prettierignore +6 -0
- package/CHANGELOG.md +5 -0
- package/CONTRIBUTING.md +47 -2
- package/README.md +147 -5
- package/bin/utils/config/load-config.ts +14 -132
- package/bin/utils/config/parser.ts +88 -0
- package/bin/utils/config/structures/base.ts +61 -0
- package/bin/utils/config/structures/legacy.ts +20 -0
- package/dist/bin/utils/config/load-config.d.ts +2 -33
- package/dist/bin/utils/config/load-config.d.ts.map +1 -1
- package/dist/bin/utils/config/load-config.js +13 -91
- package/dist/bin/utils/config/load-config.js.map +1 -1
- package/dist/bin/utils/config/parser.d.ts +19 -0
- package/dist/bin/utils/config/parser.d.ts.map +1 -0
- package/dist/bin/utils/config/parser.js +72 -0
- package/dist/bin/utils/config/parser.js.map +1 -0
- package/dist/bin/utils/config/structures/base.d.ts +35 -0
- package/dist/bin/utils/config/structures/base.d.ts.map +1 -0
- package/dist/bin/utils/config/structures/base.js +40 -0
- package/dist/bin/utils/config/structures/base.js.map +1 -0
- package/dist/bin/utils/config/structures/legacy.d.ts +6 -0
- package/dist/bin/utils/config/structures/legacy.d.ts.map +1 -0
- package/dist/bin/utils/config/structures/legacy.js +14 -0
- package/dist/bin/utils/config/structures/legacy.js.map +1 -0
- package/dist/test/unit/bin/utils/config/load-config.test.d.ts +2 -0
- package/dist/test/unit/bin/utils/config/load-config.test.d.ts.map +1 -0
- package/dist/test/unit/bin/utils/config/load-config.test.js +138 -0
- package/dist/test/unit/bin/utils/config/load-config.test.js.map +1 -0
- package/dist/test/unit/bin/utils/config/parser.test.d.ts +2 -0
- package/dist/test/unit/bin/utils/config/parser.test.d.ts.map +1 -0
- package/dist/test/unit/bin/utils/config/parser.test.js +111 -0
- package/dist/test/unit/bin/utils/config/parser.test.js.map +1 -0
- package/dist/test/unit/bin/utils/config/structures/base.test.d.ts +2 -0
- package/dist/test/unit/bin/utils/config/structures/base.test.d.ts.map +1 -0
- package/dist/test/unit/bin/utils/config/structures/base.test.js +74 -0
- package/dist/test/unit/bin/utils/config/structures/base.test.js.map +1 -0
- package/dist/test/unit/bin/utils/config/structures/legacy.test.d.ts +2 -0
- package/dist/test/unit/bin/utils/config/structures/legacy.test.d.ts.map +1 -0
- package/dist/test/unit/bin/utils/config/structures/legacy.test.js +63 -0
- package/dist/test/unit/bin/utils/config/structures/legacy.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/test/unit/bin/utils/config/load-config.test.ts +179 -0
- package/test/unit/bin/utils/config/parser.test.ts +137 -0
- package/test/unit/bin/utils/config/structures/base.test.ts +83 -0
- package/test/unit/bin/utils/config/structures/legacy.test.ts +78 -0
- package/dist/test/unit/bin/utils/actor-config.test.d.ts +0 -2
- package/dist/test/unit/bin/utils/actor-config.test.d.ts.map +0 -1
- package/dist/test/unit/bin/utils/actor-config.test.js +0 -396
- package/dist/test/unit/bin/utils/actor-config.test.js.map +0 -1
- package/test/unit/bin/utils/actor-config.test.ts +0 -481
|
@@ -1,396 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs/promises';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { CONFIG_FILE_NAME, loadActorConfig, parseConfigFile, readConfigFile, resolveRawConfig, } from '../../../../bin/utils/config/load-config.js';
|
|
6
|
-
// `readConfigFile` resolves every path against the process's working directory, so these tests give it
|
|
7
|
-
// a real one: a throwaway repo in a temp dir. Reading actual files rather than a mocked
|
|
8
|
-
// `node:fs/promises` is what makes the path handling (the ".actor/" hop, a dockerContextDir escaping
|
|
9
|
-
// the repo root) worth asserting on — against a mock those assertions only describe the mock.
|
|
10
|
-
let repoDir;
|
|
11
|
-
let originalCwd;
|
|
12
|
-
beforeEach(async () => {
|
|
13
|
-
originalCwd = process.cwd();
|
|
14
|
-
// `realpath` because macOS hands out a symlinked temp dir, while `process.cwd()` reports the target.
|
|
15
|
-
repoDir = await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(), 'apify-test-tools-config-')));
|
|
16
|
-
process.chdir(repoDir);
|
|
17
|
-
});
|
|
18
|
-
afterEach(async () => {
|
|
19
|
-
process.chdir(originalCwd);
|
|
20
|
-
await fs.rm(repoDir, { recursive: true, force: true });
|
|
21
|
-
});
|
|
22
|
-
const emptyActorSelection = { actors: [], ignore: [] };
|
|
23
|
-
const validConfig = (actors) => JSON.stringify({ actors });
|
|
24
|
-
const actorJson = (fields = {}) => JSON.stringify(fields);
|
|
25
|
-
const writeFiles = async (files) => Promise.all(Object.entries(files).map(async ([filePath, contents]) => {
|
|
26
|
-
const absPath = path.join(repoDir, filePath);
|
|
27
|
-
await fs.mkdir(path.dirname(absPath), { recursive: true });
|
|
28
|
-
await fs.writeFile(absPath, contents);
|
|
29
|
-
}));
|
|
30
|
-
// Stages 2-4 are callable on their own, which is the point: a differently shaped config file only
|
|
31
|
-
// has to reach `resolveRawConfig`'s output to work with everything downstream.
|
|
32
|
-
describe('the parse/resolve/load seam', () => {
|
|
33
|
-
it('parseConfigFile validates the file shape without touching the filesystem', () => {
|
|
34
|
-
const entry = { folder: 'actors/shopify', actorFullName: 'myteam/shopify', tokenEnvVar: 'APIFY_TOKEN' };
|
|
35
|
-
expect(parseConfigFile({ actors: [entry] })).toEqual({ actors: [entry] });
|
|
36
|
-
expect(() => parseConfigFile({ actors: [{ ...entry, folder: 123 }] })).toThrow(/Invalid "folder"/);
|
|
37
|
-
});
|
|
38
|
-
it('resolveRawConfig is where the repo root becomes "" and trailing slashes go', () => {
|
|
39
|
-
const result = resolveRawConfig({
|
|
40
|
-
actors: [
|
|
41
|
-
{ folder: '.', actorFullName: 'myteam/root', tokenEnvVar: 'APIFY_TOKEN' },
|
|
42
|
-
{
|
|
43
|
-
folder: 'actors/shopify/',
|
|
44
|
-
actorFullName: 'myteam/shopify',
|
|
45
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
46
|
-
overrideActorContext: ['packages/'],
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
});
|
|
50
|
-
expect(result).toEqual([
|
|
51
|
-
{ folder: '', actorFullName: 'myteam/root', tokenEnvVar: 'APIFY_TOKEN', overrideActorContext: undefined },
|
|
52
|
-
{
|
|
53
|
-
folder: 'actors/shopify',
|
|
54
|
-
actorFullName: 'myteam/shopify',
|
|
55
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
56
|
-
overrideActorContext: ['packages'],
|
|
57
|
-
},
|
|
58
|
-
]);
|
|
59
|
-
});
|
|
60
|
-
it('loadActorConfig resolves data coming from actor.json', async () => {
|
|
61
|
-
await writeFiles({ 'actors/shopify/.actor/actor.json': actorJson({ dockerContextDir: '..' }) });
|
|
62
|
-
expect(loadActorConfig({ folder: 'actors/shopify', actorFullName: 'myteam/shopify', tokenEnvVar: 'APIFY_TOKEN' })).toEqual({
|
|
63
|
-
actorFullName: 'myteam/shopify',
|
|
64
|
-
folder: 'actors/shopify',
|
|
65
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
66
|
-
dockerContextDir: 'actors/shopify',
|
|
67
|
-
contextPaths: ['actors/shopify'],
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('readConfigFile', () => {
|
|
72
|
-
it('returns correct ActorConfig[] for a valid config', async () => {
|
|
73
|
-
await writeFiles({
|
|
74
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
75
|
-
{
|
|
76
|
-
folder: 'actors/shopify',
|
|
77
|
-
actorFullName: 'myteam/shopify-scraper',
|
|
78
|
-
tokenEnvVar: 'APIFY_TOKEN_MYTEAM',
|
|
79
|
-
},
|
|
80
|
-
]),
|
|
81
|
-
'actors/shopify/.actor/actor.json': actorJson({ dockerContextDir: '../../..' }),
|
|
82
|
-
});
|
|
83
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
84
|
-
expect(result).toEqual([
|
|
85
|
-
{
|
|
86
|
-
actorFullName: 'myteam/shopify-scraper',
|
|
87
|
-
folder: 'actors/shopify',
|
|
88
|
-
tokenEnvVar: 'APIFY_TOKEN_MYTEAM',
|
|
89
|
-
dockerContextDir: '',
|
|
90
|
-
contextPaths: [''],
|
|
91
|
-
},
|
|
92
|
-
]);
|
|
93
|
-
});
|
|
94
|
-
it('normalizes folder "." to ""', async () => {
|
|
95
|
-
await writeFiles({
|
|
96
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
97
|
-
{ folder: '.', actorFullName: 'apify/my-actor', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
98
|
-
]),
|
|
99
|
-
'.actor/actor.json': actorJson({}),
|
|
100
|
-
});
|
|
101
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
102
|
-
expect(result[0].folder).toBe('');
|
|
103
|
-
});
|
|
104
|
-
it('defaults dockerContextDir to actor folder when absent from actor.json', async () => {
|
|
105
|
-
await writeFiles({
|
|
106
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
107
|
-
{ folder: 'actors/web-scraper', actorFullName: 'apify/web-scraper', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
108
|
-
]),
|
|
109
|
-
'actors/web-scraper/.actor/actor.json': actorJson({}),
|
|
110
|
-
});
|
|
111
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
112
|
-
expect(result[0].dockerContextDir).toBe('actors/web-scraper');
|
|
113
|
-
expect(result[0].contextPaths).toEqual(['actors/web-scraper']);
|
|
114
|
-
});
|
|
115
|
-
it('resolves dockerContextDir relative to .actor/ folder', async () => {
|
|
116
|
-
await writeFiles({
|
|
117
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
118
|
-
{ folder: 'actors/shopify', actorFullName: 'myteam/shopify', tokenEnvVar: 'APIFY_TOKEN' },
|
|
119
|
-
]),
|
|
120
|
-
'actors/shopify/.actor/actor.json': actorJson({ dockerContextDir: '../../..' }),
|
|
121
|
-
});
|
|
122
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
123
|
-
expect(result[0].dockerContextDir).toBe('');
|
|
124
|
-
});
|
|
125
|
-
it('throws when dockerContextDir resolves outside the repository root', async () => {
|
|
126
|
-
await writeFiles({
|
|
127
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
128
|
-
{ folder: 'actors/shopify', actorFullName: 'myteam/shopify', tokenEnvVar: 'APIFY_TOKEN' },
|
|
129
|
-
]),
|
|
130
|
-
'actors/shopify/.actor/actor.json': actorJson({ dockerContextDir: '../../../..' }),
|
|
131
|
-
});
|
|
132
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow(/resolves outside the repository root/);
|
|
133
|
-
});
|
|
134
|
-
it('resolves contextPaths from overrideActorContext', async () => {
|
|
135
|
-
await writeFiles({
|
|
136
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
137
|
-
{
|
|
138
|
-
folder: 'actors/shopify',
|
|
139
|
-
actorFullName: 'myteam/shopify',
|
|
140
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
141
|
-
overrideActorContext: ['actors/shopify', 'packages'],
|
|
142
|
-
},
|
|
143
|
-
]),
|
|
144
|
-
'actors/shopify/.actor/actor.json': actorJson({ dockerContextDir: '../../..' }),
|
|
145
|
-
});
|
|
146
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
147
|
-
expect(result[0].contextPaths).toEqual(['actors/shopify', 'packages']);
|
|
148
|
-
});
|
|
149
|
-
it('handles multiple actors', async () => {
|
|
150
|
-
await writeFiles({
|
|
151
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
152
|
-
{ folder: 'actors/web-scraper', actorFullName: 'apify/web-scraper', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
153
|
-
{
|
|
154
|
-
folder: 'actors/email-sender',
|
|
155
|
-
actorFullName: 'other-team/email-sender',
|
|
156
|
-
tokenEnvVar: 'APIFY_TOKEN_OTHER_TEAM',
|
|
157
|
-
},
|
|
158
|
-
]),
|
|
159
|
-
'actors/web-scraper/.actor/actor.json': actorJson({}),
|
|
160
|
-
'actors/email-sender/.actor/actor.json': actorJson({}),
|
|
161
|
-
});
|
|
162
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
163
|
-
expect(result).toHaveLength(2);
|
|
164
|
-
expect(result[0].actorFullName).toBe('apify/web-scraper');
|
|
165
|
-
expect(result[1].actorFullName).toBe('other-team/email-sender');
|
|
166
|
-
});
|
|
167
|
-
it('throws when config file is missing', async () => {
|
|
168
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('not found');
|
|
169
|
-
});
|
|
170
|
-
it('throws when config file contains invalid JSON', async () => {
|
|
171
|
-
await writeFiles({ [CONFIG_FILE_NAME]: '{bad json' });
|
|
172
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('invalid JSON');
|
|
173
|
-
});
|
|
174
|
-
it('throws when actors array is missing', async () => {
|
|
175
|
-
await writeFiles({ [CONFIG_FILE_NAME]: JSON.stringify({ notActors: [] }) });
|
|
176
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('"actors" array');
|
|
177
|
-
});
|
|
178
|
-
it('throws when the config file is not a JSON object', async () => {
|
|
179
|
-
await writeFiles({ [CONFIG_FILE_NAME]: JSON.stringify([{ folder: 'actors/shopify' }]) });
|
|
180
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('"actors" array');
|
|
181
|
-
});
|
|
182
|
-
it('throws on duplicate folders', async () => {
|
|
183
|
-
await writeFiles({
|
|
184
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
185
|
-
{ folder: 'actors/shopify', actorFullName: 'apify/shopify', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
186
|
-
{ folder: 'actors/shopify', actorFullName: 'other/shopify', tokenEnvVar: 'APIFY_TOKEN_OTHER' },
|
|
187
|
-
]),
|
|
188
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
189
|
-
});
|
|
190
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Duplicate folder');
|
|
191
|
-
});
|
|
192
|
-
it('throws on duplicate folders after normalization ("." and "")', async () => {
|
|
193
|
-
await writeFiles({
|
|
194
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
195
|
-
{ folder: '.', actorFullName: 'apify/actor-a', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
196
|
-
{ folder: '', actorFullName: 'other/actor-b', tokenEnvVar: 'APIFY_TOKEN_OTHER' },
|
|
197
|
-
]),
|
|
198
|
-
'.actor/actor.json': actorJson({}),
|
|
199
|
-
});
|
|
200
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Duplicate folder');
|
|
201
|
-
});
|
|
202
|
-
it('throws when actor.json is missing', async () => {
|
|
203
|
-
await writeFiles({
|
|
204
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
205
|
-
{ folder: 'actors/shopify', actorFullName: 'apify/shopify', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
206
|
-
]),
|
|
207
|
-
});
|
|
208
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Cannot read');
|
|
209
|
-
});
|
|
210
|
-
it('throws when folder is missing', async () => {
|
|
211
|
-
await writeFiles({
|
|
212
|
-
[CONFIG_FILE_NAME]: validConfig([{ actorFullName: 'apify/shopify', tokenEnvVar: 'APIFY_TOKEN_APIFY' }]),
|
|
213
|
-
});
|
|
214
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow(/Invalid "folder"/);
|
|
215
|
-
});
|
|
216
|
-
it('throws when folder is not a string', async () => {
|
|
217
|
-
await writeFiles({
|
|
218
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
219
|
-
{ folder: 123, actorFullName: 'apify/shopify', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
220
|
-
]),
|
|
221
|
-
});
|
|
222
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow(/Invalid "folder"/);
|
|
223
|
-
});
|
|
224
|
-
it('throws when actorFullName is missing', async () => {
|
|
225
|
-
await writeFiles({
|
|
226
|
-
[CONFIG_FILE_NAME]: validConfig([{ folder: 'actors/shopify', tokenEnvVar: 'APIFY_TOKEN_APIFY' }]),
|
|
227
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
228
|
-
});
|
|
229
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Invalid "actorFullName"');
|
|
230
|
-
});
|
|
231
|
-
it('throws when actorFullName has no slash', async () => {
|
|
232
|
-
await writeFiles({
|
|
233
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
234
|
-
{ folder: 'actors/shopify', actorFullName: 'shopify-scraper', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
235
|
-
]),
|
|
236
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
237
|
-
});
|
|
238
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Invalid "actorFullName"');
|
|
239
|
-
});
|
|
240
|
-
it('throws when actorFullName has empty parts', async () => {
|
|
241
|
-
await writeFiles({
|
|
242
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
243
|
-
{ folder: 'actors/shopify', actorFullName: '/shopify', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
244
|
-
]),
|
|
245
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
246
|
-
});
|
|
247
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Invalid "actorFullName"');
|
|
248
|
-
});
|
|
249
|
-
it('throws when tokenEnvVar is missing', async () => {
|
|
250
|
-
await writeFiles({
|
|
251
|
-
[CONFIG_FILE_NAME]: validConfig([{ folder: 'actors/shopify', actorFullName: 'apify/shopify' }]),
|
|
252
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
253
|
-
});
|
|
254
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Invalid "tokenEnvVar"');
|
|
255
|
-
});
|
|
256
|
-
it('reports every invalid field at once instead of only the first', async () => {
|
|
257
|
-
await writeFiles({
|
|
258
|
-
[CONFIG_FILE_NAME]: validConfig([{ folder: 123, actorFullName: 'shopify', overrideActorContext: 'nope' }]),
|
|
259
|
-
});
|
|
260
|
-
const promise = readConfigFile(emptyActorSelection);
|
|
261
|
-
await expect(promise).rejects.toThrow(/Invalid "folder"/);
|
|
262
|
-
await expect(promise).rejects.toThrow(/Invalid "actorFullName"/);
|
|
263
|
-
await expect(promise).rejects.toThrow(/Invalid "tokenEnvVar"/);
|
|
264
|
-
await expect(promise).rejects.toThrow(/Invalid "overrideActorContext"/);
|
|
265
|
-
});
|
|
266
|
-
it('throws when overrideActorContext is not an array', async () => {
|
|
267
|
-
await writeFiles({
|
|
268
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
269
|
-
{
|
|
270
|
-
folder: 'actors/shopify',
|
|
271
|
-
actorFullName: 'myteam/shopify',
|
|
272
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
273
|
-
overrideActorContext: 'packages',
|
|
274
|
-
},
|
|
275
|
-
]),
|
|
276
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
277
|
-
});
|
|
278
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Invalid "overrideActorContext"');
|
|
279
|
-
});
|
|
280
|
-
it('throws when overrideActorContext contains non-strings', async () => {
|
|
281
|
-
await writeFiles({
|
|
282
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
283
|
-
{
|
|
284
|
-
folder: 'actors/shopify',
|
|
285
|
-
actorFullName: 'myteam/shopify',
|
|
286
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
287
|
-
overrideActorContext: [123],
|
|
288
|
-
},
|
|
289
|
-
]),
|
|
290
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
291
|
-
});
|
|
292
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('Invalid "overrideActorContext"');
|
|
293
|
-
});
|
|
294
|
-
it('throws when overrideActorContext entries overlap (one is a prefix of another)', async () => {
|
|
295
|
-
await writeFiles({
|
|
296
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
297
|
-
{
|
|
298
|
-
folder: 'actors/shopify',
|
|
299
|
-
actorFullName: 'myteam/shopify',
|
|
300
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
301
|
-
overrideActorContext: ['actors/shopify', 'actors'],
|
|
302
|
-
},
|
|
303
|
-
]),
|
|
304
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
305
|
-
});
|
|
306
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow(/overlap/);
|
|
307
|
-
});
|
|
308
|
-
it('throws when overrideActorContext contains the repo root alongside another entry', async () => {
|
|
309
|
-
await writeFiles({
|
|
310
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
311
|
-
{
|
|
312
|
-
folder: 'actors/shopify',
|
|
313
|
-
actorFullName: 'myteam/shopify',
|
|
314
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
315
|
-
overrideActorContext: ['', 'actors/shopify'],
|
|
316
|
-
},
|
|
317
|
-
]),
|
|
318
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
319
|
-
});
|
|
320
|
-
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow(/overlap/);
|
|
321
|
-
});
|
|
322
|
-
it('adds the actor own folder automatically when overrideActorContext does not cover it', async () => {
|
|
323
|
-
await writeFiles({
|
|
324
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
325
|
-
{
|
|
326
|
-
folder: 'actors/shopify',
|
|
327
|
-
actorFullName: 'myteam/shopify',
|
|
328
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
329
|
-
overrideActorContext: ['code', 'shared'],
|
|
330
|
-
},
|
|
331
|
-
]),
|
|
332
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
333
|
-
});
|
|
334
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
335
|
-
expect(result[0].contextPaths).toEqual(['code', 'shared', 'actors/shopify']);
|
|
336
|
-
});
|
|
337
|
-
it('strips trailing slashes from folder and overrideActorContext entries', async () => {
|
|
338
|
-
await writeFiles({
|
|
339
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
340
|
-
{
|
|
341
|
-
folder: 'actors/shopify/',
|
|
342
|
-
actorFullName: 'myteam/shopify',
|
|
343
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
344
|
-
overrideActorContext: ['actors/shopify/', 'packages/'],
|
|
345
|
-
},
|
|
346
|
-
]),
|
|
347
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
348
|
-
});
|
|
349
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
350
|
-
expect(result[0].folder).toBe('actors/shopify');
|
|
351
|
-
expect(result[0].contextPaths).toEqual(['actors/shopify', 'packages']);
|
|
352
|
-
});
|
|
353
|
-
it('allows overrideActorContext with disjoint sibling paths that all reach the actor folder via one entry', async () => {
|
|
354
|
-
await writeFiles({
|
|
355
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
356
|
-
{
|
|
357
|
-
folder: 'actors/shopify',
|
|
358
|
-
actorFullName: 'myteam/shopify',
|
|
359
|
-
tokenEnvVar: 'APIFY_TOKEN',
|
|
360
|
-
overrideActorContext: ['actors/shopify', 'code', 'shared'],
|
|
361
|
-
},
|
|
362
|
-
]),
|
|
363
|
-
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
364
|
-
});
|
|
365
|
-
const result = await readConfigFile(emptyActorSelection);
|
|
366
|
-
expect(result[0].contextPaths).toEqual(['actors/shopify', 'code', 'shared']);
|
|
367
|
-
});
|
|
368
|
-
describe('actor selection', () => {
|
|
369
|
-
const twoActors = async () => writeFiles({
|
|
370
|
-
[CONFIG_FILE_NAME]: validConfig([
|
|
371
|
-
{ folder: 'actors/a', actorFullName: 'team/a', tokenEnvVar: 'TOKEN' },
|
|
372
|
-
{ folder: 'actors/b', actorFullName: 'team/b', tokenEnvVar: 'TOKEN' },
|
|
373
|
-
]),
|
|
374
|
-
'actors/a/.actor/actor.json': actorJson({}),
|
|
375
|
-
'actors/b/.actor/actor.json': actorJson({}),
|
|
376
|
-
});
|
|
377
|
-
const fullNames = (result) => result.map((c) => c.actorFullName);
|
|
378
|
-
it('returns all actors when the selection is empty', async () => {
|
|
379
|
-
await twoActors();
|
|
380
|
-
expect(fullNames(await readConfigFile(emptyActorSelection))).toEqual(['team/a', 'team/b']);
|
|
381
|
-
});
|
|
382
|
-
it('keeps only the selected actors', async () => {
|
|
383
|
-
await twoActors();
|
|
384
|
-
expect(fullNames(await readConfigFile({ actors: ['team/a'], ignore: [] }))).toEqual(['team/a']);
|
|
385
|
-
});
|
|
386
|
-
it('drops ignored actors', async () => {
|
|
387
|
-
await twoActors();
|
|
388
|
-
expect(fullNames(await readConfigFile({ actors: [], ignore: ['team/a'] }))).toEqual(['team/b']);
|
|
389
|
-
});
|
|
390
|
-
it('throws on an unknown actor name', async () => {
|
|
391
|
-
await twoActors();
|
|
392
|
-
await expect(readConfigFile({ actors: ['team/nope'], ignore: [] })).rejects.toThrow('do not exist: team/nope');
|
|
393
|
-
});
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
//# sourceMappingURL=actor-config.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"actor-config.test.js","sourceRoot":"","sources":["../../../../../test/unit/bin/utils/actor-config.test.ts"],"names":[],"mappings":"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"}
|