@arke-institute/rhiza 0.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.
- package/README.md +106 -0
- package/dist/__tests__/fixtures/index.d.ts +9 -0
- package/dist/__tests__/fixtures/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/index.js +12 -0
- package/dist/__tests__/fixtures/index.js.map +1 -0
- package/dist/__tests__/fixtures/kladoi/index.d.ts +165 -0
- package/dist/__tests__/fixtures/kladoi/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/kladoi/index.js +270 -0
- package/dist/__tests__/fixtures/kladoi/index.js.map +1 -0
- package/dist/__tests__/fixtures/logs/index.d.ts +19 -0
- package/dist/__tests__/fixtures/logs/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/logs/index.js +545 -0
- package/dist/__tests__/fixtures/logs/index.js.map +1 -0
- package/dist/__tests__/fixtures/mock-client.d.ts +127 -0
- package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mock-client.js +415 -0
- package/dist/__tests__/fixtures/mock-client.js.map +1 -0
- package/dist/__tests__/fixtures/rhizai/index.d.ts +54 -0
- package/dist/__tests__/fixtures/rhizai/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/rhizai/index.js +283 -0
- package/dist/__tests__/fixtures/rhizai/index.js.map +1 -0
- package/dist/__tests__/unit/fixtures.test.d.ts +10 -0
- package/dist/__tests__/unit/fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/unit/fixtures.test.js +275 -0
- package/dist/__tests__/unit/fixtures.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/gather.test.d.ts +8 -0
- package/dist/__tests__/unit/handoff/gather.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/gather.test.js +176 -0
- package/dist/__tests__/unit/handoff/gather.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/interpret.test.d.ts +9 -0
- package/dist/__tests__/unit/handoff/interpret.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/interpret.test.js +370 -0
- package/dist/__tests__/unit/handoff/interpret.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/route.test.d.ts +8 -0
- package/dist/__tests__/unit/handoff/route.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/route.test.js +271 -0
- package/dist/__tests__/unit/handoff/route.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/scatter.test.d.ts +7 -0
- package/dist/__tests__/unit/handoff/scatter.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/scatter.test.js +54 -0
- package/dist/__tests__/unit/handoff/scatter.test.js.map +1 -0
- package/dist/__tests__/unit/resume.test.d.ts +8 -0
- package/dist/__tests__/unit/resume.test.d.ts.map +1 -0
- package/dist/__tests__/unit/resume.test.js +134 -0
- package/dist/__tests__/unit/resume.test.js.map +1 -0
- package/dist/__tests__/unit/status.test.d.ts +8 -0
- package/dist/__tests__/unit/status.test.d.ts.map +1 -0
- package/dist/__tests__/unit/status.test.js +164 -0
- package/dist/__tests__/unit/status.test.js.map +1 -0
- package/dist/__tests__/unit/target.test.d.ts +8 -0
- package/dist/__tests__/unit/target.test.d.ts.map +1 -0
- package/dist/__tests__/unit/target.test.js +116 -0
- package/dist/__tests__/unit/target.test.js.map +1 -0
- package/dist/__tests__/unit/traverse.test.d.ts +8 -0
- package/dist/__tests__/unit/traverse.test.d.ts.map +1 -0
- package/dist/__tests__/unit/traverse.test.js +143 -0
- package/dist/__tests__/unit/traverse.test.js.map +1 -0
- package/dist/__tests__/unit/validation/klados.test.d.ts +16 -0
- package/dist/__tests__/unit/validation/klados.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/klados.test.js +275 -0
- package/dist/__tests__/unit/validation/klados.test.js.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.d.ts +16 -0
- package/dist/__tests__/unit/validation/rhiza.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.js +612 -0
- package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -0
- package/dist/__tests__/unit/validation/runtime.test.d.ts +11 -0
- package/dist/__tests__/unit/validation/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/runtime.test.js +553 -0
- package/dist/__tests__/unit/validation/runtime.test.js.map +1 -0
- package/dist/__tests__/unit/worker/errors.test.d.ts +2 -0
- package/dist/__tests__/unit/worker/errors.test.d.ts.map +1 -0
- package/dist/__tests__/unit/worker/errors.test.js +226 -0
- package/dist/__tests__/unit/worker/errors.test.js.map +1 -0
- package/dist/__tests__/unit/worker/job.test.d.ts +2 -0
- package/dist/__tests__/unit/worker/job.test.d.ts.map +1 -0
- package/dist/__tests__/unit/worker/job.test.js +233 -0
- package/dist/__tests__/unit/worker/job.test.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/interface.d.ts +142 -0
- package/dist/client/interface.d.ts.map +1 -0
- package/dist/client/interface.js +8 -0
- package/dist/client/interface.js.map +1 -0
- package/dist/client/mock.d.ts +95 -0
- package/dist/client/mock.d.ts.map +1 -0
- package/dist/client/mock.js +795 -0
- package/dist/client/mock.js.map +1 -0
- package/dist/client/types.d.ts +344 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/handoff/gather-api.d.ts +60 -0
- package/dist/handoff/gather-api.d.ts.map +1 -0
- package/dist/handoff/gather-api.js +130 -0
- package/dist/handoff/gather-api.js.map +1 -0
- package/dist/handoff/gather.d.ts +59 -0
- package/dist/handoff/gather.d.ts.map +1 -0
- package/dist/handoff/gather.js +134 -0
- package/dist/handoff/gather.js.map +1 -0
- package/dist/handoff/index.d.ts +19 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +25 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/interpret.d.ts +79 -0
- package/dist/handoff/interpret.d.ts.map +1 -0
- package/dist/handoff/interpret.js +197 -0
- package/dist/handoff/interpret.js.map +1 -0
- package/dist/handoff/invoke.d.ts +82 -0
- package/dist/handoff/invoke.d.ts.map +1 -0
- package/dist/handoff/invoke.js +196 -0
- package/dist/handoff/invoke.js.map +1 -0
- package/dist/handoff/route.d.ts +25 -0
- package/dist/handoff/route.d.ts.map +1 -0
- package/dist/handoff/route.js +65 -0
- package/dist/handoff/route.js.map +1 -0
- package/dist/handoff/scatter-api.d.ts +62 -0
- package/dist/handoff/scatter-api.d.ts.map +1 -0
- package/dist/handoff/scatter-api.js +81 -0
- package/dist/handoff/scatter-api.js.map +1 -0
- package/dist/handoff/scatter.d.ts +19 -0
- package/dist/handoff/scatter.d.ts.map +1 -0
- package/dist/handoff/scatter.js +27 -0
- package/dist/handoff/scatter.js.map +1 -0
- package/dist/handoff/target.d.ts +16 -0
- package/dist/handoff/target.d.ts.map +1 -0
- package/dist/handoff/target.js +51 -0
- package/dist/handoff/target.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +52 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +70 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/writer.d.ts +63 -0
- package/dist/logging/writer.d.ts.map +1 -0
- package/dist/logging/writer.js +160 -0
- package/dist/logging/writer.js.map +1 -0
- package/dist/resume/index.d.ts +77 -0
- package/dist/resume/index.d.ts.map +1 -0
- package/dist/resume/index.js +110 -0
- package/dist/resume/index.js.map +1 -0
- package/dist/status/index.d.ts +54 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +107 -0
- package/dist/status/index.js.map +1 -0
- package/dist/traverse/index.d.ts +53 -0
- package/dist/traverse/index.d.ts.map +1 -0
- package/dist/traverse/index.js +142 -0
- package/dist/traverse/index.js.map +1 -0
- package/dist/types/batch.d.ts +53 -0
- package/dist/types/batch.d.ts.map +1 -0
- package/dist/types/batch.js +2 -0
- package/dist/types/batch.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/klados.d.ts +63 -0
- package/dist/types/klados.d.ts.map +1 -0
- package/dist/types/klados.js +2 -0
- package/dist/types/klados.js.map +1 -0
- package/dist/types/log.d.ts +107 -0
- package/dist/types/log.d.ts.map +1 -0
- package/dist/types/log.js +2 -0
- package/dist/types/log.js.map +1 -0
- package/dist/types/refs.d.ts +58 -0
- package/dist/types/refs.d.ts.map +1 -0
- package/dist/types/refs.js +43 -0
- package/dist/types/refs.js.map +1 -0
- package/dist/types/request.d.ts +69 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +2 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/response.d.ts +31 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +2 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/rhiza.d.ts +100 -0
- package/dist/types/rhiza.d.ts.map +1 -0
- package/dist/types/rhiza.js +2 -0
- package/dist/types/rhiza.js.map +1 -0
- package/dist/types/status.d.ts +84 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +2 -0
- package/dist/types/status.js.map +1 -0
- package/dist/utils/id.d.ts +15 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +25 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/validate-klados.d.ts +38 -0
- package/dist/validation/validate-klados.d.ts.map +1 -0
- package/dist/validation/validate-klados.js +139 -0
- package/dist/validation/validate-klados.js.map +1 -0
- package/dist/validation/validate-rhiza.d.ts +29 -0
- package/dist/validation/validate-rhiza.d.ts.map +1 -0
- package/dist/validation/validate-rhiza.js +382 -0
- package/dist/validation/validate-rhiza.js.map +1 -0
- package/dist/validation/validate-runtime.d.ts +28 -0
- package/dist/validation/validate-runtime.d.ts.map +1 -0
- package/dist/validation/validate-runtime.js +212 -0
- package/dist/validation/validate-runtime.js.map +1 -0
- package/dist/worker/errors.d.ts +77 -0
- package/dist/worker/errors.d.ts.map +1 -0
- package/dist/worker/errors.js +143 -0
- package/dist/worker/errors.js.map +1 -0
- package/dist/worker/index.d.ts +8 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/job.d.ts +150 -0
- package/dist/worker/job.d.ts.map +1 -0
- package/dist/worker/job.js +280 -0
- package/dist/worker/job.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for building workflow status from log chains.
|
|
5
|
+
* Status provides an overview of workflow execution progress.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { buildStatusFromLogs } from '../../status';
|
|
9
|
+
import { successfulLinearLogs, successfulScatterGatherLogs, partialErrorLogs, allErrorLogs, mixedErrorLogs, runningWorkflowLogs, singleNodeLogs, } from '../fixtures/logs';
|
|
10
|
+
describe('Status', () => {
|
|
11
|
+
describe('buildStatusFromLogs', () => {
|
|
12
|
+
describe('overall status', () => {
|
|
13
|
+
it('returns done when all leaves done', () => {
|
|
14
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
15
|
+
expect(status.status).toBe('done');
|
|
16
|
+
});
|
|
17
|
+
it('returns done for scatter-gather when complete', () => {
|
|
18
|
+
const status = buildStatusFromLogs(successfulScatterGatherLogs);
|
|
19
|
+
expect(status.status).toBe('done');
|
|
20
|
+
});
|
|
21
|
+
it('returns error when any leaf error', () => {
|
|
22
|
+
const status = buildStatusFromLogs(partialErrorLogs);
|
|
23
|
+
expect(status.status).toBe('error');
|
|
24
|
+
});
|
|
25
|
+
it('returns error when all leaves are errors', () => {
|
|
26
|
+
const status = buildStatusFromLogs(allErrorLogs);
|
|
27
|
+
expect(status.status).toBe('error');
|
|
28
|
+
});
|
|
29
|
+
it('returns running when any leaf running', () => {
|
|
30
|
+
const status = buildStatusFromLogs(runningWorkflowLogs);
|
|
31
|
+
expect(status.status).toBe('running');
|
|
32
|
+
});
|
|
33
|
+
it('returns done for single node workflow', () => {
|
|
34
|
+
const status = buildStatusFromLogs(singleNodeLogs);
|
|
35
|
+
expect(status.status).toBe('done');
|
|
36
|
+
});
|
|
37
|
+
it('returns unknown for empty logs', () => {
|
|
38
|
+
const status = buildStatusFromLogs([]);
|
|
39
|
+
expect(status.status).toBe('unknown');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('progress counters', () => {
|
|
43
|
+
it('calculates correct totals for linear workflow', () => {
|
|
44
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
45
|
+
expect(status.progress.total).toBe(3);
|
|
46
|
+
expect(status.progress.done).toBe(3);
|
|
47
|
+
expect(status.progress.error).toBe(0);
|
|
48
|
+
expect(status.progress.running).toBe(0);
|
|
49
|
+
});
|
|
50
|
+
it('calculates correct totals for scatter-gather workflow', () => {
|
|
51
|
+
const status = buildStatusFromLogs(successfulScatterGatherLogs);
|
|
52
|
+
expect(status.progress.total).toBe(5); // producer + 3 workers + aggregator
|
|
53
|
+
expect(status.progress.done).toBe(5);
|
|
54
|
+
});
|
|
55
|
+
it('counts errors correctly', () => {
|
|
56
|
+
const status = buildStatusFromLogs(partialErrorLogs);
|
|
57
|
+
expect(status.progress.error).toBe(1);
|
|
58
|
+
expect(status.progress.done).toBe(3); // producer + 2 successful workers
|
|
59
|
+
});
|
|
60
|
+
it('counts running correctly', () => {
|
|
61
|
+
const status = buildStatusFromLogs(runningWorkflowLogs);
|
|
62
|
+
expect(status.progress.running).toBe(1);
|
|
63
|
+
expect(status.progress.done).toBe(1);
|
|
64
|
+
});
|
|
65
|
+
it('calculates all error types', () => {
|
|
66
|
+
const status = buildStatusFromLogs(allErrorLogs);
|
|
67
|
+
expect(status.progress.error).toBe(3);
|
|
68
|
+
expect(status.progress.done).toBe(1); // Just the producer
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('current kladoi', () => {
|
|
72
|
+
it('identifies currently running kladoi', () => {
|
|
73
|
+
const status = buildStatusFromLogs(runningWorkflowLogs);
|
|
74
|
+
expect(status.currentKladoi).toContain('II01klados_b');
|
|
75
|
+
});
|
|
76
|
+
it('returns empty array when nothing running', () => {
|
|
77
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
78
|
+
expect(status.currentKladoi).toHaveLength(0);
|
|
79
|
+
});
|
|
80
|
+
it('includes all running kladoi', () => {
|
|
81
|
+
// Create logs with multiple running
|
|
82
|
+
const multipleRunning = [
|
|
83
|
+
...runningWorkflowLogs,
|
|
84
|
+
{
|
|
85
|
+
id: 'log_run_child2',
|
|
86
|
+
type: 'klados_log',
|
|
87
|
+
rhiza_id: 'II01rhiza_linear',
|
|
88
|
+
klados_id: 'II01klados_c',
|
|
89
|
+
job_id: 'job_run_3',
|
|
90
|
+
status: 'running',
|
|
91
|
+
started_at: '2025-01-01T00:01:00Z',
|
|
92
|
+
received: {
|
|
93
|
+
target: 'output_b',
|
|
94
|
+
from_logs: ['log_run_root'],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
const status = buildStatusFromLogs(multipleRunning);
|
|
99
|
+
expect(status.currentKladoi).toContain('II01klados_b');
|
|
100
|
+
expect(status.currentKladoi).toContain('II01klados_c');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('error summaries', () => {
|
|
104
|
+
it('collects error summaries', () => {
|
|
105
|
+
const status = buildStatusFromLogs(partialErrorLogs);
|
|
106
|
+
expect(status.errors).toBeDefined();
|
|
107
|
+
expect(status.errors).toHaveLength(1);
|
|
108
|
+
});
|
|
109
|
+
it('includes error details', () => {
|
|
110
|
+
const status = buildStatusFromLogs(partialErrorLogs);
|
|
111
|
+
expect(status.errors[0]).toHaveProperty('kladosId');
|
|
112
|
+
expect(status.errors[0]).toHaveProperty('jobId');
|
|
113
|
+
expect(status.errors[0]).toHaveProperty('code');
|
|
114
|
+
expect(status.errors[0]).toHaveProperty('message');
|
|
115
|
+
});
|
|
116
|
+
it('collects multiple errors', () => {
|
|
117
|
+
const status = buildStatusFromLogs(allErrorLogs);
|
|
118
|
+
expect(status.errors).toHaveLength(3);
|
|
119
|
+
});
|
|
120
|
+
it('returns empty array when no errors', () => {
|
|
121
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
122
|
+
expect(status.errors).toHaveLength(0);
|
|
123
|
+
});
|
|
124
|
+
it('includes retryable flag', () => {
|
|
125
|
+
const status = buildStatusFromLogs(mixedErrorLogs);
|
|
126
|
+
expect(status.errors).toHaveLength(2);
|
|
127
|
+
const retryable = status.errors.filter((e) => e.retryable);
|
|
128
|
+
const nonRetryable = status.errors.filter((e) => !e.retryable);
|
|
129
|
+
expect(retryable.length).toBe(1);
|
|
130
|
+
expect(nonRetryable.length).toBe(1);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('timing information', () => {
|
|
134
|
+
it('includes started_at from earliest log', () => {
|
|
135
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
136
|
+
expect(status.startedAt).toBe('2025-01-01T00:00:00Z');
|
|
137
|
+
});
|
|
138
|
+
it('includes completed_at from latest log when done', () => {
|
|
139
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
140
|
+
expect(status.completedAt).toBe('2025-01-01T00:03:00Z');
|
|
141
|
+
});
|
|
142
|
+
it('does not include completed_at when running', () => {
|
|
143
|
+
const status = buildStatusFromLogs(runningWorkflowLogs);
|
|
144
|
+
expect(status.completedAt).toBeUndefined();
|
|
145
|
+
});
|
|
146
|
+
it('includes completed_at when error (workflow terminated)', () => {
|
|
147
|
+
const status = buildStatusFromLogs(partialErrorLogs);
|
|
148
|
+
// Error workflow is still "terminal" even if with error
|
|
149
|
+
expect(status.completedAt).toBeDefined();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
describe('rhiza information', () => {
|
|
153
|
+
it('includes rhiza_id', () => {
|
|
154
|
+
const status = buildStatusFromLogs(successfulLinearLogs);
|
|
155
|
+
expect(status.rhizaId).toBe('II01rhiza_linear');
|
|
156
|
+
});
|
|
157
|
+
it('handles scatter-gather rhiza_id', () => {
|
|
158
|
+
const status = buildStatusFromLogs(successfulScatterGatherLogs);
|
|
159
|
+
expect(status.rhizaId).toBe('II01rhiza_scatter_gather');
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
//# sourceMappingURL=status.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/status.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/target.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Target Resolution Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for resolving targets from flow steps using route rules.
|
|
5
|
+
* Pure function - no API calls.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { resolveTarget } from '../../handoff/target';
|
|
9
|
+
import { ref } from '../../types';
|
|
10
|
+
describe('Target Resolution', () => {
|
|
11
|
+
describe('resolveTarget', () => {
|
|
12
|
+
describe('without route rules', () => {
|
|
13
|
+
it('returns default target for pass', () => {
|
|
14
|
+
const then = { pass: ref('target_a') };
|
|
15
|
+
const properties = { type: 'File' };
|
|
16
|
+
const result = resolveTarget(then, properties);
|
|
17
|
+
expect(result?.pi).toBe('target_a');
|
|
18
|
+
});
|
|
19
|
+
it('returns default target for scatter', () => {
|
|
20
|
+
const then = { scatter: ref('worker_klados') };
|
|
21
|
+
const properties = { type: 'File' };
|
|
22
|
+
const result = resolveTarget(then, properties);
|
|
23
|
+
expect(result?.pi).toBe('worker_klados');
|
|
24
|
+
});
|
|
25
|
+
it('returns default target for gather', () => {
|
|
26
|
+
const then = { gather: ref('aggregator_klados') };
|
|
27
|
+
const properties = { type: 'Result' };
|
|
28
|
+
const result = resolveTarget(then, properties);
|
|
29
|
+
expect(result?.pi).toBe('aggregator_klados');
|
|
30
|
+
});
|
|
31
|
+
it('returns null for done', () => {
|
|
32
|
+
const then = { done: true };
|
|
33
|
+
const properties = { type: 'File' };
|
|
34
|
+
const result = resolveTarget(then, properties);
|
|
35
|
+
expect(result).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe('with route rules', () => {
|
|
39
|
+
it('evaluates route rules in order', () => {
|
|
40
|
+
const then = {
|
|
41
|
+
pass: ref('default_handler'),
|
|
42
|
+
route: [
|
|
43
|
+
{ where: { property: 'type', equals: 'pdf' }, target: ref('pdf_handler') },
|
|
44
|
+
{ where: { property: 'type', equals: 'image' }, target: ref('image_handler') },
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
const properties = { type: 'pdf' };
|
|
48
|
+
const result = resolveTarget(then, properties);
|
|
49
|
+
expect(result?.pi).toBe('pdf_handler');
|
|
50
|
+
});
|
|
51
|
+
it('returns second rule target when first does not match', () => {
|
|
52
|
+
const then = {
|
|
53
|
+
pass: ref('default_handler'),
|
|
54
|
+
route: [
|
|
55
|
+
{ where: { property: 'type', equals: 'pdf' }, target: ref('pdf_handler') },
|
|
56
|
+
{ where: { property: 'type', equals: 'image' }, target: ref('image_handler') },
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
const properties = { type: 'image' };
|
|
60
|
+
const result = resolveTarget(then, properties);
|
|
61
|
+
expect(result?.pi).toBe('image_handler');
|
|
62
|
+
});
|
|
63
|
+
it('falls back to default when no rules match', () => {
|
|
64
|
+
const then = {
|
|
65
|
+
pass: ref('default_handler'),
|
|
66
|
+
route: [
|
|
67
|
+
{ where: { property: 'type', equals: 'pdf' }, target: ref('pdf_handler') },
|
|
68
|
+
{ where: { property: 'type', equals: 'image' }, target: ref('image_handler') },
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
const properties = { type: 'unknown' };
|
|
72
|
+
const result = resolveTarget(then, properties);
|
|
73
|
+
expect(result?.pi).toBe('default_handler');
|
|
74
|
+
});
|
|
75
|
+
it('works with scatter and route rules', () => {
|
|
76
|
+
const then = {
|
|
77
|
+
scatter: ref('default_worker'),
|
|
78
|
+
route: [
|
|
79
|
+
{ where: { property: 'priority', equals: 'high' }, target: ref('priority_worker') },
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
const properties = { priority: 'high' };
|
|
83
|
+
const result = resolveTarget(then, properties);
|
|
84
|
+
expect(result?.pi).toBe('priority_worker');
|
|
85
|
+
});
|
|
86
|
+
it('handles complex AND/OR route conditions', () => {
|
|
87
|
+
const then = {
|
|
88
|
+
pass: ref('default_handler'),
|
|
89
|
+
route: [
|
|
90
|
+
{
|
|
91
|
+
where: {
|
|
92
|
+
and: [
|
|
93
|
+
{ property: 'type', equals: 'file' },
|
|
94
|
+
{ or: [{ property: 'ext', equals: 'jpg' }, { property: 'ext', equals: 'png' }] },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
target: ref('image_handler'),
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
expect(resolveTarget(then, { type: 'file', ext: 'jpg' })?.pi).toBe('image_handler');
|
|
102
|
+
expect(resolveTarget(then, { type: 'file', ext: 'pdf' })?.pi).toBe('default_handler');
|
|
103
|
+
});
|
|
104
|
+
it('handles empty route array as no routing', () => {
|
|
105
|
+
const then = {
|
|
106
|
+
pass: ref('default_handler'),
|
|
107
|
+
route: [],
|
|
108
|
+
};
|
|
109
|
+
const properties = { type: 'anything' };
|
|
110
|
+
const result = resolveTarget(then, properties);
|
|
111
|
+
expect(result?.pi).toBe('default_handler');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=target.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/target.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/traverse.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Log Chain Traversal Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for traversing log chains to find leaves, errors, and build trees.
|
|
5
|
+
* Log chains represent the execution history of a workflow.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from 'vitest';
|
|
8
|
+
import { findLeaves, findErrorLeaves, buildLogTree, } from '../../traverse';
|
|
9
|
+
import { successfulLinearLogs, successfulScatterGatherLogs, partialErrorLogs, allErrorLogs, mixedErrorLogs, runningWorkflowLogs, singleNodeLogs, } from '../fixtures/logs';
|
|
10
|
+
describe('Log Chain Traversal', () => {
|
|
11
|
+
describe('findLeaves', () => {
|
|
12
|
+
it('finds terminal nodes (no children) in linear chain', () => {
|
|
13
|
+
const leaves = findLeaves(successfulLinearLogs);
|
|
14
|
+
expect(leaves).toHaveLength(1);
|
|
15
|
+
expect(leaves[0].klados_id).toBe('II01klados_c');
|
|
16
|
+
});
|
|
17
|
+
it('finds all leaves in scatter-gather chain', () => {
|
|
18
|
+
const leaves = findLeaves(successfulScatterGatherLogs);
|
|
19
|
+
// Should find the aggregator as the only leaf
|
|
20
|
+
expect(leaves).toHaveLength(1);
|
|
21
|
+
expect(leaves[0].klados_id).toBe('II01klados_aggregator');
|
|
22
|
+
});
|
|
23
|
+
it('finds multiple leaves when workers have errors', () => {
|
|
24
|
+
const leaves = findLeaves(partialErrorLogs);
|
|
25
|
+
// Error leaf + workers that completed + aggregator may not exist
|
|
26
|
+
expect(leaves.length).toBeGreaterThanOrEqual(1);
|
|
27
|
+
});
|
|
28
|
+
it('returns empty for empty log chain', () => {
|
|
29
|
+
const leaves = findLeaves([]);
|
|
30
|
+
expect(leaves).toHaveLength(0);
|
|
31
|
+
});
|
|
32
|
+
it('handles single-node chain', () => {
|
|
33
|
+
const leaves = findLeaves(singleNodeLogs);
|
|
34
|
+
expect(leaves).toHaveLength(1);
|
|
35
|
+
expect(leaves[0].id).toBe('log_single');
|
|
36
|
+
});
|
|
37
|
+
it('finds running logs as leaves', () => {
|
|
38
|
+
const leaves = findLeaves(runningWorkflowLogs);
|
|
39
|
+
// Running logs should be leaves since they haven't produced children yet
|
|
40
|
+
const runningLeaves = leaves.filter((l) => l.status === 'running');
|
|
41
|
+
expect(runningLeaves.length).toBeGreaterThan(0);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('findErrorLeaves', () => {
|
|
45
|
+
it('finds logs with status: error', () => {
|
|
46
|
+
const errorLeaves = findErrorLeaves(partialErrorLogs);
|
|
47
|
+
expect(errorLeaves).toHaveLength(1);
|
|
48
|
+
expect(errorLeaves[0].log.status).toBe('error');
|
|
49
|
+
});
|
|
50
|
+
it('returns empty for successful chain', () => {
|
|
51
|
+
const errorLeaves = findErrorLeaves(successfulLinearLogs);
|
|
52
|
+
expect(errorLeaves).toHaveLength(0);
|
|
53
|
+
});
|
|
54
|
+
it('finds all error leaves when multiple errors', () => {
|
|
55
|
+
const errorLeaves = findErrorLeaves(allErrorLogs);
|
|
56
|
+
expect(errorLeaves).toHaveLength(3);
|
|
57
|
+
errorLeaves.forEach((e) => {
|
|
58
|
+
expect(e.log.status).toBe('error');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
it('marks retryable based on error.retryable', () => {
|
|
62
|
+
const errorLeaves = findErrorLeaves(partialErrorLogs);
|
|
63
|
+
expect(errorLeaves[0].retryable).toBe(true);
|
|
64
|
+
expect(errorLeaves[0].log.error?.retryable).toBe(true);
|
|
65
|
+
});
|
|
66
|
+
it('marks non-retryable errors correctly', () => {
|
|
67
|
+
const errorLeaves = findErrorLeaves(allErrorLogs);
|
|
68
|
+
// Should have at least one non-retryable error
|
|
69
|
+
const nonRetryable = errorLeaves.filter((e) => !e.retryable);
|
|
70
|
+
expect(nonRetryable.length).toBeGreaterThan(0);
|
|
71
|
+
});
|
|
72
|
+
it('builds path from root to error', () => {
|
|
73
|
+
const errorLeaves = findErrorLeaves(partialErrorLogs);
|
|
74
|
+
expect(errorLeaves[0].path).toBeDefined();
|
|
75
|
+
expect(errorLeaves[0].path.length).toBeGreaterThan(0);
|
|
76
|
+
// Path should start with root klados
|
|
77
|
+
expect(errorLeaves[0].path[0]).toBe('II01klados_producer');
|
|
78
|
+
});
|
|
79
|
+
it('includes log entry in error leaf', () => {
|
|
80
|
+
const errorLeaves = findErrorLeaves(partialErrorLogs);
|
|
81
|
+
expect(errorLeaves[0].log).toBeDefined();
|
|
82
|
+
expect(errorLeaves[0].log.id).toBeDefined();
|
|
83
|
+
expect(errorLeaves[0].log.klados_id).toBeDefined();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('buildLogTree', () => {
|
|
87
|
+
it('builds tree from root for linear chain', () => {
|
|
88
|
+
const tree = buildLogTree(successfulLinearLogs);
|
|
89
|
+
expect(tree).not.toBeNull();
|
|
90
|
+
expect(tree.log.klados_id).toBe('II01klados_a');
|
|
91
|
+
expect(tree.children).toHaveLength(1);
|
|
92
|
+
expect(tree.children[0].log.klados_id).toBe('II01klados_b');
|
|
93
|
+
});
|
|
94
|
+
it('builds tree with depth 3 for linear chain', () => {
|
|
95
|
+
const tree = buildLogTree(successfulLinearLogs);
|
|
96
|
+
expect(tree).not.toBeNull();
|
|
97
|
+
expect(tree.children).toHaveLength(1);
|
|
98
|
+
expect(tree.children[0].children).toHaveLength(1);
|
|
99
|
+
expect(tree.children[0].children[0].children).toHaveLength(0);
|
|
100
|
+
});
|
|
101
|
+
it('handles scatter (multiple children)', () => {
|
|
102
|
+
const tree = buildLogTree(successfulScatterGatherLogs);
|
|
103
|
+
expect(tree).not.toBeNull();
|
|
104
|
+
// Root should have 3 children (scattered workers)
|
|
105
|
+
expect(tree.children.length).toBe(3);
|
|
106
|
+
});
|
|
107
|
+
it('returns null for empty logs', () => {
|
|
108
|
+
const tree = buildLogTree([]);
|
|
109
|
+
expect(tree).toBeNull();
|
|
110
|
+
});
|
|
111
|
+
it('handles single node chain', () => {
|
|
112
|
+
const tree = buildLogTree(singleNodeLogs);
|
|
113
|
+
expect(tree).not.toBeNull();
|
|
114
|
+
expect(tree.children).toHaveLength(0);
|
|
115
|
+
});
|
|
116
|
+
it('includes log entry in each node', () => {
|
|
117
|
+
const tree = buildLogTree(successfulLinearLogs);
|
|
118
|
+
expect(tree).not.toBeNull();
|
|
119
|
+
expect(tree.log).toBeDefined();
|
|
120
|
+
expect(tree.log.id).toBeDefined();
|
|
121
|
+
expect(tree.log.status).toBeDefined();
|
|
122
|
+
});
|
|
123
|
+
it('maintains parent-child relationships correctly', () => {
|
|
124
|
+
const tree = buildLogTree(successfulScatterGatherLogs);
|
|
125
|
+
expect(tree).not.toBeNull();
|
|
126
|
+
// Each worker should have the aggregator as child (after gather)
|
|
127
|
+
// or the aggregator is connected to all workers via gather
|
|
128
|
+
const aggregatorLogs = successfulScatterGatherLogs.filter((l) => l.klados_id === 'II01klados_aggregator');
|
|
129
|
+
expect(aggregatorLogs).toHaveLength(1);
|
|
130
|
+
});
|
|
131
|
+
it('handles mixed success/error logs', () => {
|
|
132
|
+
const tree = buildLogTree(mixedErrorLogs);
|
|
133
|
+
expect(tree).not.toBeNull();
|
|
134
|
+
// Tree should still be buildable with errors
|
|
135
|
+
function countNodes(node) {
|
|
136
|
+
return 1 + node.children.reduce((acc, child) => acc + countNodes(child), 0);
|
|
137
|
+
}
|
|
138
|
+
const nodeCount = countNodes(tree);
|
|
139
|
+
expect(nodeCount).toBeGreaterThan(1);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=traverse.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traverse.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/traverse.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Klados Validation Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for validateKladosProperties() which validates klados entity properties
|
|
5
|
+
* at creation/update time (static validation).
|
|
6
|
+
*
|
|
7
|
+
* Validation Rules:
|
|
8
|
+
* - endpoint: Required, must be valid URL
|
|
9
|
+
* - accepts.types: Required, non-empty array
|
|
10
|
+
* - accepts.cardinality: Must be 'one' or 'many'
|
|
11
|
+
* - produces.types: Required, non-empty array
|
|
12
|
+
* - produces.cardinality: Must be 'one' or 'many'
|
|
13
|
+
* - actions_required: Required, non-empty array
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=klados.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"klados.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/unit/validation/klados.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|