@japa/runner 3.0.0-9 → 3.0.1

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.
@@ -1,442 +0,0 @@
1
- /*
2
- * @japa/runner
3
- *
4
- * (c) Japa
5
- *
6
- * For the full copyright and license information, please view the LICENSE
7
- * file that was distributed with this source code.
8
- */
9
- import { assert } from 'chai';
10
- import { test } from 'node:test';
11
- import { runner } from '../factories/main.js';
12
- import { GlobalHooks } from '../src/hooks.js';
13
- import { ConfigManager } from '../src/config_manager.js';
14
- import { pEvent, wrapAssertions } from '../tests_helpers/main.js';
15
- import { createTest, createTestGroup } from '../src/create_test.js';
16
- import { Emitter, Refiner, Runner, Suite } from '../modules/core/main.js';
17
- import { clearCache, getFailedTests, retryPlugin } from '../src/plugins/retry.js';
18
- test.describe('Runner | create tests and groups', () => {
19
- test('raise error when defining nested groups', async () => {
20
- const emitter = new Emitter();
21
- const refiner = new Refiner();
22
- const group = createTestGroup('', emitter, refiner, {});
23
- await wrapAssertions(() => {
24
- assert.throws(() => createTestGroup('', emitter, refiner, { group }), 'Nested groups are not supported by Japa');
25
- });
26
- });
27
- test('add group to the suite when defined', async () => {
28
- const emitter = new Emitter();
29
- const refiner = new Refiner();
30
- const suite = new Suite('', emitter, refiner);
31
- const group = createTestGroup('', emitter, refiner, { suite });
32
- await wrapAssertions(() => {
33
- assert.deepEqual(suite.stack, [group]);
34
- });
35
- });
36
- test('add test to the suite when defined', async () => {
37
- const emitter = new Emitter();
38
- const refiner = new Refiner();
39
- const suite = new Suite('', emitter, refiner);
40
- const t = createTest('', emitter, refiner, { suite });
41
- await wrapAssertions(() => {
42
- assert.deepEqual(suite.stack, [t]);
43
- });
44
- });
45
- test('add test to the group when group and suite both are defined', async () => {
46
- const emitter = new Emitter();
47
- const refiner = new Refiner();
48
- const suite = new Suite('', emitter, refiner);
49
- const group = createTestGroup('', emitter, refiner, { suite });
50
- const t = createTest('', emitter, refiner, { suite, group });
51
- await wrapAssertions(() => {
52
- assert.deepEqual(suite.stack, [group]);
53
- assert.deepEqual(group.tests, [t]);
54
- });
55
- });
56
- test('define test timeout from global options', async () => {
57
- const emitter = new Emitter();
58
- const refiner = new Refiner();
59
- const t = createTest('', emitter, refiner, { timeout: 1000 });
60
- await wrapAssertions(() => {
61
- assert.equal(t.options.timeout, 1000);
62
- });
63
- });
64
- test('define test retries from global options', async () => {
65
- const emitter = new Emitter();
66
- const refiner = new Refiner();
67
- const t = createTest('', emitter, refiner, { retries: 4 });
68
- await wrapAssertions(() => {
69
- assert.equal(t.options.retries, 4);
70
- });
71
- });
72
- test('execute test', async () => {
73
- const stack = [];
74
- const emitter = new Emitter();
75
- const refiner = new Refiner();
76
- const t = createTest('', emitter, refiner, { retries: 4 });
77
- t.run(() => {
78
- stack.push('executed');
79
- });
80
- await t.exec();
81
- await wrapAssertions(() => {
82
- assert.deepEqual(stack, ['executed']);
83
- });
84
- });
85
- test('assert test throws an exception', async () => {
86
- const emitter = new Emitter();
87
- const refiner = new Refiner();
88
- const t = createTest('', emitter, refiner, {});
89
- t.run(() => {
90
- throw new Error('Failed');
91
- }).throws('Failed');
92
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
93
- await wrapAssertions(() => {
94
- assert.equal(event.hasError, false);
95
- });
96
- });
97
- test('assert error matches the regular expression', async () => {
98
- const emitter = new Emitter();
99
- const refiner = new Refiner();
100
- const t = createTest('', emitter, refiner, {});
101
- t.run(() => {
102
- throw new Error('Failed');
103
- }).throws(/ed?/);
104
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
105
- await wrapAssertions(() => {
106
- assert.equal(event.hasError, false);
107
- });
108
- });
109
- test('throw error when test does not have a callback defined', async () => {
110
- const emitter = new Emitter();
111
- const refiner = new Refiner();
112
- const t = createTest('', emitter, refiner, {});
113
- await wrapAssertions(() => {
114
- assert.throws(() => t.throws(/ed?/), 'Cannot use "test.throws" method without a test callback');
115
- });
116
- });
117
- test('assert test throws an instance of a given class', async () => {
118
- const emitter = new Emitter();
119
- const refiner = new Refiner();
120
- const t = createTest('', emitter, refiner, {});
121
- t.run(() => {
122
- throw new Error('Failed');
123
- }).throws('Failed', Error);
124
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
125
- await wrapAssertions(() => {
126
- assert.equal(event.hasError, false);
127
- });
128
- });
129
- test('fail when test does not throw an exception', async () => {
130
- const emitter = new Emitter();
131
- const refiner = new Refiner();
132
- const t = createTest('', emitter, refiner, {});
133
- t.run(() => { }).throws('Failed', Error);
134
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
135
- await wrapAssertions(() => {
136
- assert.equal(event.hasError, true);
137
- assert.equal(event.errors[0].error.message, 'Expected test to throw an exception');
138
- });
139
- });
140
- test('fail when error constructor mismatch', async () => {
141
- class Exception {
142
- }
143
- const emitter = new Emitter();
144
- const refiner = new Refiner();
145
- const t = createTest('', emitter, refiner, {});
146
- t.run(() => {
147
- throw new Error('Failed');
148
- }).throws('Failed', Exception);
149
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
150
- await wrapAssertions(() => {
151
- assert.equal(event.hasError, true);
152
- assert.equal(event.errors[0].error.message, 'Expected test to throw "[class Exception]"');
153
- });
154
- });
155
- test('fail when error message mismatch', async () => {
156
- const emitter = new Emitter();
157
- const refiner = new Refiner();
158
- const t = createTest('', emitter, refiner, {});
159
- t.run(() => {
160
- throw new Error('Failed');
161
- }).throws('Failure');
162
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
163
- await wrapAssertions(() => {
164
- assert.equal(event.hasError, true);
165
- assert.equal(event.errors[0].error.message, 'Expected test to throw "Failure". Instead received "Failed"');
166
- });
167
- });
168
- test('fail when error does not match the regular expression', async () => {
169
- const emitter = new Emitter();
170
- const refiner = new Refiner();
171
- const t = createTest('', emitter, refiner, {});
172
- t.run(() => {
173
- throw new Error('Failed');
174
- }).throws(/lure?/);
175
- const [event] = await Promise.all([pEvent(emitter, 'test:end'), t.exec()]);
176
- await wrapAssertions(() => {
177
- assert.equal(event.hasError, true);
178
- assert.equal(event.errors[0].error.message, 'Expected test error to match "/lure?/" regular expression');
179
- });
180
- });
181
- });
182
- test.describe('Runner | global hooks', () => {
183
- test('do not run teardown hooks when setup hooks were not executed', async () => {
184
- const hooks = new GlobalHooks();
185
- const stack = [];
186
- hooks.apply(new ConfigManager({
187
- files: [],
188
- setup: [
189
- () => {
190
- stack.push('setup');
191
- },
192
- ],
193
- teardown: [
194
- () => {
195
- stack.push('teardown');
196
- },
197
- ],
198
- }, {}).hydrate());
199
- const emitter = new Emitter();
200
- await hooks.teardown(null, new Runner(emitter));
201
- await wrapAssertions(() => {
202
- assert.deepEqual(stack, []);
203
- });
204
- });
205
- test('run teardown hooks when setup hooks were executed', async () => {
206
- const hooks = new GlobalHooks();
207
- const stack = [];
208
- hooks.apply(new ConfigManager({
209
- files: [],
210
- setup: [
211
- () => {
212
- stack.push('setup');
213
- },
214
- ],
215
- teardown: [
216
- () => {
217
- stack.push('teardown');
218
- },
219
- ],
220
- }, {}).hydrate());
221
- const emitter = new Emitter();
222
- await hooks.setup(new Runner(emitter));
223
- await hooks.teardown(null, new Runner(emitter));
224
- await wrapAssertions(() => {
225
- assert.deepEqual(stack, ['setup', 'teardown']);
226
- });
227
- });
228
- test('do not run teardown hooks in case of error', async () => {
229
- const hooks = new GlobalHooks();
230
- const stack = [];
231
- hooks.apply(new ConfigManager({
232
- files: [],
233
- setup: [
234
- () => {
235
- stack.push('setup');
236
- },
237
- ],
238
- teardown: [
239
- () => {
240
- stack.push('teardown');
241
- },
242
- ],
243
- }, {}).hydrate());
244
- const emitter = new Emitter();
245
- await hooks.setup(new Runner(emitter));
246
- await hooks.teardown(new Error('foo'), new Runner(emitter));
247
- await wrapAssertions(() => {
248
- assert.deepEqual(stack, ['setup']);
249
- });
250
- });
251
- test('run teardown cleanup methods when teardown hook raises error', async () => {
252
- const hooks = new GlobalHooks();
253
- const stack = [];
254
- hooks.apply(new ConfigManager({
255
- files: [],
256
- setup: [
257
- () => {
258
- stack.push('setup');
259
- },
260
- ],
261
- teardown: [
262
- () => {
263
- stack.push('teardown');
264
- return () => {
265
- stack.push('teardown cleanup');
266
- };
267
- },
268
- () => {
269
- throw new Error('blowup');
270
- },
271
- ],
272
- }, {}).hydrate());
273
- const emitter = new Emitter();
274
- await hooks.setup(new Runner(emitter));
275
- try {
276
- await hooks.teardown(null, new Runner(emitter));
277
- }
278
- catch (error) {
279
- await hooks.teardown(error, new Runner(emitter));
280
- }
281
- await wrapAssertions(() => {
282
- assert.deepEqual(stack, ['setup', 'teardown', 'teardown cleanup']);
283
- });
284
- });
285
- });
286
- test.describe('Runner | retryPlugin', () => {
287
- test('store failing tests inside the cache dir', async () => {
288
- const stack = [];
289
- const emitter = new Emitter();
290
- const refiner = new Refiner();
291
- const suite = new Suite('same', emitter, refiner);
292
- createTest('failing test', emitter, refiner, { suite }).run(() => {
293
- stack.push('executing failing test');
294
- throw new Error('Failing');
295
- });
296
- createTest('passing test', emitter, refiner, { suite }).run(() => {
297
- stack.push('executing passing test');
298
- });
299
- await runner()
300
- .configure({
301
- files: [],
302
- refiner,
303
- reporters: {
304
- activated: [],
305
- list: [],
306
- },
307
- plugins: [retryPlugin],
308
- })
309
- .useEmitter(emitter)
310
- .runSuites(() => [suite]);
311
- await wrapAssertions(async () => {
312
- assert.deepEqual(await getFailedTests(), { tests: ['failing test'] });
313
- assert.deepEqual(stack, ['executing failing test', 'executing passing test']);
314
- });
315
- await clearCache();
316
- });
317
- test('run only failed tests when failed flag is used', async () => {
318
- const stack = [];
319
- const emitter = new Emitter();
320
- const refiner = new Refiner();
321
- function getSuite() {
322
- const suite = new Suite('same', emitter, refiner);
323
- createTest('failing test', emitter, refiner, { suite }).run(() => {
324
- stack.push('executing failing test');
325
- throw new Error('Failing');
326
- });
327
- createTest('passing test', emitter, refiner, { suite }).run(() => {
328
- stack.push('executing passing test');
329
- });
330
- return suite;
331
- }
332
- function getExecutor(argv) {
333
- return runner()
334
- .configure({
335
- files: [],
336
- refiner,
337
- reporters: {
338
- activated: [],
339
- list: [],
340
- },
341
- plugins: [retryPlugin],
342
- }, argv)
343
- .useEmitter(emitter);
344
- }
345
- await getExecutor().runSuites(() => [getSuite()]);
346
- await wrapAssertions(async () => {
347
- assert.deepEqual(await getFailedTests(), { tests: ['failing test'] });
348
- assert.deepEqual(stack, ['executing failing test', 'executing passing test']);
349
- });
350
- await getExecutor(['--failed']).runSuites(() => [getSuite()]);
351
- await wrapAssertions(async () => {
352
- assert.deepEqual(await getFailedTests(), { tests: ['failing test'] });
353
- assert.deepEqual(stack, [
354
- 'executing failing test',
355
- 'executing passing test',
356
- 'executing failing test',
357
- ]);
358
- });
359
- await clearCache();
360
- });
361
- test('run all tests when failed flag is not used', async () => {
362
- const stack = [];
363
- const emitter = new Emitter();
364
- const refiner = new Refiner();
365
- function getSuite() {
366
- const suite = new Suite('same', emitter, refiner);
367
- createTest('failing test', emitter, refiner, { suite }).run(() => {
368
- stack.push('executing failing test');
369
- throw new Error('Failing');
370
- });
371
- createTest('passing test', emitter, refiner, { suite }).run(() => {
372
- stack.push('executing passing test');
373
- });
374
- return suite;
375
- }
376
- function getExecutor(argv) {
377
- return runner()
378
- .configure({
379
- files: [],
380
- refiner,
381
- reporters: {
382
- activated: [],
383
- list: [],
384
- },
385
- plugins: [retryPlugin],
386
- }, argv)
387
- .useEmitter(emitter);
388
- }
389
- await getExecutor().runSuites(() => [getSuite()]);
390
- await wrapAssertions(async () => {
391
- assert.deepEqual(await getFailedTests(), { tests: ['failing test'] });
392
- assert.deepEqual(stack, ['executing failing test', 'executing passing test']);
393
- });
394
- await getExecutor([]).runSuites(() => [getSuite()]);
395
- await wrapAssertions(async () => {
396
- assert.deepEqual(await getFailedTests(), { tests: ['failing test'] });
397
- assert.deepEqual(stack, [
398
- 'executing failing test',
399
- 'executing passing test',
400
- 'executing failing test',
401
- 'executing passing test',
402
- ]);
403
- });
404
- await clearCache();
405
- });
406
- test('run all tests when there are no failing tests', async () => {
407
- const stack = [];
408
- const emitter = new Emitter();
409
- const refiner = new Refiner();
410
- function getSuite() {
411
- const suite = new Suite('same', emitter, refiner);
412
- createTest('passing test', emitter, refiner, { suite }).run(() => {
413
- stack.push('executing passing test');
414
- });
415
- return suite;
416
- }
417
- function getExecutor(argv) {
418
- return runner()
419
- .configure({
420
- files: [],
421
- refiner,
422
- reporters: {
423
- activated: [],
424
- list: [],
425
- },
426
- plugins: [retryPlugin],
427
- }, argv)
428
- .useEmitter(emitter);
429
- }
430
- await getExecutor().runSuites(() => [getSuite()]);
431
- await wrapAssertions(async () => {
432
- assert.deepEqual(await getFailedTests(), { tests: [] });
433
- assert.deepEqual(stack, ['executing passing test']);
434
- });
435
- await getExecutor(['--failed']).runSuites(() => [getSuite()]);
436
- await wrapAssertions(async () => {
437
- assert.deepEqual(await getFailedTests(), { tests: [] });
438
- assert.deepEqual(stack, ['executing passing test', 'executing passing test']);
439
- });
440
- await clearCache();
441
- });
442
- });
@@ -1,7 +0,0 @@
1
- import { Emitter } from '../modules/core/main.js';
2
- import { RunnerEvents } from '../src/types.js';
3
- export declare function wrapAssertions(fn: () => void | Promise<void>): Promise<void>;
4
- /**
5
- * Promisify an event
6
- */
7
- export declare function pEvent<Name extends keyof RunnerEvents>(emitter: Emitter, event: Name, timeout?: number): Promise<RunnerEvents[Name] | null>;
@@ -1,34 +0,0 @@
1
- /*
2
- * @japa/runner
3
- *
4
- * (c) Japa
5
- *
6
- * For the full copyright and license information, please view the LICENSE
7
- * file that was distributed with this source code.
8
- */
9
- import { ErrorsPrinter } from '@japa/errors-printer';
10
- export async function wrapAssertions(fn) {
11
- try {
12
- await fn();
13
- }
14
- catch (error) {
15
- await new ErrorsPrinter().printError(error);
16
- throw new Error('Assertion failure');
17
- }
18
- }
19
- /**
20
- * Promisify an event
21
- */
22
- export function pEvent(emitter, event, timeout = 500) {
23
- return new Promise((resolve) => {
24
- function handler(data) {
25
- emitter.off(event, handler);
26
- resolve(data);
27
- }
28
- setTimeout(() => {
29
- emitter.off(event, handler);
30
- resolve(null);
31
- }, timeout);
32
- emitter.on(event, handler);
33
- });
34
- }