@stratal/testing 0.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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/core/env/index.d.ts +2 -0
  3. package/dist/core/env/index.d.ts.map +1 -0
  4. package/dist/core/env/index.js +2 -0
  5. package/dist/core/env/index.js.map +1 -0
  6. package/dist/core/env/test-env.d.ts +9 -0
  7. package/dist/core/env/test-env.d.ts.map +1 -0
  8. package/dist/core/env/test-env.js +14 -0
  9. package/dist/core/env/test-env.js.map +1 -0
  10. package/dist/core/http/fetch-mock.d.ts +236 -0
  11. package/dist/core/http/fetch-mock.d.ts.map +1 -0
  12. package/dist/core/http/fetch-mock.js +290 -0
  13. package/dist/core/http/fetch-mock.js.map +1 -0
  14. package/dist/core/http/fetch-mock.types.d.ts +48 -0
  15. package/dist/core/http/fetch-mock.types.d.ts.map +1 -0
  16. package/dist/core/http/fetch-mock.types.js +2 -0
  17. package/dist/core/http/fetch-mock.types.js.map +1 -0
  18. package/dist/core/http/index.d.ts +6 -0
  19. package/dist/core/http/index.d.ts.map +1 -0
  20. package/dist/core/http/index.js +5 -0
  21. package/dist/core/http/index.js.map +1 -0
  22. package/dist/core/http/test-http-client.d.ts +54 -0
  23. package/dist/core/http/test-http-client.d.ts.map +1 -0
  24. package/dist/core/http/test-http-client.js +75 -0
  25. package/dist/core/http/test-http-client.js.map +1 -0
  26. package/dist/core/http/test-http-request.d.ts +44 -0
  27. package/dist/core/http/test-http-request.d.ts.map +1 -0
  28. package/dist/core/http/test-http-request.js +75 -0
  29. package/dist/core/http/test-http-request.js.map +1 -0
  30. package/dist/core/http/test-response.d.ts +161 -0
  31. package/dist/core/http/test-response.d.ts.map +1 -0
  32. package/dist/core/http/test-response.js +309 -0
  33. package/dist/core/http/test-response.js.map +1 -0
  34. package/dist/core/index.d.ts +7 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +7 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/override/index.d.ts +2 -0
  39. package/dist/core/override/index.d.ts.map +1 -0
  40. package/dist/core/override/index.js +2 -0
  41. package/dist/core/override/index.js.map +1 -0
  42. package/dist/core/override/provider-override-builder.d.ts +77 -0
  43. package/dist/core/override/provider-override-builder.d.ts.map +1 -0
  44. package/dist/core/override/provider-override-builder.js +94 -0
  45. package/dist/core/override/provider-override-builder.js.map +1 -0
  46. package/dist/core/test.d.ts +48 -0
  47. package/dist/core/test.d.ts.map +1 -0
  48. package/dist/core/test.js +53 -0
  49. package/dist/core/test.js.map +1 -0
  50. package/dist/core/testing-module-builder.d.ts +98 -0
  51. package/dist/core/testing-module-builder.d.ts.map +1 -0
  52. package/dist/core/testing-module-builder.js +154 -0
  53. package/dist/core/testing-module-builder.js.map +1 -0
  54. package/dist/core/testing-module.d.ts +77 -0
  55. package/dist/core/testing-module.d.ts.map +1 -0
  56. package/dist/core/testing-module.js +99 -0
  57. package/dist/core/testing-module.js.map +1 -0
  58. package/dist/errors/index.d.ts +3 -0
  59. package/dist/errors/index.d.ts.map +1 -0
  60. package/dist/errors/index.js +3 -0
  61. package/dist/errors/index.js.map +1 -0
  62. package/dist/errors/setup-error.d.ts +9 -0
  63. package/dist/errors/setup-error.d.ts.map +1 -0
  64. package/dist/errors/setup-error.js +11 -0
  65. package/dist/errors/setup-error.js.map +1 -0
  66. package/dist/errors/test-error.d.ts +9 -0
  67. package/dist/errors/test-error.d.ts.map +1 -0
  68. package/dist/errors/test-error.js +15 -0
  69. package/dist/errors/test-error.js.map +1 -0
  70. package/dist/index.d.ts +14 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +18 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/mocks/index.d.ts +4 -0
  75. package/dist/mocks/index.d.ts.map +1 -0
  76. package/dist/mocks/index.js +4 -0
  77. package/dist/mocks/index.js.map +1 -0
  78. package/dist/mocks/nodemailer.d.ts +10 -0
  79. package/dist/mocks/nodemailer.d.ts.map +1 -0
  80. package/dist/mocks/nodemailer.js +9 -0
  81. package/dist/mocks/nodemailer.js.map +1 -0
  82. package/dist/storage/fake-storage.service.d.ts +114 -0
  83. package/dist/storage/fake-storage.service.d.ts.map +1 -0
  84. package/dist/storage/fake-storage.service.js +233 -0
  85. package/dist/storage/fake-storage.service.js.map +1 -0
  86. package/dist/storage/index.d.ts +2 -0
  87. package/dist/storage/index.d.ts.map +1 -0
  88. package/dist/storage/index.js +2 -0
  89. package/dist/storage/index.js.map +1 -0
  90. package/package.json +69 -0
@@ -0,0 +1,309 @@
1
+ import { expect } from 'vitest';
2
+ /**
3
+ * TestResponse
4
+ *
5
+ * Wrapper around Response with assertion methods.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * response
10
+ * .assertOk()
11
+ * .assertStatus(200)
12
+ * .assertJsonPath('data.id', userId)
13
+ * ```
14
+ */
15
+ export class TestResponse {
16
+ response;
17
+ jsonData = null;
18
+ textData = null;
19
+ constructor(response) {
20
+ this.response = response;
21
+ }
22
+ /**
23
+ * Get the raw Response object.
24
+ */
25
+ get raw() {
26
+ return this.response;
27
+ }
28
+ /**
29
+ * Get the response status code.
30
+ */
31
+ get status() {
32
+ return this.response.status;
33
+ }
34
+ /**
35
+ * Get response headers.
36
+ */
37
+ get headers() {
38
+ return this.response.headers;
39
+ }
40
+ /**
41
+ * Get the response body as JSON.
42
+ */
43
+ async json() {
44
+ if (this.jsonData === null) {
45
+ this.jsonData = await this.response.clone().json();
46
+ }
47
+ return this.jsonData;
48
+ }
49
+ /**
50
+ * Get the response body as text.
51
+ */
52
+ async text() {
53
+ this.textData ??= await this.response.clone().text();
54
+ return this.textData;
55
+ }
56
+ // ============================================================
57
+ // Status Assertions
58
+ // ============================================================
59
+ /**
60
+ * Assert response status is 200 OK.
61
+ */
62
+ assertOk() {
63
+ return this.assertStatus(200);
64
+ }
65
+ /**
66
+ * Assert response status is 201 Created.
67
+ */
68
+ assertCreated() {
69
+ return this.assertStatus(201);
70
+ }
71
+ /**
72
+ * Assert response status is 204 No Content.
73
+ */
74
+ assertNoContent() {
75
+ return this.assertStatus(204);
76
+ }
77
+ /**
78
+ * Assert response status is 400 Bad Request.
79
+ */
80
+ assertBadRequest() {
81
+ return this.assertStatus(400);
82
+ }
83
+ /**
84
+ * Assert response status is 401 Unauthorized.
85
+ */
86
+ assertUnauthorized() {
87
+ return this.assertStatus(401);
88
+ }
89
+ /**
90
+ * Assert response status is 403 Forbidden.
91
+ */
92
+ assertForbidden() {
93
+ return this.assertStatus(403);
94
+ }
95
+ /**
96
+ * Assert response status is 404 Not Found.
97
+ */
98
+ assertNotFound() {
99
+ return this.assertStatus(404);
100
+ }
101
+ /**
102
+ * Assert response status is 422 Unprocessable Entity.
103
+ */
104
+ assertUnprocessable() {
105
+ return this.assertStatus(422);
106
+ }
107
+ /**
108
+ * Assert response status is 500 Internal Server Error.
109
+ */
110
+ assertServerError() {
111
+ return this.assertStatus(500);
112
+ }
113
+ /**
114
+ * Assert response has the given status code.
115
+ */
116
+ assertStatus(expected) {
117
+ expect(this.response.status, `Expected status ${expected}, got ${this.response.status}`).toBe(expected);
118
+ return this;
119
+ }
120
+ /**
121
+ * Assert response status is in the 2xx success range.
122
+ */
123
+ assertSuccessful() {
124
+ expect(this.response.status >= 200 && this.response.status < 300, `Expected successful status (2xx), got ${this.response.status}`).toBe(true);
125
+ return this;
126
+ }
127
+ // ============================================================
128
+ // JSON Assertions
129
+ // ============================================================
130
+ /**
131
+ * Assert JSON response contains the given data.
132
+ */
133
+ async assertJson(expected) {
134
+ const actual = await this.json();
135
+ for (const [key, value] of Object.entries(expected)) {
136
+ expect(actual[key], `Expected JSON key "${key}" to be ${JSON.stringify(value)}, got ${JSON.stringify(actual[key])}`).toBe(value);
137
+ }
138
+ return this;
139
+ }
140
+ /**
141
+ * Assert JSON response has value at the given path.
142
+ *
143
+ * @param path - Dot-notation path (e.g., 'data.user.id')
144
+ * @param expected - Expected value at path
145
+ */
146
+ async assertJsonPath(path, expected) {
147
+ const json = await this.json();
148
+ const actual = this.getValueAtPath(json, path);
149
+ expect(actual, `Expected JSON path "${path}" to be ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`).toBe(expected);
150
+ return this;
151
+ }
152
+ /**
153
+ * Assert JSON response structure matches the given schema.
154
+ */
155
+ async assertJsonStructure(structure) {
156
+ const json = await this.json();
157
+ for (const key of structure) {
158
+ expect(key in json, `Expected JSON to have key "${key}", got keys: ${JSON.stringify(Object.keys(json))}`).toBe(true);
159
+ }
160
+ return this;
161
+ }
162
+ /**
163
+ * Assert a JSON path exists (value can be anything, including null).
164
+ *
165
+ * @param path - Dot-notation path (e.g., 'data.user.id')
166
+ */
167
+ async assertJsonPathExists(path) {
168
+ const json = await this.json();
169
+ const exists = this.hasValueAtPath(json, path);
170
+ expect(exists, `Expected JSON path "${path}" to exist`).toBe(true);
171
+ return this;
172
+ }
173
+ /**
174
+ * Assert a JSON path does not exist.
175
+ *
176
+ * @param path - Dot-notation path (e.g., 'data.user.deletedAt')
177
+ */
178
+ async assertJsonPathMissing(path) {
179
+ const json = await this.json();
180
+ const exists = this.hasValueAtPath(json, path);
181
+ expect(exists, `Expected JSON path "${path}" to not exist`).toBe(false);
182
+ return this;
183
+ }
184
+ /**
185
+ * Assert JSON value at path matches a custom predicate.
186
+ *
187
+ * @param path - Dot-notation path (e.g., 'data.items')
188
+ * @param matcher - Predicate function to validate the value
189
+ */
190
+ async assertJsonPathMatches(path, matcher) {
191
+ const json = await this.json();
192
+ const value = this.getValueAtPath(json, path);
193
+ expect(matcher(value), `Expected JSON path "${path}" to match predicate, got ${JSON.stringify(value)}`).toBe(true);
194
+ return this;
195
+ }
196
+ /**
197
+ * Assert string value at path contains a substring.
198
+ *
199
+ * @param path - Dot-notation path (e.g., 'data.message')
200
+ * @param substring - Substring to search for
201
+ */
202
+ async assertJsonPathContains(path, substring) {
203
+ const json = await this.json();
204
+ const value = this.getValueAtPath(json, path);
205
+ expect(typeof value === 'string', `Expected JSON path "${path}" to be a string, got ${typeof value}`).toBe(true);
206
+ expect(value.includes(substring), `Expected JSON path "${path}" to contain "${substring}", got "${String(value)}"`).toBe(true);
207
+ return this;
208
+ }
209
+ /**
210
+ * Assert array value at path includes a specific item.
211
+ *
212
+ * @param path - Dot-notation path (e.g., 'data.tags')
213
+ * @param item - Item to search for in the array
214
+ */
215
+ async assertJsonPathIncludes(path, item) {
216
+ const json = await this.json();
217
+ const value = this.getValueAtPath(json, path);
218
+ expect(Array.isArray(value), `Expected JSON path "${path}" to be an array, got ${typeof value}`).toBe(true);
219
+ expect(value.includes(item), `Expected JSON path "${path}" to include ${JSON.stringify(item)}`).toBe(true);
220
+ return this;
221
+ }
222
+ /**
223
+ * Assert array length at path equals the expected count.
224
+ *
225
+ * @param path - Dot-notation path (e.g., 'data.items')
226
+ * @param count - Expected array length
227
+ */
228
+ async assertJsonPathCount(path, count) {
229
+ const json = await this.json();
230
+ const value = this.getValueAtPath(json, path);
231
+ expect(Array.isArray(value), `Expected JSON path "${path}" to be an array, got ${typeof value}`).toBe(true);
232
+ expect(value.length, `Expected JSON path "${path}" to have ${count} items, got ${value.length}`).toBe(count);
233
+ return this;
234
+ }
235
+ /**
236
+ * Assert multiple JSON paths at once (batch assertion).
237
+ *
238
+ * @param expectations - Object mapping paths to expected values
239
+ */
240
+ async assertJsonPaths(expectations) {
241
+ const json = await this.json();
242
+ for (const [path, expected] of Object.entries(expectations)) {
243
+ const actual = this.getValueAtPath(json, path);
244
+ expect(actual, `Expected JSON path "${path}" to be ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`).toBe(expected);
245
+ }
246
+ return this;
247
+ }
248
+ // ============================================================
249
+ // Header Assertions
250
+ // ============================================================
251
+ /**
252
+ * Assert response has the given header.
253
+ */
254
+ assertHeader(name, expected) {
255
+ const actual = this.response.headers.get(name);
256
+ expect(actual !== null, `Expected header "${name}" to be present`).toBe(true);
257
+ if (expected !== undefined) {
258
+ expect(actual, `Expected header "${name}" to be "${expected}", got "${actual}"`).toBe(expected);
259
+ }
260
+ return this;
261
+ }
262
+ /**
263
+ * Assert response does not have the given header.
264
+ */
265
+ assertHeaderMissing(name) {
266
+ const actual = this.response.headers.get(name);
267
+ expect(actual, `Expected header "${name}" to be absent, but got "${actual}"`).toBeNull();
268
+ return this;
269
+ }
270
+ // ============================================================
271
+ // Private Helpers
272
+ // ============================================================
273
+ /**
274
+ * Get value at dot-notation path.
275
+ */
276
+ getValueAtPath(obj, path) {
277
+ const parts = path.split('.');
278
+ let current = obj;
279
+ for (const part of parts) {
280
+ if (current === null || current === undefined) {
281
+ return undefined;
282
+ }
283
+ current = current[part];
284
+ }
285
+ return current;
286
+ }
287
+ /**
288
+ * Check if a path exists in the object (even if value is null/undefined).
289
+ */
290
+ hasValueAtPath(obj, path) {
291
+ const parts = path.split('.');
292
+ let current = obj;
293
+ for (const part of parts) {
294
+ if (current === null || current === undefined) {
295
+ return false;
296
+ }
297
+ if (typeof current !== 'object') {
298
+ return false;
299
+ }
300
+ const record = current;
301
+ if (!(part in record)) {
302
+ return false;
303
+ }
304
+ current = record[part];
305
+ }
306
+ return true;
307
+ }
308
+ }
309
+ //# sourceMappingURL=test-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-response.js","sourceRoot":"","sources":["../../../src/core/http/test-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { getTestEnv } from './env';
2
+ export { TestHttpClient, TestHttpRequest, TestResponse } from './http';
3
+ export { ProviderOverrideBuilder, type ProviderOverrideConfig } from './override';
4
+ export { Test } from './test';
5
+ export { TestingModule } from './testing-module';
6
+ export { TestingModuleBuilder, type TestingModuleConfig } from './testing-module-builder';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,7 @@
1
+ export { getTestEnv } from './env';
2
+ export { TestHttpClient, TestHttpRequest, TestResponse } from './http';
3
+ export { ProviderOverrideBuilder } from './override';
4
+ export { Test } from './test';
5
+ export { TestingModule } from './testing-module';
6
+ export { TestingModuleBuilder } from './testing-module-builder';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAA+B,MAAM,YAAY,CAAA;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { ProviderOverrideBuilder, type ProviderOverrideConfig } from './provider-override-builder';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/override/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,KAAK,sBAAsB,EAAE,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { ProviderOverrideBuilder } from './provider-override-builder';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/override/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAA+B,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,77 @@
1
+ import type { Container, InjectionToken } from 'stratal';
2
+ import type { TestingModuleBuilder } from '../testing-module-builder';
3
+ /**
4
+ * Provider override configuration
5
+ */
6
+ export interface ProviderOverrideConfig<T = unknown> {
7
+ token: InjectionToken<T>;
8
+ type: 'value' | 'class' | 'factory' | 'existing';
9
+ implementation: T | (new (...args: unknown[]) => T) | ((container: Container) => T) | InjectionToken<T>;
10
+ }
11
+ /**
12
+ * Fluent builder for provider overrides
13
+ *
14
+ * Provides a NestJS-style API for overriding providers in tests.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const module = await Test.createTestingModule({
19
+ * imports: [RegistrationModule],
20
+ * })
21
+ * .overrideProvider(EMAIL_TOKENS.EmailService)
22
+ * .useValue(mockEmailService)
23
+ * .compile()
24
+ * ```
25
+ */
26
+ export declare class ProviderOverrideBuilder<T> {
27
+ private readonly parent;
28
+ private readonly token;
29
+ constructor(parent: TestingModuleBuilder, token: InjectionToken<T>);
30
+ /**
31
+ * Use a static value as the provider
32
+ *
33
+ * The value will be registered directly in the container.
34
+ *
35
+ * @param value - The value to use as the provider
36
+ * @returns The parent TestingModuleBuilder for chaining
37
+ */
38
+ useValue(value: T): TestingModuleBuilder;
39
+ /**
40
+ * Use a class as the provider
41
+ *
42
+ * The class will be registered as a singleton.
43
+ *
44
+ * @param cls - The class constructor to use as the provider
45
+ * @returns The parent TestingModuleBuilder for chaining
46
+ */
47
+ useClass(cls: new (...args: unknown[]) => T): TestingModuleBuilder;
48
+ /**
49
+ * Use a factory function as the provider
50
+ *
51
+ * The factory receives the container and should return the provider instance.
52
+ *
53
+ * @param factory - Factory function that creates the provider
54
+ * @returns The parent TestingModuleBuilder for chaining
55
+ */
56
+ useFactory(factory: (container: Container) => T): TestingModuleBuilder;
57
+ /**
58
+ * Use an existing token as the provider (alias)
59
+ *
60
+ * The override token will resolve to the same instance as the target token.
61
+ *
62
+ * @param existingToken - The token to alias
63
+ * @returns The parent TestingModuleBuilder for chaining
64
+ *
65
+ * @example
66
+ * ```typescript
67
+ * const module = await Test.createTestingModule({
68
+ * imports: [MyModule],
69
+ * })
70
+ * .overrideProvider(ABSTRACT_TOKEN)
71
+ * .useExisting(ConcreteService)
72
+ * .compile()
73
+ * ```
74
+ */
75
+ useExisting(existingToken: InjectionToken<T>): TestingModuleBuilder;
76
+ }
77
+ //# sourceMappingURL=provider-override-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-override-builder.d.ts","sourceRoot":"","sources":["../../../src/core/override/provider-override-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAErE;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,CAAC,GAAG,OAAO;IACjD,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;IACxB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAA;IAChD,cAAc,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;CACxG;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,uBAAuB,CAAC,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IAG3C;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,oBAAoB;IAQxC;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,oBAAoB;IAQlE;;;;;;;OAOG;IACH,UAAU,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,CAAC,GAAG,oBAAoB;IAQtE;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,oBAAoB;CAOpE"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Fluent builder for provider overrides
3
+ *
4
+ * Provides a NestJS-style API for overriding providers in tests.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const module = await Test.createTestingModule({
9
+ * imports: [RegistrationModule],
10
+ * })
11
+ * .overrideProvider(EMAIL_TOKENS.EmailService)
12
+ * .useValue(mockEmailService)
13
+ * .compile()
14
+ * ```
15
+ */
16
+ export class ProviderOverrideBuilder {
17
+ parent;
18
+ token;
19
+ constructor(parent, token) {
20
+ this.parent = parent;
21
+ this.token = token;
22
+ }
23
+ /**
24
+ * Use a static value as the provider
25
+ *
26
+ * The value will be registered directly in the container.
27
+ *
28
+ * @param value - The value to use as the provider
29
+ * @returns The parent TestingModuleBuilder for chaining
30
+ */
31
+ useValue(value) {
32
+ return this.parent.addProviderOverride({
33
+ token: this.token,
34
+ type: 'value',
35
+ implementation: value,
36
+ });
37
+ }
38
+ /**
39
+ * Use a class as the provider
40
+ *
41
+ * The class will be registered as a singleton.
42
+ *
43
+ * @param cls - The class constructor to use as the provider
44
+ * @returns The parent TestingModuleBuilder for chaining
45
+ */
46
+ useClass(cls) {
47
+ return this.parent.addProviderOverride({
48
+ token: this.token,
49
+ type: 'class',
50
+ implementation: cls,
51
+ });
52
+ }
53
+ /**
54
+ * Use a factory function as the provider
55
+ *
56
+ * The factory receives the container and should return the provider instance.
57
+ *
58
+ * @param factory - Factory function that creates the provider
59
+ * @returns The parent TestingModuleBuilder for chaining
60
+ */
61
+ useFactory(factory) {
62
+ return this.parent.addProviderOverride({
63
+ token: this.token,
64
+ type: 'factory',
65
+ implementation: factory,
66
+ });
67
+ }
68
+ /**
69
+ * Use an existing token as the provider (alias)
70
+ *
71
+ * The override token will resolve to the same instance as the target token.
72
+ *
73
+ * @param existingToken - The token to alias
74
+ * @returns The parent TestingModuleBuilder for chaining
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const module = await Test.createTestingModule({
79
+ * imports: [MyModule],
80
+ * })
81
+ * .overrideProvider(ABSTRACT_TOKEN)
82
+ * .useExisting(ConcreteService)
83
+ * .compile()
84
+ * ```
85
+ */
86
+ useExisting(existingToken) {
87
+ return this.parent.addProviderOverride({
88
+ token: this.token,
89
+ type: 'existing',
90
+ implementation: existingToken,
91
+ });
92
+ }
93
+ }
94
+ //# sourceMappingURL=provider-override-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-override-builder.js","sourceRoot":"","sources":["../../../src/core/override/provider-override-builder.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,uBAAuB;IAEf;IACA;IAFnB,YACmB,MAA4B,EAC5B,KAAwB;QADxB,WAAM,GAAN,MAAM,CAAsB;QAC5B,UAAK,GAAL,KAAK,CAAmB;IACvC,CAAC;IAEL;;;;;;;OAOG;IACH,QAAQ,CAAC,KAAQ;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,OAAO;YACb,cAAc,EAAE,KAAK;SACtB,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,QAAQ,CAAC,GAAkC;QACzC,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,OAAO;YACb,cAAc,EAAE,GAAG;SACpB,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;OAOG;IACH,UAAU,CAAC,OAAoC;QAC7C,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,SAAS;YACf,cAAc,EAAE,OAAO;SACxB,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,aAAgC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;YACrC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,UAAU;YAChB,cAAc,EAAE,aAAa;SAC9B,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,48 @@
1
+ import type { DynamicModule, ModuleClass } from 'stratal';
2
+ import { TestingModuleBuilder, type TestingModuleConfig } from './testing-module-builder';
3
+ /**
4
+ * Test
5
+ *
6
+ * Static class for creating testing modules.
7
+ * Provides a NestJS-style API for configuring test modules.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * // In vitest.setup.ts:
12
+ * Test.setBaseModules([CoreModule])
13
+ *
14
+ * // In test files:
15
+ * const module = await Test.createTestingModule({
16
+ * imports: [RegistrationModule, GeoModule],
17
+ * })
18
+ * .overrideProvider(EMAIL_TOKENS.EmailService)
19
+ * .useValue(mockEmailService)
20
+ * .compile()
21
+ * ```
22
+ */
23
+ export declare class Test {
24
+ /**
25
+ * Base modules to include in all test modules
26
+ * Set once in vitest.setup.ts
27
+ */
28
+ private static baseModules;
29
+ /**
30
+ * Set base modules to include in all test modules
31
+ * Should be called once in vitest.setup.ts
32
+ *
33
+ * @param modules - Modules to include before test-specific modules (e.g., CoreModule)
34
+ */
35
+ static setBaseModules(modules: (ModuleClass | DynamicModule)[]): void;
36
+ /**
37
+ * Get base modules
38
+ */
39
+ static getBaseModules(): (ModuleClass | DynamicModule)[];
40
+ /**
41
+ * Create a testing module builder
42
+ *
43
+ * @param config - Configuration with modules and optional env overrides
44
+ * @returns TestingModuleBuilder for configuring and compiling the module
45
+ */
46
+ static createTestingModule(config: TestingModuleConfig): TestingModuleBuilder;
47
+ }
48
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/core/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEzF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,IAAI;IACf;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW,CAAsC;IAEhE;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,WAAW,GAAG,aAAa,CAAC,EAAE,GAAG,IAAI;IAIrE;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,EAAE;IAIxD;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB;CAG9E"}
@@ -0,0 +1,53 @@
1
+ import { TestingModuleBuilder } from './testing-module-builder';
2
+ /**
3
+ * Test
4
+ *
5
+ * Static class for creating testing modules.
6
+ * Provides a NestJS-style API for configuring test modules.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // In vitest.setup.ts:
11
+ * Test.setBaseModules([CoreModule])
12
+ *
13
+ * // In test files:
14
+ * const module = await Test.createTestingModule({
15
+ * imports: [RegistrationModule, GeoModule],
16
+ * })
17
+ * .overrideProvider(EMAIL_TOKENS.EmailService)
18
+ * .useValue(mockEmailService)
19
+ * .compile()
20
+ * ```
21
+ */
22
+ export class Test {
23
+ /**
24
+ * Base modules to include in all test modules
25
+ * Set once in vitest.setup.ts
26
+ */
27
+ static baseModules = [];
28
+ /**
29
+ * Set base modules to include in all test modules
30
+ * Should be called once in vitest.setup.ts
31
+ *
32
+ * @param modules - Modules to include before test-specific modules (e.g., CoreModule)
33
+ */
34
+ static setBaseModules(modules) {
35
+ this.baseModules = modules;
36
+ }
37
+ /**
38
+ * Get base modules
39
+ */
40
+ static getBaseModules() {
41
+ return this.baseModules;
42
+ }
43
+ /**
44
+ * Create a testing module builder
45
+ *
46
+ * @param config - Configuration with modules and optional env overrides
47
+ * @returns TestingModuleBuilder for configuring and compiling the module
48
+ */
49
+ static createTestingModule(config) {
50
+ return new TestingModuleBuilder(config);
51
+ }
52
+ }
53
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/core/test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAA4B,MAAM,0BAA0B,CAAA;AAEzF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,IAAI;IACf;;;OAGG;IACK,MAAM,CAAC,WAAW,GAAoC,EAAE,CAAA;IAEhE;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,OAAwC;QAC5D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAA;IAC5B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAA2B;QACpD,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC"}