apify-test-tools 0.5.3 → 0.5.4
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/dist/bin/build.d.ts +18 -0
- package/dist/bin/build.d.ts.map +1 -0
- package/dist/bin/build.js +229 -0
- package/dist/bin/build.js.map +1 -0
- package/dist/bin/consts.d.ts +4 -0
- package/dist/bin/consts.d.ts.map +1 -0
- package/dist/bin/consts.js +6 -0
- package/dist/bin/consts.js.map +1 -0
- package/dist/bin/git.d.ts +14 -0
- package/dist/bin/git.d.ts.map +1 -0
- package/dist/bin/git.js +43 -0
- package/dist/bin/git.js.map +1 -0
- package/dist/bin/github.d.ts +13 -0
- package/dist/bin/github.d.ts.map +1 -0
- package/dist/bin/github.js +59 -0
- package/dist/bin/github.js.map +1 -0
- package/dist/bin/main.d.ts +3 -0
- package/dist/bin/main.d.ts.map +1 -0
- package/dist/bin/main.js +124 -0
- package/dist/bin/main.js.map +1 -0
- package/dist/bin/slack.d.ts +13 -0
- package/dist/bin/slack.d.ts.map +1 -0
- package/dist/bin/slack.js +51 -0
- package/dist/bin/slack.js.map +1 -0
- package/dist/bin/test-report.d.ts +10 -0
- package/dist/bin/test-report.d.ts.map +1 -0
- package/dist/bin/test-report.js +74 -0
- package/dist/bin/test-report.js.map +1 -0
- package/dist/bin/types.d.ts +89 -0
- package/dist/bin/types.d.ts.map +1 -0
- package/dist/bin/types.js +2 -0
- package/dist/bin/types.js.map +1 -0
- package/dist/bin/utils.d.ts +29 -0
- package/dist/bin/utils.d.ts.map +1 -0
- package/dist/bin/utils.js +169 -0
- package/dist/bin/utils.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/consts.d.ts +3 -0
- package/dist/lib/consts.d.ts.map +1 -0
- package/dist/lib/consts.js +12 -0
- package/dist/lib/consts.js.map +1 -0
- package/dist/lib/extend-expect.d.ts +3 -0
- package/dist/lib/extend-expect.d.ts.map +1 -0
- package/dist/lib/extend-expect.js +257 -0
- package/dist/lib/extend-expect.js.map +1 -0
- package/dist/lib/lib.d.ts +38 -0
- package/dist/lib/lib.d.ts.map +1 -0
- package/dist/lib/lib.js +217 -0
- package/dist/lib/lib.js.map +1 -0
- package/dist/lib/run-test-result.d.ts +22 -0
- package/dist/lib/run-test-result.d.ts.map +1 -0
- package/dist/lib/run-test-result.js +73 -0
- package/dist/lib/run-test-result.js.map +1 -0
- package/dist/lib/types.d.ts +127 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts +8 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +33 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/test/unit/bin/git.test.d.ts +2 -0
- package/dist/test/unit/bin/git.test.d.ts.map +1 -0
- package/dist/test/unit/bin/git.test.js +81 -0
- package/dist/test/unit/bin/git.test.js.map +1 -0
- package/dist/test/unit/custom-matchers.test.d.ts +2 -0
- package/dist/test/unit/custom-matchers.test.d.ts.map +1 -0
- package/dist/test/unit/custom-matchers.test.js +75 -0
- package/dist/test/unit/custom-matchers.test.js.map +1 -0
- package/dist/test/unit/parse-commit.test.d.ts +2 -0
- package/dist/test/unit/parse-commit.test.d.ts.map +1 -0
- package/dist/test/unit/parse-commit.test.js +57 -0
- package/dist/test/unit/parse-commit.test.js.map +1 -0
- package/dist/test/unit/should-built-and-test.test.d.ts +2 -0
- package/dist/test/unit/should-built-and-test.test.d.ts.map +1 -0
- package/dist/test/unit/should-built-and-test.test.js +136 -0
- package/dist/test/unit/should-built-and-test.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,257 @@
|
|
|
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 failedAssertions = [];
|
|
112
|
+
const diffs = {
|
|
113
|
+
pass: true,
|
|
114
|
+
actual: ['Run:'],
|
|
115
|
+
expected: ['Run:'],
|
|
116
|
+
};
|
|
117
|
+
{
|
|
118
|
+
const expected = options?.status;
|
|
119
|
+
const actual = received.status;
|
|
120
|
+
const statusTest = expected === actual;
|
|
121
|
+
if (statusTest === false) {
|
|
122
|
+
diffs.pass = false;
|
|
123
|
+
diffs.actual.push(`status=${actual}`);
|
|
124
|
+
diffs.expected.push(`status=${expected}`);
|
|
125
|
+
failedAssertions.push(`Failed status check, expected "${expected}", got "${actual}".`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const { chargedEventCounts, stats: { durationMillis }, } = await received.getRunInfo();
|
|
129
|
+
const datasetItemCount = (await received.getDataset()).items.length;
|
|
130
|
+
const stats = await received.getStatistics();
|
|
131
|
+
const checkInterval = (value, key, label) => {
|
|
132
|
+
const result = isWithinInterval(diffs, value, options, key);
|
|
133
|
+
if (result === false) {
|
|
134
|
+
failedAssertions.push(`Failed ${label} check, expected ${JSON.stringify(options[key])}, got ${value}.`);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
checkInterval(datasetItemCount, 'datasetItemCount', 'dataset item count');
|
|
138
|
+
checkInterval(durationMillis, 'duration', 'duration');
|
|
139
|
+
checkInterval(stats?.requestsFailed, 'failedRequests', 'failed requests');
|
|
140
|
+
checkInterval(stats?.requestsRetries, 'requestsRetries', 'requests retries');
|
|
141
|
+
{
|
|
142
|
+
if (options.maxRetriesPerRequest !== null) {
|
|
143
|
+
const maxRetriesPerRequestObserved = (stats?.requestRetryHistogram ?? [0]).length - 1;
|
|
144
|
+
if (maxRetriesPerRequestObserved > options.maxRetriesPerRequest) {
|
|
145
|
+
diffs.pass = false;
|
|
146
|
+
diffs.actual.push(`maxRetriesPerRequest=${maxRetriesPerRequestObserved}`);
|
|
147
|
+
diffs.expected.push(`maxRetriesPerRequest<=${options.maxRetriesPerRequest}`);
|
|
148
|
+
failedAssertions.push(`Failed max retries observed check, expected <=${options.maxRetriesPerRequest}, got ${maxRetriesPerRequestObserved}.`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const ppeDiffs = {
|
|
153
|
+
pass: true,
|
|
154
|
+
actual: ['PPE Events:'],
|
|
155
|
+
expected: ['PPE Events:'],
|
|
156
|
+
};
|
|
157
|
+
if (options.chargedEventCounts) {
|
|
158
|
+
const expected = options.chargedEventCounts;
|
|
159
|
+
const actual = chargedEventCounts ?? {};
|
|
160
|
+
const uniquePpeEvents = new Set([
|
|
161
|
+
...Array.from(Object.keys(expected)),
|
|
162
|
+
...Array.from(Object.keys(actual)),
|
|
163
|
+
]);
|
|
164
|
+
for (const ppeEvent of uniquePpeEvents) {
|
|
165
|
+
if (!(ppeEvent in expected)) {
|
|
166
|
+
isWithinInterval(ppeDiffs, actual[ppeEvent], { [ppeEvent]: 0 }, ppeEvent);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (!(ppeEvent in actual)) {
|
|
170
|
+
ppeDiffs.pass = false;
|
|
171
|
+
ppeDiffs.actual.push(`${ppeEvent}=X`);
|
|
172
|
+
ppeDiffs.expected.push(`${ppeEvent}=${expected[ppeEvent]}`);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
isWithinInterval(ppeDiffs, actual[ppeEvent], expected, ppeEvent);
|
|
176
|
+
}
|
|
177
|
+
if (ppeDiffs.pass === false) {
|
|
178
|
+
diffs.pass = ppeDiffs.pass;
|
|
179
|
+
diffs.actual.push(ppeDiffs.actual.join('\n '));
|
|
180
|
+
diffs.expected.push(ppeDiffs.expected.join('\n '));
|
|
181
|
+
failedAssertions.push(`Failed PPE event counts check, expected ${JSON.stringify(options.chargedEventCounts)}, got ${JSON.stringify(chargedEventCounts)}.`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
{
|
|
185
|
+
const { forbiddenLogs } = options;
|
|
186
|
+
const log = await received.getLog();
|
|
187
|
+
const occuredLogs = [];
|
|
188
|
+
for (const forbiddenLog of forbiddenLogs) {
|
|
189
|
+
if (log.includes(forbiddenLog)) {
|
|
190
|
+
occuredLogs.push(forbiddenLog);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (occuredLogs.length > 0) {
|
|
194
|
+
diffs.pass = false;
|
|
195
|
+
diffs.actual.push(` logs=[${occuredLogs.join(', ')}]`);
|
|
196
|
+
diffs.expected.push(` logs=[]`);
|
|
197
|
+
failedAssertions.push(`Failed forbidden logs check, expected [] but got [${occuredLogs.join(', ')}].`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
pass: diffs.pass,
|
|
202
|
+
message: () => `Run did not finish as expected. Failed assertions: ${failedAssertions.join(' ')}`,
|
|
203
|
+
actual: diffs.actual.join('\n '),
|
|
204
|
+
expected: diffs.expected.join('\n '),
|
|
205
|
+
};
|
|
206
|
+
},
|
|
207
|
+
toStartWith: (received, prefix) => {
|
|
208
|
+
const pass = received?.startsWith(prefix);
|
|
209
|
+
return {
|
|
210
|
+
pass,
|
|
211
|
+
message: () => `Expected "${received}" to start with "${prefix}"`,
|
|
212
|
+
};
|
|
213
|
+
},
|
|
214
|
+
});
|
|
215
|
+
// here we are switching logic of expect and expect.soft
|
|
216
|
+
// expect => expect.soft
|
|
217
|
+
// expect.hard => expect
|
|
218
|
+
const { soft } = expect;
|
|
219
|
+
const oldExpect = { ...expect };
|
|
220
|
+
const softExpect = (actual, message) => {
|
|
221
|
+
return soft(actual, message);
|
|
222
|
+
};
|
|
223
|
+
for (const [key, value] of Object.entries(oldExpect)) {
|
|
224
|
+
// @ts-expect-error: No idea how to type this properly
|
|
225
|
+
softExpect[key] = value;
|
|
226
|
+
}
|
|
227
|
+
softExpect.hard = (actual, message) => {
|
|
228
|
+
return expect(actual, message);
|
|
229
|
+
};
|
|
230
|
+
return softExpect;
|
|
231
|
+
};
|
|
232
|
+
const isWithinInterval = (diffs, actual, options, intervalOption) => {
|
|
233
|
+
const expected = options[intervalOption];
|
|
234
|
+
if (expected === null) {
|
|
235
|
+
// check is disabled if expected value is null
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (typeof expected === 'number') {
|
|
239
|
+
if (actual !== expected) {
|
|
240
|
+
diffs.pass = false;
|
|
241
|
+
diffs.actual.push(`${intervalOption}=${actual}`);
|
|
242
|
+
diffs.expected.push(`${intervalOption}=${expected}`);
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else if (typeof expected === 'object') {
|
|
247
|
+
const { min, max } = expected;
|
|
248
|
+
if (actual === undefined || (min !== undefined && actual < min) || (max !== undefined && actual > max)) {
|
|
249
|
+
diffs.pass = false;
|
|
250
|
+
diffs.actual.push(`${intervalOption}=${actual}`);
|
|
251
|
+
diffs.expected.push(`${intervalOption}=<${min ?? ''},${max ?? ''}>`);
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return;
|
|
256
|
+
};
|
|
257
|
+
//# 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,38 @@
|
|
|
1
|
+
import { ExpectStatic, TestFunction, SuiteFactory, TestContext } from 'vitest';
|
|
2
|
+
import type { ActorTestOptions, RunOptions } from './types.js';
|
|
3
|
+
import { RunTestResult } from './run-test-result.js';
|
|
4
|
+
export { ExpectStatic };
|
|
5
|
+
export declare const describe: (name: string, fn?: SuiteFactory<object>, options?: ActorTestOptions) => void;
|
|
6
|
+
export declare const testActor: <T>(actorName: string, testName: string, fn: TestFunction<{
|
|
7
|
+
run: ReturnType<typeof createStartRunFn<T>>;
|
|
8
|
+
}>, testOptions?: ActorTestOptions) => void;
|
|
9
|
+
/**
|
|
10
|
+
* This wrapper creates a new task with specific `build` of the standby actor and provides
|
|
11
|
+
* `callStandby` function, which calls the task's `standbyUrl`.
|
|
12
|
+
*
|
|
13
|
+
* Using task is just current shortcoming of standby feature but ideally we would use Actor directly
|
|
14
|
+
*/
|
|
15
|
+
export declare const testStandbyActor: <I = any, O = any>(actorName: string, testName: string, fn: TestFunction<{
|
|
16
|
+
callStandby: ReturnType<typeof createStartStandbyFn<I, O>>;
|
|
17
|
+
}>, testOptions?: ActorTestOptions) => void;
|
|
18
|
+
export declare const testTestActor: <T>(testName: string, fn: TestFunction<{
|
|
19
|
+
run: ReturnType<typeof createStartRunFn<T>>;
|
|
20
|
+
}>) => void;
|
|
21
|
+
export declare const it: <T>(actorName: string, testName: string, fn: TestFunction<{
|
|
22
|
+
run: ReturnType<typeof createStartRunFn<T>>;
|
|
23
|
+
}>, testOptions?: ActorTestOptions) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a function the accepts input for a standby actor and sends request containing input
|
|
26
|
+
* to the task's standby url.
|
|
27
|
+
*/
|
|
28
|
+
declare const createStartStandbyFn: <I, O>(standbyTask: StandbyTask) => ({ input }: Pick<RunOptions<I>, "input">) => Promise<{
|
|
29
|
+
data: O;
|
|
30
|
+
status: number;
|
|
31
|
+
headers: Headers;
|
|
32
|
+
}>;
|
|
33
|
+
interface StandbyTask {
|
|
34
|
+
standbyUrl: string;
|
|
35
|
+
taskId: string;
|
|
36
|
+
}
|
|
37
|
+
declare const createStartRunFn: <T>(actorNameOrId: string, testContext: TestContext) => (runOptions: RunOptions<T>) => Promise<RunTestResult>;
|
|
38
|
+
//# 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,EACd,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAc,gBAAgB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwBrD,OAAO,EAAE,YAAY,EAAE,CAAC;AAYxB,eAAO,MAAM,QAAQ,SAAU,MAAM,OAAO,YAAY,CAAC,MAAM,CAAC,YAAW,gBAAgB,SAE1F,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,gBAAgB,SAgBjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,QAAQ,CAAC,mBAC5B,MAAM,YACP,MAAM,MACZ,YAAY,CAAC;IAAE,WAAW,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,gBAClE,gBAAgB,SAkCjC,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,GAnFW,CAAC,aACZ,MAAM,YACP,MAAM,MACZ,YAAY,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,gBACnD,gBAAgB,SA+EP,CAAC;AAE5B;;;GAGG;AACH,QAAA,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,eAAe,WAAW,iBAE/B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;;;;EAgBxD,CAAC;AAEF,UAAU,WAAW;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAmED,QAAA,MAAM,gBAAgB,GAAI,CAAC,iBAAiB,MAAM,eAAe,WAAW,kBAK9C,UAAU,CAAC,CAAC,CAAC,2BAiC1C,CAAC"}
|
package/dist/lib/lib.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
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, sleep } 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
|
+
/**
|
|
56
|
+
* This wrapper creates a new task with specific `build` of the standby actor and provides
|
|
57
|
+
* `callStandby` function, which calls the task's `standbyUrl`.
|
|
58
|
+
*
|
|
59
|
+
* Using task is just current shortcoming of standby feature but ideally we would use Actor directly
|
|
60
|
+
*/
|
|
61
|
+
export const testStandbyActor = (actorName, testName, fn, testOptions) => {
|
|
62
|
+
const options = {
|
|
63
|
+
...DEFAULT_TEST_ACTOR_OPTIONS,
|
|
64
|
+
...testOptions,
|
|
65
|
+
};
|
|
66
|
+
const name = `${actorName}: ${testName}`;
|
|
67
|
+
const shouldRun = !!RUN_ALL_PLATFORM_TESTS || config.has(actorName);
|
|
68
|
+
vitestTest.runIf(shouldRun)(name, options, async (context) => {
|
|
69
|
+
const standbyTask = await createStandbyTask(actorName, config.get(actorName)?.buildNumber);
|
|
70
|
+
const { annotate } = context;
|
|
71
|
+
const { expect, ...rest } = context;
|
|
72
|
+
// NOTE: we need to wrap `fn` in try-catch so that we can always clean up (delete the task) afterwards
|
|
73
|
+
try {
|
|
74
|
+
await fn({
|
|
75
|
+
expect: extendExpect(expect),
|
|
76
|
+
callStandby: createStartStandbyFn(standbyTask),
|
|
77
|
+
...rest,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch { }
|
|
81
|
+
const { taskId } = standbyTask;
|
|
82
|
+
const runs = (await apifyClient.task(taskId).runs().list()).items;
|
|
83
|
+
for (const run of runs) {
|
|
84
|
+
const runLink = generateRunLink(run);
|
|
85
|
+
await annotate(`${name} - ${runLink}`, 'run_link');
|
|
86
|
+
}
|
|
87
|
+
if (taskId) {
|
|
88
|
+
await apifyClient.task(taskId).delete();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
export const testTestActor = (testName, fn) => {
|
|
93
|
+
vitestTest(testName, async (context) => {
|
|
94
|
+
const { expect, ...rest } = context;
|
|
95
|
+
await fn({
|
|
96
|
+
expect: extendExpect(expect),
|
|
97
|
+
// @ts-expect-error: this just to test custom matchers
|
|
98
|
+
run: () => { },
|
|
99
|
+
...rest,
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
export const it = testActor;
|
|
104
|
+
/**
|
|
105
|
+
* Creates a function the accepts input for a standby actor and sends request containing input
|
|
106
|
+
* to the task's standby url.
|
|
107
|
+
*/
|
|
108
|
+
const createStartStandbyFn = (standbyTask) => {
|
|
109
|
+
const { standbyUrl } = standbyTask;
|
|
110
|
+
return async ({ input }) => {
|
|
111
|
+
const response = await fetch(standbyUrl, {
|
|
112
|
+
headers: {
|
|
113
|
+
Authorization: `Bearer ${apifyClient.token}`,
|
|
114
|
+
},
|
|
115
|
+
method: 'POST',
|
|
116
|
+
body: JSON.stringify(input),
|
|
117
|
+
});
|
|
118
|
+
const data = (await response.json());
|
|
119
|
+
return {
|
|
120
|
+
data,
|
|
121
|
+
status: response.status,
|
|
122
|
+
headers: response.headers,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
const randomInt = (min, max) => {
|
|
127
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Creates a task with specific `build` - either `buildNumber` or default.
|
|
131
|
+
*
|
|
132
|
+
* @throws if actor doesn't exist or it doesn't support standby mode.
|
|
133
|
+
*/
|
|
134
|
+
const createStandbyTask = async (actorNameOrId, buildNumber) => {
|
|
135
|
+
const actor = apifyClient.actor(actorNameOrId);
|
|
136
|
+
const actorInfo = (await actor.get());
|
|
137
|
+
if (!actorInfo) {
|
|
138
|
+
throw new Error(`Actor "${actorNameOrId}" not found`);
|
|
139
|
+
}
|
|
140
|
+
if (!actorInfo.standbyUrl) {
|
|
141
|
+
throw new Error(`Actor "${actorNameOrId}" doesn't support standby mode`);
|
|
142
|
+
}
|
|
143
|
+
if (!actorInfo.actorStandby) {
|
|
144
|
+
throw new Error(`Actor "${actorNameOrId} doesn't contain actorStandby options`);
|
|
145
|
+
}
|
|
146
|
+
const { isEnabled, ...defaultActorStandby } = actorInfo.actorStandby;
|
|
147
|
+
// @ts-expect-error This is not typed properly in ApifyClient, we need to remove it or API fails
|
|
148
|
+
delete defaultActorStandby.disableStandbyFieldsOverride;
|
|
149
|
+
const build = buildNumber ?? defaultActorStandby.build;
|
|
150
|
+
const actorStandbyOptions = {
|
|
151
|
+
...defaultActorStandby,
|
|
152
|
+
build,
|
|
153
|
+
};
|
|
154
|
+
try {
|
|
155
|
+
const title = `Test task - ${build}:${actorNameOrId}`.slice(0, 62);
|
|
156
|
+
// we try to create unique task name containing only `a-z0-9-` characters and at most 63 characters long
|
|
157
|
+
const name = `${randomInt(1, 1_000_000)}${title
|
|
158
|
+
.toLowerCase()
|
|
159
|
+
.replaceAll(/\s+/g, '')
|
|
160
|
+
.replaceAll(/[^a-z0-9-]+/g, '-')}`.slice(0, 62);
|
|
161
|
+
const newTask = (await apifyClient.tasks().create({
|
|
162
|
+
actId: actorNameOrId,
|
|
163
|
+
actorStandby: actorStandbyOptions,
|
|
164
|
+
description: `Task for testing standby version ${build}`,
|
|
165
|
+
title,
|
|
166
|
+
name,
|
|
167
|
+
}));
|
|
168
|
+
const { id, standbyUrl } = newTask;
|
|
169
|
+
if (!standbyUrl) {
|
|
170
|
+
throw new Error(`Task "${id} doesn't contain standbyUrl property`);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
standbyUrl,
|
|
174
|
+
taskId: id,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
throw new Error(`Failed to create task: ${error}`);
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const createStartRunFn = (actorNameOrId, testContext) => {
|
|
182
|
+
const { annotate, task } = testContext;
|
|
183
|
+
const actorConfig = config.get(actorNameOrId);
|
|
184
|
+
const build = actorConfig?.buildNumber;
|
|
185
|
+
const buildId = actorConfig?.buildId;
|
|
186
|
+
return async (runOptions) => {
|
|
187
|
+
const { input, options, prefilledInput, runId } = runOptions;
|
|
188
|
+
if (runId) {
|
|
189
|
+
const run = await apifyClient.run(runId).get();
|
|
190
|
+
if (!run) {
|
|
191
|
+
throw new Error(`Run with id "${runId}" doesn't exist`);
|
|
192
|
+
}
|
|
193
|
+
return new RunTestResult(apifyClient, run);
|
|
194
|
+
}
|
|
195
|
+
const actor = apifyClient.actor(actorNameOrId);
|
|
196
|
+
const actorInput = {
|
|
197
|
+
...(prefilledInput && (await getActorPrefilledInput(apifyClient, actorNameOrId, buildId))),
|
|
198
|
+
...input,
|
|
199
|
+
};
|
|
200
|
+
const run = await actor.call(actorInput, { build, ...options });
|
|
201
|
+
const runLink = generateRunLink(run);
|
|
202
|
+
await annotate(`${task.name} - ${runLink}`, 'run_link');
|
|
203
|
+
// @ts-expect-error: `TaskMeta` cannot be retyped
|
|
204
|
+
task.meta = {
|
|
205
|
+
runId: run.id,
|
|
206
|
+
runLink,
|
|
207
|
+
actorName: actorNameOrId,
|
|
208
|
+
};
|
|
209
|
+
// waiting for datasetItemCount and chargedEventCounts to sync
|
|
210
|
+
await sleep(10_000);
|
|
211
|
+
return new RunTestResult(apifyClient, run);
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
const generateRunLink = (run) => {
|
|
215
|
+
return `https://console.apify.com/view/runs/${run.id}`;
|
|
216
|
+
};
|
|
217
|
+
//# 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,22 @@
|
|
|
1
|
+
import { ActorRun, ApifyClient, KeyValueStoreClient } from 'apify-client';
|
|
2
|
+
import type { Dataset, SdkCrawlerStatistics } from './types.js';
|
|
3
|
+
export declare class RunTestResult {
|
|
4
|
+
private readonly apifyClient;
|
|
5
|
+
private readonly run;
|
|
6
|
+
private log;
|
|
7
|
+
private dataset;
|
|
8
|
+
private keyValueStoreClient;
|
|
9
|
+
private statistics;
|
|
10
|
+
private runInfo;
|
|
11
|
+
private input;
|
|
12
|
+
constructor(apifyClient: ApifyClient, run: ActorRun);
|
|
13
|
+
getStatistics: () => Promise<SdkCrawlerStatistics | undefined>;
|
|
14
|
+
getLog: () => Promise<string>;
|
|
15
|
+
getDataset: <T>() => Promise<Dataset<T>>;
|
|
16
|
+
getKeyValueStoreClient: () => KeyValueStoreClient;
|
|
17
|
+
getInput: <T>() => Promise<T>;
|
|
18
|
+
getRunInfo: () => Promise<ActorRun>;
|
|
19
|
+
get id(): string;
|
|
20
|
+
get status(): string;
|
|
21
|
+
}
|
|
22
|
+
//# 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,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,aAAa;IAQV,OAAO,CAAC,QAAQ,CAAC,WAAW;IAAe,OAAO,CAAC,QAAQ,CAAC,GAAG;IAP3E,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,UAAU,CAAmC;IACrD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,KAAK,CAAsB;gBAEN,WAAW,EAAE,WAAW,EAAmB,GAAG,EAAE,QAAQ;IAIrF,aAAa,QAAa,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAQjE;IAEF,MAAM,QAAa,OAAO,CAAC,MAAM,CAAC,CAOhC;IAEF,UAAU,GAAU,CAAC,OAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAQ3C;IAEF,sBAAsB,QAAO,mBAAmB,CAO9C;IAEF,QAAQ,GAAU,CAAC,OAAK,OAAO,CAAC,CAAC,CAAC,CAQhC;IAEF,UAAU,QAAa,OAAO,CAAC,QAAQ,CAAC,CAOtC;IAEF,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;CACJ"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export class RunTestResult {
|
|
2
|
+
apifyClient;
|
|
3
|
+
run;
|
|
4
|
+
log;
|
|
5
|
+
dataset;
|
|
6
|
+
keyValueStoreClient;
|
|
7
|
+
statistics;
|
|
8
|
+
runInfo;
|
|
9
|
+
input;
|
|
10
|
+
constructor(apifyClient, run) {
|
|
11
|
+
this.apifyClient = apifyClient;
|
|
12
|
+
this.run = run;
|
|
13
|
+
/**/
|
|
14
|
+
}
|
|
15
|
+
getStatistics = async () => {
|
|
16
|
+
if (this.statistics) {
|
|
17
|
+
return this.statistics;
|
|
18
|
+
}
|
|
19
|
+
const kvs = this.apifyClient.keyValueStore(this.run.defaultKeyValueStoreId);
|
|
20
|
+
const stats = await kvs.getRecord('SDK_CRAWLER_STATISTICS_0');
|
|
21
|
+
this.statistics = stats?.value;
|
|
22
|
+
return this.statistics;
|
|
23
|
+
};
|
|
24
|
+
getLog = async () => {
|
|
25
|
+
if (this.log) {
|
|
26
|
+
return this.log;
|
|
27
|
+
}
|
|
28
|
+
const runLog = await this.apifyClient.run(this.id).log().get();
|
|
29
|
+
this.log = runLog;
|
|
30
|
+
return runLog;
|
|
31
|
+
};
|
|
32
|
+
getDataset = async () => {
|
|
33
|
+
if (this.dataset) {
|
|
34
|
+
return this.dataset;
|
|
35
|
+
}
|
|
36
|
+
const dataset = this.apifyClient.dataset(this.run.defaultDatasetId);
|
|
37
|
+
const items = (await dataset.listItems()).items;
|
|
38
|
+
this.dataset = { items };
|
|
39
|
+
return this.dataset;
|
|
40
|
+
};
|
|
41
|
+
getKeyValueStoreClient = () => {
|
|
42
|
+
if (this.keyValueStoreClient) {
|
|
43
|
+
return this.keyValueStoreClient;
|
|
44
|
+
}
|
|
45
|
+
const keyValueStoreClient = this.apifyClient.keyValueStore(this.run.defaultKeyValueStoreId);
|
|
46
|
+
this.keyValueStoreClient = keyValueStoreClient;
|
|
47
|
+
return keyValueStoreClient;
|
|
48
|
+
};
|
|
49
|
+
getInput = async () => {
|
|
50
|
+
if (this.input) {
|
|
51
|
+
return this.input;
|
|
52
|
+
}
|
|
53
|
+
const kvs = this.apifyClient.keyValueStore(this.run.defaultKeyValueStoreId);
|
|
54
|
+
const input = await kvs.getRecord('INPUT');
|
|
55
|
+
this.input = input?.value;
|
|
56
|
+
return this.input;
|
|
57
|
+
};
|
|
58
|
+
getRunInfo = async () => {
|
|
59
|
+
if (this.runInfo) {
|
|
60
|
+
return this.runInfo;
|
|
61
|
+
}
|
|
62
|
+
const run = this.apifyClient.run(this.run.id);
|
|
63
|
+
this.runInfo = await run.get();
|
|
64
|
+
return this.runInfo;
|
|
65
|
+
};
|
|
66
|
+
get id() {
|
|
67
|
+
return this.run.id;
|
|
68
|
+
}
|
|
69
|
+
get status() {
|
|
70
|
+
return this.run.status;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# 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":"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"}
|