@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,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @grest-ts/testkit - Component testing library
|
|
3
|
+
*/
|
|
4
|
+
export * from './GGTest';
|
|
5
|
+
export * from './GGTestRunner';
|
|
6
|
+
export * from './IGGLocalDiscoveryServer';
|
|
7
|
+
export * from './GGTestRuntime';
|
|
8
|
+
export * from './testers/GGTestComponent';
|
|
9
|
+
export * from './mockable/GGMockable';
|
|
10
|
+
export * from './mockable/GGMockableCall';
|
|
11
|
+
export * from './mockable/mockable';
|
|
12
|
+
export * from './GGTestContext';
|
|
13
|
+
export * from './mockable/GGMockableInterceptorsServer';
|
|
14
|
+
export * from './callOn/callOn';
|
|
15
|
+
export * from './callOn/GGTestActionForLocatorOnCall';
|
|
16
|
+
export * from './callOn/GGCallOnSelector';
|
|
17
|
+
import './callOn/GGContractClass.implement';
|
|
18
|
+
export * from './GGTestRuntimeWorker';
|
|
19
|
+
export * from './testers/IGGTestWith';
|
|
20
|
+
export * from './testers/GGTestAction';
|
|
21
|
+
export * from './testers/GGMockWith';
|
|
22
|
+
export * from './testers/GGSpyWith';
|
|
23
|
+
export * from './testers/GGCallInterceptor';
|
|
24
|
+
export * from './utils/GGExpectations';
|
|
25
|
+
export * from './utils/GGTestError';
|
|
26
|
+
export { captureStackSourceFile } from './utils/captureStack';
|
|
27
|
+
export * from './GGTestSharedRef';
|
|
28
|
+
export * from './GGBundleTest';
|
|
29
|
+
export * from './mockable/GGMockableInterceptor';
|
|
30
|
+
export * from './testers/GGTestSelector';
|
|
31
|
+
export * from './testers/RuntimeSelector';
|
|
32
|
+
export * from './runner/WorkerRunner';
|
|
33
|
+
export type * from "./testers/IGGTestWith";
|
|
34
|
+
export type * from "./testers/IGGTestInterceptor";
|
|
35
|
+
//# sourceMappingURL=index-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-node.d.ts","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,yCAAyC,CAAA;AAGvD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uCAAuC,CAAA;AACrD,cAAc,2BAA2B,CAAA;AAGzC,OAAO,oCAAoC,CAAA;AAG3C,cAAc,uBAAuB,CAAA;AAGrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAC,sBAAsB,EAAC,MAAM,sBAAsB,CAAA;AAC3D,cAAc,mBAAmB,CAAA;AAGjC,cAAc,gBAAgB,CAAA;AAG9B,cAAc,kCAAkC,CAAA;AAGhD,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AAGzC,cAAc,uBAAuB,CAAA;AAErC,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @grest-ts/testkit - Component testing library
|
|
3
|
+
*/
|
|
4
|
+
// Core test framework
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { WorkerRunner } from "./runner/WorkerRunner.js";
|
|
8
|
+
import { IsolatedRunner } from "./runner/IsolatedRunner.js";
|
|
9
|
+
export * from './GGTest.js';
|
|
10
|
+
export * from './GGTestRunner.js';
|
|
11
|
+
export * from './IGGLocalDiscoveryServer.js';
|
|
12
|
+
export * from './GGTestRuntime.js';
|
|
13
|
+
export * from './testers/GGTestComponent.js';
|
|
14
|
+
export * from './mockable/GGMockable.js';
|
|
15
|
+
export * from './mockable/GGMockableCall.js';
|
|
16
|
+
export * from './mockable/mockable.js';
|
|
17
|
+
export * from './GGTestContext.js';
|
|
18
|
+
// Mockable component server (import triggers factory registration)
|
|
19
|
+
export * from './mockable/GGMockableInterceptorsServer.js';
|
|
20
|
+
// Testable - direct service invocation from tests
|
|
21
|
+
export * from './callOn/callOn.js';
|
|
22
|
+
export * from './callOn/GGTestActionForLocatorOnCall.js';
|
|
23
|
+
export * from './callOn/GGCallOnSelector.js';
|
|
24
|
+
// Contract registration - patches GGContractClass.implement() to auto-register
|
|
25
|
+
import './callOn/GGContractClass.implement.js';
|
|
26
|
+
// Control channel for runtime config updates
|
|
27
|
+
export * from './GGTestRuntimeWorker.js';
|
|
28
|
+
// Test utilities - core infrastructure
|
|
29
|
+
export * from './testers/IGGTestWith.js';
|
|
30
|
+
export * from './testers/GGTestAction.js';
|
|
31
|
+
export * from './testers/GGMockWith.js';
|
|
32
|
+
export * from './testers/GGSpyWith.js';
|
|
33
|
+
export * from './testers/GGCallInterceptor.js';
|
|
34
|
+
export * from './utils/GGExpectations.js';
|
|
35
|
+
export * from './utils/GGTestError.js';
|
|
36
|
+
export { captureStackSourceFile } from './utils/captureStack.js';
|
|
37
|
+
export * from './GGTestSharedRef.js';
|
|
38
|
+
// Production bundle DCE verification
|
|
39
|
+
export * from './GGBundleTest.js';
|
|
40
|
+
// Mockable interceptor
|
|
41
|
+
export * from './mockable/GGMockableInterceptor.js';
|
|
42
|
+
// Selector system for runtime access
|
|
43
|
+
export * from './testers/GGTestSelector.js';
|
|
44
|
+
export * from './testers/RuntimeSelector.js';
|
|
45
|
+
// Worker runner (path configured by @grest-ts/testkit-vitest)
|
|
46
|
+
export * from './runner/WorkerRunner.js';
|
|
47
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
48
|
+
WorkerRunner.setWorkerLoaderPath(path.join(__dirname, 'runner', 'worker-loader.mjs'));
|
|
49
|
+
IsolatedRunner.setIsolatedLoaderPath(path.join(__dirname, 'runner', 'isolated-loader.mjs'));
|
|
50
|
+
//# sourceMappingURL=index-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-node.js","sourceRoot":"","sources":["../../src/index-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,sBAAsB;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAClC,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAC,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAEvD,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,2BAA2B,CAAA;AACzC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA;AAE/B,mEAAmE;AACnE,cAAc,yCAAyC,CAAA;AAEvD,kDAAkD;AAClD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uCAAuC,CAAA;AACrD,cAAc,2BAA2B,CAAA;AAEzC,+EAA+E;AAC/E,OAAO,oCAAoC,CAAA;AAE3C,6CAA6C;AAC7C,cAAc,uBAAuB,CAAA;AAErC,uCAAuC;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,wBAAwB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAC,sBAAsB,EAAC,MAAM,sBAAsB,CAAA;AAC3D,cAAc,mBAAmB,CAAA;AAEjC,qCAAqC;AACrC,cAAc,gBAAgB,CAAA;AAE9B,uBAAuB;AACvB,cAAc,kCAAkC,CAAA;AAEhD,qCAAqC;AACrC,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AAEzC,8DAA8D;AAC9D,cAAc,uBAAuB,CAAA;AAKrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACtF,cAAc,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marker interface for external API services that can be mocked in tests.
|
|
3
|
+
* When a class implements this interface, the test framework can intercept
|
|
4
|
+
* all method calls and provide mock responses.
|
|
5
|
+
*
|
|
6
|
+
* Examples: REST APIs, GraphQL clients, third-party SDKs
|
|
7
|
+
*/
|
|
8
|
+
export interface GGMockableExternalApi {
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Marker interface for database/storage services that can be mocked in tests.
|
|
12
|
+
* When a class implements this interface, the test framework can intercept
|
|
13
|
+
* all method calls and provide mock responses.
|
|
14
|
+
*
|
|
15
|
+
* Examples: Database clients, cache services, file storage
|
|
16
|
+
*/
|
|
17
|
+
export interface GGMockableDatabaseApi {
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=GGMockable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockable.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockable.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;CAErC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;CAErC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockable.js","sourceRoot":"","sources":["../../../src/mockable/GGMockable.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableCall.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableCall.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAsCxF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GG_TEST_RUNTIME_WORKER } from "../GGTestRuntimeWorker.js";
|
|
2
|
+
import { CALL_THROUGH } from "./GGMockableInterceptorsServer.js";
|
|
3
|
+
import { GGMockableIPC } from "./GGMockableIPC.js";
|
|
4
|
+
const MOCKABLE_WRAPPED = Symbol('GGMockableWrapped');
|
|
5
|
+
export function GGMockableCall(cls, methodName, nameMapping) {
|
|
6
|
+
// Skip if already wrapped (happens in INLINE mode with multiple runtime instances)
|
|
7
|
+
if (cls.prototype[methodName]?.[MOCKABLE_WRAPPED]) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const originalMethod = cls.prototype[methodName];
|
|
11
|
+
const wrappedMethod = async function (...inputArgs) {
|
|
12
|
+
const worker = GG_TEST_RUNTIME_WORKER.get();
|
|
13
|
+
const args = {};
|
|
14
|
+
for (let i = 0; i < inputArgs.length; i++) {
|
|
15
|
+
if (!nameMapping[i])
|
|
16
|
+
break;
|
|
17
|
+
args[nameMapping[i]] = inputArgs[i];
|
|
18
|
+
}
|
|
19
|
+
const result = await worker.ipcClient.sendFrameworkRequest(GGMockableIPC.testServer.call, {
|
|
20
|
+
className: cls.name,
|
|
21
|
+
methodName: methodName,
|
|
22
|
+
callArgs: args
|
|
23
|
+
});
|
|
24
|
+
if (result === CALL_THROUGH) {
|
|
25
|
+
const realResult = await originalMethod.apply(this, inputArgs);
|
|
26
|
+
await worker.ipcClient.sendFrameworkRequest(GGMockableIPC.testServer.spyResult, {
|
|
27
|
+
className: cls.name,
|
|
28
|
+
methodName: methodName,
|
|
29
|
+
callResult: realResult
|
|
30
|
+
});
|
|
31
|
+
return realResult;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
// Mark as wrapped and assign to prototype
|
|
38
|
+
wrappedMethod[MOCKABLE_WRAPPED] = true;
|
|
39
|
+
cls.prototype[methodName] = wrappedMethod;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=GGMockableCall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableCall.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAC,YAAY,EAAC,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,GAAQ,EAAE,UAAkB,EAAE,WAAqB;IAC9E,mFAAmF;IACnF,IAAI,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,cAAc,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,KAAK,WAAsB,GAAG,SAAgB;QAChE,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,EAAE,CAAC;QAE5C,MAAM,IAAI,GAAQ,EAAE,CAAA;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;gBAAE,MAAM;YAC3B,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE;YACtF,SAAS,EAAE,GAAG,CAAC,IAAI;YACnB,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC/D,MAAM,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE;gBAC5E,SAAS,EAAE,GAAG,CAAC,IAAI;gBACnB,UAAU,EAAE,UAAU;gBACtB,UAAU,EAAE,UAAU;aACzB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;QACtB,CAAC;aAAM,CAAC;YACJ,OAAO,MAAM,CAAC;QAClB,CAAC;IACL,CAAC,CAAC;IAEF,0CAA0C;IACzC,aAAqB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;IAChD,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,aAAa,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface MockableCallPayload {
|
|
2
|
+
className: string;
|
|
3
|
+
methodName: string;
|
|
4
|
+
callArgs: any;
|
|
5
|
+
}
|
|
6
|
+
export interface MockableSpyResultPayload {
|
|
7
|
+
className: string;
|
|
8
|
+
methodName: string;
|
|
9
|
+
callResult: any;
|
|
10
|
+
}
|
|
11
|
+
export declare const GGMockableIPC: {
|
|
12
|
+
testServer: {
|
|
13
|
+
call: import("@grest-ts/ipc").IPCServerRequest<MockableCallPayload, any>;
|
|
14
|
+
spyResult: import("@grest-ts/ipc").IPCServerRequest<MockableSpyResultPayload, any>;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=GGMockableIPC.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableIPC.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableIPC.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC;CACnB;AAED,eAAO,MAAM,aAAa;;;;;CAKzB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableIPC.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableIPC.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,eAAe,CAAC;AAcxC,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,UAAU,EAAE;QACR,IAAI,EAAE,SAAS,CAAC,aAAa,CAA2B,eAAe,CAAC;QACxE,SAAS,EAAE,SAAS,CAAC,aAAa,CAAgC,qBAAqB,CAAC;KAC3F;CACJ,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GGTestRunner } from "../GGTestRunner";
|
|
2
|
+
import { GGCallInterceptor, GGCallInterceptorConfig } from "../testers/GGCallInterceptor";
|
|
3
|
+
export interface MockableInterceptorConfig extends GGCallInterceptorConfig {
|
|
4
|
+
className: string;
|
|
5
|
+
methodName: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Interceptor for mocking/spying on mockable class methods.
|
|
9
|
+
* Registers with GGMockableInterceptorsServer which handles the IPC communication.
|
|
10
|
+
*
|
|
11
|
+
* For spy mode, the flow is two-phase:
|
|
12
|
+
* 1. mockable/call → onRequest() validates input, returns undefined (CALL_THROUGH)
|
|
13
|
+
* 2. mockable/spy-result → onResponse() validates output
|
|
14
|
+
*/
|
|
15
|
+
export declare class GGMockableInterceptor extends GGCallInterceptor {
|
|
16
|
+
readonly className: string;
|
|
17
|
+
readonly methodName: string;
|
|
18
|
+
constructor(test: GGTestRunner, config: MockableInterceptorConfig);
|
|
19
|
+
getKey(): string;
|
|
20
|
+
protected doRegister(): void;
|
|
21
|
+
protected doUnregister(): void;
|
|
22
|
+
protected parseResponseData(result: any): any;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=GGMockableInterceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableInterceptor.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,iBAAiB,EAAE,uBAAuB,EAAC,MAAM,8BAA8B,CAAC;AAGxF,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,qBAAa,qBAAsB,SAAQ,iBAAiB;IAExD,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,yBAAyB;IAM1D,MAAM,IAAI,MAAM;IAIvB,SAAS,CAAC,UAAU,IAAI,IAAI;IAI5B,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG;CAGhD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { GGCallInterceptor } from "../testers/GGCallInterceptor.js";
|
|
2
|
+
import { GGMockableInterceptorsServer } from "./GGMockableInterceptorsServer.js";
|
|
3
|
+
/**
|
|
4
|
+
* Interceptor for mocking/spying on mockable class methods.
|
|
5
|
+
* Registers with GGMockableInterceptorsServer which handles the IPC communication.
|
|
6
|
+
*
|
|
7
|
+
* For spy mode, the flow is two-phase:
|
|
8
|
+
* 1. mockable/call → onRequest() validates input, returns undefined (CALL_THROUGH)
|
|
9
|
+
* 2. mockable/spy-result → onResponse() validates output
|
|
10
|
+
*/
|
|
11
|
+
export class GGMockableInterceptor extends GGCallInterceptor {
|
|
12
|
+
className;
|
|
13
|
+
methodName;
|
|
14
|
+
constructor(test, config) {
|
|
15
|
+
super(test, config);
|
|
16
|
+
this.className = config.className;
|
|
17
|
+
this.methodName = config.methodName;
|
|
18
|
+
}
|
|
19
|
+
getKey() {
|
|
20
|
+
return `${this.className}.${this.methodName}`;
|
|
21
|
+
}
|
|
22
|
+
doRegister() {
|
|
23
|
+
this.test.getExtensionInstance(GGMockableInterceptorsServer).addInterceptor(this);
|
|
24
|
+
}
|
|
25
|
+
doUnregister() {
|
|
26
|
+
this.test.getExtensionInstance(GGMockableInterceptorsServer).deleteInterceptor(this);
|
|
27
|
+
}
|
|
28
|
+
parseResponseData(result) {
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=GGMockableInterceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableInterceptor.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptor.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAA0B,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAC,4BAA4B,EAAC,MAAM,gCAAgC,CAAC;AAO5E;;;;;;;GAOG;AACH,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAExC,SAAS,CAAS;IAClB,UAAU,CAAS;IAEnC,YAAY,IAAkB,EAAE,MAAiC;QAC7D,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxC,CAAC;IAEM,MAAM;QACT,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IAClD,CAAC;IAES,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;IAES,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IAES,iBAAiB,CAAC,MAAW;QACnC,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GGMockableInterceptor } from "./GGMockableInterceptor";
|
|
2
|
+
import { GGTestComponent } from "../testers/GGTestComponent";
|
|
3
|
+
import { GGTestRunner } from "../GGTestRunner";
|
|
4
|
+
export declare const CALL_THROUGH = "__spyCallThrough|migo0am5g0htea";
|
|
5
|
+
export declare class GGMockableInterceptorsServer implements GGTestComponent {
|
|
6
|
+
private readonly interceptors;
|
|
7
|
+
constructor(runner: GGTestRunner);
|
|
8
|
+
addInterceptor(interceptor: GGMockableInterceptor): void;
|
|
9
|
+
deleteInterceptor(interceptor: GGMockableInterceptor): void;
|
|
10
|
+
teardown(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=GGMockableInterceptorsServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableInterceptorsServer.d.ts","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptorsServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAG7C,eAAO,MAAM,YAAY,oCAAoC,CAAC;AAE9D,qBAAa,4BAA6B,YAAW,eAAe;IAEhE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAiD;gBAElE,MAAM,EAAE,YAAY;IA4CzB,cAAc,CAAC,WAAW,EAAE,qBAAqB;IAIjD,iBAAiB,CAAC,WAAW,EAAE,qBAAqB;IAI9C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGzC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { GGTestRunner } from "../GGTestRunner.js";
|
|
2
|
+
import { GGMockableIPC } from "./GGMockableIPC.js";
|
|
3
|
+
export const CALL_THROUGH = "__spyCallThrough|migo0am5g0htea";
|
|
4
|
+
export class GGMockableInterceptorsServer {
|
|
5
|
+
interceptors = new Map();
|
|
6
|
+
constructor(runner) {
|
|
7
|
+
const server = runner.ipcServer;
|
|
8
|
+
server.onFrameworkMessage(GGMockableIPC.testServer.call, async (body) => {
|
|
9
|
+
const key = body.className + "." + body.methodName;
|
|
10
|
+
const handler = this.interceptors.get(key);
|
|
11
|
+
if (!handler) {
|
|
12
|
+
// No mock configured - call through to real implementation
|
|
13
|
+
// This allows testable() to invoke real methods on @mockable services
|
|
14
|
+
// throw new Error(
|
|
15
|
+
// `Expected handler to be set for mockable '${key}'!\n` +
|
|
16
|
+
// "Did you forget to call .with(...)?"
|
|
17
|
+
// );
|
|
18
|
+
return CALL_THROUGH;
|
|
19
|
+
}
|
|
20
|
+
// onRequest validates input and returns mock data (or undefined for spy)
|
|
21
|
+
const result = await handler.onRequest(body.callArgs);
|
|
22
|
+
if (handler.passThrough) {
|
|
23
|
+
// Spy mode - signal worker to call through
|
|
24
|
+
return CALL_THROUGH;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Mock mode - return the mock data
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
server.onFrameworkMessage(GGMockableIPC.testServer.spyResult, async (body) => {
|
|
32
|
+
const key = body.className + "." + body.methodName;
|
|
33
|
+
const handler = this.interceptors.get(key);
|
|
34
|
+
if (!handler || !handler.passThrough) {
|
|
35
|
+
// No spy handler configured - just ignore the result
|
|
36
|
+
// This allows testable() to call through without requiring spyOn()
|
|
37
|
+
// throw new Error(`Expected spy handler for '${key}'`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Validate the response from the real implementation
|
|
41
|
+
await handler.onResponse(body.callResult);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
addInterceptor(interceptor) {
|
|
45
|
+
this.interceptors.set(interceptor.getKey(), interceptor);
|
|
46
|
+
}
|
|
47
|
+
deleteInterceptor(interceptor) {
|
|
48
|
+
this.interceptors.delete(interceptor.getKey());
|
|
49
|
+
}
|
|
50
|
+
async teardown() {
|
|
51
|
+
this.interceptors.clear();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
GGTestRunner.registerExtension(GGMockableInterceptorsServer);
|
|
55
|
+
//# sourceMappingURL=GGMockableInterceptorsServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockableInterceptorsServer.js","sourceRoot":"","sources":["../../../src/mockable/GGMockableInterceptorsServer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAC;AAE9D,MAAM,OAAO,4BAA4B;IAEpB,YAAY,GAAuC,IAAI,GAAG,EAAE,CAAC;IAE9E,YAAY,MAAoB;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,2DAA2D;gBAC3D,sEAAsE;gBACtE,mBAAmB;gBACnB,8DAA8D;gBAC9D,2CAA2C;gBAC3C,KAAK;gBACL,OAAO,YAAY,CAAC;YACxB,CAAC;YAED,yEAAyE;YACzE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACtB,2CAA2C;gBAC3C,OAAO,YAAY,CAAC;YACxB,CAAC;iBAAM,CAAC;gBACJ,mCAAmC;gBACnC,OAAO,MAAM,CAAC;YAClB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,kBAAkB,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3C,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBACnC,qDAAqD;gBACrD,mEAAmE;gBACnE,wDAAwD;gBACxD,OAAO;YACX,CAAC;YAED,qDAAqD;YACrD,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,cAAc,CAAC,WAAkC;QACpD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7D,CAAC;IAEM,iBAAiB,CAAC,WAAkC;QACvD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACnD,CAAC;IAEM,KAAK,CAAC,QAAQ;QACjB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACJ;AAED,YAAY,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mockable decorator and test helpers.
|
|
3
|
+
*
|
|
4
|
+
* The @mockable decorator is re-exported from mockable-runtime.ts for production use.
|
|
5
|
+
* mockBy() and spyOn() are test-only utilities that require the full testkit.
|
|
6
|
+
*/
|
|
7
|
+
import { GGMockWith } from "../testers/GGMockWith";
|
|
8
|
+
import { GGSpyWith } from "../testers/GGSpyWith";
|
|
9
|
+
/**
|
|
10
|
+
* Type for mock access - maps class methods to GGMockWith
|
|
11
|
+
*/
|
|
12
|
+
type MockAccess<T> = {
|
|
13
|
+
[K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R> ? GGMockWith<A extends [infer Single] ? (Single extends object ? Single : Record<string, Single>) : Record<string, any>, Awaited<R>, never> : never;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Type for spy access - maps class methods to GGSpyWith
|
|
17
|
+
*/
|
|
18
|
+
type SpyAccess<T> = {
|
|
19
|
+
[K in keyof T]: T[K] extends (...args: infer A) => Promise<infer R> ? GGSpyWith<A extends [infer Single] ? (Single extends object ? Single : Record<string, Single>) : Record<string, any>, Awaited<R>, never> : never;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Get mock access for a @mockable class.
|
|
23
|
+
* Use this to create mock expectations in tests.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* .with(mockOf(AddressResolverService).resolveAddress
|
|
28
|
+
* .toEqual({address: "123 Main St"})
|
|
29
|
+
* .andReturn({lat: 40.7, lng: -74.0}))
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function mockOf<T>(cls: new (...args: any[]) => T): MockAccess<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Get spy access for a @mockable class.
|
|
35
|
+
* Use this to create spy expectations in tests - the real method will be called.
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* .with(spyOn(AddressResolverService).resolveAddress
|
|
40
|
+
* .toEqual({address: "123 Main St"})
|
|
41
|
+
* .responseToMatchObject({lat: 40.7}))
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function spyOn<T>(cls: new (...args: any[]) => T): SpyAccess<T>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=mockable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockable.d.ts","sourceRoot":"","sources":["../../../src/mockable/mockable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAM/C;;GAEG;AACH,KAAK,UAAU,CAAC,CAAC,IAAI;KAChB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAC7D,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GACzI,KAAK;CACd,CAAC;AAEF;;GAEG;AACH,KAAK,SAAS,CAAC,CAAC,IAAI;KACf,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAC7D,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,GACxI,KAAK;CACd,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAMvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAMrE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mockable decorator and test helpers.
|
|
3
|
+
*
|
|
4
|
+
* The @mockable decorator is re-exported from mockable-runtime.ts for production use.
|
|
5
|
+
* mockBy() and spyOn() are test-only utilities that require the full testkit.
|
|
6
|
+
*/
|
|
7
|
+
// Test-only imports - these pull in testkit infrastructure
|
|
8
|
+
import { GGMockableInterceptor } from "./GGMockableInterceptor.js";
|
|
9
|
+
import { GGMockWith } from "../testers/GGMockWith.js";
|
|
10
|
+
import { GGSpyWith } from "../testers/GGSpyWith.js";
|
|
11
|
+
/**
|
|
12
|
+
* Get mock access for a @mockable class.
|
|
13
|
+
* Use this to create mock expectations in tests.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* .with(mockOf(AddressResolverService).resolveAddress
|
|
18
|
+
* .toEqual({address: "123 Main St"})
|
|
19
|
+
* .andReturn({lat: 40.7, lng: -74.0}))
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function mockOf(cls) {
|
|
23
|
+
return new Proxy({}, {
|
|
24
|
+
get(_, methodName) {
|
|
25
|
+
return new GGMockWith(GGMockableInterceptor, { className: cls.name, methodName });
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get spy access for a @mockable class.
|
|
31
|
+
* Use this to create spy expectations in tests - the real method will be called.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* .with(spyOn(AddressResolverService).resolveAddress
|
|
36
|
+
* .toEqual({address: "123 Main St"})
|
|
37
|
+
* .responseToMatchObject({lat: 40.7}))
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function spyOn(cls) {
|
|
41
|
+
return new Proxy({}, {
|
|
42
|
+
get(_, methodName) {
|
|
43
|
+
return new GGSpyWith(GGMockableInterceptor, { className: cls.name, methodName });
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=mockable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockable.js","sourceRoot":"","sources":["../../../src/mockable/mockable.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2DAA2D;AAC3D,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAC;AAwB/C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CAAI,GAA8B;IACpD,OAAO,IAAI,KAAK,CAAC,EAAS,EAAE;QACxB,GAAG,CAAC,CAAC,EAAE,UAAkB;YACrB,OAAO,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAC,CAAC,CAAA;QACnF,CAAC;KACJ,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CAAI,GAA8B;IACnD,OAAO,IAAI,KAAK,CAAC,EAAS,EAAE;QACxB,GAAG,CAAC,CAAC,EAAE,UAAkB;YACrB,OAAO,IAAI,SAAS,CAAC,qBAAqB,EAAE,EAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAC,CAAC,CAAA;QAClF,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RuntimeRunner } from "./RuntimeRunner";
|
|
2
|
+
import { GGTestEnvConfig } from "../GGTestRuntime";
|
|
3
|
+
export declare class InlineRunner implements RuntimeRunner {
|
|
4
|
+
private readonly config;
|
|
5
|
+
private readonly runtimeFactory?;
|
|
6
|
+
private controlClient?;
|
|
7
|
+
constructor(config: GGTestEnvConfig, runtimeFactory?: () => any);
|
|
8
|
+
start(): Promise<void>;
|
|
9
|
+
stopRuntime(): Promise<void>;
|
|
10
|
+
shutdown(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=InlineRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineRunner.d.ts","sourceRoot":"","sources":["../../../src/runner/InlineRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAGjD,qBAAa,YAAa,YAAW,aAAa;IAK1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAJpC,OAAO,CAAC,aAAa,CAAC,CAAsB;gBAGvB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,GAAG;IAIzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIlC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GGTestRuntimeWorker } from "../GGTestRuntimeWorker.js";
|
|
2
|
+
import { GGLocatorScope } from "@grest-ts/locator";
|
|
3
|
+
export class InlineRunner {
|
|
4
|
+
config;
|
|
5
|
+
runtimeFactory;
|
|
6
|
+
controlClient;
|
|
7
|
+
constructor(config, runtimeFactory) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.runtimeFactory = runtimeFactory;
|
|
10
|
+
}
|
|
11
|
+
async start() {
|
|
12
|
+
// Use setTimeout + enterBlank() to create a fully isolated async context.
|
|
13
|
+
// This gives the inline runtime its own context tree where GGLog.init()
|
|
14
|
+
// creates an independent log context, similar to how Worker/Isolated modes
|
|
15
|
+
// naturally get separate contexts by running in different threads/processes.
|
|
16
|
+
const factory = this.runtimeFactory;
|
|
17
|
+
await new Promise((resolve, reject) => {
|
|
18
|
+
setTimeout(async () => {
|
|
19
|
+
try {
|
|
20
|
+
// Create blank context - inline runtime should not inherit test context
|
|
21
|
+
new GGLocatorScope("GGInlineRunner").enter();
|
|
22
|
+
this.controlClient = new GGTestRuntimeWorker(this.config);
|
|
23
|
+
// Pass factory to avoid dynamic import() which causes duplicate
|
|
24
|
+
// module loading in Vite/vitest environments
|
|
25
|
+
await this.controlClient.start(factory);
|
|
26
|
+
resolve();
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
reject(err);
|
|
30
|
+
}
|
|
31
|
+
}, 0);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async stopRuntime() {
|
|
35
|
+
await this.controlClient?.stopRuntime();
|
|
36
|
+
}
|
|
37
|
+
async shutdown() {
|
|
38
|
+
await this.controlClient?.shutdown();
|
|
39
|
+
this.controlClient = undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=InlineRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineRunner.js","sourceRoot":"","sources":["../../../src/runner/InlineRunner.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EAAC,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAEjD,MAAM,OAAO,YAAY;IAKA;IACA;IAJb,aAAa,CAAuB;IAE5C,YACqB,MAAuB,EACvB,cAA0B;QAD1B,WAAM,GAAN,MAAM,CAAiB;QACvB,mBAAc,GAAd,cAAc,CAAY;IAE/C,CAAC;IAED,KAAK,CAAC,KAAK;QACP,0EAA0E;QAC1E,wEAAwE;QACxE,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,UAAU,CAAC,KAAK,IAAI,EAAE;gBAClB,IAAI,CAAC;oBACD,wEAAwE;oBACxE,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC7C,IAAI,CAAC,aAAa,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1D,gEAAgE;oBAChE,6CAA6C;oBAC7C,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACxC,OAAO,EAAE,CAAC;gBACd,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;YACL,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,WAAW;QACb,MAAM,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACnC,CAAC;CACJ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RuntimeRunner } from "./RuntimeRunner";
|
|
2
|
+
import { GGTestEnvConfig } from "../GGTestRuntime";
|
|
3
|
+
export declare class IsolatedRunner implements RuntimeRunner {
|
|
4
|
+
private config;
|
|
5
|
+
private process?;
|
|
6
|
+
private static isolatedLoaderPath;
|
|
7
|
+
/**
|
|
8
|
+
* Set the path to the isolated-loader.mjs file.
|
|
9
|
+
* Called by @grest-ts/testkit-vitest to inject the path.
|
|
10
|
+
*/
|
|
11
|
+
static setIsolatedLoaderPath(path: string): void;
|
|
12
|
+
constructor(config: GGTestEnvConfig);
|
|
13
|
+
start(): Promise<void>;
|
|
14
|
+
stopRuntime(): Promise<void>;
|
|
15
|
+
shutdown(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=IsolatedRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IsolatedRunner.d.ts","sourceRoot":"","sources":["../../../src/runner/IsolatedRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAKjD,qBAAa,cAAe,YAAW,aAAa;IAapC,OAAO,CAAC,MAAM;IAZ1B,OAAO,CAAC,OAAO,CAAC,CAAe;IAE/B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAqB;IAEtD;;;OAGG;WACW,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;gBAInC,MAAM,EAAE,eAAe;IAGrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwEtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuClC"}
|