callman-core 1.0.6 → 1.2.0

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 (199) hide show
  1. package/dist/index.d.ts +6 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/script/errors.d.ts +3 -0
  6. package/dist/script/errors.d.ts.map +1 -0
  7. package/dist/script/errors.js +68 -0
  8. package/dist/script/errors.js.map +1 -0
  9. package/dist/script/executor.d.ts +5 -0
  10. package/dist/script/executor.d.ts.map +1 -0
  11. package/dist/script/executor.js +301 -0
  12. package/dist/script/executor.js.map +1 -0
  13. package/dist/script/features/assertions.d.ts +46 -0
  14. package/dist/script/features/assertions.d.ts.map +1 -0
  15. package/dist/script/features/assertions.js +264 -0
  16. package/dist/script/features/assertions.js.map +1 -0
  17. package/dist/script/features/counter.d.ts +11 -0
  18. package/dist/script/features/counter.d.ts.map +1 -0
  19. package/dist/script/features/counter.js +43 -0
  20. package/dist/script/features/counter.js.map +1 -0
  21. package/dist/script/features/cryptojs.d.ts +13 -0
  22. package/dist/script/features/cryptojs.d.ts.map +1 -0
  23. package/dist/script/features/cryptojs.js +63 -0
  24. package/dist/script/features/cryptojs.js.map +1 -0
  25. package/dist/script/features/db.d.ts +36 -0
  26. package/dist/script/features/db.d.ts.map +1 -0
  27. package/dist/script/features/db.js +165 -0
  28. package/dist/script/features/db.js.map +1 -0
  29. package/dist/script/features/environment.d.ts +11 -0
  30. package/dist/script/features/environment.d.ts.map +1 -0
  31. package/dist/script/features/environment.js +61 -0
  32. package/dist/script/features/environment.js.map +1 -0
  33. package/dist/script/features/feature-policy.d.ts +8 -0
  34. package/dist/script/features/feature-policy.d.ts.map +1 -0
  35. package/dist/script/features/feature-policy.js +88 -0
  36. package/dist/script/features/feature-policy.js.map +1 -0
  37. package/dist/script/features/kafka.d.ts +11 -0
  38. package/dist/script/features/kafka.d.ts.map +1 -0
  39. package/dist/script/features/kafka.js +71 -0
  40. package/dist/script/features/kafka.js.map +1 -0
  41. package/dist/script/features/log.d.ts +15 -0
  42. package/dist/script/features/log.d.ts.map +1 -0
  43. package/dist/script/features/log.js +59 -0
  44. package/dist/script/features/log.js.map +1 -0
  45. package/dist/script/features/node.d.ts +14 -0
  46. package/dist/script/features/node.d.ts.map +1 -0
  47. package/dist/script/features/node.js +82 -0
  48. package/dist/script/features/node.js.map +1 -0
  49. package/dist/script/features/random.d.ts +13 -0
  50. package/dist/script/features/random.d.ts.map +1 -0
  51. package/dist/script/features/random.js +111 -0
  52. package/dist/script/features/random.js.map +1 -0
  53. package/dist/script/features/redis.d.ts +10 -0
  54. package/dist/script/features/redis.d.ts.map +1 -0
  55. package/dist/script/features/redis.js +22 -0
  56. package/dist/script/features/redis.js.map +1 -0
  57. package/dist/script/features/request.d.ts +23 -0
  58. package/dist/script/features/request.d.ts.map +1 -0
  59. package/dist/script/features/request.js +105 -0
  60. package/dist/script/features/request.js.map +1 -0
  61. package/dist/script/features/response.d.ts +25 -0
  62. package/dist/script/features/response.d.ts.map +1 -0
  63. package/dist/script/features/response.js +43 -0
  64. package/dist/script/features/response.js.map +1 -0
  65. package/dist/script/features/tests.d.ts +15 -0
  66. package/dist/script/features/tests.d.ts.map +1 -0
  67. package/dist/script/features/tests.js +147 -0
  68. package/dist/script/features/tests.js.map +1 -0
  69. package/dist/script/features/variables.d.ts +6 -0
  70. package/dist/script/features/variables.d.ts.map +1 -0
  71. package/dist/script/features/variables.js +25 -0
  72. package/dist/script/features/variables.js.map +1 -0
  73. package/dist/script/legacy.d.ts +4 -0
  74. package/dist/script/legacy.d.ts.map +1 -0
  75. package/dist/script/legacy.js +128 -0
  76. package/dist/script/legacy.js.map +1 -0
  77. package/dist/script/sandbox.d.ts +16 -0
  78. package/dist/script/sandbox.d.ts.map +1 -0
  79. package/dist/script/sandbox.js +51 -0
  80. package/dist/script/sandbox.js.map +1 -0
  81. package/dist/script/scope.d.ts +23 -0
  82. package/dist/script/scope.d.ts.map +1 -0
  83. package/dist/script/scope.js +172 -0
  84. package/dist/script/scope.js.map +1 -0
  85. package/dist/script/scriptEngine.d.ts +2 -2
  86. package/dist/script/scriptEngine.d.ts.map +1 -1
  87. package/dist/script/scriptEngine.js +7 -105
  88. package/dist/script/scriptEngine.js.map +1 -1
  89. package/dist/script/timeout.d.ts +3 -0
  90. package/dist/script/timeout.d.ts.map +1 -0
  91. package/dist/script/timeout.js +38 -0
  92. package/dist/script/timeout.js.map +1 -0
  93. package/dist/script/types.d.ts +167 -0
  94. package/dist/script/types.d.ts.map +1 -0
  95. package/dist/script/types.js +7 -0
  96. package/dist/script/types.js.map +1 -0
  97. package/dist-cjs/contract/contractValidator.js +236 -0
  98. package/dist-cjs/contract/contractValidator.js.map +1 -0
  99. package/dist-cjs/index.js +47 -0
  100. package/dist-cjs/index.js.map +1 -0
  101. package/dist-cjs/package.json +1 -0
  102. package/dist-cjs/request/executeRequest.js +33 -0
  103. package/dist-cjs/request/executeRequest.js.map +1 -0
  104. package/dist-cjs/runner/requestRunner.js +102 -0
  105. package/dist-cjs/runner/requestRunner.js.map +1 -0
  106. package/dist-cjs/runner/runCollection.js +53 -0
  107. package/dist-cjs/runner/runCollection.js.map +1 -0
  108. package/dist-cjs/scenario-runner/condition.js +1735 -0
  109. package/dist-cjs/scenario-runner/condition.js.map +1 -0
  110. package/dist-cjs/scenario-runner/conditionTypes.js +3 -0
  111. package/dist-cjs/scenario-runner/conditionTypes.js.map +1 -0
  112. package/dist-cjs/scenario-runner/executionPolicyRunner.js +53 -0
  113. package/dist-cjs/scenario-runner/executionPolicyRunner.js.map +1 -0
  114. package/dist-cjs/scenario-runner/graphTraversal.js +27 -0
  115. package/dist-cjs/scenario-runner/graphTraversal.js.map +1 -0
  116. package/dist-cjs/scenario-runner/index.js +39 -0
  117. package/dist-cjs/scenario-runner/index.js.map +1 -0
  118. package/dist-cjs/scenario-runner/nodePolicy.js +127 -0
  119. package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -0
  120. package/dist-cjs/scenario-runner/notification/index.js +18 -0
  121. package/dist-cjs/scenario-runner/notification/index.js.map +1 -0
  122. package/dist-cjs/scenario-runner/notification/providers/provider.interface.js +3 -0
  123. package/dist-cjs/scenario-runner/notification/providers/provider.interface.js.map +1 -0
  124. package/dist-cjs/scenario-runner/notification/providers/slack.provider.js +88 -0
  125. package/dist-cjs/scenario-runner/notification/providers/slack.provider.js.map +1 -0
  126. package/dist-cjs/scenario-runner/notification/template.js +13 -0
  127. package/dist-cjs/scenario-runner/notification/template.js.map +1 -0
  128. package/dist-cjs/scenario-runner/retryExecutor.js +57 -0
  129. package/dist-cjs/scenario-runner/retryExecutor.js.map +1 -0
  130. package/dist-cjs/scenario-runner/runScenario.js +1545 -0
  131. package/dist-cjs/scenario-runner/runScenario.js.map +1 -0
  132. package/dist-cjs/scenario-runner/templateResolver.js +468 -0
  133. package/dist-cjs/scenario-runner/templateResolver.js.map +1 -0
  134. package/dist-cjs/scenario-runner/types.js +3 -0
  135. package/dist-cjs/scenario-runner/types.js.map +1 -0
  136. package/dist-cjs/scenario-runner/waitNodeExecutor.js +71 -0
  137. package/dist-cjs/scenario-runner/waitNodeExecutor.js.map +1 -0
  138. package/dist-cjs/script/errors.js +72 -0
  139. package/dist-cjs/script/errors.js.map +1 -0
  140. package/dist-cjs/script/executor.js +306 -0
  141. package/dist-cjs/script/executor.js.map +1 -0
  142. package/dist-cjs/script/features/assertions.js +269 -0
  143. package/dist-cjs/script/features/assertions.js.map +1 -0
  144. package/dist-cjs/script/features/counter.js +47 -0
  145. package/dist-cjs/script/features/counter.js.map +1 -0
  146. package/dist-cjs/script/features/cryptojs.js +67 -0
  147. package/dist-cjs/script/features/cryptojs.js.map +1 -0
  148. package/dist-cjs/script/features/db.js +169 -0
  149. package/dist-cjs/script/features/db.js.map +1 -0
  150. package/dist-cjs/script/features/environment.js +65 -0
  151. package/dist-cjs/script/features/environment.js.map +1 -0
  152. package/dist-cjs/script/features/feature-policy.js +94 -0
  153. package/dist-cjs/script/features/feature-policy.js.map +1 -0
  154. package/dist-cjs/script/features/kafka.js +77 -0
  155. package/dist-cjs/script/features/kafka.js.map +1 -0
  156. package/dist-cjs/script/features/log.js +64 -0
  157. package/dist-cjs/script/features/log.js.map +1 -0
  158. package/dist-cjs/script/features/node.js +89 -0
  159. package/dist-cjs/script/features/node.js.map +1 -0
  160. package/dist-cjs/script/features/random.js +115 -0
  161. package/dist-cjs/script/features/random.js.map +1 -0
  162. package/dist-cjs/script/features/redis.js +26 -0
  163. package/dist-cjs/script/features/redis.js.map +1 -0
  164. package/dist-cjs/script/features/request.js +109 -0
  165. package/dist-cjs/script/features/request.js.map +1 -0
  166. package/dist-cjs/script/features/response.js +47 -0
  167. package/dist-cjs/script/features/response.js.map +1 -0
  168. package/dist-cjs/script/features/tests.js +151 -0
  169. package/dist-cjs/script/features/tests.js.map +1 -0
  170. package/dist-cjs/script/features/variables.js +29 -0
  171. package/dist-cjs/script/features/variables.js.map +1 -0
  172. package/dist-cjs/script/legacy.js +132 -0
  173. package/dist-cjs/script/legacy.js.map +1 -0
  174. package/dist-cjs/script/pmApi.js +353 -0
  175. package/dist-cjs/script/pmApi.js.map +1 -0
  176. package/dist-cjs/script/sandbox.js +91 -0
  177. package/dist-cjs/script/sandbox.js.map +1 -0
  178. package/dist-cjs/script/scope.js +177 -0
  179. package/dist-cjs/script/scope.js.map +1 -0
  180. package/dist-cjs/script/scriptEngine.js +12 -0
  181. package/dist-cjs/script/scriptEngine.js.map +1 -0
  182. package/dist-cjs/script/timeout.js +43 -0
  183. package/dist-cjs/script/timeout.js.map +1 -0
  184. package/dist-cjs/script/types.js +8 -0
  185. package/dist-cjs/script/types.js.map +1 -0
  186. package/dist-cjs/types/index.js +3 -0
  187. package/dist-cjs/types/index.js.map +1 -0
  188. package/dist-cjs/utils/get.js +52 -0
  189. package/dist-cjs/utils/get.js.map +1 -0
  190. package/dist-cjs/utils/random.js +87 -0
  191. package/dist-cjs/utils/random.js.map +1 -0
  192. package/dist-cjs/variables/envStore.js +24 -0
  193. package/dist-cjs/variables/envStore.js.map +1 -0
  194. package/dist-cjs/variables/resolver.js +95 -0
  195. package/dist-cjs/variables/resolver.js.map +1 -0
  196. package/package.json +19 -3
  197. package/samples/runSample.mjs +0 -128
  198. package/tests/waitNode.test.mjs +0 -311
  199. package/tsconfig.json +0 -18
@@ -1,311 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test from "node:test";
3
-
4
- import { runScenario } from "../dist/index.js";
5
-
6
- const STRICT_POLICY = {
7
- onFailure: "stop",
8
- retry: {
9
- enabled: false,
10
- maxAttempts: 0,
11
- delayMs: 0,
12
- },
13
- };
14
-
15
- const createWaitNode = (id, durationMs, label = "Wait") => ({
16
- id,
17
- type: "wait",
18
- position: { x: 0, y: 0 },
19
- data: {
20
- label,
21
- config: {
22
- durationMs,
23
- executionPolicy: STRICT_POLICY,
24
- },
25
- },
26
- });
27
-
28
- const createScriptNode = (id, label = "Script") => ({
29
- id,
30
- type: "script",
31
- position: { x: 240, y: 0 },
32
- data: {
33
- label,
34
- config: {
35
- script: "return { ok: true };",
36
- timeoutMs: 3000,
37
- executionPolicy: STRICT_POLICY,
38
- },
39
- },
40
- });
41
-
42
- const createEndNode = (id, label = "End") => ({
43
- id,
44
- type: "end",
45
- position: { x: 480, y: 0 },
46
- data: {
47
- label,
48
- config: {
49
- loop: false,
50
- loopTargetNodeId: null,
51
- loopIterations: 1,
52
- loopDelayMs: 0,
53
- executionPolicy: STRICT_POLICY,
54
- },
55
- },
56
- });
57
-
58
- const createConditionNode = (id, label = "Condition") => ({
59
- id,
60
- type: "condition",
61
- position: { x: 0, y: 0 },
62
- data: {
63
- label,
64
- config: {
65
- mode: "builder",
66
- expertExpression: 'env.runWait == "yes"',
67
- rootGroup: {
68
- id: `${id}-group`,
69
- type: "group",
70
- operator: "AND",
71
- children: [
72
- {
73
- id: `${id}-rule`,
74
- type: "rule",
75
- left: {
76
- mode: "runtime",
77
- valueType: "string",
78
- value: "env.runWait",
79
- },
80
- operator: "equals",
81
- right: {
82
- mode: "literal",
83
- valueType: "string",
84
- value: "yes",
85
- },
86
- },
87
- ],
88
- },
89
- },
90
- },
91
- });
92
-
93
- const createRuntimeAdapters = ({ onScript } = {}) => ({
94
- requestExecutor: async () => {
95
- throw new Error("Request executor should not be called in wait node tests.");
96
- },
97
- dbExecutor: async () => ({
98
- rawResult: {
99
- success: true,
100
- rows: [],
101
- rowCount: 0,
102
- },
103
- dbResult: null,
104
- outputData: null,
105
- }),
106
- redisExecutor: async () => ({
107
- commandResults: [],
108
- redisResult: null,
109
- outputData: null,
110
- }),
111
- scriptExecutor: async ({ node }) => {
112
- onScript?.(node);
113
-
114
- return {
115
- variableMutations: [],
116
- testResults: [],
117
- logs: [],
118
- error: null,
119
- hasReturnValue: true,
120
- returnValue: { ok: true },
121
- outputData: { ok: true },
122
- scriptSource: node.data.config.script,
123
- timeoutMs: node.data.config.timeoutMs ?? 3000,
124
- };
125
- },
126
- kafkaExecutor: async () => ({
127
- captureResult: {
128
- topic: "test",
129
- durationMs: 0,
130
- timeoutMs: 0,
131
- messages: [],
132
- timedOut: false,
133
- errorMessage: null,
134
- },
135
- }),
136
- });
137
-
138
- const findNodeExecution = (report, stepId) => {
139
- const execution = report.nodeExecutions.find((entry) => entry.stepId === stepId);
140
- assert.ok(execution, `Expected node execution record for ${stepId}.`);
141
- return execution;
142
- };
143
-
144
- test("wait node delays execution and reports timing summary", async () => {
145
- const durationMs = 50;
146
- const scriptStartsAt = [];
147
- const scenario = {
148
- id: "scenario-wait-success",
149
- name: "Wait Success",
150
- nodes: [
151
- createWaitNode("wait-1", durationMs, "Pause"),
152
- createScriptNode("script-1", "AfterWait"),
153
- ],
154
- edges: [
155
- {
156
- id: "edge-wait-script",
157
- source: "wait-1",
158
- target: "script-1",
159
- type: "default",
160
- },
161
- ],
162
- };
163
-
164
- const startedAtMs = Date.now();
165
- const report = await runScenario({
166
- scenario,
167
- runtimeAdapters: createRuntimeAdapters({
168
- onScript: () => {
169
- scriptStartsAt.push(Date.now());
170
- },
171
- }),
172
- });
173
-
174
- assert.equal(report.scenarioStatus, "success");
175
- assert.equal(scriptStartsAt.length, 1);
176
-
177
- const waitExecution = findNodeExecution(report, "wait-1");
178
- assert.equal(waitExecution.status, "success");
179
- assert.equal(waitExecution.outputData?.type, "wait");
180
- assert.equal(waitExecution.outputData?.configuredDurationMs, durationMs);
181
- assert.equal(waitExecution.outputData?.status, "success");
182
- assert.ok(waitExecution.outputData.actualDurationMs >= durationMs - 10);
183
- assert.ok(scriptStartsAt[0] - startedAtMs >= durationMs - 10);
184
- assert.ok(
185
- report.events.some(
186
- (event) => event.type === "step:start" && event.stepId === "wait-1",
187
- ),
188
- );
189
- assert.ok(
190
- report.events.some(
191
- (event) => event.type === "step:success" && event.stepId === "wait-1",
192
- ),
193
- );
194
- });
195
-
196
- test("wait node rejects zero duration", async () => {
197
- const scenario = {
198
- id: "scenario-wait-invalid",
199
- name: "Wait Invalid",
200
- nodes: [createWaitNode("wait-1", 0, "InvalidWait")],
201
- edges: [],
202
- };
203
-
204
- const report = await runScenario({
205
- scenario,
206
- runtimeAdapters: createRuntimeAdapters(),
207
- });
208
-
209
- const waitExecution = findNodeExecution(report, "wait-1");
210
-
211
- assert.equal(report.scenarioStatus, "failed");
212
- assert.equal(waitExecution.status, "failed");
213
- assert.match(waitExecution.errorMessage ?? "", /Wait node duration must be a finite number/);
214
- assert.equal(waitExecution.outputData?.type, "wait");
215
- assert.equal(waitExecution.outputData?.status, "failed");
216
- assert.equal(waitExecution.outputData?.actualDurationMs, 0);
217
- });
218
-
219
- test("wait node executes correctly inside a condition branch", async () => {
220
- const scriptStartsAt = [];
221
- const scenario = {
222
- id: "scenario-wait-branch",
223
- name: "Wait Branch",
224
- nodes: [
225
- createConditionNode("condition-1", "CheckFlag"),
226
- createWaitNode("wait-1", 25, "BranchWait"),
227
- createScriptNode("script-1", "BranchScript"),
228
- createEndNode("end-1", "BranchEnd"),
229
- ],
230
- edges: [
231
- {
232
- id: "edge-condition-yes",
233
- source: "condition-1",
234
- target: "wait-1",
235
- type: "yes",
236
- },
237
- {
238
- id: "edge-wait-script",
239
- source: "wait-1",
240
- target: "script-1",
241
- type: "default",
242
- },
243
- {
244
- id: "edge-condition-no",
245
- source: "condition-1",
246
- target: "end-1",
247
- type: "no",
248
- },
249
- ],
250
- };
251
-
252
- const report = await runScenario({
253
- scenario,
254
- environment: {
255
- runWait: "yes",
256
- },
257
- runtimeAdapters: createRuntimeAdapters({
258
- onScript: () => {
259
- scriptStartsAt.push(Date.now());
260
- },
261
- }),
262
- });
263
-
264
- assert.equal(report.scenarioStatus, "success");
265
- assert.equal(scriptStartsAt.length, 1);
266
- assert.equal(findNodeExecution(report, "condition-1").status, "success");
267
- assert.equal(findNodeExecution(report, "wait-1").status, "success");
268
- assert.equal(findNodeExecution(report, "script-1").status, "success");
269
- assert.equal(findNodeExecution(report, "end-1").status, "skipped");
270
- });
271
-
272
- test("wait node captures cancellation and stops the scenario", async () => {
273
- const controller = new AbortController();
274
- const abortTimer = setTimeout(() => controller.abort(), 30);
275
- const scenario = {
276
- id: "scenario-wait-cancelled",
277
- name: "Wait Cancelled",
278
- nodes: [
279
- createWaitNode("wait-1", 200, "CancelableWait"),
280
- createScriptNode("script-1", "ShouldNotRun"),
281
- ],
282
- edges: [
283
- {
284
- id: "edge-wait-script",
285
- source: "wait-1",
286
- target: "script-1",
287
- type: "default",
288
- },
289
- ],
290
- };
291
-
292
- try {
293
- const report = await runScenario({
294
- scenario,
295
- runtimeAdapters: createRuntimeAdapters(),
296
- signal: controller.signal,
297
- });
298
-
299
- const waitExecution = findNodeExecution(report, "wait-1");
300
- const scriptExecution = findNodeExecution(report, "script-1");
301
-
302
- assert.equal(report.scenarioStatus, "stopped");
303
- assert.equal(waitExecution.status, "skipped");
304
- assert.equal(waitExecution.outputData?.type, "wait");
305
- assert.equal(waitExecution.outputData?.status, "cancelled");
306
- assert.ok(waitExecution.outputData.actualDurationMs < 200);
307
- assert.equal(scriptExecution.status, "skipped");
308
- } finally {
309
- clearTimeout(abortTimer);
310
- }
311
- });
package/tsconfig.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ESNext",
4
- "module": "ESNext",
5
- "moduleResolution": "Bundler",
6
- "outDir": "dist",
7
- "rootDir": "src",
8
- "declaration": true,
9
- "declarationMap": true,
10
- "sourceMap": true,
11
- "strict": true,
12
- "esModuleInterop": true,
13
- "skipLibCheck": true,
14
- "forceConsistentCasingInFileNames": true
15
- },
16
- "include": ["src/**/*"],
17
- "exclude": ["dist", "node_modules"]
18
- }