apify-test-tools 0.1.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 (103) hide show
  1. package/README.md +23 -0
  2. package/bin/build.ts +287 -0
  3. package/bin/consts.ts +6 -0
  4. package/bin/git.ts +56 -0
  5. package/bin/github.ts +75 -0
  6. package/bin/main.ts +145 -0
  7. package/bin/slack.ts +72 -0
  8. package/bin/test-report.ts +146 -0
  9. package/bin/types.ts +102 -0
  10. package/bin/utils.ts +204 -0
  11. package/dist/bin/build.d.ts +18 -0
  12. package/dist/bin/build.d.ts.map +1 -0
  13. package/dist/bin/build.js +222 -0
  14. package/dist/bin/build.js.map +1 -0
  15. package/dist/bin/consts.d.ts +4 -0
  16. package/dist/bin/consts.d.ts.map +1 -0
  17. package/dist/bin/consts.js +6 -0
  18. package/dist/bin/consts.js.map +1 -0
  19. package/dist/bin/git.d.ts +7 -0
  20. package/dist/bin/git.d.ts.map +1 -0
  21. package/dist/bin/git.js +47 -0
  22. package/dist/bin/git.js.map +1 -0
  23. package/dist/bin/github.d.ts +12 -0
  24. package/dist/bin/github.d.ts.map +1 -0
  25. package/dist/bin/github.js +64 -0
  26. package/dist/bin/github.js.map +1 -0
  27. package/dist/bin/main.d.ts +3 -0
  28. package/dist/bin/main.d.ts.map +1 -0
  29. package/dist/bin/main.js +117 -0
  30. package/dist/bin/main.js.map +1 -0
  31. package/dist/bin/slack.d.ts +12 -0
  32. package/dist/bin/slack.d.ts.map +1 -0
  33. package/dist/bin/slack.js +46 -0
  34. package/dist/bin/slack.js.map +1 -0
  35. package/dist/bin/test-report.d.ts +10 -0
  36. package/dist/bin/test-report.d.ts.map +1 -0
  37. package/dist/bin/test-report.js +74 -0
  38. package/dist/bin/test-report.js.map +1 -0
  39. package/dist/bin/types.d.ts +88 -0
  40. package/dist/bin/types.d.ts.map +1 -0
  41. package/dist/bin/types.js +2 -0
  42. package/dist/bin/types.js.map +1 -0
  43. package/dist/bin/utils.d.ts +26 -0
  44. package/dist/bin/utils.d.ts.map +1 -0
  45. package/dist/bin/utils.js +164 -0
  46. package/dist/bin/utils.js.map +1 -0
  47. package/dist/index.d.ts +3 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +3 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/lib/consts.d.ts +3 -0
  52. package/dist/lib/consts.d.ts.map +1 -0
  53. package/dist/lib/consts.js +14 -0
  54. package/dist/lib/consts.js.map +1 -0
  55. package/dist/lib/extend-expect.d.ts +3 -0
  56. package/dist/lib/extend-expect.d.ts.map +1 -0
  57. package/dist/lib/extend-expect.js +228 -0
  58. package/dist/lib/extend-expect.js.map +1 -0
  59. package/dist/lib/lib.d.ts +16 -0
  60. package/dist/lib/lib.d.ts.map +1 -0
  61. package/dist/lib/lib.js +91 -0
  62. package/dist/lib/lib.js.map +1 -0
  63. package/dist/lib/run-test-result.d.ts +20 -0
  64. package/dist/lib/run-test-result.d.ts.map +1 -0
  65. package/dist/lib/run-test-result.js +62 -0
  66. package/dist/lib/run-test-result.js.map +1 -0
  67. package/dist/lib/types.d.ts +107 -0
  68. package/dist/lib/types.d.ts.map +1 -0
  69. package/dist/lib/types.js +2 -0
  70. package/dist/lib/types.js.map +1 -0
  71. package/dist/lib/utils.d.ts +7 -0
  72. package/dist/lib/utils.d.ts.map +1 -0
  73. package/dist/lib/utils.js +30 -0
  74. package/dist/lib/utils.js.map +1 -0
  75. package/dist/test/unit/custom-matchers.test.d.ts +2 -0
  76. package/dist/test/unit/custom-matchers.test.d.ts.map +1 -0
  77. package/dist/test/unit/custom-matchers.test.js +53 -0
  78. package/dist/test/unit/custom-matchers.test.js.map +1 -0
  79. package/dist/test/unit/should-built-and-test.test.d.ts +2 -0
  80. package/dist/test/unit/should-built-and-test.test.d.ts.map +1 -0
  81. package/dist/test/unit/should-built-and-test.test.js +136 -0
  82. package/dist/test/unit/should-built-and-test.test.js.map +1 -0
  83. package/dist/test/unit/test-actor.test.d.ts +2 -0
  84. package/dist/test/unit/test-actor.test.d.ts.map +1 -0
  85. package/dist/test/unit/test-actor.test.js +17 -0
  86. package/dist/test/unit/test-actor.test.js.map +1 -0
  87. package/dist/tsconfig.tsbuildinfo +1 -0
  88. package/example-github-events/pull-request.json +523 -0
  89. package/example-github-events/push.json +216 -0
  90. package/index.ts +2 -0
  91. package/lib/consts.ts +15 -0
  92. package/lib/extend-expect.ts +268 -0
  93. package/lib/lib.ts +134 -0
  94. package/lib/run-test-result.ts +70 -0
  95. package/lib/types.ts +131 -0
  96. package/lib/utils.ts +49 -0
  97. package/package.json +41 -0
  98. package/scripts/hook-job-started.sh +11 -0
  99. package/test/tsconfig.json +15 -0
  100. package/test/unit/custom-matchers.test.ts +61 -0
  101. package/test/unit/should-built-and-test.test.ts +166 -0
  102. package/test/unit/test-actor.test.ts +17 -0
  103. package/tsconfig.json +20 -0
@@ -0,0 +1,228 @@
1
+ import { TO_FINISH_WITH_OPTIONS } from './consts.js';
2
+ export const extendExpect = (expect) => {
3
+ expect.extend({
4
+ toBeArray: (actual) => {
5
+ const pass = Array.isArray(actual);
6
+ return {
7
+ pass,
8
+ message: () => `Expected "${actual}" to be a array`,
9
+ };
10
+ },
11
+ toBeBoolean: (received) => {
12
+ const actual = typeof received;
13
+ const expected = 'boolean';
14
+ return {
15
+ pass: actual === expected,
16
+ message: () => `Expected "${actual}" to be a boolean`,
17
+ expected: 'boolean',
18
+ };
19
+ },
20
+ toBeEmptyArray: (actual) => {
21
+ const pass = Array.isArray(actual) && actual.length === 0;
22
+ return {
23
+ pass,
24
+ message: () => `Expected ${actual} to be an empty array`,
25
+ actual,
26
+ expected: [],
27
+ };
28
+ },
29
+ toBeNonEmptyArray: (actual) => {
30
+ const pass = Array.isArray(actual) && actual.length > 0;
31
+ return {
32
+ pass,
33
+ message: () => `Expected ${actual} to be a non-empty array`,
34
+ };
35
+ },
36
+ toBeNonEmptyString: (actual) => {
37
+ const pass = typeof actual === 'string' && actual.length > 0;
38
+ return {
39
+ pass,
40
+ message: () => `Expected "${actual}" to be a non-empty string`,
41
+ };
42
+ },
43
+ toBeNumber: (actual) => {
44
+ const pass = typeof actual === 'number';
45
+ return {
46
+ pass,
47
+ message: () => `Expected "${actual}" to be a number`,
48
+ };
49
+ },
50
+ toBeNonEmptyObject: (actual) => {
51
+ const isObject = typeof actual === 'object' && !Array.isArray(actual);
52
+ const isNonEmpty = Object.entries(actual).length > 0;
53
+ const pass = isObject && isNonEmpty;
54
+ return {
55
+ pass,
56
+ message: () => `Expected "${actual}" to be a non-emtpy object`,
57
+ };
58
+ },
59
+ toBeObject: (actual) => {
60
+ const pass = typeof actual === 'object' && !Array.isArray(actual);
61
+ return {
62
+ pass,
63
+ message: () => `Expected "${actual}" to be an object`,
64
+ };
65
+ },
66
+ toBeString: (received) => {
67
+ const actual = typeof received;
68
+ const expected = 'string';
69
+ return {
70
+ pass: actual === expected,
71
+ message: () => `Expected "${actual}" to be a string`,
72
+ actual,
73
+ expected,
74
+ };
75
+ },
76
+ toBeTrue: (actual) => {
77
+ const pass = actual === true;
78
+ return {
79
+ pass,
80
+ message: () => `Expected "${actual}" to be true`,
81
+ expected: true,
82
+ actual,
83
+ };
84
+ },
85
+ toBeFalse: (actual) => {
86
+ const pass = actual === false;
87
+ return {
88
+ pass,
89
+ message: () => `Expected "${actual}" to be false`,
90
+ };
91
+ },
92
+ toBeWholeNumber: (received) => {
93
+ const pass = Number.isInteger(received);
94
+ return {
95
+ pass,
96
+ message: () => `Expected "${received}" to be a whole number`,
97
+ };
98
+ },
99
+ toBeWithinRange: (received, lower, upper) => {
100
+ const pass = received >= lower && received <= upper;
101
+ return {
102
+ pass,
103
+ message: () => `Expected ${received} to be within range <${lower}, ${upper}>`,
104
+ };
105
+ },
106
+ toFinishWith: async (received, userOptions) => {
107
+ const options = {
108
+ ...TO_FINISH_WITH_OPTIONS,
109
+ ...userOptions,
110
+ };
111
+ const diffs = {
112
+ pass: true,
113
+ actual: ['Run:'],
114
+ expected: ['Run:'],
115
+ };
116
+ {
117
+ const expected = options?.status;
118
+ const actual = received.status;
119
+ diffs.pass = expected === actual;
120
+ diffs.actual.push(`status=${actual}`);
121
+ diffs.expected.push(`status=${expected}`);
122
+ }
123
+ const { chargedEventCounts, stats: { durationMillis }, } = await received.getRunInfo();
124
+ const datasetItemCount = (await received.getDataset()).items.length;
125
+ const stats = (await received.getStatistics());
126
+ isWithinInterval(diffs, datasetItemCount, options, 'datasetItemCount');
127
+ isWithinInterval(diffs, durationMillis, options, 'duration');
128
+ isWithinInterval(diffs, stats?.requestsFailed, options, 'failedRequests');
129
+ isWithinInterval(diffs, stats?.requestsRetries, options, 'requestsRetries');
130
+ const ppeDiffs = {
131
+ pass: true,
132
+ actual: ['PPE Events:'],
133
+ expected: ['PPE Events:'],
134
+ };
135
+ if (options.chargedEventCounts) {
136
+ const expected = options.chargedEventCounts;
137
+ const actual = chargedEventCounts ?? {};
138
+ const uniquePpeEvents = new Set([
139
+ ...Array.from(Object.keys(expected)),
140
+ ...Array.from(Object.keys(actual)),
141
+ ]);
142
+ for (const ppeEvent of uniquePpeEvents) {
143
+ if (!(ppeEvent in expected)) {
144
+ isWithinInterval(ppeDiffs, actual[ppeEvent], { [ppeEvent]: 0 }, ppeEvent);
145
+ continue;
146
+ }
147
+ if (!(ppeEvent in actual)) {
148
+ ppeDiffs.pass = false;
149
+ ppeDiffs.actual.push(`${ppeEvent}=X`);
150
+ ppeDiffs.expected.push(`${ppeEvent}=${expected[ppeEvent]}`);
151
+ continue;
152
+ }
153
+ isWithinInterval(ppeDiffs, actual[ppeEvent], expected, ppeEvent);
154
+ }
155
+ diffs.pass = ppeDiffs.pass;
156
+ diffs.actual.push(ppeDiffs.actual.join('\n '));
157
+ diffs.expected.push(ppeDiffs.expected.join('\n '));
158
+ }
159
+ {
160
+ const { forbiddenLogs } = options;
161
+ const log = await received.getLog();
162
+ const occuredLogs = [];
163
+ for (const forbiddenLog of forbiddenLogs) {
164
+ if (log.includes(forbiddenLog)) {
165
+ occuredLogs.push(forbiddenLog);
166
+ }
167
+ }
168
+ if (occuredLogs.length > 0) {
169
+ diffs.pass = false;
170
+ diffs.actual.push(` logs=[${occuredLogs.join(', ')}]`);
171
+ diffs.expected.push(` logs=[]`);
172
+ }
173
+ }
174
+ return {
175
+ pass: diffs.pass,
176
+ message: () => `Run ${received.id} didn't finish as expected`,
177
+ actual: diffs.actual.join('\n '),
178
+ expected: diffs.expected.join('\n '),
179
+ };
180
+ },
181
+ toStartWith: (received, prefix) => {
182
+ const pass = received?.startsWith(prefix);
183
+ return {
184
+ pass,
185
+ message: () => `Expected "${received}" to start with "${prefix}"`,
186
+ };
187
+ },
188
+ });
189
+ // here we are switching logic of expect and expect.soft
190
+ // expect => expect.soft
191
+ // expect.hard => expect
192
+ const { soft } = expect;
193
+ const oldExpect = { ...expect };
194
+ const softExpect = (actual, message) => {
195
+ return soft(actual, message);
196
+ };
197
+ for (const [key, value] of Object.entries(oldExpect)) {
198
+ // @ts-expect-error: No idea how to type this properly
199
+ softExpect[key] = value;
200
+ }
201
+ softExpect.hard = (actual, message) => {
202
+ return expect(actual, message);
203
+ };
204
+ return softExpect;
205
+ };
206
+ const isWithinInterval = (diffs, actual, options, intervalOption) => {
207
+ const expected = options[intervalOption];
208
+ if (expected === null) {
209
+ // check is disabled if expected value is null
210
+ return;
211
+ }
212
+ if (typeof expected === 'number') {
213
+ if (actual !== expected) {
214
+ diffs.pass = false;
215
+ diffs.actual.push(`${intervalOption}=${actual}`);
216
+ diffs.expected.push(`${intervalOption}=${expected}`);
217
+ }
218
+ }
219
+ else if (typeof expected === 'object') {
220
+ const { min, max } = expected;
221
+ if (actual === undefined || (min !== undefined && actual < min) || (max !== undefined && actual > max)) {
222
+ diffs.pass = false;
223
+ diffs.actual.push(`${intervalOption}=${actual}`);
224
+ diffs.expected.push(`${intervalOption}=<${min ?? ''},${max ?? ''}>`);
225
+ }
226
+ }
227
+ };
228
+ //# sourceMappingURL=extend-expect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend-expect.js","sourceRoot":"","sources":["../../lib/extend-expect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ExpectStatic, TestFunction, SuiteFactory, TestOptions, TestContext } from 'vitest';
2
+ import type { RunOptions } from './types';
3
+ import { RunTestResult } from './run-test-result.js';
4
+ export { ExpectStatic };
5
+ export declare const describe: (name: string, fn?: SuiteFactory<object>, options?: TestOptions) => void;
6
+ export declare const testActor: <T>(actorName: string, testName: string, fn: TestFunction<{
7
+ run: ReturnType<typeof createStartRunFn<T>>;
8
+ }>, testOptions?: TestOptions) => void;
9
+ export declare const testTestActor: <T>(testName: string, fn: TestFunction<{
10
+ run: ReturnType<typeof createStartRunFn<T>>;
11
+ }>) => void;
12
+ export declare const it: <T>(actorName: string, testName: string, fn: TestFunction<{
13
+ run: ReturnType<typeof createStartRunFn<T>>;
14
+ }>, testOptions?: TestOptions) => void;
15
+ declare const createStartRunFn: <T>(actorNameOrId: string, { annotate, task }: TestContext) => (runOptions: RunOptions<T>) => Promise<RunTestResult>;
16
+ //# sourceMappingURL=lib.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../lib/lib.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,YAAY,EACZ,YAAY,EAEZ,YAAY,EACZ,WAAW,EACX,WAAW,EACd,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwBrD,OAAO,EAAE,YAAY,EAAE,CAAC;AAYxB,eAAO,MAAM,QAAQ,SACX,MAAM,OACP,YAAY,CAAC,MAAM,CAAC,YAChB,WAAW,SAGvB,CAAC;AAMF,eAAO,MAAM,SAAS,GAAI,CAAC,aACZ,MAAM,YACP,MAAM,MACZ,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,gBACnD,WAAW,SAiB5B,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,CAAC,YACjB,MAAM,MACZ,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,SAWpE,CAAC;AAEF,eAAO,MAAM,EAAE,GAtCW,CAAC,aACZ,MAAM,YACP,MAAM,MACZ,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,gBACnD,WAAW,SAkCF,CAAC;AAE5B,QAAA,MAAM,gBAAgB,GAAI,CAAC,iBAAiB,MAAM,sBAAsB,WAAW,kBAIrD,UAAU,CAAC,CAAC,CAAC,2BA8B1C,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { ApifyClient } from 'apify-client';
2
+ import { describe as vitestDescribe, test as vitestTest, } from 'vitest';
3
+ import { RunTestResult } from './run-test-result.js';
4
+ import { extendExpect } from './extend-expect.js';
5
+ import { getActorPrefilledInput } from './utils.js';
6
+ const ACTOR_BUILDS = 'ACTOR_BUILDS';
7
+ let actorBuilds = [];
8
+ try {
9
+ const actorBuildsEnv = process.env[ACTOR_BUILDS];
10
+ if (actorBuildsEnv) {
11
+ actorBuilds = JSON.parse(actorBuildsEnv);
12
+ if (!Array.isArray(actorBuilds)) {
13
+ throw new Error(`${ACTOR_BUILDS} env variable should contain a JSON array, got ${typeof actorBuilds}`);
14
+ }
15
+ }
16
+ }
17
+ catch (err) {
18
+ throw new Error(`Failed to parse actor builds: ${err}`);
19
+ }
20
+ const config = actorBuilds.reduce((map, cfg) => {
21
+ map.set(cfg.actorName, cfg);
22
+ map.set(cfg.actorId, cfg);
23
+ return map;
24
+ }, new Map());
25
+ const { TESTER_APIFY_TOKEN, RUN_PLATFORM_TESTS, RUN_ALL_PLATFORM_TESTS } = process.env;
26
+ const apifyClient = new ApifyClient({ token: TESTER_APIFY_TOKEN });
27
+ const DEFAULT_TEST_OPTIONS = {
28
+ // we want to run tests concurrently
29
+ concurrent: true,
30
+ // test should finish within 1 hour
31
+ timeout: 60_000 * 60,
32
+ };
33
+ export const describe = (name, fn, options = DEFAULT_TEST_OPTIONS) => {
34
+ vitestDescribe.runIf(!!RUN_PLATFORM_TESTS || !!RUN_ALL_PLATFORM_TESTS)(name, options, fn);
35
+ };
36
+ const DEFAULT_TEST_ACTOR_OPTIONS = {
37
+ retry: 1,
38
+ };
39
+ export const testActor = (actorName, testName, fn, testOptions) => {
40
+ const options = {
41
+ ...DEFAULT_TEST_ACTOR_OPTIONS,
42
+ ...testOptions,
43
+ };
44
+ const name = `${actorName}: ${testName}`;
45
+ const shouldRun = !!RUN_ALL_PLATFORM_TESTS || config.has(actorName);
46
+ vitestTest.runIf(shouldRun)(name, options, async (context) => {
47
+ const { expect, ...rest } = context;
48
+ await fn({
49
+ expect: extendExpect(expect),
50
+ run: createStartRunFn(actorName, context),
51
+ ...rest,
52
+ });
53
+ });
54
+ };
55
+ export const testTestActor = (testName, fn) => {
56
+ vitestTest(testName, async (context) => {
57
+ const { expect, ...rest } = context;
58
+ await fn({
59
+ expect: extendExpect(expect),
60
+ // @ts-expect-error: this just to test custom matchers
61
+ run: () => { },
62
+ ...rest,
63
+ });
64
+ });
65
+ };
66
+ export const it = testActor;
67
+ const createStartRunFn = (actorNameOrId, { annotate, task }) => {
68
+ const actorConfig = config.get(actorNameOrId);
69
+ const build = actorConfig?.buildNumber;
70
+ const buildId = actorConfig?.buildId;
71
+ return async (runOptions) => {
72
+ const { input, options, prefilledInput, } = runOptions;
73
+ const actor = apifyClient.actor(actorNameOrId);
74
+ const actorInput = {
75
+ ...(prefilledInput && await getActorPrefilledInput(apifyClient, actorNameOrId, buildId)),
76
+ ...input,
77
+ };
78
+ const run = await actor.call(actorInput, { build, ...options, });
79
+ const runLink = `https://console.apify.com/view/runs/${run.id}`;
80
+ await annotate(runLink, 'run_link');
81
+ // @ts-expect-error: `TaskMeta` cannot be retyped
82
+ task.meta = {
83
+ runId: run.id,
84
+ runLink,
85
+ };
86
+ // waiting for datasetItemCount and chargedEventCounts to sync
87
+ await new Promise((resolve) => setTimeout(resolve, 10_000));
88
+ return new RunTestResult(apifyClient, run);
89
+ };
90
+ };
91
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../lib/lib.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { ActorRun, ApifyClient } from 'apify-client';
2
+ import type { Dataset, SdkCrawlerStatistics } from './types';
3
+ export declare class RunTestResult {
4
+ private readonly apifyClient;
5
+ private readonly run;
6
+ private log;
7
+ private dataset;
8
+ private statistics;
9
+ private runInfo;
10
+ private input;
11
+ constructor(apifyClient: ApifyClient, run: ActorRun);
12
+ getStatistics: () => Promise<SdkCrawlerStatistics | undefined>;
13
+ getLog: () => Promise<string>;
14
+ getDataset: <T>() => Promise<Dataset<T>>;
15
+ getInput: <T>() => Promise<T>;
16
+ getRunInfo: () => Promise<ActorRun>;
17
+ get id(): string;
18
+ get status(): string;
19
+ }
20
+ //# sourceMappingURL=run-test-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-test-result.d.ts","sourceRoot":"","sources":["../../lib/run-test-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE7D,qBAAa,aAAa;IAQlB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IARxB,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,KAAK,CAAsB;gBAGd,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,QAAQ;IAGlC,aAAa,QAAa,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAQjE;IAEF,MAAM,QAAa,OAAO,CAAC,MAAM,CAAC,CAOhC;IAEF,UAAU,GAAS,CAAC,OAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAQ1C;IAEF,QAAQ,GAAS,CAAC,OAAK,OAAO,CAAC,CAAC,CAAC,CAOhC;IAED,UAAU,QAAa,OAAO,CAAC,QAAQ,CAAC,CAOtC;IAEF,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACJ"}
@@ -0,0 +1,62 @@
1
+ export class RunTestResult {
2
+ apifyClient;
3
+ run;
4
+ log;
5
+ dataset;
6
+ statistics;
7
+ runInfo;
8
+ input;
9
+ constructor(apifyClient, run) {
10
+ this.apifyClient = apifyClient;
11
+ this.run = run;
12
+ }
13
+ getStatistics = async () => {
14
+ if (this.statistics) {
15
+ return this.statistics;
16
+ }
17
+ const kvs = this.apifyClient.keyValueStore(this.run.defaultKeyValueStoreId);
18
+ const stats = await kvs.getRecord('SDK_CRAWLER_STATISTICS_0');
19
+ this.statistics = stats?.value;
20
+ return this.statistics;
21
+ };
22
+ getLog = async () => {
23
+ if (this.log) {
24
+ return this.log;
25
+ }
26
+ const runLog = await this.apifyClient.run(this.id).log().get();
27
+ this.log = runLog;
28
+ return runLog;
29
+ };
30
+ getDataset = async () => {
31
+ if (this.dataset) {
32
+ return this.dataset;
33
+ }
34
+ const dataset = this.apifyClient.dataset(this.run.defaultDatasetId);
35
+ const items = (await dataset.listItems()).items;
36
+ this.dataset = { items };
37
+ return this.dataset;
38
+ };
39
+ getInput = async () => {
40
+ if (this.input) {
41
+ return this.input;
42
+ }
43
+ const kvs = this.apifyClient.keyValueStore(this.run.defaultKeyValueStoreId);
44
+ const input = await kvs.getRecord('INPUT');
45
+ return input;
46
+ };
47
+ getRunInfo = async () => {
48
+ if (this.runInfo) {
49
+ return this.runInfo;
50
+ }
51
+ const run = this.apifyClient.run(this.run.id);
52
+ this.runInfo = await run.get();
53
+ return this.runInfo;
54
+ };
55
+ get id() {
56
+ return this.run.id;
57
+ }
58
+ get status() {
59
+ return this.run.status;
60
+ }
61
+ }
62
+ //# sourceMappingURL=run-test-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-test-result.js","sourceRoot":"","sources":["../../lib/run-test-result.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,aAAa;IAQD;IACA;IARb,GAAG,CAAqB;IACxB,OAAO,CAA+B;IACtC,UAAU,CAAmC;IAC7C,OAAO,CAAuB;IAC9B,KAAK,CAAsB;IAEnC,YACqB,WAAwB,EACxB,GAAa;QADb,gBAAW,GAAX,WAAW,CAAa;QACxB,QAAG,GAAH,GAAG,CAAU;IACzB,CAAC;IAEV,aAAa,GAAG,KAAK,IAA+C,EAAE;QAClE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,KAAK,EAAE,KAAwC,CAAC;QAClE,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC,CAAC;IAEF,MAAM,GAAG,KAAK,IAAqB,EAAE;QACjC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,OAAO,IAAI,CAAC,GAAG,CAAC;QACpB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC/D,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,OAAO,MAAgB,CAAC;IAC5B,CAAC,CAAC;IAEF,UAAU,GAAG,KAAK,IAA2B,EAAE;QAC3C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,OAAqB,CAAC;QACtC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,KAAY,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,OAAqB,CAAC;IACtC,CAAC,CAAC;IAEF,QAAQ,GAAG,KAAK,IAAkB,EAAE;QAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,KAAU,CAAA;QAC1B,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,KAAU,CAAC;IACtB,CAAC,CAAA;IAED,UAAU,GAAG,KAAK,IAAuB,EAAE;QACvC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,OAAO,CAAC;QACxB,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAQ,CAAC;IACzB,CAAC,CAAC;IAEF,IAAI,EAAE;QACF,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3B,CAAC;CACJ"}
@@ -0,0 +1,107 @@
1
+ import { ActorCallOptions } from 'apify-client';
2
+ import { Assertion } from 'vitest';
3
+ export type ActorBuild = {
4
+ buildId: string;
5
+ actorId: string;
6
+ buildNumber: string;
7
+ actorName: string;
8
+ };
9
+ export type RunOptions<T> = {
10
+ input: Omit<T, 'actorName'>;
11
+ options?: ActorCallOptions;
12
+ prefilledInput?: boolean;
13
+ };
14
+ export type Dataset<T> = {
15
+ items: T[];
16
+ };
17
+ export type OpenInterval = {
18
+ min: number;
19
+ max?: undefined;
20
+ } | {
21
+ min?: undefined;
22
+ max: number;
23
+ };
24
+ export type ClosedInterval = {
25
+ min: number;
26
+ max: number;
27
+ };
28
+ export type Interval = number | OpenInterval | ClosedInterval;
29
+ export type ToFinishWithOptionsWithDefaults = {
30
+ status: RunStatus;
31
+ duration: Interval | null;
32
+ failedRequests: Interval | null;
33
+ requestsRetries: Interval | null;
34
+ forbiddenLogs: string[];
35
+ };
36
+ export type IntervalOption<PpeEvent extends string> = keyof Pick<ToFinishWithOptions<PpeEvent>, 'datasetItemCount' | 'requestsRetries' | 'failedRequests' | 'duration'>;
37
+ export type ToFinishWithOptions<PpeEvent extends string> = Partial<ToFinishWithOptionsWithDefaults> & {
38
+ datasetItemCount: Interval;
39
+ /**
40
+ * Define expected charged (PPE) event counts. You can also define count as `Interval`.
41
+ *
42
+ * Example
43
+ * ```ts
44
+ * chargedEventCounts: {
45
+ * 'actor-start': 4,
46
+ * 'item-pushed': { min: 10, max: 20 },
47
+ * }
48
+ * ```
49
+ *
50
+ * If you omit any PPE event, it's expected count will be 0.
51
+ * Assertion will fail if `chargedEventCounts` doesn't contain some of the expected events.
52
+ */
53
+ chargedEventCounts?: Record<PpeEvent, Interval>;
54
+ };
55
+ export type SdkCrawlerStatistics = {
56
+ requestsFinished: number;
57
+ requestsFailed: number;
58
+ requestsRetries: number;
59
+ requestsFailedPerMinute: number;
60
+ requestsFinishedPerMinute: number;
61
+ requestMinDurationMillis: number;
62
+ requestMaxDurationMillis: number;
63
+ requestRetryHistogram: number[];
64
+ requestTotalFailedDurationMillis: number;
65
+ requestTotalFinishedDurationMillis: number;
66
+ crawlerStartedAt: string;
67
+ crawlerFinishedAt: string;
68
+ statsPersistedAt: string;
69
+ crawlerRuntimeMillis: number;
70
+ crawlerLastStartTimestamp: number;
71
+ };
72
+ export type RunStatus = 'SUCCEEDED' | 'READY' | 'RUNNING' | 'FAILED' | 'ABORTING' | 'ABORTED' | 'TIMING-OUT' | 'TIMED-OUT';
73
+ export interface ActorMatchers<R = unknown> {
74
+ toBeArray: () => R;
75
+ toBeBoolean: () => R;
76
+ toBeEmptyArray: () => R;
77
+ toBeNonEmptyArray: () => R;
78
+ toBeNonEmptyString: () => R;
79
+ toBeNumber: () => R;
80
+ toBeFalse: () => R;
81
+ toBeTrue: () => R;
82
+ toBeNonEmptyObject: () => R;
83
+ toBeObject: () => R;
84
+ toBeString: () => R;
85
+ toBeWholeNumber: () => R;
86
+ toBeWithinRange: (lower: number, upper: number) => R;
87
+ /**
88
+ * Validates the following properties of a run:
89
+ * - `status` (default: `SUCCEEDED`)
90
+ * - `duration` in milliseconds (default: `{ min: 600, max: 600_000}` - <0.6s, 10min>)
91
+ * - `failedRequests` (default: `0`)
92
+ * - `requestsRetries` (default: `{ max: 3 }`)
93
+ * - `forbiddenLogs` (default: `['ReferenceError', 'TypeError']`)
94
+ * - `datasetItemCount` (required)
95
+ * - `chargedEventCounts`
96
+ */
97
+ toFinishWith: <PpeEvent extends string>(options: ToFinishWithOptions<PpeEvent>) => Promise<R>;
98
+ toStartWith: (prefix: string) => R;
99
+ hard: <T>(actual: T, message?: string) => Assertion;
100
+ }
101
+ declare module 'vitest' {
102
+ interface Assertion<T = any> extends ActorMatchers<T> {
103
+ }
104
+ interface AsymmetricMatchersContaining extends ActorMatchers {
105
+ }
106
+ }
107
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import { ApifyClient } from 'apify-client';
2
+ /**
3
+ * Gets prefilled values for a provided build or, if not provided, uses actor's
4
+ * default build (this is usually `latest`).
5
+ */
6
+ export declare const getActorPrefilledInput: (apifyClient: ApifyClient, actorNameOrId: string, buildId: string | undefined) => Promise<Record<string, unknown>>;
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,sBAAsB,gBAClB,WAAW,iBACT,MAAM,WACZ,MAAM,GAAG,SAAS,qCAuC9B,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Gets prefilled values for a provided build or, if not provided, uses actor's
3
+ * default build (this is usually `latest`).
4
+ */
5
+ export const getActorPrefilledInput = async (apifyClient, actorNameOrId, buildId) => {
6
+ if (!buildId) {
7
+ const actorInfo = await apifyClient.actor(actorNameOrId).get();
8
+ const defaultBuildTag = actorInfo?.defaultRunOptions.build;
9
+ const taggedBuild = actorInfo?.taggedBuilds?.[defaultBuildTag || ''];
10
+ buildId = taggedBuild?.buildId;
11
+ if (!buildId) {
12
+ console.error(`Coudn't find default build for actor ${actorNameOrId}. Prefilled values will not be used.`);
13
+ return {};
14
+ }
15
+ }
16
+ const buildInfo = await apifyClient.build(buildId).get();
17
+ const inputSchema = buildInfo?.actorDefinition?.input;
18
+ if (!inputSchema) {
19
+ console.error(`Coudn't find input schema definition for actor ${actorNameOrId}, build ${buildId}.`, 'Prefilled values will not be used');
20
+ return {};
21
+ }
22
+ const prefill = {};
23
+ for (const [propertyName, propertyValue] of Object.entries(inputSchema.properties)) {
24
+ if (propertyValue.prefill !== undefined) {
25
+ prefill[propertyName] = propertyValue.prefill;
26
+ }
27
+ }
28
+ return prefill;
29
+ };
30
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACvC,WAAwB,EACxB,aAAqB,EACrB,OAA2B,EAC7B,EAAE;IACA,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,CAAC;QAE/D,MAAM,eAAe,GAAG,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC;QAE3D,MAAM,WAAW,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACrE,OAAO,GAAG,WAAW,EAAE,OAAO,CAAC;QAE/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,aAAa,sCAAsC,CAAC,CAAC;YAC3G,OAAO,EAAE,CAAA;QACb,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC;IAEzD,MAAM,WAAW,GAAG,SAAS,EAAE,eAAe,EAAE,KAEnC,CAAA;IAEb,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACT,kDAAkD,aAAa,WAAW,OAAO,GAAG,EACpF,mCAAmC,CACtC,CAAC;QACF,OAAO,EAAE,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAA4B,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QACjF,IAAI,aAAa,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC;QAClD,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=custom-matchers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-matchers.test.d.ts","sourceRoot":"","sources":["../../../test/unit/custom-matchers.test.ts"],"names":[],"mappings":""}