@grest-ts/testkit 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/dist/src/GGBundleTest.d.ts +8 -0
  4. package/dist/src/GGBundleTest.d.ts.map +1 -0
  5. package/dist/src/GGBundleTest.js +75 -0
  6. package/dist/src/GGBundleTest.js.map +1 -0
  7. package/dist/src/GGTest.d.ts +131 -0
  8. package/dist/src/GGTest.d.ts.map +1 -0
  9. package/dist/src/GGTest.js +245 -0
  10. package/dist/src/GGTest.js.map +1 -0
  11. package/dist/src/GGTestContext.d.ts +36 -0
  12. package/dist/src/GGTestContext.d.ts.map +1 -0
  13. package/dist/src/GGTestContext.js +63 -0
  14. package/dist/src/GGTestContext.js.map +1 -0
  15. package/dist/src/GGTestRunner.d.ts +108 -0
  16. package/dist/src/GGTestRunner.d.ts.map +1 -0
  17. package/dist/src/GGTestRunner.js +242 -0
  18. package/dist/src/GGTestRunner.js.map +1 -0
  19. package/dist/src/GGTestRuntime.d.ts +103 -0
  20. package/dist/src/GGTestRuntime.d.ts.map +1 -0
  21. package/dist/src/GGTestRuntime.js +219 -0
  22. package/dist/src/GGTestRuntime.js.map +1 -0
  23. package/dist/src/GGTestRuntimeWorker.d.ts +41 -0
  24. package/dist/src/GGTestRuntimeWorker.d.ts.map +1 -0
  25. package/dist/src/GGTestRuntimeWorker.js +136 -0
  26. package/dist/src/GGTestRuntimeWorker.js.map +1 -0
  27. package/dist/src/GGTestSharedRef.d.ts +35 -0
  28. package/dist/src/GGTestSharedRef.d.ts.map +1 -0
  29. package/dist/src/GGTestSharedRef.js +126 -0
  30. package/dist/src/GGTestSharedRef.js.map +1 -0
  31. package/dist/src/GGTestkitExtensionsDiscovery.d.ts +21 -0
  32. package/dist/src/GGTestkitExtensionsDiscovery.d.ts.map +1 -0
  33. package/dist/src/GGTestkitExtensionsDiscovery.js +24 -0
  34. package/dist/src/GGTestkitExtensionsDiscovery.js.map +1 -0
  35. package/dist/src/IGGLocalDiscoveryServer.d.ts +16 -0
  36. package/dist/src/IGGLocalDiscoveryServer.d.ts.map +1 -0
  37. package/dist/src/IGGLocalDiscoveryServer.js +2 -0
  38. package/dist/src/IGGLocalDiscoveryServer.js.map +1 -0
  39. package/dist/src/callOn/GGCallOnSelector.d.ts +42 -0
  40. package/dist/src/callOn/GGCallOnSelector.d.ts.map +1 -0
  41. package/dist/src/callOn/GGCallOnSelector.js +35 -0
  42. package/dist/src/callOn/GGCallOnSelector.js.map +1 -0
  43. package/dist/src/callOn/GGContractClass.implement.d.ts +8 -0
  44. package/dist/src/callOn/GGContractClass.implement.d.ts.map +1 -0
  45. package/dist/src/callOn/GGContractClass.implement.js +31 -0
  46. package/dist/src/callOn/GGContractClass.implement.js.map +1 -0
  47. package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts +28 -0
  48. package/dist/src/callOn/GGTestActionForLocatorOnCall.d.ts.map +1 -0
  49. package/dist/src/callOn/GGTestActionForLocatorOnCall.js +118 -0
  50. package/dist/src/callOn/GGTestActionForLocatorOnCall.js.map +1 -0
  51. package/dist/src/callOn/TestableIPC.d.ts +72 -0
  52. package/dist/src/callOn/TestableIPC.d.ts.map +1 -0
  53. package/dist/src/callOn/TestableIPC.js +34 -0
  54. package/dist/src/callOn/TestableIPC.js.map +1 -0
  55. package/dist/src/callOn/callOn.d.ts +113 -0
  56. package/dist/src/callOn/callOn.d.ts.map +1 -0
  57. package/dist/src/callOn/callOn.js +122 -0
  58. package/dist/src/callOn/callOn.js.map +1 -0
  59. package/dist/src/callOn/registerOnCallHandler.d.ts +13 -0
  60. package/dist/src/callOn/registerOnCallHandler.d.ts.map +1 -0
  61. package/dist/src/callOn/registerOnCallHandler.js +111 -0
  62. package/dist/src/callOn/registerOnCallHandler.js.map +1 -0
  63. package/dist/src/index-node.d.ts +35 -0
  64. package/dist/src/index-node.d.ts.map +1 -0
  65. package/dist/src/index-node.js +50 -0
  66. package/dist/src/index-node.js.map +1 -0
  67. package/dist/src/mockable/GGMockable.d.ts +19 -0
  68. package/dist/src/mockable/GGMockable.d.ts.map +1 -0
  69. package/dist/src/mockable/GGMockable.js +2 -0
  70. package/dist/src/mockable/GGMockable.js.map +1 -0
  71. package/dist/src/mockable/GGMockableCall.d.ts +2 -0
  72. package/dist/src/mockable/GGMockableCall.d.ts.map +1 -0
  73. package/dist/src/mockable/GGMockableCall.js +41 -0
  74. package/dist/src/mockable/GGMockableCall.js.map +1 -0
  75. package/dist/src/mockable/GGMockableIPC.d.ts +17 -0
  76. package/dist/src/mockable/GGMockableIPC.d.ts.map +1 -0
  77. package/dist/src/mockable/GGMockableIPC.js +8 -0
  78. package/dist/src/mockable/GGMockableIPC.js.map +1 -0
  79. package/dist/src/mockable/GGMockableInterceptor.d.ts +24 -0
  80. package/dist/src/mockable/GGMockableInterceptor.d.ts.map +1 -0
  81. package/dist/src/mockable/GGMockableInterceptor.js +32 -0
  82. package/dist/src/mockable/GGMockableInterceptor.js.map +1 -0
  83. package/dist/src/mockable/GGMockableInterceptorsServer.d.ts +12 -0
  84. package/dist/src/mockable/GGMockableInterceptorsServer.d.ts.map +1 -0
  85. package/dist/src/mockable/GGMockableInterceptorsServer.js +55 -0
  86. package/dist/src/mockable/GGMockableInterceptorsServer.js.map +1 -0
  87. package/dist/src/mockable/mockable.d.ts +46 -0
  88. package/dist/src/mockable/mockable.d.ts.map +1 -0
  89. package/dist/src/mockable/mockable.js +47 -0
  90. package/dist/src/mockable/mockable.js.map +1 -0
  91. package/dist/src/runner/InlineRunner.d.ts +12 -0
  92. package/dist/src/runner/InlineRunner.d.ts.map +1 -0
  93. package/dist/src/runner/InlineRunner.js +42 -0
  94. package/dist/src/runner/InlineRunner.js.map +1 -0
  95. package/dist/src/runner/IsolatedRunner.d.ts +17 -0
  96. package/dist/src/runner/IsolatedRunner.d.ts.map +1 -0
  97. package/dist/src/runner/IsolatedRunner.js +155 -0
  98. package/dist/src/runner/IsolatedRunner.js.map +1 -0
  99. package/dist/src/runner/RuntimeRunner.d.ts +14 -0
  100. package/dist/src/runner/RuntimeRunner.d.ts.map +1 -0
  101. package/dist/src/runner/RuntimeRunner.js +2 -0
  102. package/dist/src/runner/RuntimeRunner.js.map +1 -0
  103. package/dist/src/runner/WorkerRunner.d.ts +17 -0
  104. package/dist/src/runner/WorkerRunner.d.ts.map +1 -0
  105. package/dist/src/runner/WorkerRunner.js +155 -0
  106. package/dist/src/runner/WorkerRunner.js.map +1 -0
  107. package/dist/src/runner/isolated-loader.mjs +91 -0
  108. package/dist/src/runner/worker-loader.mjs +49 -0
  109. package/dist/src/testers/GGCallInterceptor.d.ts +71 -0
  110. package/dist/src/testers/GGCallInterceptor.d.ts.map +1 -0
  111. package/dist/src/testers/GGCallInterceptor.js +170 -0
  112. package/dist/src/testers/GGCallInterceptor.js.map +1 -0
  113. package/dist/src/testers/GGMockWith.d.ts +30 -0
  114. package/dist/src/testers/GGMockWith.d.ts.map +1 -0
  115. package/dist/src/testers/GGMockWith.js +70 -0
  116. package/dist/src/testers/GGMockWith.js.map +1 -0
  117. package/dist/src/testers/GGSpyWith.d.ts +40 -0
  118. package/dist/src/testers/GGSpyWith.d.ts.map +1 -0
  119. package/dist/src/testers/GGSpyWith.js +90 -0
  120. package/dist/src/testers/GGSpyWith.js.map +1 -0
  121. package/dist/src/testers/GGTestAction.d.ts +126 -0
  122. package/dist/src/testers/GGTestAction.d.ts.map +1 -0
  123. package/dist/src/testers/GGTestAction.js +245 -0
  124. package/dist/src/testers/GGTestAction.js.map +1 -0
  125. package/dist/src/testers/GGTestComponent.d.ts +15 -0
  126. package/dist/src/testers/GGTestComponent.d.ts.map +1 -0
  127. package/dist/src/testers/GGTestComponent.js +2 -0
  128. package/dist/src/testers/GGTestComponent.js.map +1 -0
  129. package/dist/src/testers/GGTestSelector.d.ts +54 -0
  130. package/dist/src/testers/GGTestSelector.d.ts.map +1 -0
  131. package/dist/src/testers/GGTestSelector.js +179 -0
  132. package/dist/src/testers/GGTestSelector.js.map +1 -0
  133. package/dist/src/testers/IGGTestInterceptor.d.ts +8 -0
  134. package/dist/src/testers/IGGTestInterceptor.d.ts.map +1 -0
  135. package/dist/src/testers/IGGTestInterceptor.js +2 -0
  136. package/dist/src/testers/IGGTestInterceptor.js.map +1 -0
  137. package/dist/src/testers/IGGTestWith.d.ts +13 -0
  138. package/dist/src/testers/IGGTestWith.d.ts.map +1 -0
  139. package/dist/src/testers/IGGTestWith.js +2 -0
  140. package/dist/src/testers/IGGTestWith.js.map +1 -0
  141. package/dist/src/testers/RuntimeSelector.d.ts +117 -0
  142. package/dist/src/testers/RuntimeSelector.d.ts.map +1 -0
  143. package/dist/src/testers/RuntimeSelector.js +2 -0
  144. package/dist/src/testers/RuntimeSelector.js.map +1 -0
  145. package/dist/src/tsconfig.json +17 -0
  146. package/dist/src/utils/GGExpectations.d.ts +18 -0
  147. package/dist/src/utils/GGExpectations.d.ts.map +1 -0
  148. package/dist/src/utils/GGExpectations.js +59 -0
  149. package/dist/src/utils/GGExpectations.js.map +1 -0
  150. package/dist/src/utils/GGTestError.d.ts +13 -0
  151. package/dist/src/utils/GGTestError.d.ts.map +1 -0
  152. package/dist/src/utils/GGTestError.js +26 -0
  153. package/dist/src/utils/GGTestError.js.map +1 -0
  154. package/dist/src/utils/captureStack.d.ts +9 -0
  155. package/dist/src/utils/captureStack.d.ts.map +1 -0
  156. package/dist/src/utils/captureStack.js +51 -0
  157. package/dist/src/utils/captureStack.js.map +1 -0
  158. package/dist/tsconfig.publish.tsbuildinfo +1 -0
  159. package/package.json +66 -0
  160. package/src/GGBundleTest.ts +89 -0
  161. package/src/GGTest.ts +318 -0
  162. package/src/GGTestContext.ts +74 -0
  163. package/src/GGTestRunner.ts +308 -0
  164. package/src/GGTestRuntime.ts +265 -0
  165. package/src/GGTestRuntimeWorker.ts +159 -0
  166. package/src/GGTestSharedRef.ts +116 -0
  167. package/src/GGTestkitExtensionsDiscovery.ts +26 -0
  168. package/src/IGGLocalDiscoveryServer.ts +16 -0
  169. package/src/callOn/GGCallOnSelector.ts +61 -0
  170. package/src/callOn/GGContractClass.implement.ts +43 -0
  171. package/src/callOn/GGTestActionForLocatorOnCall.ts +134 -0
  172. package/src/callOn/TestableIPC.ts +81 -0
  173. package/src/callOn/callOn.ts +224 -0
  174. package/src/callOn/registerOnCallHandler.ts +123 -0
  175. package/src/index-node.ts +64 -0
  176. package/src/mockable/GGMockable.ts +22 -0
  177. package/src/mockable/GGMockableCall.ts +45 -0
  178. package/src/mockable/GGMockableIPC.ts +20 -0
  179. package/src/mockable/GGMockableInterceptor.ts +44 -0
  180. package/src/mockable/GGMockableInterceptorsServer.ts +69 -0
  181. package/src/mockable/mockable.ts +71 -0
  182. package/src/runner/InlineRunner.ts +47 -0
  183. package/src/runner/IsolatedRunner.ts +179 -0
  184. package/src/runner/RuntimeRunner.ts +15 -0
  185. package/src/runner/WorkerRunner.ts +179 -0
  186. package/src/runner/isolated-loader.mjs +91 -0
  187. package/src/runner/worker-loader.mjs +49 -0
  188. package/src/testers/GGCallInterceptor.ts +224 -0
  189. package/src/testers/GGMockWith.ts +92 -0
  190. package/src/testers/GGSpyWith.ts +115 -0
  191. package/src/testers/GGTestAction.ts +333 -0
  192. package/src/testers/GGTestComponent.ts +16 -0
  193. package/src/testers/GGTestSelector.ts +223 -0
  194. package/src/testers/IGGTestInterceptor.ts +11 -0
  195. package/src/testers/IGGTestWith.ts +15 -0
  196. package/src/testers/RuntimeSelector.ts +151 -0
  197. package/src/tsconfig.json +17 -0
  198. package/src/utils/GGExpectations.ts +78 -0
  199. package/src/utils/GGTestError.ts +37 -0
  200. package/src/utils/captureStack.ts +54 -0
@@ -0,0 +1,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":"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"}