@stratal/testing 0.0.13 → 0.0.15

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 (155) hide show
  1. package/dist/index.d.mts +1130 -0
  2. package/dist/index.d.mts.map +1 -0
  3. package/dist/index.mjs +1788 -0
  4. package/dist/index.mjs.map +1 -0
  5. package/dist/mocks/index.d.mts +2 -0
  6. package/dist/mocks/index.mjs +2 -0
  7. package/dist/mocks/nodemailer.d.mts +12 -0
  8. package/dist/mocks/nodemailer.d.mts.map +1 -0
  9. package/dist/mocks/nodemailer.mjs +7 -0
  10. package/dist/mocks/nodemailer.mjs.map +1 -0
  11. package/dist/mocks/zenstack-language.d.mts +48 -0
  12. package/dist/mocks/zenstack-language.d.mts.map +1 -0
  13. package/dist/mocks/zenstack-language.mjs +48 -0
  14. package/dist/mocks/zenstack-language.mjs.map +1 -0
  15. package/dist/vitest-plugin/index.d.mts +50 -0
  16. package/dist/vitest-plugin/index.d.mts.map +1 -0
  17. package/dist/vitest-plugin/index.mjs +86 -0
  18. package/dist/vitest-plugin/index.mjs.map +1 -0
  19. package/package.json +21 -19
  20. package/dist/auth/acting-as.d.ts +0 -21
  21. package/dist/auth/acting-as.d.ts.map +0 -1
  22. package/dist/auth/acting-as.js +0 -68
  23. package/dist/auth/acting-as.js.map +0 -1
  24. package/dist/auth/index.d.ts +0 -2
  25. package/dist/auth/index.d.ts.map +0 -1
  26. package/dist/auth/index.js +0 -2
  27. package/dist/auth/index.js.map +0 -1
  28. package/dist/core/env/index.d.ts +0 -2
  29. package/dist/core/env/index.d.ts.map +0 -1
  30. package/dist/core/env/index.js +0 -2
  31. package/dist/core/env/index.js.map +0 -1
  32. package/dist/core/env/test-env.d.ts +0 -9
  33. package/dist/core/env/test-env.d.ts.map +0 -1
  34. package/dist/core/env/test-env.js +0 -14
  35. package/dist/core/env/test-env.js.map +0 -1
  36. package/dist/core/http/fetch-mock.types.d.ts +0 -48
  37. package/dist/core/http/fetch-mock.types.d.ts.map +0 -1
  38. package/dist/core/http/fetch-mock.types.js +0 -2
  39. package/dist/core/http/fetch-mock.types.js.map +0 -1
  40. package/dist/core/http/index.d.ts +0 -6
  41. package/dist/core/http/index.d.ts.map +0 -1
  42. package/dist/core/http/index.js +0 -5
  43. package/dist/core/http/index.js.map +0 -1
  44. package/dist/core/http/mock-fetch.d.ts +0 -88
  45. package/dist/core/http/mock-fetch.d.ts.map +0 -1
  46. package/dist/core/http/mock-fetch.js +0 -111
  47. package/dist/core/http/mock-fetch.js.map +0 -1
  48. package/dist/core/http/test-http-client.d.ts +0 -54
  49. package/dist/core/http/test-http-client.d.ts.map +0 -1
  50. package/dist/core/http/test-http-client.js +0 -75
  51. package/dist/core/http/test-http-client.js.map +0 -1
  52. package/dist/core/http/test-http-request.d.ts +0 -60
  53. package/dist/core/http/test-http-request.d.ts.map +0 -1
  54. package/dist/core/http/test-http-request.js +0 -106
  55. package/dist/core/http/test-http-request.js.map +0 -1
  56. package/dist/core/http/test-response.d.ts +0 -161
  57. package/dist/core/http/test-response.d.ts.map +0 -1
  58. package/dist/core/http/test-response.js +0 -309
  59. package/dist/core/http/test-response.js.map +0 -1
  60. package/dist/core/index.d.ts +0 -7
  61. package/dist/core/index.d.ts.map +0 -1
  62. package/dist/core/index.js +0 -7
  63. package/dist/core/index.js.map +0 -1
  64. package/dist/core/override/index.d.ts +0 -2
  65. package/dist/core/override/index.d.ts.map +0 -1
  66. package/dist/core/override/index.js +0 -2
  67. package/dist/core/override/index.js.map +0 -1
  68. package/dist/core/override/provider-override-builder.d.ts +0 -78
  69. package/dist/core/override/provider-override-builder.d.ts.map +0 -1
  70. package/dist/core/override/provider-override-builder.js +0 -94
  71. package/dist/core/override/provider-override-builder.js.map +0 -1
  72. package/dist/core/sse/index.d.ts +0 -3
  73. package/dist/core/sse/index.d.ts.map +0 -1
  74. package/dist/core/sse/index.js +0 -3
  75. package/dist/core/sse/index.js.map +0 -1
  76. package/dist/core/sse/test-sse-connection.d.ts +0 -61
  77. package/dist/core/sse/test-sse-connection.d.ts.map +0 -1
  78. package/dist/core/sse/test-sse-connection.js +0 -233
  79. package/dist/core/sse/test-sse-connection.js.map +0 -1
  80. package/dist/core/sse/test-sse-request.d.ts +0 -42
  81. package/dist/core/sse/test-sse-request.d.ts.map +0 -1
  82. package/dist/core/sse/test-sse-request.js +0 -76
  83. package/dist/core/sse/test-sse-request.js.map +0 -1
  84. package/dist/core/test.d.ts +0 -48
  85. package/dist/core/test.d.ts.map +0 -1
  86. package/dist/core/test.js +0 -53
  87. package/dist/core/test.js.map +0 -1
  88. package/dist/core/testing-module-builder.d.ts +0 -57
  89. package/dist/core/testing-module-builder.d.ts.map +0 -1
  90. package/dist/core/testing-module-builder.js +0 -109
  91. package/dist/core/testing-module-builder.js.map +0 -1
  92. package/dist/core/testing-module.d.ts +0 -113
  93. package/dist/core/testing-module.d.ts.map +0 -1
  94. package/dist/core/testing-module.js +0 -177
  95. package/dist/core/testing-module.js.map +0 -1
  96. package/dist/core/ws/index.d.ts +0 -3
  97. package/dist/core/ws/index.d.ts.map +0 -1
  98. package/dist/core/ws/index.js +0 -3
  99. package/dist/core/ws/index.js.map +0 -1
  100. package/dist/core/ws/test-ws-connection.d.ts +0 -54
  101. package/dist/core/ws/test-ws-connection.d.ts.map +0 -1
  102. package/dist/core/ws/test-ws-connection.js +0 -119
  103. package/dist/core/ws/test-ws-connection.js.map +0 -1
  104. package/dist/core/ws/test-ws-request.d.ts +0 -43
  105. package/dist/core/ws/test-ws-request.d.ts.map +0 -1
  106. package/dist/core/ws/test-ws-request.js +0 -83
  107. package/dist/core/ws/test-ws-request.js.map +0 -1
  108. package/dist/errors/index.d.ts +0 -3
  109. package/dist/errors/index.d.ts.map +0 -1
  110. package/dist/errors/index.js +0 -3
  111. package/dist/errors/index.js.map +0 -1
  112. package/dist/errors/setup-error.d.ts +0 -9
  113. package/dist/errors/setup-error.d.ts.map +0 -1
  114. package/dist/errors/setup-error.js +0 -11
  115. package/dist/errors/setup-error.js.map +0 -1
  116. package/dist/errors/test-error.d.ts +0 -9
  117. package/dist/errors/test-error.d.ts.map +0 -1
  118. package/dist/errors/test-error.js +0 -15
  119. package/dist/errors/test-error.js.map +0 -1
  120. package/dist/index.d.ts +0 -21
  121. package/dist/index.d.ts.map +0 -1
  122. package/dist/index.js +0 -29
  123. package/dist/index.js.map +0 -1
  124. package/dist/mocks/index.d.ts +0 -3
  125. package/dist/mocks/index.d.ts.map +0 -1
  126. package/dist/mocks/index.js +0 -3
  127. package/dist/mocks/index.js.map +0 -1
  128. package/dist/mocks/nodemailer.d.ts +0 -10
  129. package/dist/mocks/nodemailer.d.ts.map +0 -1
  130. package/dist/mocks/nodemailer.js +0 -9
  131. package/dist/mocks/nodemailer.js.map +0 -1
  132. package/dist/mocks/zenstack-language.d.ts +0 -46
  133. package/dist/mocks/zenstack-language.d.ts.map +0 -1
  134. package/dist/mocks/zenstack-language.js +0 -47
  135. package/dist/mocks/zenstack-language.js.map +0 -1
  136. package/dist/storage/fake-storage.service.d.ts +0 -114
  137. package/dist/storage/fake-storage.service.d.ts.map +0 -1
  138. package/dist/storage/fake-storage.service.js +0 -233
  139. package/dist/storage/fake-storage.service.js.map +0 -1
  140. package/dist/storage/index.d.ts +0 -2
  141. package/dist/storage/index.d.ts.map +0 -1
  142. package/dist/storage/index.js +0 -2
  143. package/dist/storage/index.js.map +0 -1
  144. package/dist/types.d.ts +0 -5
  145. package/dist/types.d.ts.map +0 -1
  146. package/dist/types.js +0 -3
  147. package/dist/types.js.map +0 -1
  148. package/dist/vitest-plugin/index.d.ts +0 -2
  149. package/dist/vitest-plugin/index.d.ts.map +0 -1
  150. package/dist/vitest-plugin/index.js +0 -2
  151. package/dist/vitest-plugin/index.js.map +0 -1
  152. package/dist/vitest-plugin/stratal-test.d.ts +0 -28
  153. package/dist/vitest-plugin/stratal-test.d.ts.map +0 -1
  154. package/dist/vitest-plugin/stratal-test.js +0 -47
  155. package/dist/vitest-plugin/stratal-test.js.map +0 -1
@@ -1,78 +0,0 @@
1
- import { type Container } from 'stratal/di';
2
- import { type InjectionToken } from 'stratal/module';
3
- import type { TestingModuleBuilder } from '../testing-module-builder';
4
- /**
5
- * Provider override configuration
6
- */
7
- export interface ProviderOverrideConfig<T = unknown> {
8
- token: InjectionToken<T>;
9
- type: 'value' | 'class' | 'factory' | 'existing';
10
- implementation: T | (new (...args: unknown[]) => T) | ((container: Container) => T) | InjectionToken<T>;
11
- }
12
- /**
13
- * Fluent builder for provider overrides
14
- *
15
- * Provides a NestJS-style API for overriding providers in tests.
16
- *
17
- * @example
18
- * ```typescript
19
- * const module = await Test.createTestingModule({
20
- * imports: [RegistrationModule],
21
- * })
22
- * .overrideProvider(EMAIL_TOKENS.EmailService)
23
- * .useValue(mockEmailService)
24
- * .compile()
25
- * ```
26
- */
27
- export declare class ProviderOverrideBuilder<T> {
28
- private readonly parent;
29
- private readonly token;
30
- constructor(parent: TestingModuleBuilder, token: InjectionToken<T>);
31
- /**
32
- * Use a static value as the provider
33
- *
34
- * The value will be registered directly in the container.
35
- *
36
- * @param value - The value to use as the provider
37
- * @returns The parent TestingModuleBuilder for chaining
38
- */
39
- useValue(value: T): TestingModuleBuilder;
40
- /**
41
- * Use a class as the provider
42
- *
43
- * The class will be registered as a singleton.
44
- *
45
- * @param cls - The class constructor to use as the provider
46
- * @returns The parent TestingModuleBuilder for chaining
47
- */
48
- useClass(cls: new (...args: unknown[]) => T): TestingModuleBuilder;
49
- /**
50
- * Use a factory function as the provider
51
- *
52
- * The factory receives the container and should return the provider instance.
53
- *
54
- * @param factory - Factory function that creates the provider
55
- * @returns The parent TestingModuleBuilder for chaining
56
- */
57
- useFactory(factory: (container: Container) => T): TestingModuleBuilder;
58
- /**
59
- * Use an existing token as the provider (alias)
60
- *
61
- * The override token will resolve to the same instance as the target token.
62
- *
63
- * @param existingToken - The token to alias
64
- * @returns The parent TestingModuleBuilder for chaining
65
- *
66
- * @example
67
- * ```typescript
68
- * const module = await Test.createTestingModule({
69
- * imports: [MyModule],
70
- * })
71
- * .overrideProvider(ABSTRACT_TOKEN)
72
- * .useExisting(ConcreteService)
73
- * .compile()
74
- * ```
75
- */
76
- useExisting(existingToken: InjectionToken<T>): TestingModuleBuilder;
77
- }
78
- //# sourceMappingURL=provider-override-builder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-override-builder.d.ts","sourceRoot":"","sources":["../../../src/core/override/provider-override-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,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"}
@@ -1,94 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-override-builder.js","sourceRoot":"","sources":["../../../src/core/override/provider-override-builder.ts"],"names":[],"mappings":"AAaA;;;;;;;;;;;;;;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"}
@@ -1,3 +0,0 @@
1
- export { TestSseRequest } from './test-sse-request';
2
- export { TestSseConnection, type TestSseEvent } from './test-sse-connection';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA"}
@@ -1,3 +0,0 @@
1
- export { TestSseRequest } from './test-sse-request';
2
- export { TestSseConnection } from './test-sse-connection';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,uBAAuB,CAAA"}
@@ -1,61 +0,0 @@
1
- /**
2
- * Represents a parsed SSE event
3
- */
4
- export interface TestSseEvent {
5
- data: string;
6
- event?: string;
7
- id?: string;
8
- retry?: number;
9
- }
10
- /**
11
- * TestSseConnection
12
- *
13
- * Live SSE connection wrapper with assertion helpers for testing.
14
- *
15
- * @example
16
- * ```typescript
17
- * const sse = await module.sse('/streaming/sse').connect()
18
- * await sse.assertEvent({ event: 'message', data: 'hello', id: '1' })
19
- * await sse.waitForEnd()
20
- * ```
21
- */
22
- export declare class TestSseConnection {
23
- private readonly response;
24
- private readonly eventQueue;
25
- private eventWaiters;
26
- private streamEnded;
27
- private endWaiters;
28
- constructor(response: Response);
29
- /**
30
- * Wait for the next SSE event
31
- */
32
- waitForEvent(timeout?: number): Promise<TestSseEvent>;
33
- /**
34
- * Wait for the stream to end
35
- */
36
- waitForEnd(timeout?: number): Promise<void>;
37
- /**
38
- * Collect all remaining events until the stream ends
39
- */
40
- collectEvents(timeout?: number): Promise<TestSseEvent[]>;
41
- /**
42
- * Assert that the next event matches the expected partial shape
43
- */
44
- assertEvent(expected: Partial<TestSseEvent>, timeout?: number): Promise<void>;
45
- /**
46
- * Assert that the next event's data matches the expected string
47
- */
48
- assertEventData(expected: string, timeout?: number): Promise<void>;
49
- /**
50
- * Assert that the next event's data is JSON matching the expected value
51
- */
52
- assertJsonEventData<T>(expected: T, timeout?: number): Promise<void>;
53
- /**
54
- * Access the raw Response
55
- */
56
- get raw(): Response;
57
- private startReading;
58
- private parseEvent;
59
- private dispatchEvent;
60
- }
61
- //# sourceMappingURL=test-sse-connection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-sse-connection.d.ts","sourceRoot":"","sources":["../../../src/core/sse/test-sse-connection.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAMjB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,UAAU,CAAqB;gBAEV,QAAQ,EAAE,QAAQ;IAI/C;;OAEG;IACG,YAAY,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,YAAY,CAAC;IAyBzD;;OAEG;IACG,UAAU,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB/C;;OAEG;IACG,aAAa,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmC5D;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjF;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE;;OAEG;IACG,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE;;OAEG;IACH,IAAI,GAAG,IAAI,QAAQ,CAElB;IAED,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,UAAU;IA6ClB,OAAO,CAAC,aAAa;CAOrB"}
@@ -1,233 +0,0 @@
1
- import { expect } from "vitest";
2
- /**
3
- * TestSseConnection
4
- *
5
- * Live SSE connection wrapper with assertion helpers for testing.
6
- *
7
- * @example
8
- * ```typescript
9
- * const sse = await module.sse('/streaming/sse').connect()
10
- * await sse.assertEvent({ event: 'message', data: 'hello', id: '1' })
11
- * await sse.waitForEnd()
12
- * ```
13
- */
14
- export class TestSseConnection {
15
- response;
16
- eventQueue = [];
17
- eventWaiters = [];
18
- streamEnded = false;
19
- endWaiters = [];
20
- constructor(response) {
21
- this.response = response;
22
- this.startReading();
23
- }
24
- /**
25
- * Wait for the next SSE event
26
- */
27
- async waitForEvent(timeout = 5000) {
28
- if (this.eventQueue.length > 0) {
29
- return this.eventQueue.shift();
30
- }
31
- if (this.streamEnded) {
32
- throw new Error('SSE: stream has ended, no more events');
33
- }
34
- return new Promise((resolve, reject) => {
35
- const waiter = (event) => {
36
- clearTimeout(timer);
37
- resolve(event);
38
- };
39
- const timer = setTimeout(() => {
40
- const index = this.eventWaiters.indexOf(waiter);
41
- if (index !== -1)
42
- this.eventWaiters.splice(index, 1);
43
- reject(new Error(`SSE: no event received within ${timeout}ms`));
44
- }, timeout);
45
- this.eventWaiters.push(waiter);
46
- });
47
- }
48
- /**
49
- * Wait for the stream to end
50
- */
51
- async waitForEnd(timeout = 5000) {
52
- if (this.streamEnded)
53
- return;
54
- return new Promise((resolve, reject) => {
55
- const waiter = () => {
56
- clearTimeout(timer);
57
- resolve();
58
- };
59
- const timer = setTimeout(() => {
60
- const index = this.endWaiters.indexOf(waiter);
61
- if (index !== -1)
62
- this.endWaiters.splice(index, 1);
63
- reject(new Error(`SSE: stream did not end within ${timeout}ms`));
64
- }, timeout);
65
- this.endWaiters.push(waiter);
66
- });
67
- }
68
- /**
69
- * Collect all remaining events until the stream ends
70
- */
71
- async collectEvents(timeout = 5000) {
72
- const events = [];
73
- if (this.streamEnded) {
74
- return [...this.eventQueue.splice(0)];
75
- }
76
- return new Promise((resolve, reject) => {
77
- // Listen for new events until stream ends
78
- const originalDispatch = this.dispatchEvent.bind(this);
79
- this.dispatchEvent = (event) => {
80
- events.push(event);
81
- originalDispatch(event);
82
- };
83
- const endWaiter = () => {
84
- clearTimeout(timer);
85
- this.dispatchEvent = originalDispatch;
86
- resolve(events);
87
- };
88
- const timer = setTimeout(() => {
89
- this.dispatchEvent = originalDispatch;
90
- const index = this.endWaiters.indexOf(endWaiter);
91
- if (index !== -1)
92
- this.endWaiters.splice(index, 1);
93
- reject(new Error(`SSE: stream did not end within ${timeout}ms`));
94
- }, timeout);
95
- // Drain any queued events first
96
- events.push(...this.eventQueue.splice(0));
97
- this.endWaiters.push(endWaiter);
98
- });
99
- }
100
- /**
101
- * Assert that the next event matches the expected partial shape
102
- */
103
- async assertEvent(expected, timeout = 5000) {
104
- const event = await this.waitForEvent(timeout);
105
- expect(event).toMatchObject(expected);
106
- }
107
- /**
108
- * Assert that the next event's data matches the expected string
109
- */
110
- async assertEventData(expected, timeout = 5000) {
111
- const event = await this.waitForEvent(timeout);
112
- expect(event.data, `Expected SSE data "${expected}", got "${event.data}"`).toBe(expected);
113
- }
114
- /**
115
- * Assert that the next event's data is JSON matching the expected value
116
- */
117
- async assertJsonEventData(expected, timeout = 5000) {
118
- const event = await this.waitForEvent(timeout);
119
- const parsed = JSON.parse(event.data);
120
- expect(parsed).toEqual(expected);
121
- }
122
- /**
123
- * Access the raw Response
124
- */
125
- get raw() {
126
- return this.response;
127
- }
128
- startReading() {
129
- const body = this.response.body;
130
- if (!body) {
131
- this.streamEnded = true;
132
- return;
133
- }
134
- const reader = body.getReader();
135
- const decoder = new TextDecoder();
136
- let buffer = '';
137
- const read = async () => {
138
- try {
139
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
140
- while (true) {
141
- const { done, value } = await reader.read();
142
- if (done) {
143
- // Parse any remaining buffered data
144
- if (buffer.trim()) {
145
- const event = this.parseEvent(buffer);
146
- if (event)
147
- this.dispatchEvent(event);
148
- }
149
- this.streamEnded = true;
150
- for (const waiter of this.endWaiters) {
151
- waiter();
152
- }
153
- this.endWaiters = [];
154
- return;
155
- }
156
- buffer += decoder.decode(value, { stream: true });
157
- // Split on double newlines (SSE event boundary)
158
- const parts = buffer.split('\n\n');
159
- // Last part may be incomplete, keep it in the buffer
160
- buffer = parts.pop();
161
- for (const part of parts) {
162
- if (!part.trim())
163
- continue;
164
- const event = this.parseEvent(part);
165
- if (event)
166
- this.dispatchEvent(event);
167
- }
168
- }
169
- }
170
- catch {
171
- this.streamEnded = true;
172
- for (const waiter of this.endWaiters) {
173
- waiter();
174
- }
175
- this.endWaiters = [];
176
- }
177
- };
178
- void read();
179
- }
180
- parseEvent(raw) {
181
- const lines = raw.split('\n');
182
- const dataLines = [];
183
- let event;
184
- let id;
185
- let retry;
186
- for (const line of lines) {
187
- if (line.startsWith(':'))
188
- continue; // comment line
189
- const colonIndex = line.indexOf(':');
190
- if (colonIndex === -1)
191
- continue;
192
- const field = line.slice(0, colonIndex);
193
- // Strip optional leading space after colon
194
- const value = line[colonIndex + 1] === ' ' ? line.slice(colonIndex + 2) : line.slice(colonIndex + 1);
195
- switch (field) {
196
- case 'data':
197
- dataLines.push(value);
198
- break;
199
- case 'event':
200
- event = value;
201
- break;
202
- case 'id':
203
- id = value;
204
- break;
205
- case 'retry': {
206
- const parsed = parseInt(value, 10);
207
- if (!isNaN(parsed))
208
- retry = parsed;
209
- break;
210
- }
211
- }
212
- }
213
- if (dataLines.length === 0)
214
- return null;
215
- const result = { data: dataLines.join('\n') };
216
- if (event !== undefined)
217
- result.event = event;
218
- if (id !== undefined)
219
- result.id = id;
220
- if (retry !== undefined)
221
- result.retry = retry;
222
- return result;
223
- }
224
- dispatchEvent(event) {
225
- if (this.eventWaiters.length > 0) {
226
- this.eventWaiters.shift()(event);
227
- }
228
- else {
229
- this.eventQueue.push(event);
230
- }
231
- }
232
- }
233
- //# sourceMappingURL=test-sse-connection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-sse-connection.js","sourceRoot":"","sources":["../../../src/core/sse/test-sse-connection.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- import type { TestingModule } from '../testing-module';
2
- import { TestSseConnection } from './test-sse-connection';
3
- /**
4
- * TestSseRequest
5
- *
6
- * Builder for SSE connection requests. Follows the TestWsRequest pattern.
7
- *
8
- * @example
9
- * ```typescript
10
- * const sse = await module.sse('/streaming/sse').connect()
11
- * await sse.assertEvent({ event: 'message', data: 'hello' })
12
- * await sse.waitForEnd()
13
- * ```
14
- *
15
- * @example Authenticated SSE
16
- * ```typescript
17
- * const sse = await module.sse('/streaming/sse').actingAs({ id: user.id }).connect()
18
- * ```
19
- */
20
- export declare class TestSseRequest {
21
- private readonly path;
22
- private readonly module;
23
- private requestHeaders;
24
- private actingAsUser;
25
- constructor(path: string, module: TestingModule);
26
- /**
27
- * Add custom headers to the request
28
- */
29
- withHeaders(headers: Record<string, string>): this;
30
- /**
31
- * Authenticate the SSE connection as a specific user
32
- */
33
- actingAs(user: {
34
- id: string;
35
- }): this;
36
- /**
37
- * Send the request and return a live SSE connection
38
- */
39
- connect(): Promise<TestSseConnection>;
40
- private applyAuthentication;
41
- }
42
- //# sourceMappingURL=test-sse-request.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-sse-request.d.ts","sourceRoot":"","sources":["../../../src/core/sse/test-sse-request.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAc;IAKzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALxB,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAA8B;gBAGhC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa;IAGvC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAOlD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKpC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,iBAAiB,CAAC;YA0B7B,mBAAmB;CAajC"}
@@ -1,76 +0,0 @@
1
- import { AUTH_SERVICE } from '@stratal/framework/auth';
2
- import { expect } from 'vitest';
3
- import { ActingAs } from '../../auth';
4
- import { TestSseConnection } from './test-sse-connection';
5
- /**
6
- * TestSseRequest
7
- *
8
- * Builder for SSE connection requests. Follows the TestWsRequest pattern.
9
- *
10
- * @example
11
- * ```typescript
12
- * const sse = await module.sse('/streaming/sse').connect()
13
- * await sse.assertEvent({ event: 'message', data: 'hello' })
14
- * await sse.waitForEnd()
15
- * ```
16
- *
17
- * @example Authenticated SSE
18
- * ```typescript
19
- * const sse = await module.sse('/streaming/sse').actingAs({ id: user.id }).connect()
20
- * ```
21
- */
22
- export class TestSseRequest {
23
- path;
24
- module;
25
- requestHeaders = new Headers();
26
- actingAsUser = null;
27
- constructor(path, module) {
28
- this.path = path;
29
- this.module = module;
30
- }
31
- /**
32
- * Add custom headers to the request
33
- */
34
- withHeaders(headers) {
35
- for (const [key, value] of Object.entries(headers)) {
36
- this.requestHeaders.set(key, value);
37
- }
38
- return this;
39
- }
40
- /**
41
- * Authenticate the SSE connection as a specific user
42
- */
43
- actingAs(user) {
44
- this.actingAsUser = user;
45
- return this;
46
- }
47
- /**
48
- * Send the request and return a live SSE connection
49
- */
50
- async connect() {
51
- await this.applyAuthentication();
52
- this.requestHeaders.set('Accept', 'text/event-stream');
53
- const url = new URL(this.path, 'http://localhost');
54
- const request = new Request(url.toString(), {
55
- headers: this.requestHeaders,
56
- });
57
- const response = await this.module.fetch(request);
58
- expect(response.status, `Expected status 200, got ${response.status}`).toBe(200);
59
- const contentType = response.headers.get('content-type') ?? '';
60
- expect(contentType.includes('text/event-stream'), `Expected content-type "text/event-stream", got "${contentType}"`).toBe(true);
61
- return new TestSseConnection(response);
62
- }
63
- async applyAuthentication() {
64
- if (!this.actingAsUser)
65
- return;
66
- await this.module.runInRequestScope(async () => {
67
- const authService = this.module.get(AUTH_SERVICE);
68
- const actingAs = new ActingAs(authService);
69
- const authHeaders = this.actingAsUser ? await actingAs.createSessionForUser(this.actingAsUser) : new Headers();
70
- for (const [key, value] of authHeaders.entries()) {
71
- this.requestHeaders.set(key, value);
72
- }
73
- });
74
- }
75
- }
76
- //# sourceMappingURL=test-sse-request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-sse-request.js","sourceRoot":"","sources":["../../../src/core/sse/test-sse-request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAEzD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,cAAc;IAKR;IACA;IALV,cAAc,GAAY,IAAI,OAAO,EAAE,CAAA;IACvC,YAAY,GAA0B,IAAI,CAAA;IAElD,YACkB,IAAY,EACZ,MAAqB;QADrB,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAe;IACnC,CAAC;IAEL;;OAEG;IACH,WAAW,CAAC,OAA+B;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAoB;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QACxB,OAAO,IAAI,CAAA;IACZ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACZ,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAEhC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAA;QAEtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;QAClD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,OAAO,EAAE,IAAI,CAAC,cAAc;SAC5B,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAEjD,MAAM,CACL,QAAQ,CAAC,MAAM,EACf,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAC7C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEX,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QAC9D,MAAM,CACL,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EACzC,mDAAmD,WAAW,GAAG,CACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEZ,OAAO,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAChC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAM;QAE9B,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAc,YAAY,CAAC,CAAA;YAC9D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAA;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAA;YAE9G,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAClD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACpC,CAAC;QACF,CAAC,CAAC,CAAA;IACH,CAAC;CACD"}