@japa/runner 4.4.1 → 4.5.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.
@@ -1,191 +1,241 @@
1
- import { a as GlobalHooks, i as CliParser, n as createTestGroup, o as Planner, r as ConfigManager, t as createTest } from "../create_test-CuTGNCAf.js";
2
- import { c as Suite, i as Emitter, s as Runner } from "../helpers-BlHaYYTh.js";
3
- import "../main-CB1nhl6c.js";
4
- import { fileURLToPath } from "node:url";
5
- import assert from "node:assert";
1
+ import {
2
+ CliParser,
3
+ ConfigManager,
4
+ GlobalHooks,
5
+ Planner,
6
+ createTest,
7
+ createTestGroup
8
+ } from "../chunk-WNJXMFYL.js";
9
+ import "../chunk-RFKFNXTE.js";
10
+ import {
11
+ Emitter,
12
+ Runner,
13
+ Suite
14
+ } from "../chunk-L7YZLDZD.js";
15
+ import "../chunk-2KG3PWR4.js";
16
+
17
+ // factories/runner.ts
18
+ import { fileURLToPath } from "url";
6
19
  var RunnerFactory = class {
7
- #emitter = new Emitter();
8
- #config;
9
- #cliArgs;
10
- #file = fileURLToPath(import.meta.url);
11
- #bail = false;
12
- get #refiner() {
13
- return this.#config.refiner;
14
- }
15
- async #registerPlugins(runner$1) {
16
- for (let plugin of this.#config.plugins) await plugin({
17
- config: this.#config,
18
- runner: runner$1,
19
- emitter: this.#emitter,
20
- cliArgs: this.#cliArgs
21
- });
22
- }
23
- configure(config, argv) {
24
- this.#cliArgs = new CliParser().parse(argv || []);
25
- this.#config = new ConfigManager(config, this.#cliArgs).hydrate();
26
- return this;
27
- }
28
- useEmitter(emitter) {
29
- this.#emitter = emitter;
30
- return this;
31
- }
32
- async runTest(title, callback) {
33
- return this.runSuites((emitter, refiner, file) => {
34
- const defaultSuite = new Suite("default", emitter, refiner);
35
- const debuggingError = /* @__PURE__ */ new Error();
36
- createTest(title, emitter, refiner, debuggingError, {
37
- suite: defaultSuite,
38
- file
39
- }).run(callback, debuggingError);
40
- return [defaultSuite];
41
- });
42
- }
43
- bail(toggle = true) {
44
- this.#bail = toggle;
45
- return this;
46
- }
47
- async runSuites(suites) {
48
- const runner$1 = new Runner(this.#emitter);
49
- runner$1.bail(this.#bail);
50
- await this.#registerPlugins(runner$1);
51
- const { config, reporters, refinerFilters } = await new Planner(this.#config).plan();
52
- const globalHooks = new GlobalHooks();
53
- globalHooks.apply(config);
54
- reporters.forEach((reporter) => {
55
- runner$1.registerReporter(reporter);
56
- });
57
- refinerFilters.forEach((filter) => {
58
- config.refiner.add(filter.layer, filter.filters);
59
- });
60
- suites(this.#emitter, this.#refiner, this.#file).forEach((suite) => runner$1.add(suite));
61
- await globalHooks.setup(runner$1);
62
- await runner$1.start();
63
- await runner$1.exec();
64
- await runner$1.end();
65
- await globalHooks.teardown(null, runner$1);
66
- return runner$1.getSummary();
67
- }
20
+ #emitter = new Emitter();
21
+ #config;
22
+ #cliArgs;
23
+ #file = fileURLToPath(import.meta.url);
24
+ #bail = false;
25
+ get #refiner() {
26
+ return this.#config.refiner;
27
+ }
28
+ /**
29
+ * Registers plugins
30
+ */
31
+ async #registerPlugins(runner2) {
32
+ for (let plugin of this.#config.plugins) {
33
+ await plugin({
34
+ config: this.#config,
35
+ runner: runner2,
36
+ emitter: this.#emitter,
37
+ cliArgs: this.#cliArgs
38
+ });
39
+ }
40
+ }
41
+ /**
42
+ * Configure runner
43
+ */
44
+ configure(config, argv) {
45
+ this.#cliArgs = new CliParser().parse(argv || []);
46
+ this.#config = new ConfigManager(config, this.#cliArgs).hydrate();
47
+ return this;
48
+ }
49
+ /**
50
+ * Define a custom emitter instance to use
51
+ */
52
+ useEmitter(emitter) {
53
+ this.#emitter = emitter;
54
+ return this;
55
+ }
56
+ /**
57
+ * Run a test using the runner
58
+ */
59
+ async runTest(title, callback) {
60
+ return this.runSuites((emitter, refiner, file) => {
61
+ const defaultSuite = new Suite("default", emitter, refiner);
62
+ const debuggingError = new Error();
63
+ createTest(title, emitter, refiner, debuggingError, {
64
+ suite: defaultSuite,
65
+ file
66
+ }).run(callback, debuggingError);
67
+ return [defaultSuite];
68
+ });
69
+ }
70
+ /**
71
+ * Enable/disable the bail mode
72
+ */
73
+ bail(toggle = true) {
74
+ this.#bail = toggle;
75
+ return this;
76
+ }
77
+ /**
78
+ * Run dummy tests. You might use
79
+ */
80
+ async runSuites(suites) {
81
+ const runner2 = new Runner(this.#emitter);
82
+ runner2.bail(this.#bail);
83
+ await this.#registerPlugins(runner2);
84
+ const { config, reporters, refinerFilters } = await new Planner(this.#config).plan();
85
+ const globalHooks = new GlobalHooks();
86
+ globalHooks.apply(config);
87
+ reporters.forEach((reporter) => {
88
+ runner2.registerReporter(reporter);
89
+ });
90
+ refinerFilters.forEach((filter) => {
91
+ config.refiner.add(filter.layer, filter.filters);
92
+ });
93
+ suites(this.#emitter, this.#refiner, this.#file).forEach((suite) => runner2.add(suite));
94
+ await globalHooks.setup(runner2);
95
+ await runner2.start();
96
+ await runner2.exec();
97
+ await runner2.end();
98
+ await globalHooks.teardown(null, runner2);
99
+ return runner2.getSummary();
100
+ }
68
101
  };
102
+
103
+ // factories/create_dummy_tests.ts
104
+ import assert from "assert";
69
105
  function createUnitTestsSuite(emitter, refiner, file) {
70
- const suite = new Suite("unit", emitter, refiner);
71
- const group = createTestGroup("Maths#add", emitter, refiner, {
72
- suite,
73
- file
74
- });
75
- createTest("A top level test inside a suite", emitter, refiner, /* @__PURE__ */ new Error(), {
76
- suite,
77
- file
78
- }).run(() => {});
79
- createTest("add two numbers", emitter, refiner, /* @__PURE__ */ new Error(), {
80
- group,
81
- file
82
- }).run(() => {
83
- assert.equal(4, 4);
84
- });
85
- createTest("add three numbers", emitter, refiner, /* @__PURE__ */ new Error(), {
86
- group,
87
- file
88
- }).run(() => {
89
- assert.equal(6, 6);
90
- });
91
- createTest("add group of numbers", emitter, refiner, /* @__PURE__ */ new Error(), {
92
- group,
93
- file
94
- });
95
- createTest("use math.js lib", emitter, refiner, /* @__PURE__ */ new Error(), {
96
- group,
97
- file
98
- }).skip(true, "Library work pending");
99
- createTest("add multiple numbers", emitter, refiner, /* @__PURE__ */ new Error(), {
100
- file,
101
- group
102
- }).run(() => {
103
- assert.equal(8, 6);
104
- });
105
- createTest("add floating numbers", emitter, refiner, /* @__PURE__ */ new Error(), {
106
- group,
107
- file
108
- }).run(() => {
109
- assert.equal(6.300000000000001, 6);
110
- }).fails("Have to add support for floating numbers");
111
- createTest("regression test that is passing", emitter, refiner, /* @__PURE__ */ new Error(), {
112
- group,
113
- file
114
- }).run(() => {
115
- assert.equal(6.300000000000001, 6.300000000000001);
116
- }).fails("Have to add support for floating numbers");
117
- createTest("A test with an error that is not an AssertionError", emitter, refiner, /* @__PURE__ */ new Error(), {
118
- group,
119
- file
120
- }).run(() => {
121
- throw new Error("This is an error");
122
- });
123
- return suite;
106
+ const suite = new Suite("unit", emitter, refiner);
107
+ const group = createTestGroup("Maths#add", emitter, refiner, {
108
+ suite,
109
+ file
110
+ });
111
+ createTest("A top level test inside a suite", emitter, refiner, new Error(), {
112
+ suite,
113
+ file
114
+ }).run(() => {
115
+ });
116
+ createTest("add two numbers", emitter, refiner, new Error(), { group, file }).run(() => {
117
+ assert.equal(2 + 2, 4);
118
+ });
119
+ createTest("add three numbers", emitter, refiner, new Error(), {
120
+ group,
121
+ file
122
+ }).run(() => {
123
+ assert.equal(2 + 2 + 2, 6);
124
+ });
125
+ createTest("add group of numbers", emitter, refiner, new Error(), { group, file });
126
+ createTest("use math.js lib", emitter, refiner, new Error(), { group, file }).skip(
127
+ true,
128
+ "Library work pending"
129
+ );
130
+ createTest("add multiple numbers", emitter, refiner, new Error(), {
131
+ file,
132
+ group
133
+ }).run(() => {
134
+ assert.equal(2 + 2 + 2 + 2, 6);
135
+ });
136
+ createTest("add floating numbers", emitter, refiner, new Error(), { group, file }).run(() => {
137
+ assert.equal(2 + 2.2 + 2.1, 6);
138
+ }).fails("Have to add support for floating numbers");
139
+ createTest("regression test that is passing", emitter, refiner, new Error(), { group, file }).run(() => {
140
+ assert.equal(2 + 2.2 + 2.1, 2 + 2.2 + 2.1);
141
+ }).fails("Have to add support for floating numbers");
142
+ createTest("A test with an error that is not an AssertionError", emitter, refiner, new Error(), {
143
+ group,
144
+ file
145
+ }).run(() => {
146
+ throw new Error("This is an error");
147
+ });
148
+ return suite;
124
149
  }
125
150
  function createFunctionalTestsSuite(emitter, refiner, file) {
126
- const suite = new Suite("functional", emitter, refiner);
127
- const group = createTestGroup("Users/store", emitter, refiner, {
128
- suite,
129
- file
130
- });
131
- createTest("Validate user data", emitter, refiner, /* @__PURE__ */ new Error(), {
132
- group,
133
- file
134
- }).run(() => {});
135
- createTest("Disallow duplicate emails", emitter, refiner, /* @__PURE__ */ new Error(), {
136
- group,
137
- file
138
- }).run(() => {});
139
- createTest("Disallow duplicate emails across tenants", emitter, refiner, /* @__PURE__ */ new Error(), {
140
- group,
141
- file
142
- }).run(() => {
143
- assert.equal(2, 1);
144
- });
145
- createTest("Normalize email before persisting it", emitter, refiner, /* @__PURE__ */ new Error(), {
146
- group,
147
- file
148
- }).skip(true, "Have to build a normalizer");
149
- createTest("Send email verification mail", emitter, refiner, /* @__PURE__ */ new Error(), {
150
- group,
151
- file
152
- });
153
- createTest("Test that times out", emitter, refiner, /* @__PURE__ */ new Error(), {
154
- group,
155
- file
156
- }).run(() => {
157
- return new Promise((resolve) => {
158
- setTimeout(resolve, 2100);
159
- });
160
- });
161
- const usersListGroup = createTestGroup("Users/list", emitter, refiner, {
162
- suite,
163
- file
164
- });
165
- usersListGroup.setup(() => {
166
- throw new Error("Unable to cleanup database");
167
- });
168
- createTest("A test that will never run because the group hooks fails", emitter, refiner, /* @__PURE__ */ new Error(), { group: usersListGroup });
169
- createTest("A top level test inside functional suite", emitter, refiner, /* @__PURE__ */ new Error(), {
170
- suite,
171
- file
172
- }).run(() => {});
173
- return suite;
151
+ const suite = new Suite("functional", emitter, refiner);
152
+ const group = createTestGroup("Users/store", emitter, refiner, {
153
+ suite,
154
+ file
155
+ });
156
+ createTest("Validate user data", emitter, refiner, new Error(), {
157
+ group,
158
+ file
159
+ }).run(() => {
160
+ });
161
+ createTest("Disallow duplicate emails", emitter, refiner, new Error(), {
162
+ group,
163
+ file
164
+ }).run(() => {
165
+ });
166
+ createTest("Disallow duplicate emails across tenants", emitter, refiner, new Error(), {
167
+ group,
168
+ file
169
+ }).run(() => {
170
+ const users = ["", ""];
171
+ assert.equal(users.length, 1);
172
+ });
173
+ createTest("Normalize email before persisting it", emitter, refiner, new Error(), {
174
+ group,
175
+ file
176
+ }).skip(true, "Have to build a normalizer");
177
+ createTest("Send email verification mail", emitter, refiner, new Error(), {
178
+ group,
179
+ file
180
+ });
181
+ createTest("Test that times out", emitter, refiner, new Error(), {
182
+ group,
183
+ file
184
+ }).run(() => {
185
+ return new Promise((resolve) => {
186
+ setTimeout(resolve, 2100);
187
+ });
188
+ });
189
+ const usersListGroup = createTestGroup("Users/list", emitter, refiner, {
190
+ suite,
191
+ file
192
+ });
193
+ usersListGroup.setup(() => {
194
+ throw new Error("Unable to cleanup database");
195
+ });
196
+ createTest(
197
+ "A test that will never run because the group hooks fails",
198
+ emitter,
199
+ refiner,
200
+ new Error(),
201
+ {
202
+ group: usersListGroup
203
+ }
204
+ );
205
+ createTest("A top level test inside functional suite", emitter, refiner, new Error(), {
206
+ suite,
207
+ file
208
+ }).run(() => {
209
+ });
210
+ return suite;
174
211
  }
175
212
  function createDummyTests(emitter, refiner, file) {
176
- return [createUnitTestsSuite(emitter, refiner, file), createFunctionalTestsSuite(emitter, refiner, file)];
213
+ return [
214
+ createUnitTestsSuite(emitter, refiner, file),
215
+ createFunctionalTestsSuite(emitter, refiner, file)
216
+ ];
177
217
  }
178
- const runner = () => new RunnerFactory();
179
- const syncReporter = {
180
- name: "sync",
181
- handler(r, emitter) {
182
- emitter.on("runner:end", function() {
183
- const summary = r.getSummary();
184
- if (summary.hasError) {
185
- if (summary.failureTree[0].errors.length) throw summary.failureTree[0].errors[0].error;
186
- if (summary.failureTree[0].children[0].errors.length) throw summary.failureTree[0].children[0].errors[0].error;
187
- }
188
- });
189
- }
218
+
219
+ // factories/main.ts
220
+ var runner = () => new RunnerFactory();
221
+ var syncReporter = {
222
+ name: "sync",
223
+ handler(r, emitter) {
224
+ emitter.on("runner:end", function() {
225
+ const summary = r.getSummary();
226
+ if (summary.hasError) {
227
+ if (summary.failureTree[0].errors.length) {
228
+ throw summary.failureTree[0].errors[0].error;
229
+ }
230
+ if (summary.failureTree[0].children[0].errors.length) {
231
+ throw summary.failureTree[0].children[0].errors[0].error;
232
+ }
233
+ }
234
+ });
235
+ }
236
+ };
237
+ export {
238
+ createDummyTests,
239
+ runner,
240
+ syncReporter
190
241
  };
191
- export { createDummyTests, runner, syncReporter };
@@ -1,4 +1,4 @@
1
- import { Suite, Emitter, type TestContext, type Refiner } from '../modules/core/main.js';
1
+ import { Suite, Emitter, TestContext, Refiner } from '../modules/core/main.js';
2
2
  import type { Config, TestExecutor, RunnerSummary } from '../src/types.js';
3
3
  /**
4
4
  * Runner factory exposes the API to run dummy suites, groups and tests.
package/build/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { TestExecutor } from '@japa/core/types';
2
2
  import type { Config } from './src/types.js';
3
- import { type Group, type Test, type TestContext } from './modules/core/main.js';
3
+ import { Group, Test, TestContext } from './modules/core/main.js';
4
4
  type OmitFirstArg<F> = F extends [_: any, ...args: infer R] ? R : never;
5
5
  /**
6
6
  * Create a Japa test. Defining a test without the callback