@grest-ts/testkit 0.0.5

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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/dist/src/GGBundleTest.d.ts +8 -0
  4. package/dist/src/GGBundleTest.d.ts.map +1 -0
  5. package/dist/src/GGBundleTest.js +75 -0
  6. package/dist/src/GGBundleTest.js.map +1 -0
  7. package/dist/src/GGTest.d.ts +131 -0
  8. package/dist/src/GGTest.d.ts.map +1 -0
  9. package/dist/src/GGTest.js +245 -0
  10. package/dist/src/GGTest.js.map +1 -0
  11. package/dist/src/GGTestContext.d.ts +36 -0
  12. package/dist/src/GGTestContext.d.ts.map +1 -0
  13. package/dist/src/GGTestContext.js +63 -0
  14. package/dist/src/GGTestContext.js.map +1 -0
  15. package/dist/src/GGTestRunner.d.ts +108 -0
  16. package/dist/src/GGTestRunner.d.ts.map +1 -0
  17. package/dist/src/GGTestRunner.js +242 -0
  18. package/dist/src/GGTestRunner.js.map +1 -0
  19. package/dist/src/GGTestRuntime.d.ts +103 -0
  20. package/dist/src/GGTestRuntime.d.ts.map +1 -0
  21. package/dist/src/GGTestRuntime.js +219 -0
  22. package/dist/src/GGTestRuntime.js.map +1 -0
  23. package/dist/src/GGTestRuntimeWorker.d.ts +41 -0
  24. package/dist/src/GGTestRuntimeWorker.d.ts.map +1 -0
  25. package/dist/src/GGTestRuntimeWorker.js +136 -0
  26. package/dist/src/GGTestRuntimeWorker.js.map +1 -0
  27. package/dist/src/GGTestSharedRef.d.ts +35 -0
  28. package/dist/src/GGTestSharedRef.d.ts.map +1 -0
  29. package/dist/src/GGTestSharedRef.js +126 -0
  30. package/dist/src/GGTestSharedRef.js.map +1 -0
  31. package/dist/src/GGTestkitExtensionsDiscovery.d.ts +21 -0
  32. package/dist/src/GGTestkitExtensionsDiscovery.d.ts.map +1 -0
  33. package/dist/src/GGTestkitExtensionsDiscovery.js +24 -0
  34. package/dist/src/GGTestkitExtensionsDiscovery.js.map +1 -0
  35. package/dist/src/IGGLocalDiscoveryServer.d.ts +16 -0
  36. package/dist/src/IGGLocalDiscoveryServer.d.ts.map +1 -0
  37. package/dist/src/IGGLocalDiscoveryServer.js +2 -0
  38. package/dist/src/IGGLocalDiscoveryServer.js.map +1 -0
  39. package/dist/src/callOn/GGCallOnSelector.d.ts +42 -0
  40. package/dist/src/callOn/GGCallOnSelector.d.ts.map +1 -0
  41. package/dist/src/callOn/GGCallOnSelector.js +35 -0
  42. package/dist/src/callOn/GGCallOnSelector.js.map +1 -0
  43. package/dist/src/callOn/GGContractClass.implement.d.ts +8 -0
  44. package/dist/src/callOn/GGContractClass.implement.d.ts.map +1 -0
  45. package/dist/src/callOn/GGContractClass.implement.js +31 -0
  46. package/dist/src/callOn/GGContractClass.implement.js.map +1 -0
  47. package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts +28 -0
  48. package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts.map +1 -0
  49. package/dist/src/callOn/GGTestActionForLocatorOnCall.js +118 -0
  50. package/dist/src/callOn/GGTestActionForLocatorOnCall.js.map +1 -0
  51. package/dist/src/callOn/TestableIPC.d.ts +72 -0
  52. package/dist/src/callOn/TestableIPC.d.ts.map +1 -0
  53. package/dist/src/callOn/TestableIPC.js +34 -0
  54. package/dist/src/callOn/TestableIPC.js.map +1 -0
  55. package/dist/src/callOn/callOn.d.ts +113 -0
  56. package/dist/src/callOn/callOn.d.ts.map +1 -0
  57. package/dist/src/callOn/callOn.js +122 -0
  58. package/dist/src/callOn/callOn.js.map +1 -0
  59. package/dist/src/callOn/registerOnCallHandler.d.ts +13 -0
  60. package/dist/src/callOn/registerOnCallHandler.d.ts.map +1 -0
  61. package/dist/src/callOn/registerOnCallHandler.js +111 -0
  62. package/dist/src/callOn/registerOnCallHandler.js.map +1 -0
  63. package/dist/src/index-node.d.ts +35 -0
  64. package/dist/src/index-node.d.ts.map +1 -0
  65. package/dist/src/index-node.js +50 -0
  66. package/dist/src/index-node.js.map +1 -0
  67. package/dist/src/mockable/GGMockable.d.ts +19 -0
  68. package/dist/src/mockable/GGMockable.d.ts.map +1 -0
  69. package/dist/src/mockable/GGMockable.js +2 -0
  70. package/dist/src/mockable/GGMockable.js.map +1 -0
  71. package/dist/src/mockable/GGMockableCall.d.ts +2 -0
  72. package/dist/src/mockable/GGMockableCall.d.ts.map +1 -0
  73. package/dist/src/mockable/GGMockableCall.js +41 -0
  74. package/dist/src/mockable/GGMockableCall.js.map +1 -0
  75. package/dist/src/mockable/GGMockableIPC.d.ts +17 -0
  76. package/dist/src/mockable/GGMockableIPC.d.ts.map +1 -0
  77. package/dist/src/mockable/GGMockableIPC.js +8 -0
  78. package/dist/src/mockable/GGMockableIPC.js.map +1 -0
  79. package/dist/src/mockable/GGMockableInterceptor.d.ts +24 -0
  80. package/dist/src/mockable/GGMockableInterceptor.d.ts.map +1 -0
  81. package/dist/src/mockable/GGMockableInterceptor.js +32 -0
  82. package/dist/src/mockable/GGMockableInterceptor.js.map +1 -0
  83. package/dist/src/mockable/GGMockableInterceptorsServer.d.ts +12 -0
  84. package/dist/src/mockable/GGMockableInterceptorsServer.d.ts.map +1 -0
  85. package/dist/src/mockable/GGMockableInterceptorsServer.js +55 -0
  86. package/dist/src/mockable/GGMockableInterceptorsServer.js.map +1 -0
  87. package/dist/src/mockable/mockable.d.ts +46 -0
  88. package/dist/src/mockable/mockable.d.ts.map +1 -0
  89. package/dist/src/mockable/mockable.js +47 -0
  90. package/dist/src/mockable/mockable.js.map +1 -0
  91. package/dist/src/runner/InlineRunner.d.ts +12 -0
  92. package/dist/src/runner/InlineRunner.d.ts.map +1 -0
  93. package/dist/src/runner/InlineRunner.js +42 -0
  94. package/dist/src/runner/InlineRunner.js.map +1 -0
  95. package/dist/src/runner/IsolatedRunner.d.ts +17 -0
  96. package/dist/src/runner/IsolatedRunner.d.ts.map +1 -0
  97. package/dist/src/runner/IsolatedRunner.js +155 -0
  98. package/dist/src/runner/IsolatedRunner.js.map +1 -0
  99. package/dist/src/runner/RuntimeRunner.d.ts +14 -0
  100. package/dist/src/runner/RuntimeRunner.d.ts.map +1 -0
  101. package/dist/src/runner/RuntimeRunner.js +2 -0
  102. package/dist/src/runner/RuntimeRunner.js.map +1 -0
  103. package/dist/src/runner/WorkerRunner.d.ts +17 -0
  104. package/dist/src/runner/WorkerRunner.d.ts.map +1 -0
  105. package/dist/src/runner/WorkerRunner.js +155 -0
  106. package/dist/src/runner/WorkerRunner.js.map +1 -0
  107. package/dist/src/runner/isolated-loader.mjs +91 -0
  108. package/dist/src/runner/worker-loader.mjs +49 -0
  109. package/dist/src/testers/GGCallInterceptor.d.ts +71 -0
  110. package/dist/src/testers/GGCallInterceptor.d.ts.map +1 -0
  111. package/dist/src/testers/GGCallInterceptor.js +170 -0
  112. package/dist/src/testers/GGCallInterceptor.js.map +1 -0
  113. package/dist/src/testers/GGMockWith.d.ts +30 -0
  114. package/dist/src/testers/GGMockWith.d.ts.map +1 -0
  115. package/dist/src/testers/GGMockWith.js +70 -0
  116. package/dist/src/testers/GGMockWith.js.map +1 -0
  117. package/dist/src/testers/GGSpyWith.d.ts +40 -0
  118. package/dist/src/testers/GGSpyWith.d.ts.map +1 -0
  119. package/dist/src/testers/GGSpyWith.js +90 -0
  120. package/dist/src/testers/GGSpyWith.js.map +1 -0
  121. package/dist/src/testers/GGTestAction.d.ts +126 -0
  122. package/dist/src/testers/GGTestAction.d.ts.map +1 -0
  123. package/dist/src/testers/GGTestAction.js +245 -0
  124. package/dist/src/testers/GGTestAction.js.map +1 -0
  125. package/dist/src/testers/GGTestComponent.d.ts +15 -0
  126. package/dist/src/testers/GGTestComponent.d.ts.map +1 -0
  127. package/dist/src/testers/GGTestComponent.js +2 -0
  128. package/dist/src/testers/GGTestComponent.js.map +1 -0
  129. package/dist/src/testers/GGTestSelector.d.ts +54 -0
  130. package/dist/src/testers/GGTestSelector.d.ts.map +1 -0
  131. package/dist/src/testers/GGTestSelector.js +179 -0
  132. package/dist/src/testers/GGTestSelector.js.map +1 -0
  133. package/dist/src/testers/IGGTestInterceptor.d.ts +8 -0
  134. package/dist/src/testers/IGGTestInterceptor.d.ts.map +1 -0
  135. package/dist/src/testers/IGGTestInterceptor.js +2 -0
  136. package/dist/src/testers/IGGTestInterceptor.js.map +1 -0
  137. package/dist/src/testers/IGGTestWith.d.ts +13 -0
  138. package/dist/src/testers/IGGTestWith.d.ts.map +1 -0
  139. package/dist/src/testers/IGGTestWith.js +2 -0
  140. package/dist/src/testers/IGGTestWith.js.map +1 -0
  141. package/dist/src/testers/RuntimeSelector.d.ts +117 -0
  142. package/dist/src/testers/RuntimeSelector.d.ts.map +1 -0
  143. package/dist/src/testers/RuntimeSelector.js +2 -0
  144. package/dist/src/testers/RuntimeSelector.js.map +1 -0
  145. package/dist/src/tsconfig.json +17 -0
  146. package/dist/src/utils/GGExpectations.d.ts +18 -0
  147. package/dist/src/utils/GGExpectations.d.ts.map +1 -0
  148. package/dist/src/utils/GGExpectations.js +59 -0
  149. package/dist/src/utils/GGExpectations.js.map +1 -0
  150. package/dist/src/utils/GGTestError.d.ts +13 -0
  151. package/dist/src/utils/GGTestError.d.ts.map +1 -0
  152. package/dist/src/utils/GGTestError.js +26 -0
  153. package/dist/src/utils/GGTestError.js.map +1 -0
  154. package/dist/src/utils/captureStack.d.ts +9 -0
  155. package/dist/src/utils/captureStack.d.ts.map +1 -0
  156. package/dist/src/utils/captureStack.js +51 -0
  157. package/dist/src/utils/captureStack.js.map +1 -0
  158. package/dist/tsconfig.publish.tsbuildinfo +1 -0
  159. package/package.json +66 -0
  160. package/src/GGBundleTest.ts +89 -0
  161. package/src/GGTest.ts +318 -0
  162. package/src/GGTestContext.ts +74 -0
  163. package/src/GGTestRunner.ts +308 -0
  164. package/src/GGTestRuntime.ts +265 -0
  165. package/src/GGTestRuntimeWorker.ts +159 -0
  166. package/src/GGTestSharedRef.ts +116 -0
  167. package/src/GGTestkitExtensionsDiscovery.ts +26 -0
  168. package/src/IGGLocalDiscoveryServer.ts +16 -0
  169. package/src/callOn/GGCallOnSelector.ts +61 -0
  170. package/src/callOn/GGContractClass.implement.ts +43 -0
  171. package/src/callOn/GGTestActionForLocatorOnCall.ts +134 -0
  172. package/src/callOn/TestableIPC.ts +81 -0
  173. package/src/callOn/callOn.ts +224 -0
  174. package/src/callOn/registerOnCallHandler.ts +123 -0
  175. package/src/index-node.ts +64 -0
  176. package/src/mockable/GGMockable.ts +22 -0
  177. package/src/mockable/GGMockableCall.ts +45 -0
  178. package/src/mockable/GGMockableIPC.ts +20 -0
  179. package/src/mockable/GGMockableInterceptor.ts +44 -0
  180. package/src/mockable/GGMockableInterceptorsServer.ts +69 -0
  181. package/src/mockable/mockable.ts +71 -0
  182. package/src/runner/InlineRunner.ts +47 -0
  183. package/src/runner/IsolatedRunner.ts +179 -0
  184. package/src/runner/RuntimeRunner.ts +15 -0
  185. package/src/runner/WorkerRunner.ts +179 -0
  186. package/src/runner/isolated-loader.mjs +91 -0
  187. package/src/runner/worker-loader.mjs +49 -0
  188. package/src/testers/GGCallInterceptor.ts +224 -0
  189. package/src/testers/GGMockWith.ts +92 -0
  190. package/src/testers/GGSpyWith.ts +115 -0
  191. package/src/testers/GGTestAction.ts +333 -0
  192. package/src/testers/GGTestComponent.ts +16 -0
  193. package/src/testers/GGTestSelector.ts +223 -0
  194. package/src/testers/IGGTestInterceptor.ts +11 -0
  195. package/src/testers/IGGTestWith.ts +15 -0
  196. package/src/testers/RuntimeSelector.ts +151 -0
  197. package/src/tsconfig.json +17 -0
  198. package/src/utils/GGExpectations.ts +78 -0
  199. package/src/utils/GGTestError.ts +37 -0
  200. package/src/utils/captureStack.ts +54 -0
@@ -0,0 +1,245 @@
1
+ import { GG_TEST_RESOURCE, GG_TEST_RUNNER } from "./GGTestRunner.js";
2
+ import { GGTestMode, GGTestRuntime } from "./GGTestRuntime.js";
3
+ import { createStartResult } from "./testers/GGTestSelector.js";
4
+ /**
5
+ * Static API for test setup operations.
6
+ * Use GGTest.startWorker(), GGTest.with(), etc. in test files.
7
+ *
8
+ * @example
9
+ * // Single runtime
10
+ * const t = GGTest.startWorker(MainRuntime);
11
+ * t.logs.cursor();
12
+ *
13
+ * // Multiple instances
14
+ * const t = GGTest.startWorker([MainRuntime, MainRuntime]);
15
+ * t[0].logs.cursor();
16
+ *
17
+ * // Named runtimes
18
+ * const t = GGTest.startWorker({main: MainRuntime, sub: SubRuntime});
19
+ * t.main.logs.cursor();
20
+ * t.sub.config.update();
21
+ */
22
+ export class GGTest {
23
+ // -------------------------------------------------
24
+ // Private state for runtime management
25
+ // -------------------------------------------------
26
+ // When GG_COVERAGE_MODE is set, force INLINE mode for all runtimes
27
+ // This is needed because v8 coverage doesn't capture worker_threads or child_process
28
+ static forceCoverageInline = process.env.GG_COVERAGE_MODE === '1';
29
+ // -------------------------------------------------
30
+ // Public static methods
31
+ // -------------------------------------------------
32
+ /**
33
+ * Get a resource wrapper for calling test operations.
34
+ * Returns an object with methods defined by the resource's [GG_TEST_RESOURCE].
35
+ *
36
+ * @example
37
+ * GGTest.with(MyConfig.mysql).clone();
38
+ * GGTest.with(MyConfig.mysql).clone("seed.sql");
39
+ */
40
+ static with(resource) {
41
+ return resource[GG_TEST_RESOURCE];
42
+ }
43
+ /**
44
+ * Start runtimes in inline mode.
45
+ * Inline mode runs the service code in the same process as the test.
46
+ *
47
+ * @example
48
+ * // Single runtime
49
+ * const t = GGTest.startInline(MainRuntime);
50
+ *
51
+ * // Array of runtimes (multiple instances)
52
+ * const t = GGTest.startInline([MainRuntime, MainRuntime]);
53
+ *
54
+ * // Object with named runtimes
55
+ * const t = GGTest.startInline({main: MainRuntime, sub: SubRuntime});
56
+ */
57
+ static startInline(input) {
58
+ return this.startWithMode(input, GGTestMode.INLINE);
59
+ }
60
+ /**
61
+ * Start runtimes in worker mode.
62
+ * Worker mode runs the service code in a worker thread.
63
+ *
64
+ * @example
65
+ * // Single runtime
66
+ * const t = GGTest.startWorker(MainRuntime);
67
+ *
68
+ * // Array of runtimes (multiple instances)
69
+ * const t = GGTest.startWorker([MainRuntime, MainRuntime]);
70
+ *
71
+ * // Object with named runtimes
72
+ * const t = GGTest.startWorker({main: MainRuntime, sub: SubRuntime});
73
+ */
74
+ static startWorker(input) {
75
+ return this.startWithMode(input, GGTestMode.WORKER);
76
+ }
77
+ /**
78
+ * Start runtimes in isolated mode.
79
+ * Isolated mode runs the service code in a separate process.
80
+ *
81
+ * @example
82
+ * // Single runtime
83
+ * const t = GGTest.startIsolated(MainRuntime);
84
+ *
85
+ * // Array of runtimes (multiple instances)
86
+ * const t = GGTest.startIsolated([MainRuntime, MainRuntime]);
87
+ *
88
+ * // Object with named runtimes
89
+ * const t = GGTest.startIsolated({main: MainRuntime, sub: SubRuntime});
90
+ */
91
+ static startIsolated(input) {
92
+ return this.startWithMode(input, GGTestMode.ISOLATED);
93
+ }
94
+ /**
95
+ * Wait for an async expectation to be satisfied.
96
+ * Use this for standalone async expectations outside of action chains.
97
+ *
98
+ * Polls the expectation every 20ms until it's satisfied or timeout is reached.
99
+ *
100
+ * @param expectation - The expectation to wait for
101
+ * @param timeout - Max time to wait in ms (default: 5000)
102
+ *
103
+ * @example
104
+ * // Wait for a log after injecting an event
105
+ * await UserEventsPublisher.inject.registered({...});
106
+ * await GGTest.waitFor(t.logs.expect(/validation failed/i));
107
+ *
108
+ * @example
109
+ * // Wait for a metric to be incremented
110
+ * await GGTest.waitFor(t.main.metrics.expect(SomeMetric).inc({label: 'value'}));
111
+ */
112
+ static async waitFor(expectation, timeout = 5000) {
113
+ const interceptor = expectation.createInterceptor();
114
+ const checkInterval = 20;
115
+ const startTime = Date.now();
116
+ await interceptor.register();
117
+ try {
118
+ await new Promise((resolve, reject) => {
119
+ const check = () => {
120
+ const elapsed = Date.now() - startTime;
121
+ if (interceptor.isCalled()) {
122
+ resolve();
123
+ return;
124
+ }
125
+ if (elapsed > timeout) {
126
+ reject(new Error(`[GGTest.waitFor] Timeout after ${timeout}ms waiting for expectation`));
127
+ return;
128
+ }
129
+ setTimeout(check, checkInterval);
130
+ };
131
+ check();
132
+ });
133
+ await interceptor.validate();
134
+ const error = interceptor.getMockValidationError();
135
+ if (error) {
136
+ throw error;
137
+ }
138
+ }
139
+ finally {
140
+ await interceptor.unregister();
141
+ }
142
+ }
143
+ // -------------------------------------------------
144
+ // Private helpers
145
+ // -------------------------------------------------
146
+ static startWithMode(input, mode) {
147
+ const test = GG_TEST_RUNNER.get();
148
+ const constructors = this.extractConstructors(input);
149
+ const runtimes = this.createRuntimes(test, constructors, { mode: this.getCoverageMode(mode) });
150
+ const result = createStartResult(input, runtimes);
151
+ if (test.started) {
152
+ // We're inside a test block - start immediately
153
+ // Cleanup is handled by the global afterEach registered in initInTestCleanup
154
+ const startupPromise = this.startRuntimesInTestBlock(runtimes);
155
+ return this.makeAwaitable(result, startupPromise);
156
+ }
157
+ else {
158
+ // We're in describe block - normal flow, runtimes start in beforeAll
159
+ // Return immediately-resolved thenable for consistency
160
+ return this.makeAwaitable(result, Promise.resolve());
161
+ }
162
+ }
163
+ /**
164
+ * Extract runtime constructors from the input in the order they should be created.
165
+ */
166
+ static extractConstructors(input) {
167
+ // Single runtime
168
+ if ('NAME' in input) {
169
+ return [input];
170
+ }
171
+ // Array of runtimes
172
+ if (Array.isArray(input)) {
173
+ return input;
174
+ }
175
+ // Object: { main: MainRuntime, sub: [SubRuntime, SubRuntime] }
176
+ const constructors = [];
177
+ for (const value of Object.values(input)) {
178
+ if (Array.isArray(value)) {
179
+ constructors.push(...value);
180
+ }
181
+ else {
182
+ constructors.push(value);
183
+ }
184
+ }
185
+ return constructors;
186
+ }
187
+ /**
188
+ * Start runtimes immediately (for in-test usage).
189
+ * Runtimes are automatically tracked by the runner for afterEach cleanup.
190
+ */
191
+ static async startRuntimesInTestBlock(runtimes) {
192
+ for (const runtime of runtimes) {
193
+ await runtime.start();
194
+ }
195
+ }
196
+ /**
197
+ * Makes a result thenable by adding a then() method.
198
+ * This allows both sync and async usage patterns.
199
+ *
200
+ * IMPORTANT: The then() method removes itself after being called to prevent
201
+ * infinite thenable resolution. When onfulfilled returns the result,
202
+ * JavaScript would try to resolve it again if then() still existed.
203
+ */
204
+ static makeAwaitable(result, startupPromise) {
205
+ const awaitable = result;
206
+ awaitable.then = (onfulfilled, onrejected) => {
207
+ // Remove then() to prevent infinite thenable resolution
208
+ delete awaitable.then;
209
+ return startupPromise.then(() => onfulfilled ? onfulfilled(result) : result, onrejected);
210
+ };
211
+ return awaitable;
212
+ }
213
+ static getCoverageMode(requestedMode) {
214
+ if (this.forceCoverageInline && requestedMode !== GGTestMode.INLINE) {
215
+ return GGTestMode.INLINE;
216
+ }
217
+ return requestedMode;
218
+ }
219
+ static createRuntimes(test, services, config) {
220
+ const createdRuntimes = [];
221
+ for (const service of services) {
222
+ const runtimeConstructor = service;
223
+ // Validate that runtime has NAME property
224
+ if (!runtimeConstructor.NAME) {
225
+ throw new Error(`Runtime '${service.name}' must define a static NAME property. ` +
226
+ `Add 'public static readonly NAME = "yourname"' to the class.`);
227
+ }
228
+ // Validate that runtime has SOURCE_MODULE_URL (set by GGRuntime.cli())
229
+ if (!runtimeConstructor.SOURCE_MODULE_URL) {
230
+ throw new Error(`Runtime '${service.name}' has no source path. ` +
231
+ `Make sure the runtime file calls: ${service.name}.cli(import.meta.url)`);
232
+ }
233
+ const className = service.name;
234
+ const name = runtimeConstructor.NAME;
235
+ const sourcePath = runtimeConstructor.SOURCE_MODULE_URL;
236
+ const runtime = new GGTestRuntime(test, sourcePath, className, name, config);
237
+ // Store factory for inline mode — avoids dynamic import which causes
238
+ // duplicate module loading in Vite/vitest environments
239
+ runtime.runtimeFactory = () => new runtimeConstructor();
240
+ createdRuntimes.push(runtime);
241
+ }
242
+ return createdRuntimes;
243
+ }
244
+ }
245
+ //# sourceMappingURL=GGTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTest.js","sourceRoot":"","sources":["../../src/GGTest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { GGContext } from "@grest-ts/context";
2
+ import { GGTestCallOn, GGTestCallOnCollection } from "./callOn/callOn";
3
+ export declare class GGTestContext extends GGContext {
4
+ resetAfterEach(): this;
5
+ /**
6
+ * Register APIs and services for testing.
7
+ * Returns `this` merged with test clients for all registered items.
8
+ *
9
+ * @example
10
+ * const alice = new GGTestContext("alice")
11
+ * .apisV2({
12
+ * chain: ChainApi, // HTTP API → test client
13
+ * services: {
14
+ * weather: WeatherService // Service class → testable access
15
+ * }
16
+ * });
17
+ *
18
+ * alice.chain.getWeather({...}) // HTTP test client
19
+ * alice.services.weather.getWeather({...}) // Testable service
20
+ */
21
+ apis<T extends object>(apis: T): this & GGTestCallOnCollection<T>;
22
+ /**
23
+ * Call a method on an API or service within this context.
24
+ * Creates and caches test clients/proxies for reuse.
25
+ *
26
+ * @example
27
+ * alice.callOn(ChainApi).getWeather({city: "NYC"})
28
+ * alice.callOn(WeatherService).getWeather("NYC")
29
+ */
30
+ callOn<T extends object>(target: T): GGTestCallOn<T>;
31
+ beforeAll(callback: () => void): this;
32
+ beforeEach(callback: () => void): this;
33
+ afterEach(callback: () => void): this;
34
+ afterAll(callback: () => void): this;
35
+ }
36
+ //# sourceMappingURL=GGTestContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestContext.d.ts","sourceRoot":"","sources":["../../src/GGTestContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAA2B,YAAY,EAAE,sBAAsB,EAAC,MAAM,iBAAiB,CAAC;AAS/F,qBAAa,aAAc,SAAQ,SAAS;IAGjC,cAAc,IAAI,IAAI;IAO7B;;;;;;;;;;;;;;;OAeG;IACI,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,GAAG,sBAAsB,CAAC,CAAC,CAAC;IAKxE;;;;;;;OAOG;IACI,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IAIpD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAKrC,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAKtC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAKrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAI9C"}
@@ -0,0 +1,63 @@
1
+ import { GGContext } from "@grest-ts/context";
2
+ import { callOn, callOnCollection } from "./callOn/callOn.js";
3
+ // Note: beforeAll, beforeEach, afterEach, afterAll are vitest globals
4
+ // Do NOT import them directly - it breaks worker threads that load this module
5
+ // ============================================================================
6
+ // Test Collection Types
7
+ // ============================================================================
8
+ export class GGTestContext extends GGContext {
9
+ resetAfterEach() {
10
+ afterEach(() => {
11
+ this.reset();
12
+ });
13
+ return this;
14
+ }
15
+ /**
16
+ * Register APIs and services for testing.
17
+ * Returns `this` merged with test clients for all registered items.
18
+ *
19
+ * @example
20
+ * const alice = new GGTestContext("alice")
21
+ * .apisV2({
22
+ * chain: ChainApi, // HTTP API → test client
23
+ * services: {
24
+ * weather: WeatherService // Service class → testable access
25
+ * }
26
+ * });
27
+ *
28
+ * alice.chain.getWeather({...}) // HTTP test client
29
+ * alice.services.weather.getWeather({...}) // Testable service
30
+ */
31
+ apis(apis) {
32
+ Object.assign(this, callOnCollection(apis, this));
33
+ return this;
34
+ }
35
+ /**
36
+ * Call a method on an API or service within this context.
37
+ * Creates and caches test clients/proxies for reuse.
38
+ *
39
+ * @example
40
+ * alice.callOn(ChainApi).getWeather({city: "NYC"})
41
+ * alice.callOn(WeatherService).getWeather("NYC")
42
+ */
43
+ callOn(target) {
44
+ return callOn(target, this);
45
+ }
46
+ beforeAll(callback) {
47
+ beforeAll(() => this.run(callback));
48
+ return this;
49
+ }
50
+ beforeEach(callback) {
51
+ beforeEach(() => this.run(callback));
52
+ return this;
53
+ }
54
+ afterEach(callback) {
55
+ afterEach(() => this.run(callback));
56
+ return this;
57
+ }
58
+ afterAll(callback) {
59
+ afterAll(() => this.run(callback));
60
+ return this;
61
+ }
62
+ }
63
+ //# sourceMappingURL=GGTestContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestContext.js","sourceRoot":"","sources":["../../src/GGTestContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAC,MAAM,EAAE,gBAAgB,EAAuC,MAAM,iBAAiB,CAAC;AAE/F,sEAAsE;AACtE,+EAA+E;AAE/E,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,OAAO,aAAc,SAAQ,SAAS;IAGjC,cAAc;QACjB,SAAS,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,IAAI,CAAmB,IAAO;QACjC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD,OAAO,IAAwC,CAAC;IACpD,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAmB,MAAS;QACrC,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IAEM,SAAS,CAAC,QAAoB;QACjC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,UAAU,CAAC,QAAoB;QAClC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,SAAS,CAAC,QAAoB;QACjC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,QAAQ,CAAC,QAAoB;QAChC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ"}
@@ -0,0 +1,108 @@
1
+ import { GGTestRuntime } from "./GGTestRuntime";
2
+ import { IPCClientRequest, IPCServer } from "@grest-ts/ipc";
3
+ import { GGLocatorKey } from "@grest-ts/locator";
4
+ import { GGTestComponent, GGTestComponentType } from "./testers/GGTestComponent";
5
+ import { IGGLocalDiscoveryServer } from "./IGGLocalDiscoveryServer";
6
+ export declare const GG_TEST_RUNNER: GGLocatorKey<GGTestRunner>;
7
+ /**
8
+ * Interface for test lifecycle hooks.
9
+ * Registered via GGTest.registerHook() to run setup/teardown logic.
10
+ */
11
+ export interface GGTestRunnerHook {
12
+ /** Key name for deduplication (e.g., config key name) */
13
+ keyName: string;
14
+ /** Runs in beforeAll - setup logic */
15
+ beforeAll: () => Promise<void>;
16
+ /** Runs in afterAll - cleanup logic */
17
+ afterAll: () => Promise<void>;
18
+ }
19
+ /**
20
+ * Symbol for resources that support test operations.
21
+ * Resources implement this to expose operations like clone().
22
+ */
23
+ export declare const GG_TEST_RESOURCE: unique symbol;
24
+ /**
25
+ * Type for objects that expose test resource operations.
26
+ * Used by GGTest.with() to get available operations.
27
+ */
28
+ export interface TestResource<T = any> {
29
+ [GG_TEST_RESOURCE]: T;
30
+ }
31
+ export interface GGTestConfig {
32
+ serviceStartupTimeout: number;
33
+ verboseProxy: boolean;
34
+ }
35
+ export declare class GGTestRunner {
36
+ /**
37
+ * Unique identifier for this test context.
38
+ * Used for test resource isolation (e.g., creating isolated DB schemas).
39
+ */
40
+ readonly testId: string;
41
+ readonly ipcServer: IPCServer;
42
+ readonly discoveryServer: IGGLocalDiscoveryServer;
43
+ readonly config: GGTestConfig;
44
+ private _started;
45
+ /**
46
+ * Runtimes added in the describe block (before start).
47
+ * These are managed by beforeAll/afterAll.
48
+ */
49
+ private readonly globalRuntimes;
50
+ /**
51
+ * Runtimes added within test blocks (after start).
52
+ * These are managed by afterEach and cleared after each test.
53
+ */
54
+ private readonly inTestRuntimes;
55
+ /**
56
+ * Extension instances - extensions are some "describe block level components".
57
+ * Some examples EventsServer, HttpInterceptorsServer, MockableInterceptorsServer etc.
58
+ */
59
+ private readonly extensionInstances;
60
+ private readonly hooks;
61
+ constructor(ipcServer: IPCServer, discoveryServer: IGGLocalDiscoveryServer, userConfig?: Partial<GGTestConfig>);
62
+ /**
63
+ * Extension factories - extensions are some "describe block level components".
64
+ * Some examples EventsServer, HttpInterceptorsServer, MockableInterceptorsServer etc.
65
+ */
66
+ private static extensionFactories;
67
+ /**
68
+ * Register a component type.
69
+ * Components must accept GGTestRunner as their constructor argument.
70
+ */
71
+ static registerExtension<T extends GGTestComponent>(type: GGTestComponentType<T>): void;
72
+ /**
73
+ * Get a component by type. Creates it lazily if not yet instantiated.
74
+ */
75
+ getExtensionInstance<T extends GGTestComponent>(type: GGTestComponentType<T>): T;
76
+ /**
77
+ * Whether the test has started (services are running).
78
+ */
79
+ get started(): boolean;
80
+ /**
81
+ * Register a test lifecycle hook.
82
+ * Hooks run beforeAll (during start) and afterAll (during teardown).
83
+ * Duplicate registrations with the same keyName are skipped.
84
+ */
85
+ registerHook(hook: GGTestRunnerHook): void;
86
+ /**
87
+ * Send a command to ALL runtimes.
88
+ * Used by resource hooks (e.g., DB config) that apply globally.
89
+ */
90
+ sendCommand<Payload>(type: IPCClientRequest<Payload, any>, payload: Payload): Promise<void>;
91
+ /**
92
+ * Add a runtime to this test runner.
93
+ * Automatically routes to the appropriate list based on lifecycle stage.
94
+ */
95
+ addRuntime(runtime: GGTestRuntime): void;
96
+ /**
97
+ * Get all active runtimes (both global and in-test).
98
+ */
99
+ getAllRuntimes(): GGTestRuntime[];
100
+ /**
101
+ * Find a runtime by its unique runtimeId.
102
+ */
103
+ getRuntimeById(runtimeId: string): GGTestRuntime | undefined;
104
+ start(): Promise<void>;
105
+ runAfterEachHooks(): Promise<void>;
106
+ teardown(): Promise<void>;
107
+ }
108
+ //# sourceMappingURL=GGTestRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GGTestRunner.d.ts","sourceRoot":"","sources":["../../src/GGTestRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAA;AAE7C,OAAO,EAAC,gBAAgB,EAAE,SAAS,EAAC,MAAM,eAAe,CAAC;AAG1D,OAAO,EAAC,YAAY,EAAC,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAC,eAAe,EAAE,mBAAmB,EAAC,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAGlE,eAAO,MAAM,cAAc,4BAAiD,CAAC;AAE7E;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,eAA6B,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACjC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IACzB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,YAAY,EAAE,OAAO,CAAA;CACxB;AAED,qBAAa,YAAY;IAErB;;;OAGG;IACH,SAAgB,MAAM,EAAE,MAAM,CAAA;IAC9B,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,eAAe,EAAE,uBAAuB,CAAA;IACxD,SAAgB,MAAM,EAAE,YAAY,CAGnC;IACD,OAAO,CAAC,QAAQ,CAAiB;IAEjC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IAErD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsB;IAErD;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwD;IAE3F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;gBAErD,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,uBAAuB,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAsB9G;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAkC;IAEnE;;;OAGG;WACW,iBAAiB,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ9F;;OAEG;IACI,oBAAoB,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC;IAavF;;OAEG;IACH,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAQjD;;;OAGG;IACU,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxG;;;OAGG;IACI,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAU/C;;OAEG;IACI,cAAc,IAAI,aAAa,EAAE;IAIxC;;OAEG;IACI,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAKtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDtB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAalC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CA4CzC"}