@saltcorn/db-common 1.6.3-beta.1 → 1.7.0-alpha.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.
- package/dist/dbtypes.d.ts +11 -2
- package/dist/dbtypes.d.ts.map +1 -1
- package/dist/dbtypes.js +1 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -47
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +51 -7
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +195 -147
- package/dist/internal.js.map +1 -1
- package/dist/internal.test.js +9 -5
- package/dist/internal.test.js.map +1 -1
- package/dist/multi-tenant.d.ts +1 -0
- package/dist/multi-tenant.d.ts.map +1 -1
- package/dist/multi-tenant.js +13 -22
- package/dist/multi-tenant.js.map +1 -1
- package/dist/sqlite-commons.d.ts +3 -3
- package/dist/sqlite-commons.d.ts.map +1 -1
- package/dist/sqlite-commons.js +40 -60
- package/dist/sqlite-commons.js.map +1 -1
- package/dist/tenants.d.ts +2 -2
- package/dist/tenants.d.ts.map +1 -1
- package/dist/tenants.js +8 -3
- package/dist/tenants.js.map +1 -1
- package/dist/test_expect.d.ts +89 -0
- package/dist/test_expect.d.ts.map +1 -0
- package/dist/test_expect.js +530 -0
- package/dist/test_expect.js.map +1 -0
- package/dist/types.d.ts +94 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -2
- package/package.json +3 -14
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jest-compatible test helpers backed by node:test / node:assert, so test
|
|
3
|
+
* suites can run on node's built-in test runner without a jest dependency.
|
|
4
|
+
* Lives in db-common so it can be shared across packages, e.g.:
|
|
5
|
+
* import { describe, it, expect, beforeAll, jest } from "@saltcorn/db-common/test_expect";
|
|
6
|
+
* Only the surface used by the migrated test suites is implemented.
|
|
7
|
+
*/
|
|
8
|
+
import assert from "node:assert";
|
|
9
|
+
import { inspect } from "node:util";
|
|
10
|
+
import { createRequire } from "node:module";
|
|
11
|
+
// This module is ESM, so the CommonJS `require` is not defined. jest.mock needs
|
|
12
|
+
// to reach into the shared CommonJS module cache to mutate cached exports;
|
|
13
|
+
// createRequire gives us a require bound to the same cache as the (CJS) test
|
|
14
|
+
// suites that call jest.mock.
|
|
15
|
+
const require = createRequire(import.meta.url);
|
|
16
|
+
import { describe as nodeDescribe, it as nodeIt, test as nodeTest, before, after, beforeEach as nodeBeforeEach, afterEach as nodeAfterEach, } from "node:test";
|
|
17
|
+
// node:test names the once-per-file hooks before/after; jest calls them
|
|
18
|
+
// beforeAll/afterAll. Wrap to drop jest's optional timeout 2nd argument.
|
|
19
|
+
const beforeAll = (fn) => before(fn);
|
|
20
|
+
const afterAll = (fn) => after(fn);
|
|
21
|
+
const beforeEach = (fn) => nodeBeforeEach(fn);
|
|
22
|
+
const afterEach = (fn) => nodeAfterEach(fn);
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// .each() table tests
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// jest interpolates the title with printf tokens (%s, %d, %j, ... and %# for
|
|
27
|
+
// the row index) or, for object rows, with $property references.
|
|
28
|
+
const eachTitle = (title, args, index) => {
|
|
29
|
+
let argIx = 0;
|
|
30
|
+
const withTokens = String(title).replace(/%[sdifjoOp#%]/g, (token) => {
|
|
31
|
+
if (token === "%%")
|
|
32
|
+
return "%";
|
|
33
|
+
if (token === "%#")
|
|
34
|
+
return String(index);
|
|
35
|
+
if (argIx >= args.length)
|
|
36
|
+
return token;
|
|
37
|
+
const arg = args[argIx++];
|
|
38
|
+
switch (token) {
|
|
39
|
+
case "%s":
|
|
40
|
+
return typeof arg === "string" ? arg : inspect(arg, { depth: 3 });
|
|
41
|
+
case "%d":
|
|
42
|
+
case "%f":
|
|
43
|
+
return String(Number(arg));
|
|
44
|
+
case "%i":
|
|
45
|
+
return String(parseInt(arg, 10));
|
|
46
|
+
case "%j":
|
|
47
|
+
return JSON.stringify(arg);
|
|
48
|
+
default:
|
|
49
|
+
return inspect(arg, { depth: 3 });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const row = args.length === 1 ? args[0] : undefined;
|
|
53
|
+
if (row == null || typeof row !== "object")
|
|
54
|
+
return withTokens;
|
|
55
|
+
return withTokens.replace(/\$([\w.]+)/g, (whole, path) => {
|
|
56
|
+
let value = row;
|
|
57
|
+
for (const key of path.split(".")) {
|
|
58
|
+
if (value == null || typeof value !== "object")
|
|
59
|
+
return whole;
|
|
60
|
+
value = value[key];
|
|
61
|
+
}
|
|
62
|
+
return typeof value === "string" ? value : inspect(value, { depth: 3 });
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const eachFor = (runner) => (table) => (title, fn, ..._rest) => {
|
|
66
|
+
table.forEach((row, index) => {
|
|
67
|
+
const args = Array.isArray(row) ? row : [row];
|
|
68
|
+
runner(eachTitle(title, args, index), () => fn(...args));
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
// node:test's describe/it/test have no .each, and their exports cannot be
|
|
72
|
+
// mutated from here (this module is ESM), so wrap them.
|
|
73
|
+
const withEach = (base) => {
|
|
74
|
+
const wrapped = (...args) => base(...args);
|
|
75
|
+
for (const key of Object.getOwnPropertyNames(base)) {
|
|
76
|
+
if (key === "length" || key === "name" || key === "prototype")
|
|
77
|
+
continue;
|
|
78
|
+
const variant = base[key];
|
|
79
|
+
if (typeof variant === "function") {
|
|
80
|
+
const wrappedVariant = (...args) => variant(...args);
|
|
81
|
+
wrappedVariant.each = eachFor(variant);
|
|
82
|
+
wrapped[key] = wrappedVariant;
|
|
83
|
+
}
|
|
84
|
+
else
|
|
85
|
+
wrapped[key] = variant;
|
|
86
|
+
}
|
|
87
|
+
wrapped.each = eachFor(base);
|
|
88
|
+
return wrapped;
|
|
89
|
+
};
|
|
90
|
+
const describe = withEach(nodeDescribe);
|
|
91
|
+
const it = withEach(nodeIt);
|
|
92
|
+
const test = withEach(nodeTest);
|
|
93
|
+
export { describe, it, test, beforeAll, afterAll, beforeEach, afterEach, };
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// asymmetric matchers (expect.arrayContaining / expect.objectContaining)
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
class ArrayContaining {
|
|
98
|
+
constructor(sample) {
|
|
99
|
+
this.sample = sample;
|
|
100
|
+
}
|
|
101
|
+
matches(actual) {
|
|
102
|
+
return (Array.isArray(actual) &&
|
|
103
|
+
this.sample.every((e) => actual.some((a) => looseEqual(a, e))));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
class ObjectContaining {
|
|
107
|
+
constructor(sample) {
|
|
108
|
+
this.sample = sample;
|
|
109
|
+
}
|
|
110
|
+
matches(actual) {
|
|
111
|
+
if (actual == null || typeof actual !== "object")
|
|
112
|
+
return false;
|
|
113
|
+
return Object.keys(this.sample).every((k) => looseEqual(actual[k], this.sample[k]));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// expect.any(Constructor): matches any value of the given type/instance.
|
|
117
|
+
class Any {
|
|
118
|
+
constructor(sample) {
|
|
119
|
+
this.sample = sample;
|
|
120
|
+
}
|
|
121
|
+
matches(actual) {
|
|
122
|
+
switch (this.sample) {
|
|
123
|
+
case String:
|
|
124
|
+
return typeof actual === "string" || actual instanceof String;
|
|
125
|
+
case Number:
|
|
126
|
+
return typeof actual === "number" || actual instanceof Number;
|
|
127
|
+
case Boolean:
|
|
128
|
+
return typeof actual === "boolean";
|
|
129
|
+
case BigInt:
|
|
130
|
+
return typeof actual === "bigint";
|
|
131
|
+
case Function:
|
|
132
|
+
return typeof actual === "function";
|
|
133
|
+
case Object:
|
|
134
|
+
return actual !== null && typeof actual === "object";
|
|
135
|
+
case Array:
|
|
136
|
+
return Array.isArray(actual);
|
|
137
|
+
default:
|
|
138
|
+
return actual != null && actual instanceof this.sample;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const isAsymmetric = (x) => x instanceof ArrayContaining ||
|
|
143
|
+
x instanceof ObjectContaining ||
|
|
144
|
+
x instanceof Any;
|
|
145
|
+
// jest's toEqual: recursive equality that ignores prototypes and treats
|
|
146
|
+
// undefined-valued properties as absent.
|
|
147
|
+
const looseEqual = (a, b) => {
|
|
148
|
+
if (isAsymmetric(b))
|
|
149
|
+
return b.matches(a);
|
|
150
|
+
if (isAsymmetric(a))
|
|
151
|
+
return a.matches(b);
|
|
152
|
+
if (Object.is(a, b))
|
|
153
|
+
return true;
|
|
154
|
+
if (a == null || b == null)
|
|
155
|
+
return a === b;
|
|
156
|
+
if (typeof a !== "object" || typeof b !== "object")
|
|
157
|
+
return a === b;
|
|
158
|
+
if (a instanceof Date && b instanceof Date)
|
|
159
|
+
return a.getTime() === b.getTime();
|
|
160
|
+
if (a instanceof RegExp && b instanceof RegExp)
|
|
161
|
+
return a.source === b.source && a.flags === b.flags;
|
|
162
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
163
|
+
if (!Array.isArray(a) || !Array.isArray(b))
|
|
164
|
+
return false;
|
|
165
|
+
if (a.length !== b.length)
|
|
166
|
+
return false;
|
|
167
|
+
return a.every((v, i) => looseEqual(v, b[i]));
|
|
168
|
+
}
|
|
169
|
+
const ak = Object.keys(a).filter((k) => a[k] !== undefined);
|
|
170
|
+
const bk = Object.keys(b).filter((k) => b[k] !== undefined);
|
|
171
|
+
if (ak.length !== bk.length)
|
|
172
|
+
return false;
|
|
173
|
+
return ak.every((k) => Object.prototype.hasOwnProperty.call(b, k) && looseEqual(a[k], b[k]));
|
|
174
|
+
};
|
|
175
|
+
// jest's toMatchObject: recursive subset match (received may have extra keys).
|
|
176
|
+
const matchObject = (actual, expected) => {
|
|
177
|
+
if (isAsymmetric(expected))
|
|
178
|
+
return expected.matches(actual);
|
|
179
|
+
if (Array.isArray(expected)) {
|
|
180
|
+
if (!Array.isArray(actual) || actual.length !== expected.length)
|
|
181
|
+
return false;
|
|
182
|
+
return expected.every((e, i) => matchObject(actual[i], e));
|
|
183
|
+
}
|
|
184
|
+
if (expected && typeof expected === "object") {
|
|
185
|
+
if (actual == null || typeof actual !== "object")
|
|
186
|
+
return false;
|
|
187
|
+
return Object.keys(expected).every((k) => matchObject(actual[k], expected[k]));
|
|
188
|
+
}
|
|
189
|
+
return Object.is(actual, expected);
|
|
190
|
+
};
|
|
191
|
+
const matchError = (error, expected) => {
|
|
192
|
+
const message = error && error.message ? String(error.message) : String(error);
|
|
193
|
+
if (typeof expected === "string")
|
|
194
|
+
return message.includes(expected);
|
|
195
|
+
if (expected instanceof RegExp)
|
|
196
|
+
return expected.test(message);
|
|
197
|
+
if (typeof expected === "function")
|
|
198
|
+
return error instanceof expected;
|
|
199
|
+
return true;
|
|
200
|
+
};
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// expect()
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
class Expectation {
|
|
205
|
+
constructor(actual, isNot = false) {
|
|
206
|
+
this.actual = actual;
|
|
207
|
+
this.isNot = isNot;
|
|
208
|
+
}
|
|
209
|
+
get not() {
|
|
210
|
+
return new Expectation(this.actual, !this.isNot);
|
|
211
|
+
}
|
|
212
|
+
get rejects() {
|
|
213
|
+
return new AsyncExpectation(this.actual, true, this.isNot);
|
|
214
|
+
}
|
|
215
|
+
get resolves() {
|
|
216
|
+
return new AsyncExpectation(this.actual, false, this.isNot);
|
|
217
|
+
}
|
|
218
|
+
assertPass(pass, message) {
|
|
219
|
+
assert.ok(this.isNot ? !pass : pass, message);
|
|
220
|
+
}
|
|
221
|
+
show(v) {
|
|
222
|
+
return inspect(v, { depth: 6 });
|
|
223
|
+
}
|
|
224
|
+
toBe(expected) {
|
|
225
|
+
if (this.isNot)
|
|
226
|
+
assert.notStrictEqual(this.actual, expected);
|
|
227
|
+
else
|
|
228
|
+
assert.strictEqual(this.actual, expected);
|
|
229
|
+
}
|
|
230
|
+
toEqual(expected) {
|
|
231
|
+
const pass = looseEqual(this.actual, expected);
|
|
232
|
+
this.assertPass(pass, `toEqual mismatch:\n actual: ${this.show(this.actual)}\n expected: ${this.show(expected)}`);
|
|
233
|
+
}
|
|
234
|
+
toStrictEqual(expected) {
|
|
235
|
+
if (isAsymmetric(expected)) {
|
|
236
|
+
this.assertPass(expected.matches(this.actual), `toStrictEqual mismatch: ${this.show(this.actual)}`);
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (this.isNot)
|
|
240
|
+
assert.notDeepStrictEqual(this.actual, expected);
|
|
241
|
+
else
|
|
242
|
+
assert.deepStrictEqual(this.actual, expected);
|
|
243
|
+
}
|
|
244
|
+
toContain(expected) {
|
|
245
|
+
const pass = (typeof this.actual === "string" || Array.isArray(this.actual)) &&
|
|
246
|
+
this.actual.includes(expected);
|
|
247
|
+
this.assertPass(pass, `expected ${this.show(this.actual)} to contain ${this.show(expected)}`);
|
|
248
|
+
}
|
|
249
|
+
toContainEqual(expected) {
|
|
250
|
+
const pass = Array.isArray(this.actual) &&
|
|
251
|
+
this.actual.some((x) => looseEqual(x, expected));
|
|
252
|
+
this.assertPass(pass, `expected ${this.show(this.actual)} to contain equal ${this.show(expected)}`);
|
|
253
|
+
}
|
|
254
|
+
toMatchObject(expected) {
|
|
255
|
+
this.assertPass(matchObject(this.actual, expected), `expected ${this.show(this.actual)} to match object ${this.show(expected)}`);
|
|
256
|
+
}
|
|
257
|
+
toMatch(expected) {
|
|
258
|
+
const pass = typeof expected === "string"
|
|
259
|
+
? String(this.actual).includes(expected)
|
|
260
|
+
: expected.test(this.actual);
|
|
261
|
+
this.assertPass(pass, `expected ${this.show(String(this.actual))} to match ${expected}`);
|
|
262
|
+
}
|
|
263
|
+
toHaveLength(length) {
|
|
264
|
+
this.assertPass(this.actual != null && this.actual.length === length, `expected length ${this.actual?.length} to be ${length}`);
|
|
265
|
+
}
|
|
266
|
+
toBeDefined() {
|
|
267
|
+
this.assertPass(this.actual !== undefined, `expected value to be defined`);
|
|
268
|
+
}
|
|
269
|
+
toBeUndefined() {
|
|
270
|
+
this.assertPass(this.actual === undefined, `expected ${this.show(this.actual)} to be undefined`);
|
|
271
|
+
}
|
|
272
|
+
toBeNull() {
|
|
273
|
+
this.assertPass(this.actual === null, `expected ${this.show(this.actual)} to be null`);
|
|
274
|
+
}
|
|
275
|
+
toBeTruthy() {
|
|
276
|
+
this.assertPass(!!this.actual, `expected ${this.show(this.actual)} to be truthy`);
|
|
277
|
+
}
|
|
278
|
+
toBeFalsy() {
|
|
279
|
+
this.assertPass(!this.actual, `expected ${this.show(this.actual)} to be falsy`);
|
|
280
|
+
}
|
|
281
|
+
toBeGreaterThan(n) {
|
|
282
|
+
this.assertPass(this.actual > n, `expected ${this.show(this.actual)} > ${n}`);
|
|
283
|
+
}
|
|
284
|
+
toBeLessThan(n) {
|
|
285
|
+
this.assertPass(this.actual < n, `expected ${this.show(this.actual)} < ${n}`);
|
|
286
|
+
}
|
|
287
|
+
toBeGreaterThanOrEqual(n) {
|
|
288
|
+
this.assertPass(this.actual >= n, `expected ${this.show(this.actual)} >= ${n}`);
|
|
289
|
+
}
|
|
290
|
+
toBeLessThanOrEqual(n) {
|
|
291
|
+
this.assertPass(this.actual <= n, `expected ${this.show(this.actual)} <= ${n}`);
|
|
292
|
+
}
|
|
293
|
+
// path is a dotted string ("a.b.0.c") or an array of keys; the expected
|
|
294
|
+
// value is optional - with no second argument only presence is checked.
|
|
295
|
+
toHaveProperty(path, ...rest) {
|
|
296
|
+
const keys = Array.isArray(path) ? path : String(path).split(".");
|
|
297
|
+
let value = this.actual;
|
|
298
|
+
let found = true;
|
|
299
|
+
for (const key of keys) {
|
|
300
|
+
if (value == null || !(String(key) in Object(value))) {
|
|
301
|
+
found = false;
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
value = value[key];
|
|
305
|
+
}
|
|
306
|
+
const pass = found && (rest.length === 0 || looseEqual(value, rest[0]));
|
|
307
|
+
this.assertPass(pass, `expected ${this.show(this.actual)} to have property ${keys.join(".")}${rest.length ? " = " + this.show(rest[0]) : ""}`);
|
|
308
|
+
}
|
|
309
|
+
toBeInstanceOf(cls) {
|
|
310
|
+
this.assertPass(this.actual instanceof cls, `expected ${this.show(this.actual)} to be instance of ${cls?.name}`);
|
|
311
|
+
}
|
|
312
|
+
toThrow(expected) {
|
|
313
|
+
let threw = false;
|
|
314
|
+
let error;
|
|
315
|
+
try {
|
|
316
|
+
if (typeof this.actual === "function")
|
|
317
|
+
this.actual();
|
|
318
|
+
}
|
|
319
|
+
catch (e) {
|
|
320
|
+
threw = true;
|
|
321
|
+
error = e;
|
|
322
|
+
}
|
|
323
|
+
const pass = threw && (expected === undefined || matchError(error, expected));
|
|
324
|
+
this.assertPass(pass, `expected function to throw`);
|
|
325
|
+
}
|
|
326
|
+
toHaveBeenCalled() {
|
|
327
|
+
this.assertPass((this.actual?.mock?.calls?.length ?? 0) > 0, `expected mock function to have been called`);
|
|
328
|
+
}
|
|
329
|
+
// jest alias for toHaveBeenCalled
|
|
330
|
+
toBeCalled() {
|
|
331
|
+
this.toHaveBeenCalled();
|
|
332
|
+
}
|
|
333
|
+
// args may contain asymmetric matchers (expect.objectContaining etc); the
|
|
334
|
+
// arity must match exactly, as in jest.
|
|
335
|
+
toHaveBeenCalledWith(...expected) {
|
|
336
|
+
const calls = this.actual?.mock?.calls ?? [];
|
|
337
|
+
this.assertPass(calls.some((call) => looseEqual(call, expected)), `expected mock to have been called with:\n ${this.show(expected)}\nactual calls:\n ${this.show(calls)}`);
|
|
338
|
+
}
|
|
339
|
+
toHaveBeenLastCalledWith(...expected) {
|
|
340
|
+
const calls = this.actual?.mock?.calls ?? [];
|
|
341
|
+
const last = calls[calls.length - 1];
|
|
342
|
+
this.assertPass(calls.length > 0 && looseEqual(last, expected), `expected mock's last call to be:\n ${this.show(expected)}\nactual:\n ${this.show(last)}`);
|
|
343
|
+
}
|
|
344
|
+
toHaveBeenCalledTimes(n) {
|
|
345
|
+
const count = this.actual?.mock?.calls?.length ?? 0;
|
|
346
|
+
this.assertPass(count === n, `expected mock to have been called ${n} times, but was called ${count} times`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// async matchers via expect(promise).rejects / .resolves
|
|
350
|
+
class AsyncExpectation {
|
|
351
|
+
constructor(actual, wantReject, isNot) {
|
|
352
|
+
this.actual = actual;
|
|
353
|
+
this.wantReject = wantReject;
|
|
354
|
+
this.isNot = isNot;
|
|
355
|
+
}
|
|
356
|
+
async settle() {
|
|
357
|
+
try {
|
|
358
|
+
const value = typeof this.actual === "function" ? await this.actual() : await this.actual;
|
|
359
|
+
return { threw: false, value };
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
return { threw: true, error };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
async settledExpectation() {
|
|
366
|
+
const { threw, value, error } = await this.settle();
|
|
367
|
+
if (this.wantReject) {
|
|
368
|
+
assert.ok(threw, `expected promise to reject, but it resolved`);
|
|
369
|
+
return new Expectation(error, this.isNot);
|
|
370
|
+
}
|
|
371
|
+
assert.ok(!threw, `expected promise to resolve, but it rejected: ${error}`);
|
|
372
|
+
return new Expectation(value, this.isNot);
|
|
373
|
+
}
|
|
374
|
+
async toThrow(expected) {
|
|
375
|
+
const { threw, error } = await this.settle();
|
|
376
|
+
if (this.wantReject) {
|
|
377
|
+
const pass = threw && (expected === undefined || matchError(error, expected));
|
|
378
|
+
assert.ok(this.isNot ? !pass : pass, `expected promise to reject${expected !== undefined ? " with " + expected : ""}`);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
assert.ok(!threw, `expected promise to resolve`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async toBe(expected) {
|
|
385
|
+
(await this.settledExpectation()).toBe(expected);
|
|
386
|
+
}
|
|
387
|
+
async toEqual(expected) {
|
|
388
|
+
(await this.settledExpectation()).toEqual(expected);
|
|
389
|
+
}
|
|
390
|
+
async toStrictEqual(expected) {
|
|
391
|
+
(await this.settledExpectation()).toStrictEqual(expected);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
export const expect = ((actual) => new Expectation(actual));
|
|
395
|
+
expect.arrayContaining = (sample) => new ArrayContaining(sample);
|
|
396
|
+
expect.objectContaining = (sample) => new ObjectContaining(sample);
|
|
397
|
+
expect.any = (sample) => new Any(sample);
|
|
398
|
+
// assertion-count expectation is not tracked; accepted as a no-op.
|
|
399
|
+
expect.assertions = (_n) => { };
|
|
400
|
+
// ---------------------------------------------------------------------------
|
|
401
|
+
// jest.fn() mock functions
|
|
402
|
+
// ---------------------------------------------------------------------------
|
|
403
|
+
export const fn = (impl) => {
|
|
404
|
+
const calls = [];
|
|
405
|
+
let implementation = impl;
|
|
406
|
+
let returnValue;
|
|
407
|
+
let hasReturnValue = false;
|
|
408
|
+
const mockFn = (...args) => {
|
|
409
|
+
calls.push(args);
|
|
410
|
+
if (implementation)
|
|
411
|
+
return implementation(...args);
|
|
412
|
+
if (hasReturnValue)
|
|
413
|
+
return returnValue;
|
|
414
|
+
return undefined;
|
|
415
|
+
};
|
|
416
|
+
mockFn.mock = { calls };
|
|
417
|
+
mockFn.mockReturnValue = (v) => {
|
|
418
|
+
returnValue = v;
|
|
419
|
+
hasReturnValue = true;
|
|
420
|
+
return mockFn;
|
|
421
|
+
};
|
|
422
|
+
mockFn.mockImplementation = (f) => {
|
|
423
|
+
implementation = f;
|
|
424
|
+
return mockFn;
|
|
425
|
+
};
|
|
426
|
+
mockFn.mockClear = () => {
|
|
427
|
+
calls.length = 0;
|
|
428
|
+
};
|
|
429
|
+
mockFn.mockReset = () => {
|
|
430
|
+
calls.length = 0;
|
|
431
|
+
implementation = undefined;
|
|
432
|
+
hasReturnValue = false;
|
|
433
|
+
returnValue = undefined;
|
|
434
|
+
};
|
|
435
|
+
return mockFn;
|
|
436
|
+
};
|
|
437
|
+
// jest.spyOn: wrap an object method with a mock that calls through to the
|
|
438
|
+
// original by default and can be restored. Tracked so restoreAllMocks() can
|
|
439
|
+
// undo every active spy.
|
|
440
|
+
const activeSpies = [];
|
|
441
|
+
const spyOn = (obj, method) => {
|
|
442
|
+
const original = obj[method];
|
|
443
|
+
const spy = fn((...args) => typeof original === "function" ? original.apply(obj, args) : undefined);
|
|
444
|
+
spy.mockRestore = () => {
|
|
445
|
+
obj[method] = original;
|
|
446
|
+
};
|
|
447
|
+
obj[method] = spy;
|
|
448
|
+
activeSpies.push(spy);
|
|
449
|
+
return spy;
|
|
450
|
+
};
|
|
451
|
+
// Mock a module. With a factory, the named exports it returns replace those
|
|
452
|
+
// on the (shared, require-cached) module; without one, function exports are
|
|
453
|
+
// auto-mocked. Mutating the cached exports means modules required afterwards
|
|
454
|
+
// see the mocks - so callers should require() the system-under-test after
|
|
455
|
+
// jest.mock (jest hoists mock calls above imports; node:test does not).
|
|
456
|
+
//
|
|
457
|
+
// require(name) must resolve from the *calling test file*, not from this
|
|
458
|
+
// shared shim - otherwise mocking a package only installed for the caller's
|
|
459
|
+
// own workspace fails here even though it resolves fine from the test file.
|
|
460
|
+
// captureStackTrace(target, mockFn) gets that caller's frame directly, with
|
|
461
|
+
// no guessing - some test setups replace global.Error with a wrapper, which
|
|
462
|
+
// breaks a plain new Error() here, so we go through a real native Error.
|
|
463
|
+
function mockFn(name, factory) {
|
|
464
|
+
const RealError = new Error().constructor;
|
|
465
|
+
const origPrepare = RealError.prepareStackTrace;
|
|
466
|
+
RealError.prepareStackTrace = (_, stack) => stack;
|
|
467
|
+
const target = {};
|
|
468
|
+
RealError.captureStackTrace(target, mockFn);
|
|
469
|
+
const stack = target.stack;
|
|
470
|
+
RealError.prepareStackTrace = origPrepare;
|
|
471
|
+
const callerFile = stack[0]?.getFileName();
|
|
472
|
+
const scopedRequire = callerFile ? createRequire(callerFile) : require;
|
|
473
|
+
const mod = scopedRequire(name);
|
|
474
|
+
const replacement = factory ? factory() : autoMock(mod);
|
|
475
|
+
let mutationFailed = false;
|
|
476
|
+
for (const key of Object.keys(replacement)) {
|
|
477
|
+
try {
|
|
478
|
+
mod[key] = replacement[key];
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
// non-writable export
|
|
482
|
+
}
|
|
483
|
+
if (mod[key] !== replacement[key])
|
|
484
|
+
mutationFailed = true;
|
|
485
|
+
}
|
|
486
|
+
// Bundled packages (esbuild/tsup output such as the `ai` package) expose
|
|
487
|
+
// their exports as getter-only, non-configurable properties, so the
|
|
488
|
+
// assignments above silently do nothing. Fall back to swapping the module's
|
|
489
|
+
// require-cache entry for a plain object, which every require() made after
|
|
490
|
+
// this call - notably the system under test - then receives. Only done when
|
|
491
|
+
// mutating in place actually failed, so modules that hold a reference to the
|
|
492
|
+
// original exports object keep seeing the mocks wherever that still works.
|
|
493
|
+
if (mutationFailed && mod && typeof mod === "object") {
|
|
494
|
+
try {
|
|
495
|
+
const entry = scopedRequire.cache[scopedRequire.resolve(name)];
|
|
496
|
+
if (entry)
|
|
497
|
+
entry.exports = { ...mod, ...replacement };
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
// not resolvable/cacheable (builtin, ESM); nothing more we can do
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
// jest.mock without a factory: replace every function export with a mock.
|
|
505
|
+
const autoMock = (mod) => {
|
|
506
|
+
const replacement = {};
|
|
507
|
+
for (const key of Object.keys(mod))
|
|
508
|
+
if (typeof mod[key] === "function")
|
|
509
|
+
replacement[key] = fn();
|
|
510
|
+
return replacement;
|
|
511
|
+
};
|
|
512
|
+
// ---------------------------------------------------------------------------
|
|
513
|
+
// jest object: setTimeout (no-op; node:test has no default timeout), fn, mock
|
|
514
|
+
// ---------------------------------------------------------------------------
|
|
515
|
+
export const jest = {
|
|
516
|
+
// node:test has no global default timeout, so raising it is unnecessary.
|
|
517
|
+
setTimeout: (_ms) => { },
|
|
518
|
+
fn,
|
|
519
|
+
spyOn,
|
|
520
|
+
mock: mockFn,
|
|
521
|
+
clearAllMocks: () => {
|
|
522
|
+
for (const spy of activeSpies)
|
|
523
|
+
spy.mockClear?.();
|
|
524
|
+
},
|
|
525
|
+
restoreAllMocks: () => {
|
|
526
|
+
while (activeSpies.length)
|
|
527
|
+
activeSpies.pop().mockRestore?.();
|
|
528
|
+
},
|
|
529
|
+
};
|
|
530
|
+
//# sourceMappingURL=test_expect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_expect.js","sourceRoot":"","sources":["../test_expect.ts"],"names":[],"mappings":"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"}
|