callman-core 1.11.4 → 1.11.6
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/dist/host/db/connectionMapping.d.ts +20 -0
- package/dist/host/db/connectionMapping.d.ts.map +1 -0
- package/dist/host/db/connectionMapping.js +27 -0
- package/dist/host/db/connectionMapping.js.map +1 -0
- package/dist/host/db/mongoAdapter.d.ts +1 -0
- package/dist/host/db/mongoAdapter.d.ts.map +1 -1
- package/dist/host/db/mongoAdapter.js +79 -9
- package/dist/host/db/mongoAdapter.js.map +1 -1
- package/dist/host/db/mysqlAdapter.d.ts +1 -0
- package/dist/host/db/mysqlAdapter.d.ts.map +1 -1
- package/dist/host/db/mysqlAdapter.js +8 -0
- package/dist/host/db/mysqlAdapter.js.map +1 -1
- package/dist/host/db/oracleAdapter.d.ts +1 -0
- package/dist/host/db/oracleAdapter.d.ts.map +1 -1
- package/dist/host/db/oracleAdapter.js +9 -0
- package/dist/host/db/oracleAdapter.js.map +1 -1
- package/dist/host/db/postgresAdapter.d.ts +1 -0
- package/dist/host/db/postgresAdapter.d.ts.map +1 -1
- package/dist/host/db/postgresAdapter.js +8 -0
- package/dist/host/db/postgresAdapter.js.map +1 -1
- package/dist/host/db/queryExecutor.d.ts +10 -1
- package/dist/host/db/queryExecutor.d.ts.map +1 -1
- package/dist/host/db/queryExecutor.js +40 -4
- package/dist/host/db/queryExecutor.js.map +1 -1
- package/dist/host/db/types.d.ts +5 -0
- package/dist/host/db/types.d.ts.map +1 -1
- package/dist/host/index.d.ts +9 -2
- package/dist/host/index.d.ts.map +1 -1
- package/dist/host/index.js +10 -1
- package/dist/host/index.js.map +1 -1
- package/dist/scenario-runner/assertion.d.ts +8 -0
- package/dist/scenario-runner/assertion.d.ts.map +1 -0
- package/dist/scenario-runner/assertion.js +149 -0
- package/dist/scenario-runner/assertion.js.map +1 -0
- package/dist/scenario-runner/condition.d.ts +3 -1
- package/dist/scenario-runner/condition.d.ts.map +1 -1
- package/dist/scenario-runner/condition.js +28 -2
- package/dist/scenario-runner/condition.js.map +1 -1
- package/dist/scenario-runner/index.d.ts +1 -0
- package/dist/scenario-runner/index.d.ts.map +1 -1
- package/dist/scenario-runner/index.js +3 -0
- package/dist/scenario-runner/index.js.map +1 -1
- package/dist/scenario-runner/nodePolicy.d.ts.map +1 -1
- package/dist/scenario-runner/nodePolicy.js +2 -0
- package/dist/scenario-runner/nodePolicy.js.map +1 -1
- package/dist/scenario-runner/runScenario.d.ts.map +1 -1
- package/dist/scenario-runner/runScenario.js +57 -0
- package/dist/scenario-runner/runScenario.js.map +1 -1
- package/dist/scenario-runner/types.d.ts +38 -4
- package/dist/scenario-runner/types.d.ts.map +1 -1
- package/dist-cjs/host/db/connectionMapping.js +31 -0
- package/dist-cjs/host/db/connectionMapping.js.map +1 -0
- package/dist-cjs/host/db/mongoAdapter.js +81 -10
- package/dist-cjs/host/db/mongoAdapter.js.map +1 -1
- package/dist-cjs/host/db/mysqlAdapter.js +10 -1
- package/dist-cjs/host/db/mysqlAdapter.js.map +1 -1
- package/dist-cjs/host/db/oracleAdapter.js +11 -1
- package/dist-cjs/host/db/oracleAdapter.js.map +1 -1
- package/dist-cjs/host/db/postgresAdapter.js +10 -1
- package/dist-cjs/host/db/postgresAdapter.js.map +1 -1
- package/dist-cjs/host/db/queryExecutor.js +39 -1
- package/dist-cjs/host/db/queryExecutor.js.map +1 -1
- package/dist-cjs/host/index.js +28 -1
- package/dist-cjs/host/index.js.map +1 -1
- package/dist-cjs/scenario-runner/assertion.js +157 -0
- package/dist-cjs/scenario-runner/assertion.js.map +1 -0
- package/dist-cjs/scenario-runner/condition.js +31 -3
- package/dist-cjs/scenario-runner/condition.js.map +1 -1
- package/dist-cjs/scenario-runner/index.js +3 -0
- package/dist-cjs/scenario-runner/index.js.map +1 -1
- package/dist-cjs/scenario-runner/nodePolicy.js +2 -0
- package/dist-cjs/scenario-runner/nodePolicy.js.map +1 -1
- package/dist-cjs/scenario-runner/runScenario.js +57 -0
- package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
- package/package.json +1 -1
package/dist/host/index.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
export { buildDbExecuteCapability, runConfiguredDbQuery, runRedisCommandsForPhase, buildRedisValueCache, buildRedisCapability, type ConnectionRuntime, type ConnectionRuntimeMap, type DbConnectionRuntime, type RedisConnectionRuntime, type DbNodeConfig, type RequestDatabaseRuntimeConfig, type RequestRedisRuntimeConfig, type ScriptTemplateContext, } from "./connections.js";
|
|
2
|
-
export { executeQuery } from "./db/queryExecutor.js";
|
|
3
|
-
export {
|
|
2
|
+
export { executeQuery, executeResolvedDbQuery, testDbConnection, } from "./db/queryExecutor.js";
|
|
3
|
+
export { executeMongoQuery, testMongoConnection, __setMongoDriverForTests, } from "./db/mongoAdapter.js";
|
|
4
|
+
export { executePostgresQuery, testPostgresConnection, __setPostgresDriverForTests, } from "./db/postgresAdapter.js";
|
|
5
|
+
export { executeMysqlQuery, testMysqlConnection, __setMysqlDriverForTests, } from "./db/mysqlAdapter.js";
|
|
6
|
+
export { executeOracleQuery, testOracleConnection, __setOracleDriverForTests, } from "./db/oracleAdapter.js";
|
|
7
|
+
export { stripTrailingSqlTerminator } from "./db/sqlNormalize.js";
|
|
8
|
+
export { normalizeOracleConnectString, OracleConnectStringError, } from "./db/oracleConnectString.js";
|
|
9
|
+
export { databaseConfigToDbConnection, type CoreDbProvider, type DatabaseConnectionConfigLike, } from "./db/connectionMapping.js";
|
|
10
|
+
export { type DbConnection, type DbConnectionInput, type DbConnectionType, type DbConnectionMode, type DbConnectionTestResult, type DbQueryExecutionResult, type DbQueryPhase, type DbTemplateContext, type ExecuteDbQueryPayload, } from "./db/types.js";
|
|
4
11
|
export { executeRedisCommands } from "./redis/redisService.js";
|
|
5
12
|
export { type RedisCommandExecutionResult, type RedisCommandPhase, type RequestRedisResult, } from "./redis/types.js";
|
|
6
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/host/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,EAC5B,KAAK,cAAc,EACnB,KAAK,4BAA4B,GAClC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACL,KAAK,2BAA2B,EAChC,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC"}
|
package/dist/host/index.js
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
// resolved connection runtimes into script capabilities. Lets the collection
|
|
3
3
|
// runner execute `pm.db.*` and `pm.redis` without an external host process.
|
|
4
4
|
export { buildDbExecuteCapability, runConfiguredDbQuery, runRedisCommandsForPhase, buildRedisValueCache, buildRedisCapability, } from "./connections.js";
|
|
5
|
-
export { executeQuery } from "./db/queryExecutor.js";
|
|
5
|
+
export { executeQuery, executeResolvedDbQuery, testDbConnection, } from "./db/queryExecutor.js";
|
|
6
|
+
// Individual adapters + connectivity checks, so hosts (Electron, backend) call
|
|
7
|
+
// the single shared implementation instead of duplicating driver logic.
|
|
8
|
+
export { executeMongoQuery, testMongoConnection, __setMongoDriverForTests, } from "./db/mongoAdapter.js";
|
|
9
|
+
export { executePostgresQuery, testPostgresConnection, __setPostgresDriverForTests, } from "./db/postgresAdapter.js";
|
|
10
|
+
export { executeMysqlQuery, testMysqlConnection, __setMysqlDriverForTests, } from "./db/mysqlAdapter.js";
|
|
11
|
+
export { executeOracleQuery, testOracleConnection, __setOracleDriverForTests, } from "./db/oracleAdapter.js";
|
|
12
|
+
export { stripTrailingSqlTerminator } from "./db/sqlNormalize.js";
|
|
13
|
+
export { normalizeOracleConnectString, OracleConnectStringError, } from "./db/oracleConnectString.js";
|
|
14
|
+
export { databaseConfigToDbConnection, } from "./db/connectionMapping.js";
|
|
6
15
|
export { executeRedisCommands } from "./redis/redisService.js";
|
|
7
16
|
//# sourceMappingURL=index.js.map
|
package/dist/host/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GASrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/host/index.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAE5E,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GASrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,+EAA+E;AAC/E,wEAAwE;AACxE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,4BAA4B,GAG7B,MAAM,2BAA2B,CAAC;AAanC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ConditionRuntimeScope, ConditionValidationIssue } from "./conditionTypes.js";
|
|
2
|
+
import type { AssertionCheck, AssertionEvaluationResult, AssertionScenarioNodeConfig } from "./types.js";
|
|
3
|
+
export declare const createAssertionCheck: (overrides?: Partial<AssertionCheck>) => AssertionCheck;
|
|
4
|
+
export declare const createDefaultAssertionConfig: () => AssertionScenarioNodeConfig;
|
|
5
|
+
export declare const normalizeAssertionNodeConfig: (value: unknown) => AssertionScenarioNodeConfig;
|
|
6
|
+
export declare const validateAssertionConfig: (config: AssertionScenarioNodeConfig, runtimeRootKeys?: Iterable<string>) => ConditionValidationIssue[];
|
|
7
|
+
export declare const evaluateAssertionConfig: (config: AssertionScenarioNodeConfig, scope: ConditionRuntimeScope) => AssertionEvaluationResult;
|
|
8
|
+
//# sourceMappingURL=assertion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/assertion.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAEV,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACV,cAAc,EAEd,yBAAyB,EAEzB,2BAA2B,EAC5B,MAAM,YAAY,CAAC;AAUpB,eAAO,MAAM,oBAAoB,GAC/B,YAAW,OAAO,CAAC,cAAc,CAAM,KACtC,cAKD,CAAC;AAEH,eAAO,MAAM,4BAA4B,QAAO,2BAY9C,CAAC;AAsBH,eAAO,MAAM,4BAA4B,GACvC,OAAO,OAAO,KACb,2BAmBF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,2BAA2B,EACnC,kBAAkB,QAAQ,CAAC,MAAM,CAAC,KACjC,wBAAwB,EAwB1B,CAAC;AA6BF,eAAO,MAAM,uBAAuB,GAClC,QAAQ,2BAA2B,EACnC,OAAO,qBAAqB,KAC3B,yBA+CF,CAAC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Assertion node — a no-code checkpoint built on top of the condition
|
|
2
|
+
// engine. Each check is a single condition rule (`left operator right`,
|
|
3
|
+
// where either operand may be a runtime reference to a previous node's
|
|
4
|
+
// output by label). The node passes/fails (no branching); on failure the
|
|
5
|
+
// caller honours the node's executionPolicy.
|
|
6
|
+
//
|
|
7
|
+
// All comparison/operand/operator semantics are REUSED from condition.ts,
|
|
8
|
+
// so an assertion evaluates identically to a condition rule — and, because
|
|
9
|
+
// this lives in callman_core, identically on the desktop client and the
|
|
10
|
+
// schedule/server runner.
|
|
11
|
+
import { createConditionOperand, createConditionRule, evaluateConditionRule, getConditionOperatorLabel, isConditionOperatorUnary, validateConditionRule, } from "./condition.js";
|
|
12
|
+
const createId = (prefix) => typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
|
|
13
|
+
? crypto.randomUUID()
|
|
14
|
+
: `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
15
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
+
export const createAssertionCheck = (overrides = {}) => ({
|
|
17
|
+
id: overrides.id ?? createId("assertion-check"),
|
|
18
|
+
name: overrides.name ?? "",
|
|
19
|
+
enabled: overrides.enabled ?? true,
|
|
20
|
+
rule: overrides.rule ?? createConditionRule(),
|
|
21
|
+
});
|
|
22
|
+
export const createDefaultAssertionConfig = () => ({
|
|
23
|
+
matchMode: "all",
|
|
24
|
+
checks: [
|
|
25
|
+
createAssertionCheck({
|
|
26
|
+
name: "",
|
|
27
|
+
rule: createConditionRule({
|
|
28
|
+
left: createConditionOperand("runtime", "string", ""),
|
|
29
|
+
operator: "equals",
|
|
30
|
+
right: createConditionOperand("runtime", "string", ""),
|
|
31
|
+
}),
|
|
32
|
+
}),
|
|
33
|
+
],
|
|
34
|
+
});
|
|
35
|
+
const normalizeMatchMode = (value) => value === "any" ? "any" : "all";
|
|
36
|
+
const normalizeCheck = (value) => {
|
|
37
|
+
if (!isRecord(value)) {
|
|
38
|
+
return createAssertionCheck();
|
|
39
|
+
}
|
|
40
|
+
return createAssertionCheck({
|
|
41
|
+
id: typeof value.id === "string" ? value.id : undefined,
|
|
42
|
+
name: typeof value.name === "string" ? value.name : "",
|
|
43
|
+
enabled: typeof value.enabled === "boolean" ? value.enabled : true,
|
|
44
|
+
// Reuse the condition rule constructor to default/clone a well-formed
|
|
45
|
+
// rule from (possibly partial) persisted data.
|
|
46
|
+
rule: isRecord(value.rule)
|
|
47
|
+
? createConditionRule(value.rule)
|
|
48
|
+
: createConditionRule(),
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
export const normalizeAssertionNodeConfig = (value) => {
|
|
52
|
+
if (!isRecord(value)) {
|
|
53
|
+
return createDefaultAssertionConfig();
|
|
54
|
+
}
|
|
55
|
+
const checks = Array.isArray(value.checks)
|
|
56
|
+
? value.checks.map(normalizeCheck)
|
|
57
|
+
: [];
|
|
58
|
+
return {
|
|
59
|
+
matchMode: normalizeMatchMode(value.matchMode),
|
|
60
|
+
checks: checks.length > 0 ? checks : createDefaultAssertionConfig().checks,
|
|
61
|
+
...(isRecord(value.executionPolicy)
|
|
62
|
+
? {
|
|
63
|
+
executionPolicy: value.executionPolicy,
|
|
64
|
+
}
|
|
65
|
+
: {}),
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
export const validateAssertionConfig = (config, runtimeRootKeys) => {
|
|
69
|
+
const issues = [];
|
|
70
|
+
const enabledChecks = config.checks.filter((check) => check.enabled);
|
|
71
|
+
if (enabledChecks.length === 0) {
|
|
72
|
+
issues.push({
|
|
73
|
+
id: "assertion",
|
|
74
|
+
message: "Add at least one enabled assertion check.",
|
|
75
|
+
severity: "warning",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
for (const check of config.checks) {
|
|
79
|
+
if (!check.enabled) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
// Per-check rule validation reuses the condition validator; prefix the
|
|
83
|
+
// issue id with the check id so the UI can attribute it to the row.
|
|
84
|
+
for (const issue of validateConditionRule(check.rule, runtimeRootKeys)) {
|
|
85
|
+
issues.push({ ...issue, id: `${check.id}:${issue.id}` });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return issues;
|
|
89
|
+
};
|
|
90
|
+
const describeCheckMessage = (check, passed, evaluation) => {
|
|
91
|
+
const label = check.name.trim() || "Assertion";
|
|
92
|
+
if (!evaluation) {
|
|
93
|
+
return `${label}: not evaluated`;
|
|
94
|
+
}
|
|
95
|
+
const operatorLabel = getConditionOperatorLabel(evaluation.operator);
|
|
96
|
+
const leftText = evaluation.left.displayValue;
|
|
97
|
+
if (isConditionOperatorUnary(evaluation.operator)) {
|
|
98
|
+
return passed
|
|
99
|
+
? `${label}: ${leftText} ${operatorLabel}`
|
|
100
|
+
: `${label}: expected ${leftText} ${operatorLabel}`;
|
|
101
|
+
}
|
|
102
|
+
const rightText = evaluation.right?.displayValue ?? "";
|
|
103
|
+
return passed
|
|
104
|
+
? `${label}: ${leftText} ${operatorLabel} ${rightText}`
|
|
105
|
+
: `${label}: expected ${leftText} ${operatorLabel} ${rightText}`;
|
|
106
|
+
};
|
|
107
|
+
export const evaluateAssertionConfig = (config, scope) => {
|
|
108
|
+
const checks = config.checks.map((check) => {
|
|
109
|
+
if (!check.enabled) {
|
|
110
|
+
return {
|
|
111
|
+
id: check.id,
|
|
112
|
+
name: check.name,
|
|
113
|
+
enabled: false,
|
|
114
|
+
passed: true,
|
|
115
|
+
message: `${check.name.trim() || "Assertion"}: skipped`,
|
|
116
|
+
evaluation: null,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const evaluation = evaluateConditionRule(check.rule, scope);
|
|
120
|
+
const passed = evaluation.result;
|
|
121
|
+
return {
|
|
122
|
+
id: check.id,
|
|
123
|
+
name: check.name,
|
|
124
|
+
enabled: true,
|
|
125
|
+
passed,
|
|
126
|
+
message: describeCheckMessage(check, passed, evaluation),
|
|
127
|
+
evaluation,
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
const enabled = checks.filter((check) => check.enabled);
|
|
131
|
+
const passedCount = enabled.filter((check) => check.passed).length;
|
|
132
|
+
const failedCount = enabled.length - passedCount;
|
|
133
|
+
// No enabled checks → vacuously passes (a no-op checkpoint never fails the
|
|
134
|
+
// scenario). "all": every enabled check passes. "any": at least one.
|
|
135
|
+
const passed = enabled.length === 0
|
|
136
|
+
? true
|
|
137
|
+
: config.matchMode === "any"
|
|
138
|
+
? passedCount > 0
|
|
139
|
+
: failedCount === 0;
|
|
140
|
+
return {
|
|
141
|
+
passed,
|
|
142
|
+
matchMode: config.matchMode,
|
|
143
|
+
total: enabled.length,
|
|
144
|
+
passedCount,
|
|
145
|
+
failedCount,
|
|
146
|
+
checks,
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
//# sourceMappingURL=assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../src/scenario-runner/assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConditionEvaluationResult, ConditionGroup, ConditionGroupEvaluation, ConditionLogicalOperator, ConditionMode, ConditionNodeConfig, ConditionOperand, ConditionOperator, ConditionRule, ConditionRuntimeScope, ConditionRuntimeSuggestion, ConditionValidationIssue, ConditionValueType } from "./conditionTypes.js";
|
|
1
|
+
import { ConditionEvaluationResult, ConditionGroup, ConditionGroupEvaluation, ConditionLogicalOperator, ConditionMode, ConditionNodeConfig, ConditionOperand, ConditionOperator, ConditionRuleEvaluation, ConditionRule, ConditionRuntimeScope, ConditionRuntimeSuggestion, ConditionValidationIssue, ConditionValueType } from "./conditionTypes.js";
|
|
2
2
|
import type { ScenarioNode } from "./types.js";
|
|
3
3
|
interface ParseResult {
|
|
4
4
|
group: ConditionGroup;
|
|
@@ -10,6 +10,7 @@ export declare const CONDITION_OPERATOR_META: Array<{
|
|
|
10
10
|
label: string;
|
|
11
11
|
value: ConditionOperator;
|
|
12
12
|
}>;
|
|
13
|
+
export declare const evaluateConditionRule: (rule: ConditionRule, runtimeScope: ConditionRuntimeScope) => ConditionRuleEvaluation;
|
|
13
14
|
export declare const CONDITION_VALUE_TYPES: ConditionValueType[];
|
|
14
15
|
export declare const createConditionOperand: (mode?: ConditionOperand["mode"], valueType?: ConditionValueType, value?: ConditionOperand["value"]) => ConditionOperand;
|
|
15
16
|
export declare const createConditionRule: (overrides?: Partial<ConditionRule>) => ConditionRule;
|
|
@@ -23,6 +24,7 @@ export declare const parseConditionExpressionToGroup: (expression: string) => Co
|
|
|
23
24
|
export declare const parseConditionExpressionSafely: (expression: string) => ParseResult;
|
|
24
25
|
export declare const normalizeConditionNodeConfig: (value: unknown) => ConditionNodeConfig;
|
|
25
26
|
export declare const validateConditionConfig: (config: ConditionNodeConfig, runtimeRootKeys?: Iterable<string>) => ConditionValidationIssue[];
|
|
27
|
+
export declare const validateConditionRule: (rule: ConditionRule, runtimeRootKeys?: Iterable<string>) => ConditionValidationIssue[];
|
|
26
28
|
export declare const getConditionRuleCount: (group: ConditionGroup) => number;
|
|
27
29
|
export declare const getConditionGroupCount: (group: ConditionGroup) => number;
|
|
28
30
|
export declare const getConditionQuickSummary: (config: ConditionNodeConfig) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/condition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/scenario-runner/condition.ts"],"names":[],"mappings":"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"}
|
|
@@ -423,6 +423,22 @@ const buildNodeSuggestions = (label, type) => {
|
|
|
423
423
|
createSuggestion(group, `${label}.responseMeta.status`, "Provider response status.", "number", "200"),
|
|
424
424
|
...metaSuggestions,
|
|
425
425
|
];
|
|
426
|
+
case "assertion":
|
|
427
|
+
// Mirrors the assertion node's runtime outputData in runScenario.ts
|
|
428
|
+
// (passed / matchMode / total / passedCount / failedCount / checks[]),
|
|
429
|
+
// so downstream nodes can reference e.g. `{{Assert.passed}}`.
|
|
430
|
+
return [
|
|
431
|
+
createSuggestion(group, `${label}.passed`, "Whether every enabled assertion check passed.", "boolean", "true"),
|
|
432
|
+
createSuggestion(group, `${label}.matchMode`, "Assertion match mode (all / any).", "string", "all"),
|
|
433
|
+
createSuggestion(group, `${label}.total`, "Total number of checks.", "number", "3"),
|
|
434
|
+
createSuggestion(group, `${label}.passedCount`, "How many checks passed.", "number", "3"),
|
|
435
|
+
createSuggestion(group, `${label}.failedCount`, "How many checks failed.", "number", "0"),
|
|
436
|
+
createSuggestion(group, `${label}.checks`, "Per-check results array.", "array"),
|
|
437
|
+
createSuggestion(group, `${label}.checks[0].name`, "First check's name.", "string"),
|
|
438
|
+
createSuggestion(group, `${label}.checks[0].passed`, "Whether the first check passed.", "boolean", "true"),
|
|
439
|
+
createSuggestion(group, `${label}.checks[0].message`, "First check's result message.", "string"),
|
|
440
|
+
...metaSuggestions,
|
|
441
|
+
];
|
|
426
442
|
case "condition":
|
|
427
443
|
return [
|
|
428
444
|
createSuggestion(group, `${label}.result`, "Condition boolean result.", "boolean", "true"),
|
|
@@ -1263,7 +1279,10 @@ const resolveOperand = (operand, runtimeScope) => {
|
|
|
1263
1279
|
value: typeof coercedValue === "undefined" ? resolution.value : coercedValue,
|
|
1264
1280
|
};
|
|
1265
1281
|
};
|
|
1266
|
-
|
|
1282
|
+
// Evaluate a single condition rule against the runtime scope. Exported so
|
|
1283
|
+
// the assertion node (which is a list of named checks, each one a rule) can
|
|
1284
|
+
// reuse the exact same operand/operator semantics as the condition node.
|
|
1285
|
+
export const evaluateConditionRule = (rule, runtimeScope) => {
|
|
1267
1286
|
const left = resolveOperand(rule.left, runtimeScope);
|
|
1268
1287
|
const right = rule.right ? resolveOperand(rule.right, runtimeScope) : undefined;
|
|
1269
1288
|
let result = false;
|
|
@@ -1388,7 +1407,7 @@ const evaluateRule = (rule, runtimeScope) => {
|
|
|
1388
1407
|
const evaluateGroup = (group, runtimeScope) => {
|
|
1389
1408
|
const children = group.children.map((child) => child.type === "group"
|
|
1390
1409
|
? evaluateGroup(child, runtimeScope)
|
|
1391
|
-
:
|
|
1410
|
+
: evaluateConditionRule(child, runtimeScope));
|
|
1392
1411
|
return {
|
|
1393
1412
|
id: group.id,
|
|
1394
1413
|
type: "group",
|
|
@@ -1594,6 +1613,13 @@ export const validateConditionConfig = (config, runtimeRootKeys) => {
|
|
|
1594
1613
|
validateGroup(targetGroup, issues, rootKeySet);
|
|
1595
1614
|
return issues;
|
|
1596
1615
|
};
|
|
1616
|
+
// Validate a single rule in isolation. Exported for the assertion node,
|
|
1617
|
+
// which is a flat list of named rules rather than a nested group.
|
|
1618
|
+
export const validateConditionRule = (rule, runtimeRootKeys) => {
|
|
1619
|
+
const issues = [];
|
|
1620
|
+
validateRule(rule, issues, runtimeRootKeys ? new Set(runtimeRootKeys) : null);
|
|
1621
|
+
return issues;
|
|
1622
|
+
};
|
|
1597
1623
|
export const getConditionRuleCount = (group) => collectConditionRuleCount(group);
|
|
1598
1624
|
export const getConditionGroupCount = (group) => collectConditionGroupCount(group);
|
|
1599
1625
|
export const getConditionQuickSummary = (config) => getConditionQuickSummaryParts(config).join(" • ");
|