@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.
- package/LICENSE +21 -0
- package/README.md +413 -0
- package/dist/src/GGBundleTest.d.ts +8 -0
- package/dist/src/GGBundleTest.d.ts.map +1 -0
- package/dist/src/GGBundleTest.js +75 -0
- package/dist/src/GGBundleTest.js.map +1 -0
- package/dist/src/GGTest.d.ts +131 -0
- package/dist/src/GGTest.d.ts.map +1 -0
- package/dist/src/GGTest.js +245 -0
- package/dist/src/GGTest.js.map +1 -0
- package/dist/src/GGTestContext.d.ts +36 -0
- package/dist/src/GGTestContext.d.ts.map +1 -0
- package/dist/src/GGTestContext.js +63 -0
- package/dist/src/GGTestContext.js.map +1 -0
- package/dist/src/GGTestRunner.d.ts +108 -0
- package/dist/src/GGTestRunner.d.ts.map +1 -0
- package/dist/src/GGTestRunner.js +242 -0
- package/dist/src/GGTestRunner.js.map +1 -0
- package/dist/src/GGTestRuntime.d.ts +103 -0
- package/dist/src/GGTestRuntime.d.ts.map +1 -0
- package/dist/src/GGTestRuntime.js +219 -0
- package/dist/src/GGTestRuntime.js.map +1 -0
- package/dist/src/GGTestRuntimeWorker.d.ts +41 -0
- package/dist/src/GGTestRuntimeWorker.d.ts.map +1 -0
- package/dist/src/GGTestRuntimeWorker.js +136 -0
- package/dist/src/GGTestRuntimeWorker.js.map +1 -0
- package/dist/src/GGTestSharedRef.d.ts +35 -0
- package/dist/src/GGTestSharedRef.d.ts.map +1 -0
- package/dist/src/GGTestSharedRef.js +126 -0
- package/dist/src/GGTestSharedRef.js.map +1 -0
- package/dist/src/GGTestkitExtensionsDiscovery.d.ts +21 -0
- package/dist/src/GGTestkitExtensionsDiscovery.d.ts.map +1 -0
- package/dist/src/GGTestkitExtensionsDiscovery.js +24 -0
- package/dist/src/GGTestkitExtensionsDiscovery.js.map +1 -0
- package/dist/src/IGGLocalDiscoveryServer.d.ts +16 -0
- package/dist/src/IGGLocalDiscoveryServer.d.ts.map +1 -0
- package/dist/src/IGGLocalDiscoveryServer.js +2 -0
- package/dist/src/IGGLocalDiscoveryServer.js.map +1 -0
- package/dist/src/callOn/GGCallOnSelector.d.ts +42 -0
- package/dist/src/callOn/GGCallOnSelector.d.ts.map +1 -0
- package/dist/src/callOn/GGCallOnSelector.js +35 -0
- package/dist/src/callOn/GGCallOnSelector.js.map +1 -0
- package/dist/src/callOn/GGContractClass.implement.d.ts +8 -0
- package/dist/src/callOn/GGContractClass.implement.d.ts.map +1 -0
- package/dist/src/callOn/GGContractClass.implement.js +31 -0
- package/dist/src/callOn/GGContractClass.implement.js.map +1 -0
- package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts +28 -0
- package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts.map +1 -0
- package/dist/src/callOn/GGTestActionForLocatorOnCall.js +118 -0
- package/dist/src/callOn/GGTestActionForLocatorOnCall.js.map +1 -0
- package/dist/src/callOn/TestableIPC.d.ts +72 -0
- package/dist/src/callOn/TestableIPC.d.ts.map +1 -0
- package/dist/src/callOn/TestableIPC.js +34 -0
- package/dist/src/callOn/TestableIPC.js.map +1 -0
- package/dist/src/callOn/callOn.d.ts +113 -0
- package/dist/src/callOn/callOn.d.ts.map +1 -0
- package/dist/src/callOn/callOn.js +122 -0
- package/dist/src/callOn/callOn.js.map +1 -0
- package/dist/src/callOn/registerOnCallHandler.d.ts +13 -0
- package/dist/src/callOn/registerOnCallHandler.d.ts.map +1 -0
- package/dist/src/callOn/registerOnCallHandler.js +111 -0
- package/dist/src/callOn/registerOnCallHandler.js.map +1 -0
- package/dist/src/index-node.d.ts +35 -0
- package/dist/src/index-node.d.ts.map +1 -0
- package/dist/src/index-node.js +50 -0
- package/dist/src/index-node.js.map +1 -0
- package/dist/src/mockable/GGMockable.d.ts +19 -0
- package/dist/src/mockable/GGMockable.d.ts.map +1 -0
- package/dist/src/mockable/GGMockable.js +2 -0
- package/dist/src/mockable/GGMockable.js.map +1 -0
- package/dist/src/mockable/GGMockableCall.d.ts +2 -0
- package/dist/src/mockable/GGMockableCall.d.ts.map +1 -0
- package/dist/src/mockable/GGMockableCall.js +41 -0
- package/dist/src/mockable/GGMockableCall.js.map +1 -0
- package/dist/src/mockable/GGMockableIPC.d.ts +17 -0
- package/dist/src/mockable/GGMockableIPC.d.ts.map +1 -0
- package/dist/src/mockable/GGMockableIPC.js +8 -0
- package/dist/src/mockable/GGMockableIPC.js.map +1 -0
- package/dist/src/mockable/GGMockableInterceptor.d.ts +24 -0
- package/dist/src/mockable/GGMockableInterceptor.d.ts.map +1 -0
- package/dist/src/mockable/GGMockableInterceptor.js +32 -0
- package/dist/src/mockable/GGMockableInterceptor.js.map +1 -0
- package/dist/src/mockable/GGMockableInterceptorsServer.d.ts +12 -0
- package/dist/src/mockable/GGMockableInterceptorsServer.d.ts.map +1 -0
- package/dist/src/mockable/GGMockableInterceptorsServer.js +55 -0
- package/dist/src/mockable/GGMockableInterceptorsServer.js.map +1 -0
- package/dist/src/mockable/mockable.d.ts +46 -0
- package/dist/src/mockable/mockable.d.ts.map +1 -0
- package/dist/src/mockable/mockable.js +47 -0
- package/dist/src/mockable/mockable.js.map +1 -0
- package/dist/src/runner/InlineRunner.d.ts +12 -0
- package/dist/src/runner/InlineRunner.d.ts.map +1 -0
- package/dist/src/runner/InlineRunner.js +42 -0
- package/dist/src/runner/InlineRunner.js.map +1 -0
- package/dist/src/runner/IsolatedRunner.d.ts +17 -0
- package/dist/src/runner/IsolatedRunner.d.ts.map +1 -0
- package/dist/src/runner/IsolatedRunner.js +155 -0
- package/dist/src/runner/IsolatedRunner.js.map +1 -0
- package/dist/src/runner/RuntimeRunner.d.ts +14 -0
- package/dist/src/runner/RuntimeRunner.d.ts.map +1 -0
- package/dist/src/runner/RuntimeRunner.js +2 -0
- package/dist/src/runner/RuntimeRunner.js.map +1 -0
- package/dist/src/runner/WorkerRunner.d.ts +17 -0
- package/dist/src/runner/WorkerRunner.d.ts.map +1 -0
- package/dist/src/runner/WorkerRunner.js +155 -0
- package/dist/src/runner/WorkerRunner.js.map +1 -0
- package/dist/src/runner/isolated-loader.mjs +91 -0
- package/dist/src/runner/worker-loader.mjs +49 -0
- package/dist/src/testers/GGCallInterceptor.d.ts +71 -0
- package/dist/src/testers/GGCallInterceptor.d.ts.map +1 -0
- package/dist/src/testers/GGCallInterceptor.js +170 -0
- package/dist/src/testers/GGCallInterceptor.js.map +1 -0
- package/dist/src/testers/GGMockWith.d.ts +30 -0
- package/dist/src/testers/GGMockWith.d.ts.map +1 -0
- package/dist/src/testers/GGMockWith.js +70 -0
- package/dist/src/testers/GGMockWith.js.map +1 -0
- package/dist/src/testers/GGSpyWith.d.ts +40 -0
- package/dist/src/testers/GGSpyWith.d.ts.map +1 -0
- package/dist/src/testers/GGSpyWith.js +90 -0
- package/dist/src/testers/GGSpyWith.js.map +1 -0
- package/dist/src/testers/GGTestAction.d.ts +126 -0
- package/dist/src/testers/GGTestAction.d.ts.map +1 -0
- package/dist/src/testers/GGTestAction.js +245 -0
- package/dist/src/testers/GGTestAction.js.map +1 -0
- package/dist/src/testers/GGTestComponent.d.ts +15 -0
- package/dist/src/testers/GGTestComponent.d.ts.map +1 -0
- package/dist/src/testers/GGTestComponent.js +2 -0
- package/dist/src/testers/GGTestComponent.js.map +1 -0
- package/dist/src/testers/GGTestSelector.d.ts +54 -0
- package/dist/src/testers/GGTestSelector.d.ts.map +1 -0
- package/dist/src/testers/GGTestSelector.js +179 -0
- package/dist/src/testers/GGTestSelector.js.map +1 -0
- package/dist/src/testers/IGGTestInterceptor.d.ts +8 -0
- package/dist/src/testers/IGGTestInterceptor.d.ts.map +1 -0
- package/dist/src/testers/IGGTestInterceptor.js +2 -0
- package/dist/src/testers/IGGTestInterceptor.js.map +1 -0
- package/dist/src/testers/IGGTestWith.d.ts +13 -0
- package/dist/src/testers/IGGTestWith.d.ts.map +1 -0
- package/dist/src/testers/IGGTestWith.js +2 -0
- package/dist/src/testers/IGGTestWith.js.map +1 -0
- package/dist/src/testers/RuntimeSelector.d.ts +117 -0
- package/dist/src/testers/RuntimeSelector.d.ts.map +1 -0
- package/dist/src/testers/RuntimeSelector.js +2 -0
- package/dist/src/testers/RuntimeSelector.js.map +1 -0
- package/dist/src/tsconfig.json +17 -0
- package/dist/src/utils/GGExpectations.d.ts +18 -0
- package/dist/src/utils/GGExpectations.d.ts.map +1 -0
- package/dist/src/utils/GGExpectations.js +59 -0
- package/dist/src/utils/GGExpectations.js.map +1 -0
- package/dist/src/utils/GGTestError.d.ts +13 -0
- package/dist/src/utils/GGTestError.d.ts.map +1 -0
- package/dist/src/utils/GGTestError.js +26 -0
- package/dist/src/utils/GGTestError.js.map +1 -0
- package/dist/src/utils/captureStack.d.ts +9 -0
- package/dist/src/utils/captureStack.d.ts.map +1 -0
- package/dist/src/utils/captureStack.js +51 -0
- package/dist/src/utils/captureStack.js.map +1 -0
- package/dist/tsconfig.publish.tsbuildinfo +1 -0
- package/package.json +66 -0
- package/src/GGBundleTest.ts +89 -0
- package/src/GGTest.ts +318 -0
- package/src/GGTestContext.ts +74 -0
- package/src/GGTestRunner.ts +308 -0
- package/src/GGTestRuntime.ts +265 -0
- package/src/GGTestRuntimeWorker.ts +159 -0
- package/src/GGTestSharedRef.ts +116 -0
- package/src/GGTestkitExtensionsDiscovery.ts +26 -0
- package/src/IGGLocalDiscoveryServer.ts +16 -0
- package/src/callOn/GGCallOnSelector.ts +61 -0
- package/src/callOn/GGContractClass.implement.ts +43 -0
- package/src/callOn/GGTestActionForLocatorOnCall.ts +134 -0
- package/src/callOn/TestableIPC.ts +81 -0
- package/src/callOn/callOn.ts +224 -0
- package/src/callOn/registerOnCallHandler.ts +123 -0
- package/src/index-node.ts +64 -0
- package/src/mockable/GGMockable.ts +22 -0
- package/src/mockable/GGMockableCall.ts +45 -0
- package/src/mockable/GGMockableIPC.ts +20 -0
- package/src/mockable/GGMockableInterceptor.ts +44 -0
- package/src/mockable/GGMockableInterceptorsServer.ts +69 -0
- package/src/mockable/mockable.ts +71 -0
- package/src/runner/InlineRunner.ts +47 -0
- package/src/runner/IsolatedRunner.ts +179 -0
- package/src/runner/RuntimeRunner.ts +15 -0
- package/src/runner/WorkerRunner.ts +179 -0
- package/src/runner/isolated-loader.mjs +91 -0
- package/src/runner/worker-loader.mjs +49 -0
- package/src/testers/GGCallInterceptor.ts +224 -0
- package/src/testers/GGMockWith.ts +92 -0
- package/src/testers/GGSpyWith.ts +115 -0
- package/src/testers/GGTestAction.ts +333 -0
- package/src/testers/GGTestComponent.ts +16 -0
- package/src/testers/GGTestSelector.ts +223 -0
- package/src/testers/IGGTestInterceptor.ts +11 -0
- package/src/testers/IGGTestWith.ts +15 -0
- package/src/testers/RuntimeSelector.ts +151 -0
- package/src/tsconfig.json +17 -0
- package/src/utils/GGExpectations.ts +78 -0
- package/src/utils/GGTestError.ts +37 -0
- 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"}
|