@memberjunction/testing-engine 3.0.0 → 3.1.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.
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Variable resolution service for the Testing Framework
4
+ * @module @memberjunction/testing-engine
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.VariableResolver = exports.VariableResolutionError = void 0;
8
+ const global_1 = require("@memberjunction/global");
9
+ /**
10
+ * Error thrown when variable resolution fails
11
+ */
12
+ class VariableResolutionError extends Error {
13
+ constructor(message, variableName, reason) {
14
+ super(message);
15
+ this.variableName = variableName;
16
+ this.reason = reason;
17
+ this.name = 'VariableResolutionError';
18
+ }
19
+ }
20
+ exports.VariableResolutionError = VariableResolutionError;
21
+ /**
22
+ * Service for resolving test variables through the inheritance hierarchy.
23
+ *
24
+ * Resolution order (highest to lowest priority):
25
+ * 1. Run-level values (CLI flags, API params)
26
+ * 2. Suite-level values (if running in a suite)
27
+ * 3. Test-level defaults
28
+ * 4. TestType defaults
29
+ */
30
+ class VariableResolver {
31
+ /**
32
+ * Resolve variables for a test execution.
33
+ *
34
+ * @param typeVariablesSchemaJson - JSON string from TestType.VariablesSchema
35
+ * @param testVariablesJson - JSON string from Test.Variables (optional)
36
+ * @param suiteVariablesJson - JSON string from TestSuite.Variables (optional)
37
+ * @param runOptions - Runtime options containing user-provided variable values
38
+ * @returns Resolved variables with values and sources
39
+ * @throws VariableResolutionError if required variables are missing or values are invalid
40
+ */
41
+ resolveVariables(typeVariablesSchemaJson, testVariablesJson, suiteVariablesJson, runOptions) {
42
+ // Parse schemas
43
+ const typeSchema = this.parseTypeSchema(typeVariablesSchemaJson);
44
+ const testConfig = this.parseTestConfig(testVariablesJson);
45
+ const suiteConfig = this.parseSuiteConfig(suiteVariablesJson);
46
+ // If no type schema, return empty resolved variables
47
+ if (!typeSchema || typeSchema.variables.length === 0) {
48
+ return { values: {}, sources: {} };
49
+ }
50
+ const values = {};
51
+ const sources = {};
52
+ // Process each variable defined in the type schema
53
+ for (const varDef of typeSchema.variables) {
54
+ const testOverride = testConfig?.variables?.[varDef.name];
55
+ // Check if test explicitly marks this variable as not exposed
56
+ if (testOverride && testOverride.exposed === false) {
57
+ continue; // Variable not exposed by this test, skip it
58
+ }
59
+ // Resolve the value through the priority hierarchy
60
+ const resolved = this.resolveValue(varDef, testOverride, suiteConfig, runOptions);
61
+ if (resolved.value !== undefined) {
62
+ values[varDef.name] = resolved.value;
63
+ sources[varDef.name] = resolved.source;
64
+ }
65
+ else if (varDef.required) {
66
+ throw new VariableResolutionError(`Required variable '${varDef.name}' has no value. ` +
67
+ `Provide a value via --var ${varDef.name}=<value> or set a default.`, varDef.name, 'missing_required');
68
+ }
69
+ }
70
+ return { values, sources };
71
+ }
72
+ /**
73
+ * Parse the TestType.VariablesSchema JSON
74
+ */
75
+ parseTypeSchema(json) {
76
+ if (!json) {
77
+ return null;
78
+ }
79
+ const parsed = (0, global_1.SafeJSONParse)(json);
80
+ if (!parsed || typeof parsed !== 'object') {
81
+ return null;
82
+ }
83
+ // Validate schema version
84
+ if (parsed.schemaVersion !== '1.0') {
85
+ throw new VariableResolutionError(`Unsupported variables schema version: ${parsed.schemaVersion}. Expected '1.0'.`, undefined, 'parse_error');
86
+ }
87
+ return parsed;
88
+ }
89
+ /**
90
+ * Parse the Test.Variables JSON
91
+ */
92
+ parseTestConfig(json) {
93
+ if (!json) {
94
+ return null;
95
+ }
96
+ const parsed = (0, global_1.SafeJSONParse)(json);
97
+ if (!parsed || typeof parsed !== 'object') {
98
+ return null;
99
+ }
100
+ return parsed;
101
+ }
102
+ /**
103
+ * Parse the TestSuite.Variables JSON
104
+ */
105
+ parseSuiteConfig(json) {
106
+ if (!json) {
107
+ return null;
108
+ }
109
+ const parsed = (0, global_1.SafeJSONParse)(json);
110
+ if (!parsed || typeof parsed !== 'object') {
111
+ return null;
112
+ }
113
+ return parsed;
114
+ }
115
+ /**
116
+ * Resolve a single variable value through the priority hierarchy.
117
+ *
118
+ * Priority order:
119
+ * 1. If locked at test level, use test/type default (no override allowed)
120
+ * 2. Run-level value
121
+ * 3. Suite-level value
122
+ * 4. Test-level default
123
+ * 5. Type-level default
124
+ */
125
+ resolveValue(varDef, testOverride, suiteConfig, runOptions) {
126
+ // If variable is locked at test level, use test default (or type default)
127
+ if (testOverride?.locked) {
128
+ const value = testOverride.defaultValue ?? varDef.defaultValue;
129
+ return {
130
+ value: value,
131
+ source: testOverride.defaultValue !== undefined ? 'test' : 'type'
132
+ };
133
+ }
134
+ // Priority 1: Run-level value
135
+ if (runOptions.variables?.[varDef.name] !== undefined) {
136
+ const value = runOptions.variables[varDef.name];
137
+ this.validateValue(varDef, testOverride, value, 'run');
138
+ return { value: value, source: 'run' };
139
+ }
140
+ // Priority 2: Suite-level value
141
+ if (suiteConfig?.variables?.[varDef.name] !== undefined) {
142
+ const value = suiteConfig.variables[varDef.name];
143
+ this.validateValue(varDef, testOverride, value, 'suite');
144
+ return { value: value, source: 'suite' };
145
+ }
146
+ // Priority 3: Test-level default
147
+ if (testOverride?.defaultValue !== undefined) {
148
+ return { value: testOverride.defaultValue, source: 'test' };
149
+ }
150
+ // Priority 4: Type-level default
151
+ if (varDef.defaultValue !== undefined) {
152
+ return { value: varDef.defaultValue, source: 'type' };
153
+ }
154
+ return { value: undefined, source: '' };
155
+ }
156
+ /**
157
+ * Validate a variable value against its definition.
158
+ */
159
+ validateValue(varDef, testOverride, value, source) {
160
+ // Type validation
161
+ this.validateDataType(varDef, value);
162
+ // Check against possible values (static source)
163
+ if (varDef.valueSource === 'static' && varDef.possibleValues && varDef.possibleValues.length > 0) {
164
+ // Get allowed values (test-restricted or all from type)
165
+ const allowedValues = testOverride?.restrictedValues
166
+ ?? varDef.possibleValues.map(pv => pv.value);
167
+ if (!allowedValues.includes(value)) {
168
+ throw new VariableResolutionError(`Variable '${varDef.name}' value '${value}' (from ${source}) is not in allowed values: [${allowedValues.join(', ')}]`, varDef.name, 'invalid_value');
169
+ }
170
+ }
171
+ }
172
+ /**
173
+ * Validate value matches the expected data type.
174
+ */
175
+ validateDataType(varDef, value) {
176
+ const actualType = typeof value;
177
+ switch (varDef.dataType) {
178
+ case 'string':
179
+ if (actualType !== 'string') {
180
+ throw new VariableResolutionError(`Variable '${varDef.name}' expected type 'string' but got '${actualType}'`, varDef.name, 'invalid_type');
181
+ }
182
+ break;
183
+ case 'number':
184
+ if (actualType !== 'number' || isNaN(value)) {
185
+ throw new VariableResolutionError(`Variable '${varDef.name}' expected type 'number' but got '${actualType}'`, varDef.name, 'invalid_type');
186
+ }
187
+ break;
188
+ case 'boolean':
189
+ if (actualType !== 'boolean') {
190
+ throw new VariableResolutionError(`Variable '${varDef.name}' expected type 'boolean' but got '${actualType}'`, varDef.name, 'invalid_type');
191
+ }
192
+ break;
193
+ case 'date':
194
+ // Date can be a string (ISO format) or Date object
195
+ if (!(value instanceof Date) && (actualType !== 'string' || isNaN(Date.parse(value)))) {
196
+ throw new VariableResolutionError(`Variable '${varDef.name}' expected type 'date' but got '${actualType}'`, varDef.name, 'invalid_type');
197
+ }
198
+ break;
199
+ }
200
+ }
201
+ /**
202
+ * Get available variables for a test (combines type and test configuration).
203
+ * Useful for CLI help and variable listing.
204
+ */
205
+ getAvailableVariables(typeVariablesSchemaJson, testVariablesJson) {
206
+ const typeSchema = this.parseTypeSchema(typeVariablesSchemaJson);
207
+ const testConfig = this.parseTestConfig(testVariablesJson);
208
+ if (!typeSchema) {
209
+ return [];
210
+ }
211
+ // Filter to only exposed variables and apply test-level overrides
212
+ return typeSchema.variables
213
+ .filter(varDef => {
214
+ const testOverride = testConfig?.variables?.[varDef.name];
215
+ // Include if no override or explicitly exposed
216
+ return !testOverride || testOverride.exposed !== false;
217
+ })
218
+ .map(varDef => {
219
+ const testOverride = testConfig?.variables?.[varDef.name];
220
+ // Apply test-level overrides to the definition
221
+ if (testOverride) {
222
+ return {
223
+ ...varDef,
224
+ defaultValue: testOverride.defaultValue ?? varDef.defaultValue,
225
+ // Restrict possible values if specified
226
+ possibleValues: testOverride.restrictedValues
227
+ ? varDef.possibleValues?.filter(pv => testOverride.restrictedValues.includes(pv.value))
228
+ : varDef.possibleValues
229
+ };
230
+ }
231
+ return varDef;
232
+ });
233
+ }
234
+ /**
235
+ * Parse a variable value from a CLI string.
236
+ * Converts string input to appropriate type based on variable definition.
237
+ */
238
+ parseCliValue(varDef, cliValue) {
239
+ switch (varDef.dataType) {
240
+ case 'string':
241
+ return cliValue;
242
+ case 'number': {
243
+ const num = parseFloat(cliValue);
244
+ if (isNaN(num)) {
245
+ throw new VariableResolutionError(`Cannot parse '${cliValue}' as number for variable '${varDef.name}'`, varDef.name, 'invalid_type');
246
+ }
247
+ return num;
248
+ }
249
+ case 'boolean': {
250
+ const lower = cliValue.toLowerCase();
251
+ if (lower === 'true' || lower === '1' || lower === 'yes') {
252
+ return true;
253
+ }
254
+ if (lower === 'false' || lower === '0' || lower === 'no') {
255
+ return false;
256
+ }
257
+ throw new VariableResolutionError(`Cannot parse '${cliValue}' as boolean for variable '${varDef.name}'. Use true/false, 1/0, or yes/no.`, varDef.name, 'invalid_type');
258
+ }
259
+ case 'date': {
260
+ const date = new Date(cliValue);
261
+ if (isNaN(date.getTime())) {
262
+ throw new VariableResolutionError(`Cannot parse '${cliValue}' as date for variable '${varDef.name}'`, varDef.name, 'invalid_type');
263
+ }
264
+ return date;
265
+ }
266
+ default:
267
+ return cliValue;
268
+ }
269
+ }
270
+ /**
271
+ * Parse CLI variable arguments (name=value format) into a variables object.
272
+ * If type schema is provided, values are converted to appropriate types.
273
+ */
274
+ parseCliVariables(cliArgs, typeVariablesSchemaJson) {
275
+ const typeSchema = typeVariablesSchemaJson ? this.parseTypeSchema(typeVariablesSchemaJson) : null;
276
+ const result = {};
277
+ for (const arg of cliArgs) {
278
+ const eqIndex = arg.indexOf('=');
279
+ if (eqIndex === -1) {
280
+ throw new VariableResolutionError(`Invalid variable format: '${arg}'. Expected format: name=value`, undefined, 'parse_error');
281
+ }
282
+ const name = arg.substring(0, eqIndex);
283
+ const valueStr = arg.substring(eqIndex + 1);
284
+ // Find variable definition for type conversion
285
+ const varDef = typeSchema?.variables.find(v => v.name === name);
286
+ if (varDef) {
287
+ result[name] = this.parseCliValue(varDef, valueStr);
288
+ }
289
+ else {
290
+ // No type info, keep as string
291
+ result[name] = valueStr;
292
+ }
293
+ }
294
+ return result;
295
+ }
296
+ }
297
+ exports.VariableResolver = VariableResolver;
298
+ //# sourceMappingURL=variable-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variable-resolver.js","sourceRoot":"","sources":["../../src/utils/variable-resolver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/testing-engine",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "MemberJunction Testing Framework Engine - Core test execution and evaluation engine supporting multiple test types",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -10,25 +10,30 @@
10
10
  "scripts": {
11
11
  "start": "ts-node-dev src/index.ts",
12
12
  "build": "tsc",
13
- "test": "echo \"Error: no test specified\" && exit 1"
13
+ "test": "jest",
14
+ "test:watch": "jest --watch",
15
+ "test:coverage": "jest --coverage"
14
16
  },
15
17
  "author": "MemberJunction.com",
16
18
  "license": "ISC",
17
19
  "devDependencies": {
18
20
  "ts-node-dev": "^2.0.0",
19
21
  "typescript": "^5.4.5",
20
- "@types/debug": "^4.1.12"
22
+ "@types/debug": "^4.1.12",
23
+ "@types/jest": "^29.5.12",
24
+ "jest": "^29.7.0",
25
+ "ts-jest": "^29.1.2"
21
26
  },
22
27
  "dependencies": {
23
- "@memberjunction/ai": "3.0.0",
24
- "@memberjunction/ai-agents": "3.0.0",
25
- "@memberjunction/ai-core-plus": "3.0.0",
26
- "@memberjunction/ai-prompts": "3.0.0",
27
- "@memberjunction/aiengine": "3.0.0",
28
- "@memberjunction/core": "3.0.0",
29
- "@memberjunction/core-entities": "3.0.0",
30
- "@memberjunction/global": "3.0.0",
31
- "@memberjunction/testing-engine-base": "3.0.0",
28
+ "@memberjunction/ai": "3.1.0",
29
+ "@memberjunction/ai-agents": "3.1.0",
30
+ "@memberjunction/ai-core-plus": "3.1.0",
31
+ "@memberjunction/ai-prompts": "3.1.0",
32
+ "@memberjunction/aiengine": "3.1.0",
33
+ "@memberjunction/core": "3.1.0",
34
+ "@memberjunction/core-entities": "3.1.0",
35
+ "@memberjunction/global": "3.1.0",
36
+ "@memberjunction/testing-engine-base": "3.1.0",
32
37
  "debug": "^4.4.0",
33
38
  "rxjs": "^7.8.1",
34
39
  "zod": "^3.23.8"