apify-test-tools 0.9.1-beta.1 → 0.9.1-beta.11
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/CODEOWNERS +1 -1
- package/.github/actionlint.yaml +12 -0
- package/.github/actions/checkout-restore-dependencies/action.yaml +94 -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 +108 -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 +63 -0
- package/.github/workflows/public_pr-build-test.yaml +175 -0
- package/.github/workflows/public_push-build-latest.yaml +44 -0
- package/.github/workflows/public_review.yaml +107 -0
- package/.github/workflows-package-version +1 -0
- package/.prettierignore +9 -0
- package/.vscode/settings.json +2 -1
- package/CHANGELOG.md +15 -0
- package/CONTRIBUTING.md +53 -2
- package/README.md +229 -36
- package/bin/build-from-local.ts +23 -28
- package/bin/build.ts +82 -70
- package/bin/main.ts +2 -1
- package/bin/types.ts +0 -11
- package/bin/utils/config/load-config.ts +133 -0
- package/bin/utils/config/parser.ts +89 -0
- package/bin/utils/config/structures/base.ts +65 -0
- package/bin/utils/config/structures/grouped.ts +40 -0
- package/bin/utils/config/structures/legacy.ts +22 -0
- package/bin/utils/json-file.ts +55 -0
- package/bin/utils.ts +5 -150
- package/dist/bin/build-from-local.d.ts +2 -2
- package/dist/bin/build-from-local.d.ts.map +1 -1
- package/dist/bin/build-from-local.js +20 -19
- package/dist/bin/build-from-local.js.map +1 -1
- package/dist/bin/build.d.ts +7 -11
- package/dist/bin/build.d.ts.map +1 -1
- package/dist/bin/build.js +51 -50
- package/dist/bin/build.js.map +1 -1
- package/dist/bin/main.d.ts.map +1 -1
- package/dist/bin/main.js +2 -1
- package/dist/bin/main.js.map +1 -1
- package/dist/bin/types.d.ts +0 -9
- package/dist/bin/types.d.ts.map +1 -1
- package/dist/bin/utils/config/load-config.d.ts +13 -0
- package/dist/bin/utils/config/load-config.d.ts.map +1 -0
- package/dist/bin/utils/config/load-config.js +99 -0
- package/dist/bin/utils/config/load-config.js.map +1 -0
- 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 +73 -0
- package/dist/bin/utils/config/parser.js.map +1 -0
- package/dist/bin/utils/config/structures/base.d.ts +36 -0
- package/dist/bin/utils/config/structures/base.d.ts.map +1 -0
- package/dist/bin/utils/config/structures/base.js +41 -0
- package/dist/bin/utils/config/structures/base.js.map +1 -0
- package/dist/bin/utils/config/structures/grouped.d.ts +6 -0
- package/dist/bin/utils/config/structures/grouped.d.ts.map +1 -0
- package/dist/bin/utils/config/structures/grouped.js +29 -0
- package/dist/bin/utils/config/structures/grouped.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/bin/utils/json-file.d.ts +20 -0
- package/dist/bin/utils/json-file.d.ts.map +1 -0
- package/dist/bin/utils/json-file.js +42 -0
- package/dist/bin/utils/json-file.js.map +1 -0
- package/dist/bin/utils.d.ts +5 -8
- package/dist/bin/utils.d.ts.map +1 -1
- package/dist/bin/utils.js +4 -107
- package/dist/bin/utils.js.map +1 -1
- package/dist/lib/consts.d.ts +1 -0
- package/dist/lib/consts.d.ts.map +1 -1
- package/dist/lib/consts.js +3 -0
- package/dist/lib/consts.js.map +1 -1
- package/dist/lib/lib.d.ts +10 -0
- package/dist/lib/lib.d.ts.map +1 -1
- package/dist/lib/lib.js +24 -18
- package/dist/lib/lib.js.map +1 -1
- package/dist/lib/types.d.ts +11 -3
- package/dist/lib/types.d.ts.map +1 -1
- 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 +139 -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 +129 -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/grouped.test.d.ts +2 -0
- package/dist/test/unit/bin/utils/config/structures/grouped.test.d.ts.map +1 -0
- package/dist/test/unit/bin/utils/config/structures/grouped.test.js +75 -0
- package/dist/test/unit/bin/utils/config/structures/grouped.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/test/unit/bin/utils/files.test.d.ts +2 -0
- package/dist/test/unit/bin/utils/files.test.d.ts.map +1 -0
- package/dist/test/unit/bin/utils/files.test.js +117 -0
- package/dist/test/unit/bin/utils/files.test.js.map +1 -0
- package/dist/test/unit/lib.test.d.ts +2 -0
- package/dist/test/unit/lib.test.d.ts.map +1 -0
- package/dist/test/unit/lib.test.js +37 -0
- package/dist/test/unit/lib.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/lib/consts.ts +4 -0
- package/lib/lib.ts +32 -20
- package/lib/types.ts +11 -3
- package/package.json +5 -2
- package/test/fixtures/bin/utils/files/array.json +1 -0
- package/test/fixtures/bin/utils/files/comments.jsonc +4 -0
- package/test/fixtures/bin/utils/files/directory.json/.gitkeep +0 -0
- package/test/fixtures/bin/utils/files/empty-object.json +1 -0
- package/test/fixtures/bin/utils/files/empty.json +0 -0
- package/test/fixtures/bin/utils/files/malformed.json +1 -0
- package/test/fixtures/bin/utils/files/nested.json +6 -0
- package/test/fixtures/bin/utils/files/no-json-extension.actorrc +1 -0
- package/test/fixtures/bin/utils/files/null.json +1 -0
- package/test/fixtures/bin/utils/files/number.json +1 -0
- package/test/fixtures/bin/utils/files/unreadable.json +1 -0
- package/test/tsconfig.json +4 -2
- package/test/unit/bin/utils/config/load-config.test.ts +180 -0
- package/test/unit/bin/utils/config/parser.test.ts +158 -0
- package/test/unit/bin/utils/config/structures/base.test.ts +83 -0
- package/test/unit/bin/utils/config/structures/grouped.test.ts +90 -0
- package/test/unit/bin/utils/config/structures/legacy.test.ts +78 -0
- package/test/unit/bin/utils/files.test.ts +158 -0
- package/test/unit/lib.test.ts +53 -0
- package/dist/test/unit/bin/utils.test.d.ts +0 -2
- package/dist/test/unit/bin/utils.test.d.ts.map +0 -1
- package/dist/test/unit/bin/utils.test.js +0 -321
- package/dist/test/unit/bin/utils.test.js.map +0 -1
- package/test/unit/bin/utils.test.ts +0 -381
package/dist/lib/lib.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ApifyClient } from 'apify-client';
|
|
2
2
|
import { describe as vitestDescribe, test as vitestTest } from 'vitest';
|
|
3
|
-
import { DATASET_SYNC_DELAY_MS, DEFAULT_TEST_RUN_DURATION_MS } from './consts.js';
|
|
3
|
+
import { DATASET_SYNC_DELAY_MS, DEFAULT_TEST_ACTOR_TIMEOUT_SECS, DEFAULT_TEST_RUN_DURATION_MS } from './consts.js';
|
|
4
4
|
import { extendExpect } from './extend-expect.js';
|
|
5
5
|
import { RunTestResult } from './run-test-result.js';
|
|
6
6
|
import { getActorPrefilledInput, sleep } from './utils.js';
|
|
@@ -23,31 +23,32 @@ const config = actorBuilds.reduce((map, cfg) => {
|
|
|
23
23
|
map.set(cfg.actorRawId, cfg);
|
|
24
24
|
return map;
|
|
25
25
|
}, new Map());
|
|
26
|
-
const { TESTER_APIFY_TOKEN,
|
|
26
|
+
const { TESTER_APIFY_TOKEN, RUN_ALL_PLATFORM_TESTS } = process.env;
|
|
27
27
|
const apifyClient = new ApifyClient({ token: TESTER_APIFY_TOKEN });
|
|
28
28
|
const DEFAULT_TEST_OPTIONS = {
|
|
29
29
|
// we want to run tests concurrently
|
|
30
30
|
concurrent: true,
|
|
31
31
|
// test should finish within 1 hour
|
|
32
32
|
timeout: DEFAULT_TEST_RUN_DURATION_MS,
|
|
33
|
+
retry: 1,
|
|
33
34
|
};
|
|
35
|
+
/**
|
|
36
|
+
* Platform tests need `TESTER_APIFY_TOKEN` to talk to the platform, so without it we skip them altogether.
|
|
37
|
+
*
|
|
38
|
+
* `RUN_ALL_PLATFORM_TESTS` enables them too because locally we can test against a hardcoded `runId`,
|
|
39
|
+
* which doesn't need the tester token.
|
|
40
|
+
*/
|
|
34
41
|
export const describe = (name, fn, options = DEFAULT_TEST_OPTIONS) => {
|
|
35
|
-
vitestDescribe.runIf(!!
|
|
36
|
-
};
|
|
37
|
-
const DEFAULT_TEST_ACTOR_OPTIONS = {
|
|
38
|
-
retry: 1,
|
|
39
|
-
// prevent orphaned runs
|
|
40
|
-
timeout: DEFAULT_TEST_RUN_DURATION_MS,
|
|
42
|
+
vitestDescribe.runIf(!!TESTER_APIFY_TOKEN || !!RUN_ALL_PLATFORM_TESTS)(name, options, fn);
|
|
41
43
|
};
|
|
42
44
|
/**
|
|
43
45
|
* @param actorId - The actor's raw platform ID or its full name (`owner/name`, e.g. `"apify/web-scraper"`).
|
|
44
46
|
*/
|
|
45
47
|
export const testActor = (actorId, testName, fn, testOptions) => {
|
|
46
|
-
const options = {
|
|
47
|
-
...DEFAULT_TEST_ACTOR_OPTIONS,
|
|
48
|
-
...testOptions,
|
|
49
|
-
};
|
|
48
|
+
const options = { ...DEFAULT_TEST_OPTIONS, ...testOptions };
|
|
50
49
|
const name = `${actorId}: ${testName}`;
|
|
50
|
+
// `RUN_ALL_PLATFORM_TESTS` is needed for the scheduled tests, which have no `ACTOR_BUILDS` to match the
|
|
51
|
+
// tests against - without it, every test would be filtered out as an actor we didn't build.
|
|
51
52
|
const shouldRun = !!RUN_ALL_PLATFORM_TESTS || config.has(actorId);
|
|
52
53
|
vitestTest.runIf(shouldRun)(name, options, async (context) => {
|
|
53
54
|
const { expect, ...rest } = context;
|
|
@@ -69,11 +70,10 @@ export const testActor = (actorId, testName, fn, testOptions) => {
|
|
|
69
70
|
*/
|
|
70
71
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
72
|
export const testStandbyActor = (actorId, testName, fn, testOptions) => {
|
|
72
|
-
const options = {
|
|
73
|
-
...DEFAULT_TEST_ACTOR_OPTIONS,
|
|
74
|
-
...testOptions,
|
|
75
|
-
};
|
|
73
|
+
const options = { ...DEFAULT_TEST_OPTIONS, ...testOptions };
|
|
76
74
|
const name = `${actorId}: ${testName}`;
|
|
75
|
+
// `RUN_ALL_PLATFORM_TESTS` is needed for the scheduled tests, which have no `ACTOR_BUILDS` to match the
|
|
76
|
+
// tests against - without it, every test would be filtered out as an actor we didn't build.
|
|
77
77
|
const shouldRun = !!RUN_ALL_PLATFORM_TESTS || config.has(actorId);
|
|
78
78
|
vitestTest.runIf(shouldRun)(name, options, async (context) => {
|
|
79
79
|
const standbyTask = await createStandbyTask(actorId, config.get(actorId)?.buildNumber);
|
|
@@ -214,12 +214,15 @@ const createStartRunFn = (actorId, testContext) => {
|
|
|
214
214
|
}
|
|
215
215
|
return new RunTestResult(apifyClient, run);
|
|
216
216
|
}
|
|
217
|
-
const actor = apifyClient.actor(actorId);
|
|
218
217
|
const actorInput = {
|
|
219
218
|
...(prefilledInput && (await getActorPrefilledInput(apifyClient, actorId, buildId))),
|
|
220
219
|
...input,
|
|
221
220
|
};
|
|
222
|
-
const
|
|
221
|
+
const actor = apifyClient.actor(actorId);
|
|
222
|
+
const actorInfo = await actor.get();
|
|
223
|
+
const timeout = Math.min(actorInfo?.defaultRunOptions?.timeoutSecs ?? DEFAULT_TEST_ACTOR_TIMEOUT_SECS, DEFAULT_TEST_ACTOR_TIMEOUT_SECS);
|
|
224
|
+
const actorOptions = { timeout, build, log: null, ...options };
|
|
225
|
+
const run = await actor.call(actorInput, actorOptions);
|
|
223
226
|
const runLink = generateRunLink(run);
|
|
224
227
|
await annotate(`${task.name} - ${runLink}`, 'run_link');
|
|
225
228
|
// @ts-expect-error: `TaskMeta` cannot be retyped
|
|
@@ -236,4 +239,7 @@ const createStartRunFn = (actorId, testContext) => {
|
|
|
236
239
|
const generateRunLink = (run) => {
|
|
237
240
|
return `https://console.apify.com/view/runs/${run.id}`;
|
|
238
241
|
};
|
|
242
|
+
/** Used for unit testing */
|
|
243
|
+
// eslint-disable-next-line no-underscore-dangle
|
|
244
|
+
export const _private = { createStartRunFn };
|
|
239
245
|
//# sourceMappingURL=lib.js.map
|
package/dist/lib/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../lib/lib.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAgB,IAAI,IAAI,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEtF,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../lib/lib.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -8,7 +8,15 @@ export type ActorBuild = {
|
|
|
8
8
|
};
|
|
9
9
|
export type RunOptions<T> = {
|
|
10
10
|
input: Omit<T, 'actorName'>;
|
|
11
|
-
options?: ActorCallOptions
|
|
11
|
+
options?: Omit<ActorCallOptions, 'timeout'> & {
|
|
12
|
+
/**
|
|
13
|
+
* Timeout for the actor run in seconds. Zero value means there is no timeout.
|
|
14
|
+
* - If `undefined`, the run uses timeout of the default Actor run configuration.
|
|
15
|
+
*
|
|
16
|
+
* @default 3540 // 59 minutes (finish the run before the test)
|
|
17
|
+
*/
|
|
18
|
+
timeout?: number;
|
|
19
|
+
};
|
|
12
20
|
prefilledInput?: boolean;
|
|
13
21
|
/**
|
|
14
22
|
* If you specify `runId`, all the other options will be ignored and this run's data will
|
|
@@ -115,8 +123,8 @@ export type ActorTestOptions = Omit<TestOptions, 'retry' | 'timeout'> & {
|
|
|
115
123
|
*/
|
|
116
124
|
retry?: TestOptions['retry'];
|
|
117
125
|
/**
|
|
118
|
-
* Timeout for the
|
|
119
|
-
* - If `undefined`, the run uses timeout of the default
|
|
126
|
+
* Timeout for the test in milliseconds. Zero value means there is no timeout.
|
|
127
|
+
* - If `undefined`, the run uses timeout of the default test configuration.
|
|
120
128
|
*
|
|
121
129
|
* @default 60 * 60 * 1000 // 1 hour
|
|
122
130
|
*/
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IACxB,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.test.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/bin/utils/config/load-config.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
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, readConfigFile } from '../../../../../bin/utils/config/load-config.js';
|
|
6
|
+
let repoDir;
|
|
7
|
+
let originalCwd;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
originalCwd = process.cwd();
|
|
10
|
+
// `realpath` because macOS hands out a symlinked temp dir, while `process.cwd()` reports the target.
|
|
11
|
+
repoDir = await fs.realpath(await fs.mkdtemp(path.join(os.tmpdir(), 'apify-test-tools-config-')));
|
|
12
|
+
process.chdir(repoDir);
|
|
13
|
+
});
|
|
14
|
+
afterEach(async () => {
|
|
15
|
+
process.chdir(originalCwd);
|
|
16
|
+
await fs.rm(repoDir, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
const emptyActorSelection = { actors: [], ignore: [] };
|
|
19
|
+
const validConfig = (actors) => JSON.stringify({ actors });
|
|
20
|
+
const actorJson = (fields = {}) => JSON.stringify(fields);
|
|
21
|
+
const writeFiles = async (files) => Promise.all(Object.entries(files).map(async ([filePath, contents]) => {
|
|
22
|
+
const absPath = path.join(repoDir, filePath);
|
|
23
|
+
await fs.mkdir(path.dirname(absPath), { recursive: true });
|
|
24
|
+
await fs.writeFile(absPath, contents);
|
|
25
|
+
}));
|
|
26
|
+
describe('loadActorConfig', () => {
|
|
27
|
+
const entry = (fields = {}) => ({
|
|
28
|
+
folder: 'actors/shopify',
|
|
29
|
+
actorFullName: 'myteam/shopify',
|
|
30
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
31
|
+
overrideActorContext: undefined,
|
|
32
|
+
...fields,
|
|
33
|
+
});
|
|
34
|
+
const writeActorJson = async (fields = {}) => writeFiles({ 'actors/shopify/.actor/actor.json': actorJson(fields) });
|
|
35
|
+
it('resolves data coming from actor.json', async () => {
|
|
36
|
+
await writeActorJson({ dockerContextDir: '..' });
|
|
37
|
+
expect(loadActorConfig(entry())).toEqual({
|
|
38
|
+
actorFullName: 'myteam/shopify',
|
|
39
|
+
folder: 'actors/shopify',
|
|
40
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
41
|
+
dockerContextDir: 'actors/shopify',
|
|
42
|
+
contextPaths: ['actors/shopify'],
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
it('defaults dockerContextDir to the actor folder when actor.json does not set it', async () => {
|
|
46
|
+
await writeActorJson();
|
|
47
|
+
expect(loadActorConfig(entry()).dockerContextDir).toBe('actors/shopify');
|
|
48
|
+
});
|
|
49
|
+
it('resolves dockerContextDir relative to the .actor/ folder, not the actor folder', async () => {
|
|
50
|
+
await writeActorJson({ dockerContextDir: '../../..' });
|
|
51
|
+
expect(loadActorConfig(entry()).dockerContextDir).toBe('');
|
|
52
|
+
});
|
|
53
|
+
it('throws when dockerContextDir resolves outside the repository root', async () => {
|
|
54
|
+
await writeActorJson({ dockerContextDir: '../../../..' });
|
|
55
|
+
expect(() => loadActorConfig(entry())).toThrow(/resolves outside the repository root/);
|
|
56
|
+
});
|
|
57
|
+
it('throws when actor.json is missing', () => {
|
|
58
|
+
expect(() => loadActorConfig(entry())).toThrow('Cannot read');
|
|
59
|
+
});
|
|
60
|
+
it('resolves contextPaths from overrideActorContext', async () => {
|
|
61
|
+
await writeActorJson({ dockerContextDir: '../../..' });
|
|
62
|
+
expect(loadActorConfig(entry({ overrideActorContext: ['actors/shopify', 'packages'] })).contextPaths).toEqual([
|
|
63
|
+
'actors/shopify',
|
|
64
|
+
'packages',
|
|
65
|
+
]);
|
|
66
|
+
});
|
|
67
|
+
it('adds the actor own folder automatically when overrideActorContext does not cover it', async () => {
|
|
68
|
+
await writeActorJson();
|
|
69
|
+
expect(loadActorConfig(entry({ overrideActorContext: ['code', 'shared'] })).contextPaths).toEqual([
|
|
70
|
+
'code',
|
|
71
|
+
'shared',
|
|
72
|
+
'actors/shopify',
|
|
73
|
+
]);
|
|
74
|
+
});
|
|
75
|
+
it('allows overrideActorContext with disjoint sibling paths that all reach the actor folder via one entry', async () => {
|
|
76
|
+
await writeActorJson();
|
|
77
|
+
expect(loadActorConfig(entry({ overrideActorContext: ['actors/shopify', 'code', 'shared'] })).contextPaths).toEqual(['actors/shopify', 'code', 'shared']);
|
|
78
|
+
});
|
|
79
|
+
it('throws when overrideActorContext entries overlap (one is a prefix of another)', async () => {
|
|
80
|
+
await writeActorJson();
|
|
81
|
+
expect(() => loadActorConfig(entry({ overrideActorContext: ['actors/shopify', 'actors'] }))).toThrow(/overlap/);
|
|
82
|
+
});
|
|
83
|
+
it('throws when overrideActorContext contains the repo root alongside another entry', async () => {
|
|
84
|
+
await writeActorJson();
|
|
85
|
+
expect(() => loadActorConfig(entry({ overrideActorContext: ['', 'actors/shopify'] }))).toThrow(/overlap/);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('readConfigFile', () => {
|
|
89
|
+
// Golden output massaging the whole config reading process
|
|
90
|
+
it("carries the parser's normalization through to ActorConfig[]", async () => {
|
|
91
|
+
await writeFiles({
|
|
92
|
+
[CONFIG_FILE_NAME]: validConfig([
|
|
93
|
+
{ folder: '.', actorFullName: 'apify/root', tokenEnvVar: 'APIFY_TOKEN_APIFY' },
|
|
94
|
+
{
|
|
95
|
+
folder: 'actors/shopify/',
|
|
96
|
+
actorFullName: 'myteam/shopify',
|
|
97
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
98
|
+
overrideActorContext: ['actors/shopify/', 'packages/'],
|
|
99
|
+
},
|
|
100
|
+
]),
|
|
101
|
+
'.actor/actor.json': actorJson({}),
|
|
102
|
+
'actors/shopify/.actor/actor.json': actorJson({}),
|
|
103
|
+
});
|
|
104
|
+
expect(await readConfigFile(emptyActorSelection)).toEqual([
|
|
105
|
+
{
|
|
106
|
+
actorFullName: 'apify/root',
|
|
107
|
+
folder: '',
|
|
108
|
+
tokenEnvVar: 'APIFY_TOKEN_APIFY',
|
|
109
|
+
dockerContextDir: '',
|
|
110
|
+
contextPaths: [''],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
actorFullName: 'myteam/shopify',
|
|
114
|
+
folder: 'actors/shopify',
|
|
115
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
116
|
+
dockerContextDir: 'actors/shopify',
|
|
117
|
+
contextPaths: ['actors/shopify', 'packages'],
|
|
118
|
+
},
|
|
119
|
+
]);
|
|
120
|
+
});
|
|
121
|
+
it('throws when config file is missing', async () => {
|
|
122
|
+
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('not found');
|
|
123
|
+
});
|
|
124
|
+
it('throws when config file contains invalid JSON', async () => {
|
|
125
|
+
await writeFiles({ [CONFIG_FILE_NAME]: '{bad json' });
|
|
126
|
+
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('invalid JSON');
|
|
127
|
+
});
|
|
128
|
+
it('throws when the config file is not a JSON object', async () => {
|
|
129
|
+
await writeFiles({ [CONFIG_FILE_NAME]: JSON.stringify([{ folder: 'actors/shopify' }]) });
|
|
130
|
+
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow('"actors" array');
|
|
131
|
+
});
|
|
132
|
+
// The wording of a schema failure belongs to the strategy; this only checks that the failure
|
|
133
|
+
// reaches the caller rather than being swallowed on the way out of readConfigFile.
|
|
134
|
+
it('surfaces a schema failure from the parser', async () => {
|
|
135
|
+
await writeFiles({ [CONFIG_FILE_NAME]: JSON.stringify({ notActors: [] }) });
|
|
136
|
+
await expect(readConfigFile(emptyActorSelection)).rejects.toThrow(/at actors/);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=load-config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-config.test.js","sourceRoot":"","sources":["../../../../../../test/unit/bin/utils/config/load-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../../../../../test/unit/bin/utils/config/parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { _privates, parseConfigFile } from '../../../../../bin/utils/config/parser.js';
|
|
3
|
+
import { CONFIG_FILE_STRATEGY } from '../../../../../bin/utils/config/structures/base.js';
|
|
4
|
+
import { GROUPED_PARSER } from '../../../../../bin/utils/config/structures/grouped.js';
|
|
5
|
+
import { LEGACY_PARSER } from '../../../../../bin/utils/config/structures/legacy.js';
|
|
6
|
+
const { selectStrategy, verifyConfiguration } = _privates;
|
|
7
|
+
const actor = (fields = {}) => ({
|
|
8
|
+
folder: 'actors/shopify',
|
|
9
|
+
actorFullName: 'myteam/shopify',
|
|
10
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
11
|
+
overrideActorContext: undefined,
|
|
12
|
+
...fields,
|
|
13
|
+
});
|
|
14
|
+
describe('selectStrategy', () => {
|
|
15
|
+
it('falls back to the legacy strategy when no mode is declared', () => {
|
|
16
|
+
expect(selectStrategy({})).toBe(LEGACY_PARSER);
|
|
17
|
+
});
|
|
18
|
+
it.each([
|
|
19
|
+
[CONFIG_FILE_STRATEGY.LEGACY, LEGACY_PARSER],
|
|
20
|
+
[CONFIG_FILE_STRATEGY.GROUPED, GROUPED_PARSER],
|
|
21
|
+
])('honours an explicit "%s" mode', (mode, expected) => {
|
|
22
|
+
expect(selectStrategy({ mode })).toBe(expected);
|
|
23
|
+
});
|
|
24
|
+
it('throws on a mode no strategy is registered for', () => {
|
|
25
|
+
expect(() => selectStrategy('some-nonexistent-mode')).toThrow();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('verifyConfiguration', () => {
|
|
29
|
+
it('resolves the repo root to "" and gets rid of trailing slashes', () => {
|
|
30
|
+
const result = verifyConfiguration([
|
|
31
|
+
{ folder: '.', actorFullName: 'myteam/root', tokenEnvVar: 'APIFY_TOKEN', overrideActorContext: undefined },
|
|
32
|
+
{
|
|
33
|
+
folder: 'actors/shopify/',
|
|
34
|
+
actorFullName: 'myteam/shopify',
|
|
35
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
36
|
+
overrideActorContext: ['packages/'],
|
|
37
|
+
},
|
|
38
|
+
]);
|
|
39
|
+
expect(result).toEqual([
|
|
40
|
+
{ folder: '', actorFullName: 'myteam/root', tokenEnvVar: 'APIFY_TOKEN', overrideActorContext: undefined },
|
|
41
|
+
{
|
|
42
|
+
folder: 'actors/shopify',
|
|
43
|
+
actorFullName: 'myteam/shopify',
|
|
44
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
45
|
+
overrideActorContext: ['packages'],
|
|
46
|
+
},
|
|
47
|
+
]);
|
|
48
|
+
});
|
|
49
|
+
it.each([
|
|
50
|
+
['"." and ""', '.', ''],
|
|
51
|
+
['weird roots', '', './//'],
|
|
52
|
+
['a trailing slash', 'actors/shopify', 'actors/shopify/'],
|
|
53
|
+
])('rejects folders that collide once normalized: %s', (_name, first, second) => {
|
|
54
|
+
expect(() => verifyConfiguration([
|
|
55
|
+
actor({ folder: first, actorFullName: 'myteam/actor-a' }),
|
|
56
|
+
actor({ folder: second, actorFullName: 'myteam/actor-b' }),
|
|
57
|
+
])).toThrow(/Duplicate folder/);
|
|
58
|
+
});
|
|
59
|
+
it('quotes a duplicate folder the way it was written, not the way it normalized', () => {
|
|
60
|
+
expect(() => verifyConfiguration([
|
|
61
|
+
actor({ folder: '.', actorFullName: 'myteam/actor-a' }),
|
|
62
|
+
actor({ folder: './', actorFullName: 'myteam/actor-b' }),
|
|
63
|
+
])).toThrow('Duplicate folder "./"');
|
|
64
|
+
});
|
|
65
|
+
it('rejects two entries pointing at the same actor', () => {
|
|
66
|
+
expect(() => verifyConfiguration([actor({ folder: 'actors/a' }), actor({ folder: 'actors/b' })])).toThrow(/Duplicate actor "myteam\/shopify"/);
|
|
67
|
+
});
|
|
68
|
+
it('treats actorFullName case-sensitively — "myteam/A" is not "myteam/a"', () => {
|
|
69
|
+
expect(() => verifyConfiguration([
|
|
70
|
+
actor({ folder: 'actors/a', actorFullName: 'myteam/abc' }),
|
|
71
|
+
actor({ folder: 'actors/b', actorFullName: 'myteam/ABC' }),
|
|
72
|
+
])).not.toThrow();
|
|
73
|
+
});
|
|
74
|
+
it('reports every collision at once instead of stopping at the first', () => {
|
|
75
|
+
const message = (() => {
|
|
76
|
+
try {
|
|
77
|
+
verifyConfiguration([
|
|
78
|
+
actor({ folder: 'actors/a', actorFullName: 'myteam/actor-a' }),
|
|
79
|
+
actor({ folder: 'actors/a', actorFullName: 'myteam/actor-b' }),
|
|
80
|
+
actor({ folder: 'actors/c', actorFullName: 'myteam/actor-c' }),
|
|
81
|
+
actor({ folder: 'actors/d', actorFullName: 'myteam/actor-c' }),
|
|
82
|
+
]);
|
|
83
|
+
return '';
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return err.message;
|
|
87
|
+
}
|
|
88
|
+
})();
|
|
89
|
+
expect(message.split('\n')).toEqual([
|
|
90
|
+
'Duplicate folder "actors/a". Each actor must have a unique folder.',
|
|
91
|
+
'Duplicate actor "myteam/actor-c". Each entry must point at a different actor.',
|
|
92
|
+
]);
|
|
93
|
+
});
|
|
94
|
+
it('reports both problems for an entry that duplicates a folder and an actor at once', () => {
|
|
95
|
+
expect(() => verifyConfiguration([actor(), actor()])).toThrow(/Duplicate folder[\s\S]*Duplicate actor/);
|
|
96
|
+
});
|
|
97
|
+
it('accepts an empty configuration', () => {
|
|
98
|
+
expect(verifyConfiguration([])).toEqual([]);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('parseConfigFile', () => {
|
|
102
|
+
it('validates and normalizes a plain object without touching the filesystem', () => {
|
|
103
|
+
expect(parseConfigFile({ actors: [actor({ folder: 'actors/shopify/' })] })).toEqual([
|
|
104
|
+
actor({ folder: 'actors/shopify', overrideActorContext: undefined }),
|
|
105
|
+
]);
|
|
106
|
+
});
|
|
107
|
+
it('parses a grouped config file, which needs mode to be stripped', () => {
|
|
108
|
+
expect(parseConfigFile({
|
|
109
|
+
mode: CONFIG_FILE_STRATEGY.GROUPED,
|
|
110
|
+
groups: {
|
|
111
|
+
myteam: {
|
|
112
|
+
actors: [{ folder: 'actors/shopify/', actorFullName: 'myteam/shopify' }],
|
|
113
|
+
tokenEnvVar: 'APIFY_TOKEN',
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
})).toEqual([
|
|
117
|
+
actor({ folder: 'actors/shopify', actorFullName: 'myteam/shopify', overrideActorContext: undefined }),
|
|
118
|
+
]);
|
|
119
|
+
});
|
|
120
|
+
it('surfaces cross-entry violations from verifyConfiguration', () => {
|
|
121
|
+
expect(() => parseConfigFile({
|
|
122
|
+
actors: [
|
|
123
|
+
actor({ actorFullName: 'myteam/actor-a', folder: 'collide/collide' }),
|
|
124
|
+
actor({ actorFullName: 'myteam/actor-b', folder: 'collide/collide' }),
|
|
125
|
+
],
|
|
126
|
+
})).toThrow(/Duplicate folder/);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../../../../../test/unit/bin/utils/config/parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.test.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/bin/utils/config/structures/base.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { ACTOR_NAME, USERNAME } from '@apify/consts';
|
|
3
|
+
import { ACTOR_FULL_NAME_REGEX } from '../../../../../../bin/utils/config/structures/base.js';
|
|
4
|
+
// ACTOR_FULL_NAME_REGEX is spliced together from two platform constants by stripping their anchors
|
|
5
|
+
// and joining them with a "/". These tests are about the splice, not about re-testing the platform's
|
|
6
|
+
// own rules: an anchor left behind, an anchor stripped too eagerly, or the actor-name alternation
|
|
7
|
+
// losing its parentheses would all produce a regex that still looks plausible and matches the wrong
|
|
8
|
+
// things. The cases below are the ones that tell those failures apart.
|
|
9
|
+
describe('ACTOR_FULL_NAME_REGEX', () => {
|
|
10
|
+
it.each([
|
|
11
|
+
['apify/web-scraper'],
|
|
12
|
+
['myteam/shopify'],
|
|
13
|
+
['my.team/web-scraper'],
|
|
14
|
+
['my-team/shopify'],
|
|
15
|
+
['my_team/a1'],
|
|
16
|
+
// ACTOR_NAME's first alternative — a single character — is a legal actor name on its own.
|
|
17
|
+
['myteam/a'],
|
|
18
|
+
['myteam/a--b'],
|
|
19
|
+
])('accepts %s', (fullName) => {
|
|
20
|
+
expect(ACTOR_FULL_NAME_REGEX.test(fullName)).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it.each([
|
|
23
|
+
['there is no slash', 'shopify'],
|
|
24
|
+
['the owner half is empty', '/shopify'],
|
|
25
|
+
['the actor half is empty', 'myteam/'],
|
|
26
|
+
['there are two slashes', 'myteam//shopify'],
|
|
27
|
+
['there is a third segment', 'myteam/shopify/extra'],
|
|
28
|
+
['the owner holds a space', 'my team/shopify'],
|
|
29
|
+
['the actor name starts with a hyphen', 'myteam/-shopify'],
|
|
30
|
+
['the actor name ends with a hyphen', 'myteam/shopify-'],
|
|
31
|
+
['the actor name holds an underscore', 'myteam/web_scraper'],
|
|
32
|
+
['the actor name holds a dot', 'myteam/web.scraper'],
|
|
33
|
+
])('rejects a name where %s', (_name, fullName) => {
|
|
34
|
+
expect(ACTOR_FULL_NAME_REGEX.test(fullName)).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
// Both halves arrive anchored and get de-anchored so they can be joined; the composed regex has to
|
|
37
|
+
// put the anchors back. Without them these all match on a substring.
|
|
38
|
+
it.each([
|
|
39
|
+
['leading text', 'see myteam/shopify'],
|
|
40
|
+
['trailing text', 'myteam/shopify here'],
|
|
41
|
+
['a leading newline', '\nmyteam/shopify'],
|
|
42
|
+
['a trailing newline', 'myteam/shopify\n'],
|
|
43
|
+
['surrounding whitespace', ' myteam/shopify '],
|
|
44
|
+
])('matches the whole string, so it rejects %s', (_name, fullName) => {
|
|
45
|
+
expect(ACTOR_FULL_NAME_REGEX.test(fullName)).toBe(false);
|
|
46
|
+
});
|
|
47
|
+
// ACTOR_NAME's source is an alternation, "(A|B)". It survives the splice only because the platform
|
|
48
|
+
// wrote it parenthesized — lose those parens and the regex becomes "^owner/A|B$", where the "B"
|
|
49
|
+
// branch matches a bare actor name with no owner at all.
|
|
50
|
+
it('keeps the actor-name alternation from swallowing the owner half', () => {
|
|
51
|
+
expect(ACTOR_NAME.REGEX.source).toMatch(/^\^\(.*\)\$$/);
|
|
52
|
+
expect(ACTOR_FULL_NAME_REGEX.test('shopify')).toBe(false);
|
|
53
|
+
expect(ACTOR_FULL_NAME_REGEX.test('a')).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
// The owner half carries a {min,max} quantifier, the one part of either source that a sloppy strip
|
|
56
|
+
// could eat. Bounds come from the constants so this stays honest if the platform moves them.
|
|
57
|
+
it("enforces the platform's username length bounds", () => {
|
|
58
|
+
const owner = (length) => `${'a'.repeat(length)}/shopify`;
|
|
59
|
+
expect(ACTOR_FULL_NAME_REGEX.test(owner(USERNAME.MIN_LENGTH))).toBe(true);
|
|
60
|
+
expect(ACTOR_FULL_NAME_REGEX.test(owner(USERNAME.MIN_LENGTH - 1))).toBe(false);
|
|
61
|
+
expect(ACTOR_FULL_NAME_REGEX.test(owner(USERNAME.MAX_LENGTH))).toBe(true);
|
|
62
|
+
expect(ACTOR_FULL_NAME_REGEX.test(owner(USERNAME.MAX_LENGTH + 1))).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
// `.source` carries the pattern and none of the flags, so the flags have to be re-applied by hand.
|
|
65
|
+
// USERNAME.REGEX is declared /i and the platform does accept "MyTeam" as a username; drop that on
|
|
66
|
+
// the way here and the owner half silently becomes stricter than the thing it was copied from.
|
|
67
|
+
it('accepts either half in any case, the way the platform does', () => {
|
|
68
|
+
expect(USERNAME.REGEX.flags).toContain('i');
|
|
69
|
+
expect(ACTOR_FULL_NAME_REGEX.flags).toContain('i');
|
|
70
|
+
expect(ACTOR_FULL_NAME_REGEX.test('myteam/Shopify')).toBe(true);
|
|
71
|
+
expect(ACTOR_FULL_NAME_REGEX.test('MyTeam/shopify')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=base.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.test.js","sourceRoot":"","sources":["../../../../../../../test/unit/bin/utils/config/structures/base.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grouped.test.d.ts","sourceRoot":"","sources":["../../../../../../../test/unit/bin/utils/config/structures/grouped.test.ts"],"names":[],"mappings":""}
|