@principles/core 1.240.2 → 1.240.4
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/principle-injector.test.d.ts +2 -0
- package/dist/principle-injector.test.d.ts.map +1 -0
- package/dist/principle-injector.test.js +158 -0
- package/dist/principle-injector.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.d.ts +26 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.js +402 -0
- package/dist/runtime-v2/__tests__/bridge-result-shaper.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.d.ts +25 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.js +281 -0
- package/dist/runtime-v2/__tests__/pruning-mask.test.js.map +1 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.d.ts +29 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.js +431 -0
- package/dist/runtime-v2/__tests__/workflow-funnel-loader.test.js.map +1 -0
- package/dist/trajectory-store.test.d.ts +2 -0
- package/dist/trajectory-store.test.d.ts.map +1 -0
- package/dist/trajectory-store.test.js +251 -0
- package/dist/trajectory-store.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkflowFunnelLoader Tests — Core Package
|
|
3
|
+
*
|
|
4
|
+
* Direct unit tests for the WorkflowFunnelLoader class.
|
|
5
|
+
*
|
|
6
|
+
* Tests verify:
|
|
7
|
+
* - Constructor loads workflows.yaml from stateDir
|
|
8
|
+
* - Missing file → empty funnels + warning
|
|
9
|
+
* - Malformed YAML → preserves last known-good config + warning
|
|
10
|
+
* - Invalid schema (missing version/funnels) → preserves last known-good + warning
|
|
11
|
+
* - Invalid funnel entries (missing workflowId/stages) → skipped + warning
|
|
12
|
+
* - getStages returns correct stages for known workflow
|
|
13
|
+
* - getStages returns empty array for unknown workflow
|
|
14
|
+
* - getFunnel returns full funnel with policy for known workflow
|
|
15
|
+
* - getFunnel returns undefined for unknown workflow
|
|
16
|
+
* - getFunnel returns deep clone (mutations don't affect internal state)
|
|
17
|
+
* - getAllFunnels returns deep clone of all stages
|
|
18
|
+
* - getAllFunnelsWithPolicy returns deep clone of all funnels
|
|
19
|
+
* - watch() starts file watching, dispose() cleans up
|
|
20
|
+
* - getWarnings returns warnings from last load
|
|
21
|
+
* - getConfigPath returns correct path
|
|
22
|
+
*
|
|
23
|
+
* ERR checklist:
|
|
24
|
+
* - ERR-002 / EP-03: malformed YAML preserves last known-good (fail-safe)
|
|
25
|
+
* - ERR-007 / EP-02: single source for funnels table
|
|
26
|
+
* - EP-07: deep clones prevent consumer mutation of internal state
|
|
27
|
+
*/
|
|
28
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
29
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
30
|
+
import * as fs from 'fs';
|
|
31
|
+
import * as path from 'path';
|
|
32
|
+
import * as os from 'os';
|
|
33
|
+
import * as yamlLib from 'js-yaml';
|
|
34
|
+
import { WorkflowFunnelLoader } from '../../workflow-funnel-loader.js';
|
|
35
|
+
describe('WorkflowFunnelLoader', () => {
|
|
36
|
+
let tmpDir;
|
|
37
|
+
let stateDir;
|
|
38
|
+
let configPath;
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-workflow-loader-test-'));
|
|
41
|
+
stateDir = path.join(tmpDir, '.state');
|
|
42
|
+
fs.mkdirSync(stateDir, { recursive: true });
|
|
43
|
+
configPath = path.join(stateDir, 'workflows.yaml');
|
|
44
|
+
});
|
|
45
|
+
afterEach(() => {
|
|
46
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
47
|
+
});
|
|
48
|
+
function writeConfig(config) {
|
|
49
|
+
const yamlStr = yamlLib.dump(config, { schema: yamlLib.DEFAULT_SCHEMA });
|
|
50
|
+
fs.writeFileSync(configPath, yamlStr, 'utf-8');
|
|
51
|
+
}
|
|
52
|
+
describe('constructor and initial load', () => {
|
|
53
|
+
it('loads valid workflows.yaml on construction', () => {
|
|
54
|
+
writeConfig({
|
|
55
|
+
version: '1.0',
|
|
56
|
+
funnels: [
|
|
57
|
+
{
|
|
58
|
+
workflowId: 'test-funnel',
|
|
59
|
+
stages: [
|
|
60
|
+
{ name: 'stage1', eventType: 'created', eventCategory: 'created', statsField: 'test.created' },
|
|
61
|
+
{ name: 'stage2', eventType: 'completed', eventCategory: 'completed', statsField: 'test.completed' },
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
});
|
|
66
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
67
|
+
const stages = loader.getStages('test-funnel');
|
|
68
|
+
expect(stages.length).toBe(2);
|
|
69
|
+
expect(stages[0].name).toBe('stage1');
|
|
70
|
+
expect(stages[1].name).toBe('stage2');
|
|
71
|
+
});
|
|
72
|
+
it('handles missing workflows.yaml with empty funnels + warning', () => {
|
|
73
|
+
fs.rmSync(configPath, { force: true });
|
|
74
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
75
|
+
expect(loader.getStages('any-workflow')).toEqual([]);
|
|
76
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
77
|
+
const warnings = loader.getWarnings();
|
|
78
|
+
expect(warnings.length).toBeGreaterThan(0);
|
|
79
|
+
expect(warnings[0]).toContain('not found');
|
|
80
|
+
});
|
|
81
|
+
it('handles malformed YAML with empty funnels + warning', () => {
|
|
82
|
+
fs.writeFileSync(configPath, 'not: valid: yaml: [broken', 'utf-8');
|
|
83
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
84
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
85
|
+
const warnings = loader.getWarnings();
|
|
86
|
+
expect(warnings.length).toBeGreaterThan(0);
|
|
87
|
+
expect(warnings[0]).toContain('Failed to parse');
|
|
88
|
+
});
|
|
89
|
+
it('handles missing version field with warning', () => {
|
|
90
|
+
fs.writeFileSync(configPath, 'funnels:\n - workflowId: test\n stages: []\n', 'utf-8');
|
|
91
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
92
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
93
|
+
const warnings = loader.getWarnings();
|
|
94
|
+
expect(warnings.some(w => w.includes('validation failed'))).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
it('handles missing funnels array with warning', () => {
|
|
97
|
+
fs.writeFileSync(configPath, 'version: "1.0"\n', 'utf-8');
|
|
98
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
99
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
100
|
+
const warnings = loader.getWarnings();
|
|
101
|
+
expect(warnings.some(w => w.includes('validation failed'))).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('getStages', () => {
|
|
105
|
+
it('returns empty array for unknown workflow', () => {
|
|
106
|
+
writeConfig({
|
|
107
|
+
version: '1.0',
|
|
108
|
+
funnels: [
|
|
109
|
+
{
|
|
110
|
+
workflowId: 'known-funnel',
|
|
111
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
});
|
|
115
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
116
|
+
expect(loader.getStages('unknown-funnel')).toEqual([]);
|
|
117
|
+
});
|
|
118
|
+
it('returns stages in order for known workflow', () => {
|
|
119
|
+
writeConfig({
|
|
120
|
+
version: '1.0',
|
|
121
|
+
funnels: [
|
|
122
|
+
{
|
|
123
|
+
workflowId: 'ordered-funnel',
|
|
124
|
+
stages: [
|
|
125
|
+
{ name: 'first', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' },
|
|
126
|
+
{ name: 'second', eventType: 'e2', eventCategory: 'c2', statsField: 'f2' },
|
|
127
|
+
{ name: 'third', eventType: 'e3', eventCategory: 'c3', statsField: 'f3' },
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
133
|
+
const stages = loader.getStages('ordered-funnel');
|
|
134
|
+
expect(stages.map(s => s.name)).toEqual(['first', 'second', 'third']);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('getFunnel', () => {
|
|
138
|
+
it('returns undefined for unknown workflow', () => {
|
|
139
|
+
writeConfig({
|
|
140
|
+
version: '1.0',
|
|
141
|
+
funnels: [],
|
|
142
|
+
});
|
|
143
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
144
|
+
expect(loader.getFunnel('nonexistent')).toBeUndefined();
|
|
145
|
+
});
|
|
146
|
+
it('returns full funnel with policy for known workflow', () => {
|
|
147
|
+
writeConfig({
|
|
148
|
+
version: '1.0',
|
|
149
|
+
funnels: [
|
|
150
|
+
{
|
|
151
|
+
workflowId: 'policy-funnel',
|
|
152
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
153
|
+
policy: {
|
|
154
|
+
timeoutMs: 30000,
|
|
155
|
+
stageOrder: 'strict',
|
|
156
|
+
runtimeKind: 'pi-ai',
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
});
|
|
161
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
162
|
+
const funnel = loader.getFunnel('policy-funnel');
|
|
163
|
+
expect(funnel).toBeDefined();
|
|
164
|
+
expect(funnel?.workflowId).toBe('policy-funnel');
|
|
165
|
+
expect(funnel?.stages.length).toBe(1);
|
|
166
|
+
expect(funnel?.policy?.timeoutMs).toBe(30000);
|
|
167
|
+
expect(funnel?.policy?.stageOrder).toBe('strict');
|
|
168
|
+
});
|
|
169
|
+
it('returns deep clone — mutations do not affect internal state', () => {
|
|
170
|
+
writeConfig({
|
|
171
|
+
version: '1.0',
|
|
172
|
+
funnels: [
|
|
173
|
+
{
|
|
174
|
+
workflowId: 'clone-test',
|
|
175
|
+
stages: [{ name: 'original', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
176
|
+
policy: { timeoutMs: 1000 },
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
});
|
|
180
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
181
|
+
const funnel1 = loader.getFunnel('clone-test');
|
|
182
|
+
funnel1.stages[0].name = 'mutated';
|
|
183
|
+
funnel1.policy.timeoutMs = 99999;
|
|
184
|
+
const funnel2 = loader.getFunnel('clone-test');
|
|
185
|
+
expect(funnel2.stages[0].name).toBe('original');
|
|
186
|
+
expect(funnel2.policy?.timeoutMs).toBe(1000);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe('getAllFunnels', () => {
|
|
190
|
+
it('returns all funnels as a Map', () => {
|
|
191
|
+
writeConfig({
|
|
192
|
+
version: '1.0',
|
|
193
|
+
funnels: [
|
|
194
|
+
{
|
|
195
|
+
workflowId: 'funnel-a',
|
|
196
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
workflowId: 'funnel-b',
|
|
200
|
+
stages: [
|
|
201
|
+
{ name: 's2', eventType: 'e2', eventCategory: 'c2', statsField: 'f2' },
|
|
202
|
+
{ name: 's3', eventType: 'e3', eventCategory: 'c3', statsField: 'f3' },
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
});
|
|
207
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
208
|
+
const all = loader.getAllFunnels();
|
|
209
|
+
expect(all.size).toBe(2);
|
|
210
|
+
expect(all.get('funnel-a')?.length).toBe(1);
|
|
211
|
+
expect(all.get('funnel-b')?.length).toBe(2);
|
|
212
|
+
});
|
|
213
|
+
it('returns deep clone — mutations do not affect internal state', () => {
|
|
214
|
+
writeConfig({
|
|
215
|
+
version: '1.0',
|
|
216
|
+
funnels: [
|
|
217
|
+
{
|
|
218
|
+
workflowId: 'mutate-test',
|
|
219
|
+
stages: [{ name: 'original', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
});
|
|
223
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
224
|
+
const all1 = loader.getAllFunnels();
|
|
225
|
+
all1.get('mutate-test')[0].name = 'mutated';
|
|
226
|
+
const all2 = loader.getAllFunnels();
|
|
227
|
+
expect(all2.get('mutate-test')[0].name).toBe('original');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('getAllFunnelsWithPolicy', () => {
|
|
231
|
+
it('returns all funnels with policy as a Map', () => {
|
|
232
|
+
writeConfig({
|
|
233
|
+
version: '1.0',
|
|
234
|
+
funnels: [
|
|
235
|
+
{
|
|
236
|
+
workflowId: 'funnel-x',
|
|
237
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
238
|
+
policy: { timeoutMs: 5000 },
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
});
|
|
242
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
243
|
+
const all = loader.getAllFunnelsWithPolicy();
|
|
244
|
+
expect(all.size).toBe(1);
|
|
245
|
+
const funnel = all.get('funnel-x');
|
|
246
|
+
expect(funnel.workflowId).toBe('funnel-x');
|
|
247
|
+
expect(funnel.policy?.timeoutMs).toBe(5000);
|
|
248
|
+
});
|
|
249
|
+
it('returns deep clone — policy mutations do not affect internal state', () => {
|
|
250
|
+
writeConfig({
|
|
251
|
+
version: '1.0',
|
|
252
|
+
funnels: [
|
|
253
|
+
{
|
|
254
|
+
workflowId: 'policy-clone',
|
|
255
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
256
|
+
policy: {
|
|
257
|
+
timeoutMs: 1000,
|
|
258
|
+
observability: {
|
|
259
|
+
enabled: true,
|
|
260
|
+
emitEvents: ['event1', 'event2'],
|
|
261
|
+
},
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
});
|
|
266
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
267
|
+
const all1 = loader.getAllFunnelsWithPolicy();
|
|
268
|
+
const funnel1 = all1.get('policy-clone');
|
|
269
|
+
funnel1.policy.timeoutMs = 99999;
|
|
270
|
+
funnel1.policy.observability.emitEvents.push('malicious');
|
|
271
|
+
const all2 = loader.getAllFunnelsWithPolicy();
|
|
272
|
+
const funnel2 = all2.get('policy-clone');
|
|
273
|
+
expect(funnel2.policy?.timeoutMs).toBe(1000);
|
|
274
|
+
expect(funnel2.policy?.observability?.emitEvents).toEqual(['event1', 'event2']);
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
describe('load() reload', () => {
|
|
278
|
+
it('reloads from disk on explicit load() call', () => {
|
|
279
|
+
writeConfig({
|
|
280
|
+
version: '1.0',
|
|
281
|
+
funnels: [
|
|
282
|
+
{
|
|
283
|
+
workflowId: 'reload-test',
|
|
284
|
+
stages: [{ name: 'v1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
});
|
|
288
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
289
|
+
expect(loader.getStages('reload-test')[0].name).toBe('v1');
|
|
290
|
+
writeConfig({
|
|
291
|
+
version: '1.0',
|
|
292
|
+
funnels: [
|
|
293
|
+
{
|
|
294
|
+
workflowId: 'reload-test',
|
|
295
|
+
stages: [{ name: 'v2', eventType: 'e2', eventCategory: 'c2', statsField: 'f2' }],
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
});
|
|
299
|
+
loader.load();
|
|
300
|
+
expect(loader.getStages('reload-test')[0].name).toBe('v2');
|
|
301
|
+
});
|
|
302
|
+
it('preserves last known-good config on malformed reload', () => {
|
|
303
|
+
writeConfig({
|
|
304
|
+
version: '1.0',
|
|
305
|
+
funnels: [
|
|
306
|
+
{
|
|
307
|
+
workflowId: 'stable-funnel',
|
|
308
|
+
stages: [{ name: 'good', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
});
|
|
312
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
313
|
+
expect(loader.getStages('stable-funnel')[0].name).toBe('good');
|
|
314
|
+
fs.writeFileSync(configPath, '::: invalid yaml :::', 'utf-8');
|
|
315
|
+
loader.load();
|
|
316
|
+
expect(loader.getStages('stable-funnel')[0].name).toBe('good');
|
|
317
|
+
expect(loader.getWarnings().some(w => w.includes('Failed to parse'))).toBe(true);
|
|
318
|
+
});
|
|
319
|
+
it('clears funnels when file is deleted and reloaded', () => {
|
|
320
|
+
writeConfig({
|
|
321
|
+
version: '1.0',
|
|
322
|
+
funnels: [
|
|
323
|
+
{
|
|
324
|
+
workflowId: 'will-disappear',
|
|
325
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
326
|
+
},
|
|
327
|
+
],
|
|
328
|
+
});
|
|
329
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
330
|
+
expect(loader.getStages('will-disappear').length).toBe(1);
|
|
331
|
+
fs.rmSync(configPath);
|
|
332
|
+
loader.load();
|
|
333
|
+
expect(loader.getStages('will-disappear')).toEqual([]);
|
|
334
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
describe('invalid funnel entries', () => {
|
|
338
|
+
it('skips funnels missing workflowId', () => {
|
|
339
|
+
const yamlContent = `version: "1.0"\nfunnels:\n - stages:\n - name: s1\n eventType: e1\n eventCategory: c1\n statsField: f1\n`;
|
|
340
|
+
fs.writeFileSync(configPath, yamlContent, 'utf-8');
|
|
341
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
342
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
343
|
+
expect(loader.getWarnings().some(w => w.includes('Skipping invalid funnel'))).toBe(true);
|
|
344
|
+
});
|
|
345
|
+
it('skips funnels missing stages array', () => {
|
|
346
|
+
const yamlContent = `version: "1.0"\nfunnels:\n - workflowId: no-stages\n`;
|
|
347
|
+
fs.writeFileSync(configPath, yamlContent, 'utf-8');
|
|
348
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
349
|
+
expect(loader.getAllFunnels().size).toBe(0);
|
|
350
|
+
expect(loader.getWarnings().some(w => w.includes('Skipping invalid funnel'))).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
it('keeps valid funnels when some are invalid', () => {
|
|
353
|
+
const yamlContent = `version: "1.0"\nfunnels:\n - workflowId: valid-1\n stages:\n - name: s1\n eventType: e1\n eventCategory: c1\n statsField: f1\n - workflowId: valid-2\n stages:\n - name: s2\n eventType: e2\n eventCategory: c2\n statsField: f2\n - stages: []\n`;
|
|
354
|
+
fs.writeFileSync(configPath, yamlContent, 'utf-8');
|
|
355
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
356
|
+
expect(loader.getAllFunnels().size).toBe(2);
|
|
357
|
+
expect(loader.getStages('valid-1').length).toBe(1);
|
|
358
|
+
expect(loader.getStages('valid-2').length).toBe(1);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
describe('getWarnings', () => {
|
|
362
|
+
it('returns empty array for successful load', () => {
|
|
363
|
+
writeConfig({
|
|
364
|
+
version: '1.0',
|
|
365
|
+
funnels: [{
|
|
366
|
+
workflowId: 'clean',
|
|
367
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
368
|
+
}],
|
|
369
|
+
});
|
|
370
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
371
|
+
const warnings = loader.getWarnings();
|
|
372
|
+
expect(Array.isArray(warnings)).toBe(true);
|
|
373
|
+
expect(warnings).toEqual([]);
|
|
374
|
+
});
|
|
375
|
+
it('warnings are cleared and refreshed on each load', () => {
|
|
376
|
+
fs.writeFileSync(configPath, 'bad yaml [[[', 'utf-8');
|
|
377
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
378
|
+
const firstWarnings = loader.getWarnings();
|
|
379
|
+
expect(firstWarnings.length).toBeGreaterThan(0);
|
|
380
|
+
writeConfig({
|
|
381
|
+
version: '1.0',
|
|
382
|
+
funnels: [{
|
|
383
|
+
workflowId: 'clean',
|
|
384
|
+
stages: [{ name: 's1', eventType: 'e1', eventCategory: 'c1', statsField: 'f1' }],
|
|
385
|
+
}],
|
|
386
|
+
});
|
|
387
|
+
loader.load();
|
|
388
|
+
const secondWarnings = loader.getWarnings();
|
|
389
|
+
expect(secondWarnings).toEqual([]);
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
describe('getConfigPath', () => {
|
|
393
|
+
it('returns the correct config path', () => {
|
|
394
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
395
|
+
expect(loader.getConfigPath()).toBe(configPath);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
describe('watch and dispose', () => {
|
|
399
|
+
it('watch() does not throw when file does not exist', () => {
|
|
400
|
+
fs.rmSync(configPath, { force: true });
|
|
401
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
402
|
+
expect(() => loader.watch()).not.toThrow();
|
|
403
|
+
loader.dispose();
|
|
404
|
+
});
|
|
405
|
+
it('dispose() is safe to call multiple times', () => {
|
|
406
|
+
writeConfig({
|
|
407
|
+
version: '1.0',
|
|
408
|
+
funnels: [],
|
|
409
|
+
});
|
|
410
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
411
|
+
loader.watch();
|
|
412
|
+
expect(() => loader.dispose()).not.toThrow();
|
|
413
|
+
expect(() => loader.dispose()).not.toThrow();
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
describe('stage-level fields', () => {
|
|
417
|
+
it('preserves optional stage fields: timeoutMs, successCriteria, legacyDisabled', () => {
|
|
418
|
+
const yamlContent = `version: "1.0"\nfunnels:\n - workflowId: stage-fields\n stages:\n - name: full-stage\n eventType: ev1\n eventCategory: cat1\n statsField: stats.ev1\n timeoutMs: 5000\n successCriteria: "count > 0"\n legacyDisabled: true\n observability:\n enabled: true\n emitEvents:\n - stage_started\n`;
|
|
419
|
+
fs.writeFileSync(configPath, yamlContent, 'utf-8');
|
|
420
|
+
const loader = new WorkflowFunnelLoader(stateDir);
|
|
421
|
+
const stages = loader.getStages('stage-fields');
|
|
422
|
+
expect(stages.length).toBe(1);
|
|
423
|
+
expect(stages[0].timeoutMs).toBe(5000);
|
|
424
|
+
expect(stages[0].successCriteria).toBe('count > 0');
|
|
425
|
+
expect(stages[0].legacyDisabled).toBe(true);
|
|
426
|
+
expect(stages[0].observability?.enabled).toBe(true);
|
|
427
|
+
expect(stages[0].observability?.emitEvents).toEqual(['stage_started']);
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
//# sourceMappingURL=workflow-funnel-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-funnel-loader.test.js","sourceRoot":"","sources":["../../../src/runtime-v2/__tests__/workflow-funnel-loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-store.test.d.ts","sourceRoot":"","sources":["../src/trajectory-store.test.ts"],"names":[],"mappings":""}
|