@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,170 @@
|
|
|
1
|
+
import { GGTestError } from "../utils/GGTestError.js";
|
|
2
|
+
import { GGLog } from "@grest-ts/logger";
|
|
3
|
+
/**
|
|
4
|
+
* Unified base class for mock/spy interceptors.
|
|
5
|
+
*
|
|
6
|
+
* - Mock mode (passThrough=false): validates input, returns fake data
|
|
7
|
+
* - Spy mode (passThrough=true): validates input, calls through, validates output
|
|
8
|
+
*
|
|
9
|
+
* Transport-specific subclasses provide register/unregister/getKey.
|
|
10
|
+
*/
|
|
11
|
+
export class GGCallInterceptor {
|
|
12
|
+
test;
|
|
13
|
+
definedInSourceFile;
|
|
14
|
+
_sleep;
|
|
15
|
+
times;
|
|
16
|
+
passThrough;
|
|
17
|
+
inputExpectations;
|
|
18
|
+
outputExpectations;
|
|
19
|
+
returnData;
|
|
20
|
+
noOfTimesCalled = 0;
|
|
21
|
+
isRegistered = false;
|
|
22
|
+
validationError;
|
|
23
|
+
constructor(test, config) {
|
|
24
|
+
this.test = test;
|
|
25
|
+
this.definedInSourceFile = config.definedInSourceFile;
|
|
26
|
+
this._sleep = config.sleep;
|
|
27
|
+
this.times = config.times;
|
|
28
|
+
this.passThrough = config.passThrough;
|
|
29
|
+
this.inputExpectations = config.inputExpectations;
|
|
30
|
+
this.outputExpectations = config.outputExpectations;
|
|
31
|
+
this.returnData = config.returnData;
|
|
32
|
+
if (this.passThrough) {
|
|
33
|
+
if (this.returnData !== undefined) {
|
|
34
|
+
throw new Error("Spy can't have returnData! It calls through and returns what ever it receives!");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (this.outputExpectations) {
|
|
39
|
+
throw new Error("Mocks can't have output expectations, they return the data that is defined in the test!");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Transform request body before checking expectations.
|
|
45
|
+
* Override to extract/transform the input for validation.
|
|
46
|
+
* Default: returns body unchanged.
|
|
47
|
+
*/
|
|
48
|
+
transformInput(body) {
|
|
49
|
+
return body;
|
|
50
|
+
}
|
|
51
|
+
// -------------------------------------------
|
|
52
|
+
// Registration lifecycle
|
|
53
|
+
// -------------------------------------------
|
|
54
|
+
register() {
|
|
55
|
+
if (this.isRegistered) {
|
|
56
|
+
throw new Error("Interceptor already registered, this should not happen...");
|
|
57
|
+
}
|
|
58
|
+
if (this.noOfTimesCalled > 0) {
|
|
59
|
+
throw new Error("Should not register interceptor multiple times. Something is wrong...");
|
|
60
|
+
}
|
|
61
|
+
this.isRegistered = true;
|
|
62
|
+
const mode = this.passThrough ? "spy" : "mock";
|
|
63
|
+
GGLog.debug(this, `Add ${mode} interceptor [${this.getKey()}]`);
|
|
64
|
+
this.doRegister();
|
|
65
|
+
}
|
|
66
|
+
unregister() {
|
|
67
|
+
if (!this.isRegistered) {
|
|
68
|
+
throw new Error("Interceptor is not registered, but trying to unregister. This should not happen...");
|
|
69
|
+
}
|
|
70
|
+
const mode = this.passThrough ? "spy" : "mock";
|
|
71
|
+
GGLog.debug(this, `Remove ${mode} interceptor [${this.getKey()}]`);
|
|
72
|
+
this.doUnregister();
|
|
73
|
+
this.isRegistered = false;
|
|
74
|
+
}
|
|
75
|
+
// -------------------------------------------
|
|
76
|
+
// Request/Response handling
|
|
77
|
+
// -------------------------------------------
|
|
78
|
+
/**
|
|
79
|
+
* Handle incoming request.
|
|
80
|
+
* - Validates input expectations
|
|
81
|
+
* - For mock: returns configured returnData
|
|
82
|
+
* - For spy: returns undefined (signal to pass through)
|
|
83
|
+
*/
|
|
84
|
+
async onRequest(body) {
|
|
85
|
+
try {
|
|
86
|
+
this.checkNoOfTimesCalled();
|
|
87
|
+
const transformed = this.transformInput(body);
|
|
88
|
+
this.inputExpectations?.check(transformed);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
const errorType = this.passThrough ? "SPY_REQUEST_VALIDATION_FAILED" : "MOCK_VALIDATION_FAILED";
|
|
92
|
+
this.setMockValidationError(error, errorType);
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
if (!this.passThrough) {
|
|
96
|
+
await this.sleepIfNeeded();
|
|
97
|
+
return this.returnData;
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Handle response (spy mode only).
|
|
103
|
+
* Called after pass-through completes with the real response.
|
|
104
|
+
* Parses response via transport-specific method, then validates.
|
|
105
|
+
*/
|
|
106
|
+
async onResponse(result) {
|
|
107
|
+
if (!this.passThrough) {
|
|
108
|
+
throw new Error("onResponse called in mock mode! Mocks don't have responses as they create fake responses! This is a coding error if you reach here!");
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const data = this.parseResponseData(result);
|
|
112
|
+
this.outputExpectations?.check(data);
|
|
113
|
+
await this.sleepIfNeeded();
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
this.setMockValidationError(error, "SPY_RESPONSE_VALIDATION_FAILED");
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// -------------------------------------------
|
|
121
|
+
// Validation after test completes
|
|
122
|
+
// -------------------------------------------
|
|
123
|
+
validate() {
|
|
124
|
+
if (this.noOfTimesCalled === 0 && this.times > 0) {
|
|
125
|
+
throw new GGTestError({
|
|
126
|
+
test: "Expected to be called, but was not.",
|
|
127
|
+
expected: "To be called",
|
|
128
|
+
received: "-",
|
|
129
|
+
sourceFile: this.definedInSourceFile
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getMockValidationError() {
|
|
134
|
+
return this.validationError;
|
|
135
|
+
}
|
|
136
|
+
isCalled() {
|
|
137
|
+
return this.noOfTimesCalled > 0;
|
|
138
|
+
}
|
|
139
|
+
// -------------------------------------------
|
|
140
|
+
// Helpers
|
|
141
|
+
// -------------------------------------------
|
|
142
|
+
async sleepIfNeeded() {
|
|
143
|
+
if (this._sleep) {
|
|
144
|
+
await new Promise(resolve => setTimeout(resolve, this._sleep));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
checkNoOfTimesCalled() {
|
|
148
|
+
this.noOfTimesCalled++;
|
|
149
|
+
if (this.noOfTimesCalled > this.times) {
|
|
150
|
+
throw new GGTestError({
|
|
151
|
+
context: `[${this.getKey()}]`,
|
|
152
|
+
test: "Interceptor called too many times!",
|
|
153
|
+
expected: `Called ${this.times} time(s)`,
|
|
154
|
+
received: `Called ${this.noOfTimesCalled} times(s)`,
|
|
155
|
+
sourceFile: this.definedInSourceFile
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
setMockValidationError(originalError, type) {
|
|
160
|
+
const messagePrefix = `[${this.getKey()}] ${type}`;
|
|
161
|
+
GGLog.error(this, messagePrefix, originalError);
|
|
162
|
+
originalError.isMockValidationError = true;
|
|
163
|
+
originalError.message = messagePrefix + "\n" + originalError.message;
|
|
164
|
+
const lines = originalError.stack?.split("\n") || [];
|
|
165
|
+
lines.shift();
|
|
166
|
+
originalError.stack = lines.join("\n");
|
|
167
|
+
this.validationError = originalError;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=GGCallInterceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGCallInterceptor.js","sourceRoot":"","sources":["../../../src/testers/GGCallInterceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { DeepPartial } from "@grest-ts/common";
|
|
2
|
+
import { Raw } from "@grest-ts/schema";
|
|
3
|
+
import { GGTestRunner } from "../GGTestRunner";
|
|
4
|
+
import { IGGTestWith } from "./IGGTestWith";
|
|
5
|
+
import { IGGTestInterceptor } from "./IGGTestInterceptor";
|
|
6
|
+
import { GGCallInterceptor } from "./GGCallInterceptor";
|
|
7
|
+
type InterceptorFactory = new (runner: GGTestRunner, config: any) => GGCallInterceptor;
|
|
8
|
+
export declare class GGMockWith<RequestBody = any, ResponseData = any, ErrorsUnion = any> implements IGGTestWith {
|
|
9
|
+
private readonly interceptorFactory;
|
|
10
|
+
private readonly interceptorConfig;
|
|
11
|
+
private readonly definedInSourceFile;
|
|
12
|
+
private _sleep;
|
|
13
|
+
private _times;
|
|
14
|
+
private readonly expectations;
|
|
15
|
+
private returnData;
|
|
16
|
+
constructor(interceptorFactory: InterceptorFactory, config: Record<string, any>);
|
|
17
|
+
createInterceptor(): IGGTestInterceptor;
|
|
18
|
+
sleep(timeMs: number): this;
|
|
19
|
+
times(amount: number): this;
|
|
20
|
+
toEqual(expectedData: Raw<RequestBody>): this;
|
|
21
|
+
toMatchObject(expectedData: DeepPartial<Raw<RequestBody>>): this;
|
|
22
|
+
toBeUndefined(): this;
|
|
23
|
+
toHaveLength(length: number): this;
|
|
24
|
+
arrayToContain<Item extends RequestBody extends Array<infer R> ? R : never>(...items: Partial<Raw<Item>>[]): this;
|
|
25
|
+
arrayToContainEqual<Item extends RequestBody extends Array<infer R> ? R : never>(...items: Partial<Raw<Item>>[]): this;
|
|
26
|
+
andReturn(data: Raw<ResponseData | ErrorsUnion> | (() => Raw<ResponseData | ErrorsUnion>)): this;
|
|
27
|
+
requiresWaitFor(): boolean;
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=GGMockWith.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockWith.d.ts","sourceRoot":"","sources":["../../../src/testers/GGMockWith.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAiB,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC;AAE/E,KAAK,kBAAkB,GAAG,KAAK,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,KAAK,iBAAiB,CAAC;AAEvF,qBAAa,UAAU,CAAC,WAAW,GAAG,GAAG,EAAE,YAAY,GAAG,GAAG,EAAE,WAAW,GAAG,GAAG,CAAE,YAAW,WAAW;IAEpG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsB;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqD;IAClF,OAAO,CAAC,UAAU,CAAkE;gBAExE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAMxE,iBAAiB,IAAI,kBAAkB;IAcvC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK3B,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,IAAI;IAK7C,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAKhE,aAAa,IAAI,IAAI;IAKrB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,cAAc,CAAC,IAAI,SAAS,WAAW,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI;IAKjH,mBAAmB,CAAC,IAAI,SAAS,WAAW,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI;IAKtH,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI;IAKhG,eAAe,IAAI,OAAO;CAIpC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { captureStackSourceFile } from "../utils/captureStack.js";
|
|
2
|
+
import { GGExpectations } from "../utils/GGExpectations.js";
|
|
3
|
+
import { GG_TEST_RUNNER } from "../GGTestRunner.js";
|
|
4
|
+
export class GGMockWith {
|
|
5
|
+
interceptorFactory;
|
|
6
|
+
interceptorConfig;
|
|
7
|
+
definedInSourceFile;
|
|
8
|
+
_sleep;
|
|
9
|
+
_times = 1;
|
|
10
|
+
expectations = new GGExpectations();
|
|
11
|
+
returnData;
|
|
12
|
+
constructor(interceptorFactory, config) {
|
|
13
|
+
this.interceptorFactory = interceptorFactory;
|
|
14
|
+
this.interceptorConfig = config;
|
|
15
|
+
this.definedInSourceFile = captureStackSourceFile();
|
|
16
|
+
}
|
|
17
|
+
createInterceptor() {
|
|
18
|
+
const test = GG_TEST_RUNNER.get();
|
|
19
|
+
const config = {
|
|
20
|
+
...this.interceptorConfig,
|
|
21
|
+
definedInSourceFile: this.definedInSourceFile,
|
|
22
|
+
sleep: this._sleep,
|
|
23
|
+
times: this._times,
|
|
24
|
+
passThrough: false,
|
|
25
|
+
inputExpectations: this.expectations,
|
|
26
|
+
returnData: this.returnData
|
|
27
|
+
};
|
|
28
|
+
return new this.interceptorFactory(test, config);
|
|
29
|
+
}
|
|
30
|
+
sleep(timeMs) {
|
|
31
|
+
this._sleep = timeMs;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
times(amount) {
|
|
35
|
+
this._times = amount;
|
|
36
|
+
return this;
|
|
37
|
+
}
|
|
38
|
+
toEqual(expectedData) {
|
|
39
|
+
this.expectations.toEqual(expectedData);
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
toMatchObject(expectedData) {
|
|
43
|
+
this.expectations.toMatchObject(expectedData);
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
toBeUndefined() {
|
|
47
|
+
this.expectations.toBeUndefined();
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
toHaveLength(length) {
|
|
51
|
+
this.expectations.toHaveLength(length);
|
|
52
|
+
return this;
|
|
53
|
+
}
|
|
54
|
+
arrayToContain(...items) {
|
|
55
|
+
this.expectations.arrayToContain(...items);
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
arrayToContainEqual(...items) {
|
|
59
|
+
this.expectations.arrayToContainEqual(...items);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
andReturn(data) {
|
|
63
|
+
this.returnData = data;
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
requiresWaitFor() {
|
|
67
|
+
return this.interceptorConfig.requiresWaitFor === true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=GGMockWith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGMockWith.js","sourceRoot":"","sources":["../../../src/testers/GGMockWith.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAC,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAC,cAAc,EAAe,MAAM,iBAAiB,CAAC;AAO7D,MAAM,OAAO,UAAU;IAEF,kBAAkB,CAAqB;IACvC,iBAAiB,CAAsB;IACvC,mBAAmB,CAAS;IACrC,MAAM,CAAS;IACf,MAAM,GAAW,CAAC,CAAC;IAEV,YAAY,GAAgC,IAAI,cAAc,EAAE,CAAC;IAC1E,UAAU,CAAkE;IAEpF,YAAY,kBAAsC,EAAE,MAA2B;QAC3E,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,sBAAsB,EAAE,CAAC;IACxD,CAAC;IAEM,iBAAiB;QACpB,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,MAAM,GAA4B;YACpC,GAAG,IAAI,CAAC,iBAAiB;YACzB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,WAAW,EAAE,KAAK;YAClB,iBAAiB,EAAE,IAAI,CAAC,YAAY;YACpC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC;QACF,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,MAAc;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,MAAc;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,OAAO,CAAC,YAA8B;QACzC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,YAA2B,CAAC,CAAA;QACtD,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,aAAa,CAAC,YAA2C;QAC5D,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,YAA2B,CAAC,CAAA;QAC5D,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAA;QACjC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,YAAY,CAAC,MAAc;QAC9B,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACtC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,cAAc,CAA8D,GAAG,KAA2B;QAC7G,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,CAAA;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,mBAAmB,CAA8D,GAAG,KAA2B;QAClH,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,GAAG,KAAK,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,SAAS,CAAC,IAA+E;QAC5F,IAAI,CAAC,UAAU,GAAG,IAAW,CAAC;QAC9B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,eAAe;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,KAAK,IAAI,CAAC;IAC3D,CAAC;CAEJ"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Raw } from "@grest-ts/schema";
|
|
2
|
+
import { ConstructorOf, DeepPartial } from "@grest-ts/common";
|
|
3
|
+
import { GGTestRunner } from "../GGTestRunner";
|
|
4
|
+
import { IGGTestWith } from "./IGGTestWith";
|
|
5
|
+
import { IGGTestInterceptor } from "./IGGTestInterceptor";
|
|
6
|
+
import { GGCallInterceptor } from "./GGCallInterceptor";
|
|
7
|
+
type InterceptorFactory = new (runner: GGTestRunner, config: any) => GGCallInterceptor;
|
|
8
|
+
export declare class GGSpyWith<RequestBody = any, ResponseData = any, ErrorsUnion = any> implements IGGTestWith {
|
|
9
|
+
private readonly interceptorFactory;
|
|
10
|
+
private readonly interceptorConfig;
|
|
11
|
+
private readonly definedInSourceFile;
|
|
12
|
+
private readonly _expectInput;
|
|
13
|
+
private _expectError;
|
|
14
|
+
private readonly _expectOutput;
|
|
15
|
+
private activeExpect;
|
|
16
|
+
private _sleep;
|
|
17
|
+
private _times;
|
|
18
|
+
constructor(interceptorFactory: InterceptorFactory, config: Record<string, any>);
|
|
19
|
+
createInterceptor(): IGGTestInterceptor;
|
|
20
|
+
/**
|
|
21
|
+
* Wait ms before returning data.
|
|
22
|
+
*/
|
|
23
|
+
sleep(timeMs: number): this;
|
|
24
|
+
/**
|
|
25
|
+
* Expect this mock to be called amount of times.
|
|
26
|
+
*/
|
|
27
|
+
times(amount: number): this;
|
|
28
|
+
get response(): GGSpyWith<ResponseData, never, never>;
|
|
29
|
+
toBeError<Type extends ConstructorOf<ErrorsUnion>>(type: Type): GGSpyWith<Extract<ErrorsUnion, InstanceType<Type>>, never, never>;
|
|
30
|
+
toEqual(expectedData: Raw<RequestBody>): this;
|
|
31
|
+
toMatchObject(expectedData: DeepPartial<Raw<RequestBody>>): this;
|
|
32
|
+
responseToMatchObject(expectedData: DeepPartial<Raw<ResponseData>>): this;
|
|
33
|
+
toBeUndefined(): this;
|
|
34
|
+
toHaveLength(length: number): this;
|
|
35
|
+
arrayToContain<Item extends RequestBody extends Array<infer R> ? R : never>(...items: Partial<Raw<Item>>[]): this;
|
|
36
|
+
arrayToContainEqual<Item extends RequestBody extends Array<infer R> ? R : never>(...items: Partial<Raw<Item>>[]): this;
|
|
37
|
+
requiresWaitFor(): boolean;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=GGSpyWith.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSpyWith.d.ts","sourceRoot":"","sources":["../../../src/testers/GGSpyWith.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAiB,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC;AAE/E,KAAK,kBAAkB,GAAG,KAAK,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,KAAK,iBAAiB,CAAC;AAEvF,qBAAa,SAAS,CAAC,WAAW,GAAG,GAAG,EAAE,YAAY,GAAG,GAAG,EAAE,WAAW,GAAG,GAAG,CAAE,YAAW,WAAW;IAEnG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsB;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAE7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoD;IACjF,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqD;IAEnF,OAAO,CAAC,YAAY,CAAsB;IAE1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;gBAEf,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAOxE,iBAAiB,IAAI,kBAAkB;IAe9C;;OAEG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC;;OAEG;IACI,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,IAAW,QAAQ,IAAI,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAI3D;IAEM,SAAS,CAAC,IAAI,SAAS,aAAa,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC;IAMjI,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,IAAI;IAK7C,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAKhE,qBAAqB,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,GAAG,IAAI;IAKzE,aAAa,IAAI,IAAI;IAKrB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,cAAc,CAAC,IAAI,SAAS,WAAW,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI;IAKjH,mBAAmB,CAAC,IAAI,SAAS,WAAW,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI;IAKtH,eAAe,IAAI,OAAO;CAGpC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { captureStackSourceFile } from "../utils/captureStack.js";
|
|
2
|
+
import { GGExpectations } from "../utils/GGExpectations.js";
|
|
3
|
+
import { GG_TEST_RUNNER } from "../GGTestRunner.js";
|
|
4
|
+
export class GGSpyWith {
|
|
5
|
+
interceptorFactory;
|
|
6
|
+
interceptorConfig;
|
|
7
|
+
definedInSourceFile;
|
|
8
|
+
_expectInput = new GGExpectations();
|
|
9
|
+
_expectError;
|
|
10
|
+
_expectOutput = new GGExpectations();
|
|
11
|
+
activeExpect;
|
|
12
|
+
_sleep;
|
|
13
|
+
_times = 1;
|
|
14
|
+
constructor(interceptorFactory, config) {
|
|
15
|
+
this.interceptorFactory = interceptorFactory;
|
|
16
|
+
this.interceptorConfig = config;
|
|
17
|
+
this.definedInSourceFile = captureStackSourceFile();
|
|
18
|
+
this.activeExpect = this._expectInput;
|
|
19
|
+
}
|
|
20
|
+
createInterceptor() {
|
|
21
|
+
const test = GG_TEST_RUNNER.get();
|
|
22
|
+
const config = {
|
|
23
|
+
...this.interceptorConfig,
|
|
24
|
+
definedInSourceFile: this.definedInSourceFile,
|
|
25
|
+
sleep: this._sleep,
|
|
26
|
+
times: this._times,
|
|
27
|
+
passThrough: true,
|
|
28
|
+
inputExpectations: this._expectInput,
|
|
29
|
+
outputExpectations: this._expectOutput,
|
|
30
|
+
expectError: this._expectError
|
|
31
|
+
};
|
|
32
|
+
return new this.interceptorFactory(test, config);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Wait ms before returning data.
|
|
36
|
+
*/
|
|
37
|
+
sleep(timeMs) {
|
|
38
|
+
this._sleep = timeMs;
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Expect this mock to be called amount of times.
|
|
43
|
+
*/
|
|
44
|
+
times(amount) {
|
|
45
|
+
this._times = amount;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
get response() {
|
|
49
|
+
this.activeExpect = this._expectOutput;
|
|
50
|
+
this._expectOutput.flush();
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
toBeError(type) {
|
|
54
|
+
this._expectError = type;
|
|
55
|
+
this._expectOutput.flush();
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
toEqual(expectedData) {
|
|
59
|
+
this.activeExpect.toEqual(expectedData);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
toMatchObject(expectedData) {
|
|
63
|
+
this.activeExpect.toMatchObject(expectedData);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
responseToMatchObject(expectedData) {
|
|
67
|
+
this._expectOutput.toMatchObject(expectedData);
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
toBeUndefined() {
|
|
71
|
+
this.activeExpect.toBeUndefined();
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
toHaveLength(length) {
|
|
75
|
+
this.activeExpect.toHaveLength(length);
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
arrayToContain(...items) {
|
|
79
|
+
this.activeExpect.arrayToContain(...items);
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
arrayToContainEqual(...items) {
|
|
83
|
+
this.activeExpect.arrayToContainEqual(...items);
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
requiresWaitFor() {
|
|
87
|
+
return this.interceptorConfig.requiresWaitFor === true;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=GGSpyWith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGSpyWith.js","sourceRoot":"","sources":["../../../src/testers/GGSpyWith.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { IGGTestWith } from "./IGGTestWith";
|
|
2
|
+
import { IGGTestInterceptor } from "./IGGTestInterceptor";
|
|
3
|
+
import { GGContext } from "@grest-ts/context";
|
|
4
|
+
import { Raw } from "@grest-ts/schema";
|
|
5
|
+
import { DeepPartial } from "@grest-ts/common";
|
|
6
|
+
import { GGExpectations } from "../utils/GGExpectations";
|
|
7
|
+
interface WaitForInterceptor {
|
|
8
|
+
interceptor: IGGTestInterceptor;
|
|
9
|
+
timeout: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for a test action's logging behavior.
|
|
13
|
+
*/
|
|
14
|
+
export interface GGTestActionConfig {
|
|
15
|
+
/** If true, the action has no response to log (e.g., fire-and-forget WebSocket message) */
|
|
16
|
+
noResponse: boolean;
|
|
17
|
+
/** Data used for logging the action */
|
|
18
|
+
logData: {
|
|
19
|
+
/** Description shown in logs, e.g., "[POST /api/users]" or "[Config MyConfig.timeout]" */
|
|
20
|
+
message: string;
|
|
21
|
+
/** Optional context to display (e.g., auth, language) */
|
|
22
|
+
context?: any;
|
|
23
|
+
/** Optional request payload to log when executing */
|
|
24
|
+
request?: any;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Base class for test actions that can be awaited and chained with expectations.
|
|
29
|
+
*
|
|
30
|
+
* Test actions are PromiseLike objects that execute when awaited. They support
|
|
31
|
+
* attaching interceptors (mocks, log expectations, spies) that are validated
|
|
32
|
+
* during execution.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // Simple action - just await to execute
|
|
36
|
+
* const user = await client.getUser(123);
|
|
37
|
+
*
|
|
38
|
+
* // With sync expectation - mock must be called during the action
|
|
39
|
+
* await client.createUser({name: "Alice"})
|
|
40
|
+
* .with(mockEmailService.sendWelcome.toBeCalledOnce());
|
|
41
|
+
*
|
|
42
|
+
* // With async expectation - waits for event after action completes
|
|
43
|
+
* await client.triggerAsyncJob()
|
|
44
|
+
* .waitFor(t.logs.expect("Job completed"), 10000);
|
|
45
|
+
*
|
|
46
|
+
* @typeParam T - The type returned when the action completes
|
|
47
|
+
*/
|
|
48
|
+
export declare abstract class GGTestAction<T> implements Promise<T> {
|
|
49
|
+
readonly [Symbol.toStringTag]: string;
|
|
50
|
+
protected readonly ctx: GGContext;
|
|
51
|
+
private readonly config;
|
|
52
|
+
protected readonly interceptors: IGGTestInterceptor[];
|
|
53
|
+
protected readonly _waitForInterceptors: WaitForInterceptor[];
|
|
54
|
+
private readonly definedInSourceFile;
|
|
55
|
+
protected readonly responseExpectations: GGExpectations<any>;
|
|
56
|
+
constructor(ctx: GGContext, config: GGTestActionConfig);
|
|
57
|
+
toEqual(expectedData: Raw<T>): this;
|
|
58
|
+
toMatchObject(expectedData: DeepPartial<Raw<T>>): this;
|
|
59
|
+
toBeUndefined(): this;
|
|
60
|
+
toHaveLength(length: number): this;
|
|
61
|
+
arrayToContain<Item extends T extends Array<infer R> ? R : never>(...items: Partial<Raw<Item>>[]): this;
|
|
62
|
+
arrayToContainEqual<Item extends T extends Array<infer R> ? R : never>(...items: Partial<Raw<Item>>[]): this;
|
|
63
|
+
/**
|
|
64
|
+
* Attach expectations that must be satisfied during action execution.
|
|
65
|
+
*
|
|
66
|
+
* Interceptors are registered before the action runs and validated immediately after.
|
|
67
|
+
* If an expectation fails (e.g., mock not called), the test fails before checking
|
|
68
|
+
* the action's response - this surfaces the root cause of failures first.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* await client.createOrder({items: [...]})
|
|
72
|
+
* .with(mockInventory.reserve.toBeCalledOnce())
|
|
73
|
+
* .with(mockPayment.charge.toMatchObject({amount: 100}));
|
|
74
|
+
*/
|
|
75
|
+
with(...expectations: IGGTestWith[]): this;
|
|
76
|
+
/**
|
|
77
|
+
* Attach an expectation that may be satisfied after the action completes.
|
|
78
|
+
*
|
|
79
|
+
* Use this for async side effects - when the action triggers something that
|
|
80
|
+
* happens later (e.g., background job, delayed log, async notification).
|
|
81
|
+
* The test will poll until the expectation is satisfied or timeout is reached.
|
|
82
|
+
*
|
|
83
|
+
* @param expectation - The expectation to wait for
|
|
84
|
+
* @param timeout - Max time to wait in ms (default: 5000)
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* // Action returns immediately, but logs after 100ms
|
|
88
|
+
* await client.triggerBackgroundJob({id: 123})
|
|
89
|
+
* .waitFor(t.logs.expect("Job 123 completed"), 10000);
|
|
90
|
+
*/
|
|
91
|
+
waitFor(expectation: IGGTestWith, timeout?: number): this;
|
|
92
|
+
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
|
|
93
|
+
catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
|
|
94
|
+
finally(onfinally?: (() => void) | null): Promise<T>;
|
|
95
|
+
protected execute(): Promise<T>;
|
|
96
|
+
/**
|
|
97
|
+
* Execute the core action (e.g., make HTTP request, send WebSocket message).
|
|
98
|
+
* Subclasses implement this with their specific action logic.
|
|
99
|
+
*
|
|
100
|
+
* @returns The raw response data (before parsing/transformation)
|
|
101
|
+
*/
|
|
102
|
+
protected abstract executeAction(): Promise<tActionRawData>;
|
|
103
|
+
/**
|
|
104
|
+
* Process and validate the raw response from executeAction().
|
|
105
|
+
* Called AFTER mock validation, so mock errors surface first.
|
|
106
|
+
*
|
|
107
|
+
* Subclasses implement this to:
|
|
108
|
+
* - Parse the raw response into the expected type T
|
|
109
|
+
* - Check response expectations (e.g., toMatchObject, toEqual)
|
|
110
|
+
*
|
|
111
|
+
* @param result - Raw response from executeAction()
|
|
112
|
+
* @returns The parsed/validated result of type T
|
|
113
|
+
*/
|
|
114
|
+
protected processRawResponse(result: tActionRawData): Promise<T>;
|
|
115
|
+
private _waitForAllInterceptors;
|
|
116
|
+
private logMsg;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Branded type for raw action response data.
|
|
120
|
+
* Used to distinguish raw responses from parsed results in the type system.
|
|
121
|
+
*/
|
|
122
|
+
export type tActionRawData = any & {
|
|
123
|
+
tActionRawData: never;
|
|
124
|
+
};
|
|
125
|
+
export {};
|
|
126
|
+
//# sourceMappingURL=GGTestAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GGTestAction.d.ts","sourceRoot":"","sources":["../../../src/testers/GGTestAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AAIxD,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,GAAG,EAAC,MAAM,kBAAkB,CAAC;AACrC,OAAO,EAAC,WAAW,EAAC,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAC,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAEvD,UAAU,kBAAkB;IACxB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,UAAU,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE;QACL,0FAA0F;QAC1F,OAAO,EAAE,MAAM,CAAC;QAChB,yDAAyD;QACzD,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,qDAAqD;QACrD,OAAO,CAAC,EAAE,GAAG,CAAA;KAChB,CAAC;CACL;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,8BAAsB,YAAY,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IAEvD,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,CAAkB;IAEvD,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,kBAAkB,EAAE,CAAM;IAC3D,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,kBAAkB,EAAE,CAAM;IACnE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAE7C,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAuB;gBAEvE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB;IAmB/C,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI;IAKnC,aAAa,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAKtD,aAAa,IAAI,IAAI;IAKrB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlC,cAAc,CAAC,IAAI,SAAS,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI;IAKvG,mBAAmB,CAAC,IAAI,SAAS,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI;IAKnH;;;;;;;;;;;OAWG;IACI,IAAI,CAAC,GAAG,YAAY,EAAE,WAAW,EAAE,GAAG,IAAI;IAqBjD;;;;;;;;;;;;;;OAcG;IACI,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,GAAE,MAAa,GAAG,IAAI;IAU/D,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,EACtC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EACrE,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GACxE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAIxB,KAAK,CAAC,OAAO,GAAG,KAAK,EACxB,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GACtE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;IAIhB,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;cAI3C,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;IA+DrC;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC;IAE3D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;YAIlD,uBAAuB;IAmCrC,OAAO,CAAC,MAAM;CAejB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG;IAAE,cAAc,EAAE,KAAK,CAAA;CAAE,CAAA"}
|