@codefast/di-testing 0.0.0 → 0.1.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/CHANGELOG.md +27 -0
- package/dist/discovery/dependency-scanner.d.ts +6 -0
- package/dist/discovery/dependency-scanner.d.ts.map +1 -1
- package/dist/discovery/dependency-scanner.js +4 -0
- package/dist/discovery/dependency-scanner.js.map +1 -1
- package/dist/discovery/mock-binder.d.ts +18 -1
- package/dist/discovery/mock-binder.d.ts.map +1 -1
- package/dist/discovery/mock-binder.js +31 -10
- package/dist/discovery/mock-binder.js.map +1 -1
- package/dist/errors/errors.d.ts +17 -1
- package/dist/errors/errors.d.ts.map +1 -1
- package/dist/errors/errors.js +12 -0
- package/dist/errors/errors.js.map +1 -1
- package/dist/mocking/auto-mock.d.ts +8 -0
- package/dist/mocking/auto-mock.d.ts.map +1 -1
- package/dist/mocking/auto-mock.js +4 -0
- package/dist/mocking/auto-mock.js.map +1 -1
- package/dist/mocking/mock-factory.d.ts +6 -0
- package/dist/mocking/mock-factory.d.ts.map +1 -1
- package/dist/mocking/mock-factory.js +2 -0
- package/dist/mocking/mock-factory.js.map +1 -1
- package/dist/mocking/spy.d.ts +8 -0
- package/dist/mocking/spy.d.ts.map +1 -1
- package/dist/mocking/spy.js +2 -0
- package/dist/mocking/spy.js.map +1 -1
- package/dist/test-bed/bed-builder.d.ts +8 -0
- package/dist/test-bed/bed-builder.d.ts.map +1 -1
- package/dist/test-bed/bed-builder.js +2 -0
- package/dist/test-bed/bed-builder.js.map +1 -1
- package/dist/test-bed/sociable-builder.d.ts +4 -0
- package/dist/test-bed/sociable-builder.d.ts.map +1 -1
- package/dist/test-bed/sociable-builder.js +2 -0
- package/dist/test-bed/sociable-builder.js.map +1 -1
- package/dist/test-bed/solitary-builder.d.ts +4 -0
- package/dist/test-bed/solitary-builder.d.ts.map +1 -1
- package/dist/test-bed/solitary-builder.js +2 -0
- package/dist/test-bed/solitary-builder.js.map +1 -1
- package/dist/test-bed/test-bed.d.ts +4 -0
- package/dist/test-bed/test-bed.d.ts.map +1 -1
- package/dist/test-bed/test-bed.js +2 -0
- package/dist/test-bed/test-bed.js.map +1 -1
- package/dist/test-bed/unit-test-bed.d.ts +10 -0
- package/dist/test-bed/unit-test-bed.d.ts.map +1 -1
- package/dist/test-bed/unit-test-bed.js +4 -0
- package/dist/test-bed/unit-test-bed.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/discovery/dependency-scanner.ts +6 -0
- package/src/discovery/mock-binder.ts +45 -10
- package/src/errors/errors.ts +17 -1
- package/src/mocking/auto-mock.ts +8 -0
- package/src/mocking/mock-factory.ts +6 -0
- package/src/mocking/spy.ts +8 -0
- package/src/test-bed/bed-builder.ts +8 -0
- package/src/test-bed/sociable-builder.ts +4 -0
- package/src/test-bed/solitary-builder.ts +4 -0
- package/src/test-bed/test-bed.ts +4 -0
- package/src/test-bed/unit-test-bed.ts +10 -0
- package/src/types.ts +2 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# @codefast/di-testing
|
|
2
|
+
|
|
3
|
+
## 0.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#774](https://github.com/codefastlabs/codefast/pull/774) [`176e95a`](https://github.com/codefastlabs/codefast/commit/176e95a32b44fa16d81a22e4a48f53176837c839) Thanks [@thevuong](https://github.com/thevuong)! - Fold di's reserved `slotName` criterion into slot addressing, so `{ name: "x" }` and `{ tag: slotName.of("x") }` — one
|
|
8
|
+
slot to the container — are one slot to TestBed too: a mock registered with either spelling now matches a dependency
|
|
9
|
+
declared with the other, and `mocks.get(token, options)` accepts both.
|
|
10
|
+
- Updated dependencies [[`96af502`](https://github.com/codefastlabs/codefast/commit/96af502ed8dd7fc02c4440d03b40dc6677b7bcec)]:
|
|
11
|
+
- @codefast/di@0.8.0
|
|
12
|
+
|
|
13
|
+
## 0.1.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- [#771](https://github.com/codefastlabs/codefast/pull/771) [`33c19b7`](https://github.com/codefastlabs/codefast/commit/33c19b73bf97dfe4388124f139552a3d63fcd87b) Thanks [@thevuong](https://github.com/thevuong)! - Add `@codefast/di-testing`: solitary and sociable auto-mocking test beds for `@codefast/di`. `TestBed.solitary(Class)`
|
|
18
|
+
reads a class's declared dependencies through di's `MetadataReader`, builds a mock for each, and constructs the real
|
|
19
|
+
unit through a container so `@postConstruct`, accessor injection, and `@preDestroy` run as in production. The default
|
|
20
|
+
mock is a zero-dependency spy; pass `mockFactory: () => vi.fn()` to build the mocks from Vitest, Jest, or Sinon — the
|
|
21
|
+
factory's return type flows through the bed, so each backend's own mock API type-checks on `mocks.get(...)` and inside
|
|
22
|
+
`.stub` callbacks with no adapter packages. Overrides cover fixed sealed values (`.using`), partial stubs (`.stub`),
|
|
23
|
+
absent optionals (`.absent`), `injectAll` element lists (`.usingAll`), and slot-targeted mocks
|
|
24
|
+
(`.mock(token, { name })`); beds expose `resetMocks()` and `await using` disposal.
|
|
25
|
+
`TestBed.sociable(Class).expose(Collaborator)` keeps chosen class-keyed collaborators real (recursively, lifecycle
|
|
26
|
+
included) while token-keyed dependencies stay mocked as the declared boundary; `bed.exposed(Class)` retrieves the real
|
|
27
|
+
instances.
|
|
@@ -6,11 +6,15 @@ import type { Constructor, DependencySlot, MetadataReader } from "@codefast/di";
|
|
|
6
6
|
* @remarks Mirrors di's own fallback: a class with no constructor metadata is fine as long as its
|
|
7
7
|
* constructor takes no parameters, which keeps zero-arg and accessor-only classes testable without
|
|
8
8
|
* `@injectable`. A parameterful constructor with no metadata is a {@link NotInjectableError}.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.1.0
|
|
9
11
|
*/
|
|
10
12
|
export declare function scanDependencies(target: Constructor, reader: MetadataReader): ReadonlyArray<DependencySlot>;
|
|
11
13
|
/**
|
|
12
14
|
* What a sociable scan finds: the slots to mock, the exposed classes the unit actually reaches, and
|
|
13
15
|
* the constrained slots those classes are injected through.
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
14
18
|
*/
|
|
15
19
|
export interface SociableScan {
|
|
16
20
|
readonly mockSlots: ReadonlyArray<DependencySlot>;
|
|
@@ -24,6 +28,8 @@ export interface SociableScan {
|
|
|
24
28
|
*
|
|
25
29
|
* @remarks Class identity is what exposure follows — a `Token`-keyed dependency is always mocked,
|
|
26
30
|
* treating tokens as the declared boundary between the logic under test and the outside world.
|
|
31
|
+
*
|
|
32
|
+
* @since 0.1.0
|
|
27
33
|
*/
|
|
28
34
|
export declare function scanSociableDependencies(target: Constructor, exposed: ReadonlySet<Constructor>, reader: MetadataReader): SociableScan;
|
|
29
35
|
//# sourceMappingURL=dependency-scanner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-scanner.d.ts","sourceRoot":"","sources":["../../src/discovery/dependency-scanner.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAIhF
|
|
1
|
+
{"version":3,"file":"dependency-scanner.d.ts","sourceRoot":"","sources":["../../src/discovery/dependency-scanner.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAIhF;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,GAAG,aAAa,CAAC,cAAc,CAAC,CAS3G;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAC/C,gGAAgG;IAChG,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;CACnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,EACjC,MAAM,EAAE,cAAc,GACrB,YAAY,CA2Bd"}
|
|
@@ -6,6 +6,8 @@ import { NotInjectableError } from "#/errors/errors";
|
|
|
6
6
|
* @remarks Mirrors di's own fallback: a class with no constructor metadata is fine as long as its
|
|
7
7
|
* constructor takes no parameters, which keeps zero-arg and accessor-only classes testable without
|
|
8
8
|
* `@injectable`. A parameterful constructor with no metadata is a {@link NotInjectableError}.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.1.0
|
|
9
11
|
*/
|
|
10
12
|
export function scanDependencies(target, reader) {
|
|
11
13
|
const constructorMetadata = reader.getConstructorMetadata(target);
|
|
@@ -21,6 +23,8 @@ export function scanDependencies(target, reader) {
|
|
|
21
23
|
*
|
|
22
24
|
* @remarks Class identity is what exposure follows — a `Token`-keyed dependency is always mocked,
|
|
23
25
|
* treating tokens as the declared boundary between the logic under test and the outside world.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
24
28
|
*/
|
|
25
29
|
export function scanSociableDependencies(target, exposed, reader) {
|
|
26
30
|
const mockSlots = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-scanner.js","sourceRoot":"","sources":["../../src/discovery/dependency-scanner.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAIxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD
|
|
1
|
+
{"version":3,"file":"dependency-scanner.js","sourceRoot":"","sources":["../../src/discovery/dependency-scanner.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAIxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB,EAAE,MAAsB;IAC1E,MAAM,mBAAmB,GAAG,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,mBAAmB,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AACvG,CAAC;AAeD;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAmB,EACnB,OAAiC,EACjC,MAAsB;IAEtB,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAe,CAAC;IAC3C,MAAM,SAAS,GAA0B,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAuB,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvB,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACnB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC;gBACD,SAAS;YACX,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -6,6 +6,8 @@ import type { MockFactory } from "#/mocking/mock-factory";
|
|
|
6
6
|
*
|
|
7
7
|
* @remarks A stub's `setup` runs once per compile, so two beds built from one builder never share
|
|
8
8
|
* seeded spies.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.1.0
|
|
9
11
|
*/
|
|
10
12
|
export type MockOverride = {
|
|
11
13
|
readonly kind: "stub";
|
|
@@ -21,6 +23,8 @@ export type MockOverride = {
|
|
|
21
23
|
};
|
|
22
24
|
/**
|
|
23
25
|
* Normalized slot criteria an override or a `mocks.get` lookup addresses one binding slot with.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
24
28
|
*/
|
|
25
29
|
export interface SlotCriteria {
|
|
26
30
|
readonly name: string | undefined;
|
|
@@ -29,6 +33,8 @@ export interface SlotCriteria {
|
|
|
29
33
|
/**
|
|
30
34
|
* One override registration: how a dependency is supplied, and which slot it targets (none = every
|
|
31
35
|
* slot of the token that has no more specific override).
|
|
36
|
+
*
|
|
37
|
+
* @since 0.1.0
|
|
32
38
|
*/
|
|
33
39
|
export interface SlottedOverride {
|
|
34
40
|
readonly criteria: SlotCriteria | undefined;
|
|
@@ -36,10 +42,14 @@ export interface SlottedOverride {
|
|
|
36
42
|
}
|
|
37
43
|
/**
|
|
38
44
|
* What one bound entry was supplied with — only `auto` and `stub` entries carry a mock surface.
|
|
45
|
+
*
|
|
46
|
+
* @since 0.1.0
|
|
39
47
|
*/
|
|
40
48
|
export type BoundMockKind = "auto" | "stub" | "value" | "absent" | "all" | "exposed";
|
|
41
49
|
/**
|
|
42
50
|
* One bound value `mocks` can look up: its slot criteria, the value, and how it was supplied.
|
|
51
|
+
*
|
|
52
|
+
* @since 0.1.0
|
|
43
53
|
*/
|
|
44
54
|
export interface BoundMock {
|
|
45
55
|
readonly criteria: SlotCriteria | undefined;
|
|
@@ -50,11 +60,16 @@ export interface BoundMock {
|
|
|
50
60
|
* Folds an `InjectOptions` into slot criteria, or `undefined` when it names no criterion.
|
|
51
61
|
*
|
|
52
62
|
* @remarks Tags are copied and deduplicated by identity — di interns each `(key, value)` pair, so a
|
|
53
|
-
* repeated pair is the same object.
|
|
63
|
+
* repeated pair is the same object. A reserved `slotName` criterion folds into `name`, so both
|
|
64
|
+
* spellings address one slot.
|
|
65
|
+
*
|
|
66
|
+
* @since 0.1.0
|
|
54
67
|
*/
|
|
55
68
|
export declare function normalizeCriteria(options: InjectOptions | undefined): SlotCriteria | undefined;
|
|
56
69
|
/**
|
|
57
70
|
* Returns whether two criteria address the same slot — equal name and the same tag set.
|
|
71
|
+
*
|
|
72
|
+
* @since 0.1.0
|
|
58
73
|
*/
|
|
59
74
|
export declare function criteriaEquals(left: SlotCriteria, right: SlotCriteria): boolean;
|
|
60
75
|
/**
|
|
@@ -66,6 +81,8 @@ export declare function criteriaEquals(left: SlotCriteria, right: SlotCriteria):
|
|
|
66
81
|
* An override that matches nothing is an {@link UndeclaredDependencyError}; `.absent()` on a
|
|
67
82
|
* required slot or `.usingAll()` with no unconstrained `injectAll()` slot is an
|
|
68
83
|
* {@link OverrideMismatchError}.
|
|
84
|
+
*
|
|
85
|
+
* @since 0.1.0
|
|
69
86
|
*/
|
|
70
87
|
export declare function bindMocks(container: Container, dependencies: ReadonlyArray<DependencySlot>, overrides: ReadonlyMap<DependencyKey, ReadonlyArray<SlottedOverride>>, mockFactory: MockFactory, exposed?: ReadonlySet<Constructor>): ReadonlyMap<DependencyKey, ReadonlyArray<BoundMock>>;
|
|
71
88
|
//# sourceMappingURL=mock-binder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-binder.d.ts","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMrH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"mock-binder.d.ts","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAEtG,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAMrH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAErF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAU9F;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAE/E;AAiDD;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CACvB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC,EAC3C,SAAS,EAAE,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,EACrE,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,WAAW,CAAC,WAAW,CAAC,GACjC,WAAW,CAAC,aAAa,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CA4ItD"}
|
|
@@ -1,28 +1,46 @@
|
|
|
1
1
|
/** Binds a unit's discovered dependencies onto a container as mocks — the sole container coupling. */
|
|
2
|
-
import { tokenName } from "@codefast/di";
|
|
2
|
+
import { slotName, tokenName } from "@codefast/di";
|
|
3
3
|
import { OverrideMismatchError, UndeclaredDependencyError } from "#/errors/errors";
|
|
4
4
|
import { createAutoMock } from "#/mocking/auto-mock";
|
|
5
5
|
/** The name prefix `usingAll` elements are bound under, so identical constants keep distinct slots. */
|
|
6
6
|
const ALL_ELEMENT_SLOT_PREFIX = "di-testing:all:";
|
|
7
|
+
/**
|
|
8
|
+
* One name and plain tag set, with di's reserved criterion folded into the name.
|
|
9
|
+
*
|
|
10
|
+
* @remarks di treats `{name: "x"}` and `{tag: slotName.of("x")}` as one slot, so addressing here
|
|
11
|
+
* must too — mirroring `bindingSlotToResolveOptions` in di.
|
|
12
|
+
*/
|
|
13
|
+
function foldReservedName(name, tags) {
|
|
14
|
+
const reserved = tags.find((tag) => tag.key === slotName);
|
|
15
|
+
if (reserved === undefined) {
|
|
16
|
+
return { name, tags };
|
|
17
|
+
}
|
|
18
|
+
return { name: name ?? reserved.value, tags: tags.filter((tag) => tag.key !== slotName) };
|
|
19
|
+
}
|
|
7
20
|
/**
|
|
8
21
|
* Folds an `InjectOptions` into slot criteria, or `undefined` when it names no criterion.
|
|
9
22
|
*
|
|
10
23
|
* @remarks Tags are copied and deduplicated by identity — di interns each `(key, value)` pair, so a
|
|
11
|
-
* repeated pair is the same object.
|
|
24
|
+
* repeated pair is the same object. A reserved `slotName` criterion folds into `name`, so both
|
|
25
|
+
* spellings address one slot.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
12
28
|
*/
|
|
13
29
|
export function normalizeCriteria(options) {
|
|
14
30
|
if (options === undefined) {
|
|
15
31
|
return undefined;
|
|
16
32
|
}
|
|
17
|
-
const
|
|
18
|
-
const tags = [...new Set(
|
|
19
|
-
if (
|
|
33
|
+
const merged = options.tag === undefined ? (options.tags ?? []) : [options.tag, ...(options.tags ?? [])];
|
|
34
|
+
const { name, tags } = foldReservedName(options.name, [...new Set(merged)]);
|
|
35
|
+
if (name === undefined && tags.length === 0) {
|
|
20
36
|
return undefined;
|
|
21
37
|
}
|
|
22
|
-
return { name
|
|
38
|
+
return { name, tags };
|
|
23
39
|
}
|
|
24
40
|
/**
|
|
25
41
|
* Returns whether two criteria address the same slot — equal name and the same tag set.
|
|
42
|
+
*
|
|
43
|
+
* @since 0.1.0
|
|
26
44
|
*/
|
|
27
45
|
export function criteriaEquals(left, right) {
|
|
28
46
|
return left.name === right.name && tagSetEquals(left.tags, right.tags);
|
|
@@ -43,15 +61,16 @@ function tagSetEquals(left, right) {
|
|
|
43
61
|
}
|
|
44
62
|
/** Returns the slot's own criteria, or `undefined` for an unconstrained slot. */
|
|
45
63
|
function criteriaOfSlot(slot) {
|
|
46
|
-
const tags = slot.tags ?? [];
|
|
47
|
-
if (
|
|
64
|
+
const { name, tags } = foldReservedName(slot.name, slot.tags ?? []);
|
|
65
|
+
if (name === undefined && tags.length === 0) {
|
|
48
66
|
return undefined;
|
|
49
67
|
}
|
|
50
|
-
return { name
|
|
68
|
+
return { name, tags };
|
|
51
69
|
}
|
|
52
70
|
/** Returns whether an override's criteria address exactly this slot. */
|
|
53
71
|
function matchesSlot(criteria, slot) {
|
|
54
|
-
|
|
72
|
+
const folded = foldReservedName(slot.name, slot.tags ?? []);
|
|
73
|
+
return criteria.name === folded.name && tagSetEquals(criteria.tags, folded.tags);
|
|
55
74
|
}
|
|
56
75
|
/** A readable rendering of criteria for error messages. */
|
|
57
76
|
function describeCriteria(criteria) {
|
|
@@ -77,6 +96,8 @@ function acceptsAll(slot) {
|
|
|
77
96
|
* An override that matches nothing is an {@link UndeclaredDependencyError}; `.absent()` on a
|
|
78
97
|
* required slot or `.usingAll()` with no unconstrained `injectAll()` slot is an
|
|
79
98
|
* {@link OverrideMismatchError}.
|
|
99
|
+
*
|
|
100
|
+
* @since 0.1.0
|
|
80
101
|
*/
|
|
81
102
|
export function bindMocks(container, dependencies, overrides, mockFactory, exposed) {
|
|
82
103
|
if (exposed !== undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-binder.js","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"AAAA,sGAAsG;AAGtG,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"mock-binder.js","sourceRoot":"","sources":["../../src/discovery/mock-binder.ts"],"names":[],"mappings":"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"}
|
package/dist/errors/errors.d.ts
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @remarks Mirrors `@codefast/di`'s own `DiError` shape rather than extending it, so a caller can
|
|
6
6
|
* catch testing-setup failures separately from resolution failures.
|
|
7
|
+
*
|
|
8
|
+
* @since 0.1.0
|
|
7
9
|
*/
|
|
8
10
|
export declare abstract class TestingError extends Error {
|
|
9
11
|
abstract readonly code: string;
|
|
@@ -11,6 +13,8 @@ export declare abstract class TestingError extends Error {
|
|
|
11
13
|
}
|
|
12
14
|
/**
|
|
13
15
|
* A scanned class takes constructor parameters but carries no `@injectable` metadata.
|
|
16
|
+
*
|
|
17
|
+
* @since 0.1.0
|
|
14
18
|
*/
|
|
15
19
|
export declare class NotInjectableError extends TestingError {
|
|
16
20
|
readonly code = "NOT_INJECTABLE";
|
|
@@ -22,19 +26,27 @@ export declare class NotInjectableError extends TestingError {
|
|
|
22
26
|
*
|
|
23
27
|
* @remarks Almost always a typo or a stale token reference; failing loudly beats silently binding an
|
|
24
28
|
* unused constant or returning `undefined`.
|
|
29
|
+
*
|
|
30
|
+
* @since 0.1.0
|
|
25
31
|
*/
|
|
26
32
|
export declare class UndeclaredDependencyError extends TestingError {
|
|
27
33
|
readonly code = "UNDECLARED_DEPENDENCY";
|
|
28
34
|
readonly tokenName: string;
|
|
29
35
|
constructor(tokenName: string, detail?: string);
|
|
30
36
|
}
|
|
31
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* What a sealed entry was supplied with, naming the one cause a lookup error should report.
|
|
39
|
+
*
|
|
40
|
+
* @since 0.1.0
|
|
41
|
+
*/
|
|
32
42
|
export type SealedCause = "value" | "absent" | "all" | "exposed";
|
|
33
43
|
/**
|
|
34
44
|
* A `mocks.get(...)` lookup asked for a dependency that is not a retrievable mock.
|
|
35
45
|
*
|
|
36
46
|
* @remarks `.using()`, `.absent()`, and `.usingAll()` seal the value, and an exposed class is real —
|
|
37
47
|
* none of them carries a mock surface, so handing them back typed as `Mocked` would lie.
|
|
48
|
+
*
|
|
49
|
+
* @since 0.1.0
|
|
38
50
|
*/
|
|
39
51
|
export declare class SealedDependencyError extends TestingError {
|
|
40
52
|
readonly code = "SEALED_DEPENDENCY";
|
|
@@ -44,6 +56,8 @@ export declare class SealedDependencyError extends TestingError {
|
|
|
44
56
|
/**
|
|
45
57
|
* An override whose shape does not fit the slot it targets — `.absent()` on a required dependency,
|
|
46
58
|
* or `.usingAll()` where no unconstrained `injectAll()` slot exists.
|
|
59
|
+
*
|
|
60
|
+
* @since 0.1.0
|
|
47
61
|
*/
|
|
48
62
|
export declare class OverrideMismatchError extends TestingError {
|
|
49
63
|
readonly code = "OVERRIDE_MISMATCH";
|
|
@@ -53,6 +67,8 @@ export declare class OverrideMismatchError extends TestingError {
|
|
|
53
67
|
/**
|
|
54
68
|
* A sociable bed's exposure could not be honoured — the class is unreachable, already the unit, or
|
|
55
69
|
* was asked for without having been exposed.
|
|
70
|
+
*
|
|
71
|
+
* @since 0.1.0
|
|
56
72
|
*/
|
|
57
73
|
export declare class ExposureError extends TestingError {
|
|
58
74
|
readonly code = "EXPOSURE";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors/errors.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors/errors.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG;;;;;;;GAOG;AACH,8BAAsB,YAAa,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAK7B;CACF;AAED;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,YAAY,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAK7C;CACF;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AASjE;;;;;;;GAOG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,YAAY,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAGhD;CACF;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,YAAY,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAG5C;CACF;AAED;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,YAAY,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAG7C;CACF"}
|
package/dist/errors/errors.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @remarks Mirrors `@codefast/di`'s own `DiError` shape rather than extending it, so a caller can
|
|
6
6
|
* catch testing-setup failures separately from resolution failures.
|
|
7
|
+
*
|
|
8
|
+
* @since 0.1.0
|
|
7
9
|
*/
|
|
8
10
|
export class TestingError extends Error {
|
|
9
11
|
constructor(message) {
|
|
@@ -13,6 +15,8 @@ export class TestingError extends Error {
|
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* A scanned class takes constructor parameters but carries no `@injectable` metadata.
|
|
18
|
+
*
|
|
19
|
+
* @since 0.1.0
|
|
16
20
|
*/
|
|
17
21
|
export class NotInjectableError extends TestingError {
|
|
18
22
|
code = "NOT_INJECTABLE";
|
|
@@ -27,6 +31,8 @@ export class NotInjectableError extends TestingError {
|
|
|
27
31
|
*
|
|
28
32
|
* @remarks Almost always a typo or a stale token reference; failing loudly beats silently binding an
|
|
29
33
|
* unused constant or returning `undefined`.
|
|
34
|
+
*
|
|
35
|
+
* @since 0.1.0
|
|
30
36
|
*/
|
|
31
37
|
export class UndeclaredDependencyError extends TestingError {
|
|
32
38
|
code = "UNDECLARED_DEPENDENCY";
|
|
@@ -47,6 +53,8 @@ const SEALED_MESSAGES = {
|
|
|
47
53
|
*
|
|
48
54
|
* @remarks `.using()`, `.absent()`, and `.usingAll()` seal the value, and an exposed class is real —
|
|
49
55
|
* none of them carries a mock surface, so handing them back typed as `Mocked` would lie.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
50
58
|
*/
|
|
51
59
|
export class SealedDependencyError extends TestingError {
|
|
52
60
|
code = "SEALED_DEPENDENCY";
|
|
@@ -59,6 +67,8 @@ export class SealedDependencyError extends TestingError {
|
|
|
59
67
|
/**
|
|
60
68
|
* An override whose shape does not fit the slot it targets — `.absent()` on a required dependency,
|
|
61
69
|
* or `.usingAll()` where no unconstrained `injectAll()` slot exists.
|
|
70
|
+
*
|
|
71
|
+
* @since 0.1.0
|
|
62
72
|
*/
|
|
63
73
|
export class OverrideMismatchError extends TestingError {
|
|
64
74
|
code = "OVERRIDE_MISMATCH";
|
|
@@ -71,6 +81,8 @@ export class OverrideMismatchError extends TestingError {
|
|
|
71
81
|
/**
|
|
72
82
|
* A sociable bed's exposure could not be honoured — the class is unreachable, already the unit, or
|
|
73
83
|
* was asked for without having been exposed.
|
|
84
|
+
*
|
|
85
|
+
* @since 0.1.0
|
|
74
86
|
*/
|
|
75
87
|
export class ExposureError extends TestingError {
|
|
76
88
|
code = "EXPOSURE";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors/errors.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors/errors.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG;;;;;;;GAOG;AACH,MAAM,OAAgB,YAAa,SAAQ,KAAK;IAG9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACpC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IACzC,IAAI,GAAG,gBAAgB,CAAC;IACxB,UAAU,CAAS;IAE5B,YAAY,UAAkB;QAC5B,KAAK,CACH,oCAAoC,UAAU,gNAAgN,CAC/P,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,yBAA0B,SAAQ,YAAY;IAChD,IAAI,GAAG,uBAAuB,CAAC;IAC/B,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,MAAe;QAC5C,KAAK,CACH,IAAI,SAAS,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,oJAAoJ,CAChN,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AASD,MAAM,eAAe,GAA0C;IAC7D,KAAK,EAAE,iGAAiG;IACxG,MAAM,EAAE,yEAAyE;IACjF,GAAG,EAAE,qFAAqF;IAC1F,OAAO,EAAE,oFAAoF;CAC9F,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAC5C,IAAI,GAAG,mBAAmB,CAAC;IAC3B,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,KAAkB;QAC/C,KAAK,CAAC,IAAI,SAAS,gCAAgC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAC5C,IAAI,GAAG,mBAAmB,CAAC;IAC3B,SAAS,CAAS;IAE3B,YAAY,SAAiB,EAAE,MAAc;QAC3C,KAAK,CAAC,IAAI,SAAS,MAAM,MAAM,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAY;IACpC,IAAI,GAAG,UAAU,CAAC;IAClB,UAAU,CAAS;IAE5B,YAAY,UAAkB,EAAE,MAAc;QAC5C,KAAK,CAAC,IAAI,UAAU,MAAM,MAAM,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -11,6 +11,8 @@ import type { Spy } from "#/mocking/spy";
|
|
|
11
11
|
*
|
|
12
12
|
* @typeParam Dependency - The dependency type being mocked.
|
|
13
13
|
* @typeParam Backend - The spy type the active mock factory produces.
|
|
14
|
+
*
|
|
15
|
+
* @since 0.1.0
|
|
14
16
|
*/
|
|
15
17
|
export type Mocked<Dependency, Backend extends MockFunction = Spy> = Dependency extends (...args: infer Args) => infer Return ? [Backend] extends [Spy] ? [Spy] extends [Backend] ? Spy<Args, Return> : Backend & ((...args: Args) => Return) : Backend & ((...args: Args) => Return) : Dependency extends object ? {
|
|
16
18
|
[Key in keyof Dependency]: Mocked<Dependency[Key], Backend>;
|
|
@@ -22,6 +24,8 @@ export type Mocked<Dependency, Backend extends MockFunction = Spy> = Dependency
|
|
|
22
24
|
* optional so only the members a test cares about need spelling out.
|
|
23
25
|
*
|
|
24
26
|
* @typeParam Dependency - The dependency type being partially stubbed.
|
|
27
|
+
*
|
|
28
|
+
* @since 0.1.0
|
|
25
29
|
*/
|
|
26
30
|
export type DeepPartial<Dependency> = Dependency extends (...args: Array<never>) => unknown ? Dependency : Dependency extends object ? {
|
|
27
31
|
[Key in keyof Dependency]?: DeepPartial<Dependency[Key]>;
|
|
@@ -29,6 +33,8 @@ export type DeepPartial<Dependency> = Dependency extends (...args: Array<never>)
|
|
|
29
33
|
/**
|
|
30
34
|
* The key an auto-mock answers with its reset routine, clearing the root spy, every materialized
|
|
31
35
|
* member, and the spies of its seed.
|
|
36
|
+
*
|
|
37
|
+
* @since 0.1.0
|
|
32
38
|
*/
|
|
33
39
|
export declare const MOCK_RESET: unique symbol;
|
|
34
40
|
/**
|
|
@@ -42,6 +48,8 @@ export declare const MOCK_RESET: unique symbol;
|
|
|
42
48
|
*
|
|
43
49
|
* @typeParam Dependency - The dependency type being mocked.
|
|
44
50
|
* @typeParam Backend - The spy type the factory produces, threaded into the returned `Mocked` view.
|
|
51
|
+
*
|
|
52
|
+
* @since 0.1.0
|
|
45
53
|
*/
|
|
46
54
|
export declare function createAutoMock<Dependency, Backend extends MockFunction = Spy>(mockFactory: MockFactory<Backend>, seed?: DeepPartial<Dependency>): Mocked<Dependency, Backend>;
|
|
47
55
|
//# sourceMappingURL=auto-mock.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-mock.d.ts","sourceRoot":"","sources":["../../src/mocking/auto-mock.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEzC
|
|
1
|
+
{"version":3,"file":"auto-mock.d.ts","sourceRoot":"","sources":["../../src/mocking/auto-mock.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,MAAM,CAAC,UAAU,EAAE,OAAO,SAAS,YAAY,GAAG,GAAG,IAAI,UAAU,SAAS,CACtF,GAAG,IAAI,EAAE,MAAM,IAAI,KAChB,MAAM,MAAM,GACb,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GACrB,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GACrB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,GACjB,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,GACvC,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,GACvC,UAAU,SAAS,MAAM,GACvB;KAAG,GAAG,IAAI,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CAAE,GAC/D,UAAU,CAAC;AAEjB;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,CAAC,UAAU,IAAI,UAAU,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,GACvF,UAAU,GACV,UAAU,SAAS,MAAM,GACvB;KAAG,GAAG,IAAI,MAAM,UAAU,CAAC,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;CAAE,GAC5D,UAAU,CAAC;AAEjB;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,OAAO,MAAwC,CAAC;AAoDzE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,OAAO,SAAS,YAAY,GAAG,GAAG,EAC3E,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,EACjC,IAAI,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,GAC7B,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAyH7B"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* The key an auto-mock answers with its reset routine, clearing the root spy, every materialized
|
|
4
4
|
* member, and the spies of its seed.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
5
7
|
*/
|
|
6
8
|
export const MOCK_RESET = Symbol("di-testing:mock-reset");
|
|
7
9
|
// `then` would make every mock thenable and stall `await`; `toJSON` and `asymmetricMatch` are probed
|
|
@@ -59,6 +61,8 @@ function seedProvides(seed, key) {
|
|
|
59
61
|
*
|
|
60
62
|
* @typeParam Dependency - The dependency type being mocked.
|
|
61
63
|
* @typeParam Backend - The spy type the factory produces, threaded into the returned `Mocked` view.
|
|
64
|
+
*
|
|
65
|
+
* @since 0.1.0
|
|
62
66
|
*/
|
|
63
67
|
export function createAutoMock(mockFactory, seed) {
|
|
64
68
|
// A primitive stub has no members to mock — the seed is the dependency's whole value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-mock.js","sourceRoot":"","sources":["../../src/mocking/auto-mock.ts"],"names":[],"mappings":"AAAA,uFAAuF;
|
|
1
|
+
{"version":3,"file":"auto-mock.js","sourceRoot":"","sources":["../../src/mocking/auto-mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import type { Spy } from "#/mocking/spy";
|
|
|
5
5
|
*
|
|
6
6
|
* @remarks Deliberately structural so any backend qualifies: the built-in {@link Spy}, a Vitest
|
|
7
7
|
* `vi.fn()`, a `jest.fn()`, or a Sinon stub all satisfy it.
|
|
8
|
+
*
|
|
9
|
+
* @since 0.1.0
|
|
8
10
|
*/
|
|
9
11
|
export type MockFunction = (...args: ReadonlyArray<unknown>) => unknown;
|
|
10
12
|
/**
|
|
@@ -16,10 +18,14 @@ export type MockFunction = (...args: ReadonlyArray<unknown>) => unknown;
|
|
|
16
18
|
* with no adapter package and no module augmentation.
|
|
17
19
|
*
|
|
18
20
|
* @typeParam Backend - The spy type one factory call produces; defaults to the loose callable.
|
|
21
|
+
*
|
|
22
|
+
* @since 0.1.0
|
|
19
23
|
*/
|
|
20
24
|
export type MockFactory<Backend extends MockFunction = MockFunction> = () => Backend;
|
|
21
25
|
/**
|
|
22
26
|
* The default `MockFactory` — one built-in {@link Spy} per call, with no test-framework dependency.
|
|
27
|
+
*
|
|
28
|
+
* @since 0.1.0
|
|
23
29
|
*/
|
|
24
30
|
export declare const defaultMockFactory: MockFactory<Spy>;
|
|
25
31
|
//# sourceMappingURL=mock-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-factory.d.ts","sourceRoot":"","sources":["../../src/mocking/mock-factory.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGzC
|
|
1
|
+
{"version":3,"file":"mock-factory.d.ts","sourceRoot":"","sources":["../../src/mocking/mock-factory.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGzC;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;AAExE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,CAAC,OAAO,SAAS,YAAY,GAAG,YAAY,IAAI,MAAM,OAAO,CAAC;AAErF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,GAAG,CAAqB,CAAC"}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { createSpy } from "#/mocking/spy";
|
|
3
3
|
/**
|
|
4
4
|
* The default `MockFactory` — one built-in {@link Spy} per call, with no test-framework dependency.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
5
7
|
*/
|
|
6
8
|
export const defaultMockFactory = () => createSpy();
|
|
7
9
|
//# sourceMappingURL=mock-factory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-factory.js","sourceRoot":"","sources":["../../src/mocking/mock-factory.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAGvF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"mock-factory.js","sourceRoot":"","sources":["../../src/mocking/mock-factory.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAGvF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA0B1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAqB,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC"}
|
package/dist/mocking/spy.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** The built-in zero-dependency spy the default mock factory hands out. */
|
|
2
2
|
/**
|
|
3
3
|
* One recorded invocation's outcome — a returned value or a thrown error.
|
|
4
|
+
*
|
|
5
|
+
* @since 0.1.0
|
|
4
6
|
*/
|
|
5
7
|
export interface SpyResult {
|
|
6
8
|
readonly type: "return" | "throw";
|
|
@@ -10,6 +12,8 @@ export interface SpyResult {
|
|
|
10
12
|
* The call log a spy exposes for assertions.
|
|
11
13
|
*
|
|
12
14
|
* @typeParam Args - The spy's argument tuple.
|
|
15
|
+
*
|
|
16
|
+
* @since 0.1.0
|
|
13
17
|
*/
|
|
14
18
|
export interface SpyState<Args extends ReadonlyArray<unknown>> {
|
|
15
19
|
readonly calls: ReadonlyArray<Args>;
|
|
@@ -20,6 +24,8 @@ export interface SpyState<Args extends ReadonlyArray<unknown>> {
|
|
|
20
24
|
*
|
|
21
25
|
* @remarks `Return` defaults to `any` so a spy drops into any typed method slot, exactly as Vitest's
|
|
22
26
|
* own mock type does — the package's one deliberate `any`.
|
|
27
|
+
*
|
|
28
|
+
* @since 0.1.0
|
|
23
29
|
*/
|
|
24
30
|
export interface Spy<Args extends ReadonlyArray<unknown> = ReadonlyArray<unknown>, Return = any> {
|
|
25
31
|
(...args: Args): Return;
|
|
@@ -34,6 +40,8 @@ export interface Spy<Args extends ReadonlyArray<unknown> = ReadonlyArray<unknown
|
|
|
34
40
|
}
|
|
35
41
|
/**
|
|
36
42
|
* Creates a fresh zero-dependency spy that records its calls and returns `undefined` until configured.
|
|
43
|
+
*
|
|
44
|
+
* @since 0.1.0
|
|
37
45
|
*/
|
|
38
46
|
export declare function createSpy(): Spy;
|
|
39
47
|
//# sourceMappingURL=spy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spy.d.ts","sourceRoot":"","sources":["../../src/mocking/spy.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E
|
|
1
|
+
{"version":3,"file":"spy.d.ts","sourceRoot":"","sources":["../../src/mocking/spy.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ,CAAC,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC;IAC3D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CAC5C;AAGD;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG,CAAC,IAAI,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG;IAC7F,CAAC,GAAG,IAAI,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,4DAA4D;IAC5D,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG,IAAI,CAAC;IACxD,mFAAmF;IACnF,SAAS,IAAI,IAAI,CAAC;CACnB;AAGD;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,GAAG,CAwC/B"}
|
package/dist/mocking/spy.js
CHANGED
package/dist/mocking/spy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spy.js","sourceRoot":"","sources":["../../src/mocking/spy.ts"],"names":[],"mappings":"AAAA,2EAA2E;
|
|
1
|
+
{"version":3,"file":"spy.js","sourceRoot":"","sources":["../../src/mocking/spy.ts"],"names":[],"mappings":"AAAA,2EAA2E;AA4C3E,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAkC,EAAE,CAAC;IAChD,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,cAA0E,CAAC;IAC/E,IAAI,WAAoB,CAAC;IAEzB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CACvB,CAAC,GAAG,IAA4B,EAAW,EAAE;QAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,CAAC;YACnF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,EACD;QACE,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;QACxB,eAAe,CAAC,KAAc;YAC5B,WAAW,GAAG,KAAK,CAAC;YACpB,cAAc,GAAG,SAAS,CAAC;YAC3B,OAAO,GAAG,CAAC;QACb,CAAC;QACD,kBAAkB,CAAC,EAAgD;YACjE,cAAc,GAAG,EAAE,CAAC;YACpB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,oEAAoE;QACpE,SAAS;YACP,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACjB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACnB,cAAc,GAAG,SAAS,CAAC;YAC3B,WAAW,GAAG,SAAS,CAAC;QAC1B,CAAC;KACF,CACK,CAAC;IAET,OAAO,GAAG,CAAC;AACb,CAAC"}
|