claude-flow-novice 2.15.6 → 2.15.8
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/.claude/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +1 -1
- package/.claude/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +13 -11
- package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
- package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
- package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +87 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +103 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/iteration-manager.ts +45 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
- package/.claude/skills/cfn-loop-orchestration/src/helpers/timeout-calculator.ts +41 -0
- package/.claude/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
- package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +197 -0
- package/.claude/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
- package/.claude/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
- package/.claude/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
- package/.claude/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
- package/.claude/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
- package/.claude/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
- package/.claude/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
- package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
- package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
- package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +13 -72
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +5 -65
- package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +465 -508
- package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +733 -743
- package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +13 -79
- package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +13 -18
- package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +13 -18
- package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +13 -18
- package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +15 -17
- package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +15 -17
- package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +15 -14
- package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -17
- package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -17
- package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +15 -17
- package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +23 -30
- package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +13 -18
- package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +13 -18
- package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +312 -317
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +23 -20
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +23 -20
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +23 -20
- package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +23 -20
- package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +15 -20
- package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +15 -20
- package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +718 -737
- package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +817 -828
- package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +15 -20
- package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +8 -9
- package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +668 -684
- package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +15 -20
- package/claude-assets/agents/cfn-dev-team/testers/tester.md +248 -253
- package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +13 -18
- package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +13 -18
- package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +13 -18
- package/claude-assets/cfn-extras/agents/google-sheets/google-sheets-coordinator.md +1 -1
- package/claude-assets/cfn-extras/docs/GOOGLE_SHEETS_CFN_LOOP.md +13 -11
- package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
- package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/consensus.ts +87 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/deliverable-verifier.ts +103 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/iteration-manager.ts +45 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
- package/claude-assets/skills/cfn-loop-orchestration/src/helpers/timeout-calculator.ts +41 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +197 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
- package/claude-assets/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
- package/claude-assets/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
- package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
- package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
- package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/package.json +1 -1
- package/scripts/clean-agent-profiles.sh +112 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { parseTestResults } from '../src/helpers/parse-test-results';
|
|
2
|
+
|
|
3
|
+
describe('parseTestResults', () => {
|
|
4
|
+
describe('Jest parser', () => {
|
|
5
|
+
it('should parse passing Jest output', () => {
|
|
6
|
+
const jestOutput = `
|
|
7
|
+
PASS tests/example.test.ts
|
|
8
|
+
✓ test case 1 (5 ms)
|
|
9
|
+
✓ test case 2 (3 ms)
|
|
10
|
+
|
|
11
|
+
Test Suites: 1 passed, 1 total
|
|
12
|
+
Tests: 2 passed, 2 total
|
|
13
|
+
Time: 1.234 s
|
|
14
|
+
`;
|
|
15
|
+
|
|
16
|
+
const result = parseTestResults('jest', jestOutput);
|
|
17
|
+
|
|
18
|
+
expect(result.framework).toBe('jest');
|
|
19
|
+
expect(result.total).toBe(2);
|
|
20
|
+
expect(result.passed).toBe(2);
|
|
21
|
+
expect(result.failed).toBe(0);
|
|
22
|
+
expect(result.skipped).toBe(0);
|
|
23
|
+
expect(result.passRate).toBeCloseTo(1.0, 4);
|
|
24
|
+
expect(result.durationMs).toBeGreaterThan(0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should parse failing Jest output', () => {
|
|
28
|
+
const jestOutput = `
|
|
29
|
+
FAIL tests/example.test.ts
|
|
30
|
+
✓ test case 1 (5 ms)
|
|
31
|
+
✕ test case 2 (3 ms)
|
|
32
|
+
✕ test case 3 (2 ms)
|
|
33
|
+
|
|
34
|
+
● test case 2
|
|
35
|
+
● test case 3
|
|
36
|
+
|
|
37
|
+
Test Suites: 1 failed, 1 total
|
|
38
|
+
Tests: 1 passed, 2 failed, 3 total
|
|
39
|
+
Time: 0.567 s
|
|
40
|
+
`;
|
|
41
|
+
|
|
42
|
+
const result = parseTestResults('jest', jestOutput);
|
|
43
|
+
|
|
44
|
+
expect(result.framework).toBe('jest');
|
|
45
|
+
expect(result.total).toBe(3);
|
|
46
|
+
expect(result.passed).toBe(1);
|
|
47
|
+
expect(result.failed).toBe(2);
|
|
48
|
+
expect(result.passRate).toBeCloseTo(0.3333, 4);
|
|
49
|
+
expect(result.failedTestNames).toEqual(['test case 2', 'test case 3']);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('should handle Jest output with skipped tests', () => {
|
|
53
|
+
const jestOutput = `
|
|
54
|
+
Tests: 2 passed, 1 skipped, 3 total
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const result = parseTestResults('jest', jestOutput);
|
|
58
|
+
|
|
59
|
+
expect(result.total).toBe(3);
|
|
60
|
+
expect(result.passed).toBe(2);
|
|
61
|
+
expect(result.skipped).toBe(1);
|
|
62
|
+
expect(result.passRate).toBeCloseTo(0.6667, 4);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should handle invalid Jest output', () => {
|
|
66
|
+
const result = parseTestResults('jest', 'invalid output');
|
|
67
|
+
|
|
68
|
+
expect(result.total).toBe(0);
|
|
69
|
+
expect(result.passed).toBe(0);
|
|
70
|
+
expect(result.failed).toBe(0);
|
|
71
|
+
expect(result.passRate).toBe(0.0);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('Mocha parser', () => {
|
|
76
|
+
it('should parse passing Mocha output', () => {
|
|
77
|
+
const mochaOutput = `
|
|
78
|
+
✓ test case 1
|
|
79
|
+
✓ test case 2
|
|
80
|
+
|
|
81
|
+
2 passing (150ms)
|
|
82
|
+
`;
|
|
83
|
+
|
|
84
|
+
const result = parseTestResults('mocha', mochaOutput);
|
|
85
|
+
|
|
86
|
+
expect(result.framework).toBe('mocha');
|
|
87
|
+
expect(result.total).toBe(2);
|
|
88
|
+
expect(result.passed).toBe(2);
|
|
89
|
+
expect(result.failed).toBe(0);
|
|
90
|
+
expect(result.passRate).toBe(1.0);
|
|
91
|
+
expect(result.durationMs).toBe(150);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should parse failing Mocha output', () => {
|
|
95
|
+
const mochaOutput = `
|
|
96
|
+
✓ test case 1
|
|
97
|
+
1) test case 2: AssertionError
|
|
98
|
+
2) test case 3: Error
|
|
99
|
+
|
|
100
|
+
1 passing (100ms)
|
|
101
|
+
2 failing
|
|
102
|
+
`;
|
|
103
|
+
|
|
104
|
+
const result = parseTestResults('mocha', mochaOutput);
|
|
105
|
+
|
|
106
|
+
expect(result.total).toBe(3);
|
|
107
|
+
expect(result.passed).toBe(1);
|
|
108
|
+
expect(result.failed).toBe(2);
|
|
109
|
+
expect(result.passRate).toBeCloseTo(0.3333, 4);
|
|
110
|
+
expect(result.failedTestNames).toHaveLength(2);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should parse Mocha output with pending tests', () => {
|
|
114
|
+
const mochaOutput = `
|
|
115
|
+
2 passing (50ms)
|
|
116
|
+
1 pending
|
|
117
|
+
`;
|
|
118
|
+
|
|
119
|
+
const result = parseTestResults('mocha', mochaOutput);
|
|
120
|
+
|
|
121
|
+
expect(result.total).toBe(3);
|
|
122
|
+
expect(result.passed).toBe(2);
|
|
123
|
+
expect(result.skipped).toBe(1);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should handle time in seconds', () => {
|
|
127
|
+
const mochaOutput = `
|
|
128
|
+
5 passing (2.5s)
|
|
129
|
+
`;
|
|
130
|
+
|
|
131
|
+
const result = parseTestResults('mocha', mochaOutput);
|
|
132
|
+
|
|
133
|
+
expect(result.durationMs).toBe(2500);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('Pytest parser', () => {
|
|
138
|
+
it('should parse passing pytest output', () => {
|
|
139
|
+
const pytestOutput = `
|
|
140
|
+
test_example.py::test_case_1 PASSED
|
|
141
|
+
test_example.py::test_case_2 PASSED
|
|
142
|
+
|
|
143
|
+
====== 2 passed in 0.45s ======
|
|
144
|
+
`;
|
|
145
|
+
|
|
146
|
+
const result = parseTestResults('pytest', pytestOutput);
|
|
147
|
+
|
|
148
|
+
expect(result.framework).toBe('pytest');
|
|
149
|
+
expect(result.total).toBe(2);
|
|
150
|
+
expect(result.passed).toBe(2);
|
|
151
|
+
expect(result.failed).toBe(0);
|
|
152
|
+
expect(result.passRate).toBe(1.0);
|
|
153
|
+
expect(result.durationMs).toBe(450);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should parse failing pytest output', () => {
|
|
157
|
+
const pytestOutput = `
|
|
158
|
+
test_example.py::test_case_1 PASSED
|
|
159
|
+
test_example.py::test_case_2 FAILED
|
|
160
|
+
|
|
161
|
+
FAILED test_example.py::test_case_2
|
|
162
|
+
|
|
163
|
+
1 passed, 1 failed in 1.23s
|
|
164
|
+
`;
|
|
165
|
+
|
|
166
|
+
const result = parseTestResults('pytest', pytestOutput);
|
|
167
|
+
|
|
168
|
+
expect(result.total).toBe(2);
|
|
169
|
+
expect(result.passed).toBe(1);
|
|
170
|
+
expect(result.failed).toBe(1);
|
|
171
|
+
expect(result.passRate).toBe(0.5);
|
|
172
|
+
expect(result.failedTestNames).toContain('test_example.py::test_case_2');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should parse pytest output with skipped tests', () => {
|
|
176
|
+
const pytestOutput = `
|
|
177
|
+
2 passed, 1 skipped in 0.5s
|
|
178
|
+
`;
|
|
179
|
+
|
|
180
|
+
const result = parseTestResults('pytest', pytestOutput);
|
|
181
|
+
|
|
182
|
+
expect(result.total).toBe(3);
|
|
183
|
+
expect(result.skipped).toBe(1);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
describe('TAP parser', () => {
|
|
188
|
+
it('should parse passing TAP output', () => {
|
|
189
|
+
const tapOutput = `
|
|
190
|
+
1..3
|
|
191
|
+
ok 1 - test case 1
|
|
192
|
+
ok 2 - test case 2
|
|
193
|
+
ok 3 - test case 3
|
|
194
|
+
`;
|
|
195
|
+
|
|
196
|
+
const result = parseTestResults('tap', tapOutput);
|
|
197
|
+
|
|
198
|
+
expect(result.framework).toBe('tap');
|
|
199
|
+
expect(result.total).toBe(3);
|
|
200
|
+
expect(result.passed).toBe(3);
|
|
201
|
+
expect(result.failed).toBe(0);
|
|
202
|
+
expect(result.passRate).toBe(1.0);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should parse failing TAP output', () => {
|
|
206
|
+
const tapOutput = `
|
|
207
|
+
1..4
|
|
208
|
+
ok 1 - test case 1
|
|
209
|
+
not ok 2 - test case 2
|
|
210
|
+
ok 3 - test case 3
|
|
211
|
+
not ok 4 - test case 4
|
|
212
|
+
`;
|
|
213
|
+
|
|
214
|
+
const result = parseTestResults('tap', tapOutput);
|
|
215
|
+
|
|
216
|
+
expect(result.total).toBe(4);
|
|
217
|
+
expect(result.passed).toBe(2);
|
|
218
|
+
expect(result.failed).toBe(2);
|
|
219
|
+
expect(result.passRate).toBe(0.5);
|
|
220
|
+
expect(result.failedTestNames).toHaveLength(2);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it('should parse TAP output with skipped tests', () => {
|
|
224
|
+
const tapOutput = `
|
|
225
|
+
1..3
|
|
226
|
+
ok 1 - test case 1
|
|
227
|
+
ok 2 - test case 2 # SKIP not implemented
|
|
228
|
+
ok 3 - test case 3
|
|
229
|
+
`;
|
|
230
|
+
|
|
231
|
+
const result = parseTestResults('tap', tapOutput);
|
|
232
|
+
|
|
233
|
+
expect(result.total).toBe(3);
|
|
234
|
+
expect(result.passed).toBe(2);
|
|
235
|
+
expect(result.skipped).toBe(1);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe('Go test parser', () => {
|
|
240
|
+
it('should parse passing Go test output', () => {
|
|
241
|
+
const goOutput = `
|
|
242
|
+
--- PASS: TestExample1 (0.00s)
|
|
243
|
+
--- PASS: TestExample2 (0.01s)
|
|
244
|
+
PASS
|
|
245
|
+
ok example/package 0.123s
|
|
246
|
+
`;
|
|
247
|
+
|
|
248
|
+
const result = parseTestResults('go', goOutput);
|
|
249
|
+
|
|
250
|
+
expect(result.framework).toBe('go');
|
|
251
|
+
expect(result.total).toBe(2);
|
|
252
|
+
expect(result.passed).toBe(2);
|
|
253
|
+
expect(result.failed).toBe(0);
|
|
254
|
+
expect(result.passRate).toBe(1.0);
|
|
255
|
+
expect(result.durationMs).toBe(123);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it('should parse failing Go test output', () => {
|
|
259
|
+
const goOutput = `
|
|
260
|
+
--- PASS: TestExample1 (0.00s)
|
|
261
|
+
--- FAIL: TestExample2 (0.01s)
|
|
262
|
+
--- FAIL: TestExample3 (0.00s)
|
|
263
|
+
FAIL
|
|
264
|
+
ok example/package 0.234s
|
|
265
|
+
`;
|
|
266
|
+
|
|
267
|
+
const result = parseTestResults('go', goOutput);
|
|
268
|
+
|
|
269
|
+
expect(result.total).toBe(3);
|
|
270
|
+
expect(result.passed).toBe(1);
|
|
271
|
+
expect(result.failed).toBe(2);
|
|
272
|
+
expect(result.passRate).toBeCloseTo(0.3333, 4);
|
|
273
|
+
expect(result.failedTestNames).toHaveLength(2);
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it('should parse Go output with skipped tests', () => {
|
|
277
|
+
const goOutput = `
|
|
278
|
+
--- PASS: TestExample1 (0.00s)
|
|
279
|
+
--- SKIP: TestExample2 (0.00s)
|
|
280
|
+
ok example/package 0.1s
|
|
281
|
+
`;
|
|
282
|
+
|
|
283
|
+
const result = parseTestResults('go', goOutput);
|
|
284
|
+
|
|
285
|
+
expect(result.total).toBe(2);
|
|
286
|
+
expect(result.passed).toBe(1);
|
|
287
|
+
expect(result.skipped).toBe(1);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
describe('Auto-detect framework', () => {
|
|
292
|
+
it('should auto-detect Jest output', () => {
|
|
293
|
+
const jestOutput = `
|
|
294
|
+
Test Suites: 1 passed, 1 total
|
|
295
|
+
Tests: 5 passed, 5 total
|
|
296
|
+
`;
|
|
297
|
+
|
|
298
|
+
const result = parseTestResults('auto', jestOutput);
|
|
299
|
+
|
|
300
|
+
expect(result.framework).toBe('jest');
|
|
301
|
+
expect(result.total).toBe(5);
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
it('should auto-detect Mocha output', () => {
|
|
305
|
+
const mochaOutput = `
|
|
306
|
+
3 passing (100ms)
|
|
307
|
+
1 failing
|
|
308
|
+
`;
|
|
309
|
+
|
|
310
|
+
const result = parseTestResults('auto', mochaOutput);
|
|
311
|
+
|
|
312
|
+
expect(result.framework).toBe('mocha');
|
|
313
|
+
expect(result.total).toBe(4);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('should auto-detect pytest output', () => {
|
|
317
|
+
const pytestOutput = `
|
|
318
|
+
====== 5 passed in 1.2s ======
|
|
319
|
+
`;
|
|
320
|
+
|
|
321
|
+
const result = parseTestResults('auto', pytestOutput);
|
|
322
|
+
|
|
323
|
+
expect(result.framework).toBe('pytest');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('should auto-detect TAP output', () => {
|
|
327
|
+
const tapOutput = `
|
|
328
|
+
1..10
|
|
329
|
+
ok 1 - test
|
|
330
|
+
`;
|
|
331
|
+
|
|
332
|
+
const result = parseTestResults('auto', tapOutput);
|
|
333
|
+
|
|
334
|
+
expect(result.framework).toBe('tap');
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
it('should auto-detect Go test output', () => {
|
|
338
|
+
const goOutput = `
|
|
339
|
+
--- PASS: TestExample (0.00s)
|
|
340
|
+
PASS
|
|
341
|
+
`;
|
|
342
|
+
|
|
343
|
+
const result = parseTestResults('auto', goOutput);
|
|
344
|
+
|
|
345
|
+
expect(result.framework).toBe('go');
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
it('should return unknown for unrecognized output', () => {
|
|
349
|
+
const result = parseTestResults('auto', 'completely random output');
|
|
350
|
+
|
|
351
|
+
expect(result.framework).toBe('unknown');
|
|
352
|
+
expect(result.total).toBe(0);
|
|
353
|
+
});
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
describe('Edge cases', () => {
|
|
357
|
+
it('should handle empty output', () => {
|
|
358
|
+
const result = parseTestResults('jest', '');
|
|
359
|
+
|
|
360
|
+
expect(result.total).toBe(0);
|
|
361
|
+
expect(result.passRate).toBe(0.0);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
it('should handle zero tests', () => {
|
|
365
|
+
const jestOutput = `
|
|
366
|
+
Tests: 0 total
|
|
367
|
+
`;
|
|
368
|
+
|
|
369
|
+
const result = parseTestResults('jest', jestOutput);
|
|
370
|
+
|
|
371
|
+
expect(result.total).toBe(0);
|
|
372
|
+
expect(result.passRate).toBe(0.0);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it('should preserve raw output', () => {
|
|
376
|
+
const rawOutput = 'test output here';
|
|
377
|
+
const result = parseTestResults('jest', rawOutput);
|
|
378
|
+
|
|
379
|
+
expect(result.raw).toBe(rawOutput);
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
});
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeout Calculator Tests
|
|
3
|
+
* Tests for calculating mode and phase-specific timeouts
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { calculateTimeout, Mode } from '../src/helpers/timeout-calculator';
|
|
7
|
+
|
|
8
|
+
describe('timeout-calculator', () => {
|
|
9
|
+
describe('mode-based timeouts', () => {
|
|
10
|
+
it('should calculate timeout for mvp mode', () => {
|
|
11
|
+
const timeout = calculateTimeout({ mode: 'mvp' });
|
|
12
|
+
expect(timeout).toBe(1800); // 30 min
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should calculate timeout for standard mode', () => {
|
|
16
|
+
const timeout = calculateTimeout({ mode: 'standard' });
|
|
17
|
+
expect(timeout).toBe(3600); // 60 min
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should calculate timeout for enterprise mode', () => {
|
|
21
|
+
const timeout = calculateTimeout({ mode: 'enterprise' });
|
|
22
|
+
expect(timeout).toBe(7200); // 120 min
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('phase multipliers', () => {
|
|
27
|
+
it('should apply phase-1 multiplier (1x)', () => {
|
|
28
|
+
const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-1' });
|
|
29
|
+
expect(timeout).toBe(3600); // 60 min * 1.0
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should apply phase-2 multiplier (1.5x)', () => {
|
|
33
|
+
const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-2' });
|
|
34
|
+
expect(timeout).toBe(5400); // 60 min * 1.5
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('should apply phase-3 multiplier (2x)', () => {
|
|
38
|
+
const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-3' });
|
|
39
|
+
expect(timeout).toBe(7200); // 60 min * 2.0
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should apply phase-4 multiplier (1.0x)', () => {
|
|
43
|
+
const timeout = calculateTimeout({ mode: 'standard', phase: 'phase-4' });
|
|
44
|
+
expect(timeout).toBe(3600); // 60 min * 1.0
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('combined mode and phase calculations', () => {
|
|
49
|
+
it('should calculate mvp mode with phase-2', () => {
|
|
50
|
+
const timeout = calculateTimeout({ mode: 'mvp', phase: 'phase-2' });
|
|
51
|
+
expect(timeout).toBe(2700); // 30 min * 1.5
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should calculate mvp mode with phase-3', () => {
|
|
55
|
+
const timeout = calculateTimeout({ mode: 'mvp', phase: 'phase-3' });
|
|
56
|
+
expect(timeout).toBe(3600); // 30 min * 2.0
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should calculate enterprise mode with phase-2', () => {
|
|
60
|
+
const timeout = calculateTimeout({ mode: 'enterprise', phase: 'phase-2' });
|
|
61
|
+
expect(timeout).toBe(10800); // 120 min * 1.5
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('should calculate enterprise mode with phase-3', () => {
|
|
65
|
+
const timeout = calculateTimeout({ mode: 'enterprise', phase: 'phase-3' });
|
|
66
|
+
expect(timeout).toBe(14400); // 120 min * 2.0
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
describe('edge cases', () => {
|
|
71
|
+
it('should use base timeout when no phase specified', () => {
|
|
72
|
+
const timeout = calculateTimeout({ mode: 'standard' });
|
|
73
|
+
expect(timeout).toBe(3600); // No multiplier
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('should use base timeout for unknown phase', () => {
|
|
77
|
+
const timeout = calculateTimeout({ mode: 'standard', phase: 'unknown-phase' });
|
|
78
|
+
expect(timeout).toBe(3600); // Default multiplier = 1.0
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('should handle phase with different casing', () => {
|
|
82
|
+
const timeout = calculateTimeout({ mode: 'standard', phase: 'PHASE-2' });
|
|
83
|
+
expect(timeout).toBe(5400); // Case-insensitive
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
describe('timeout consistency', () => {
|
|
88
|
+
it('should return same timeout for same inputs', () => {
|
|
89
|
+
const timeout1 = calculateTimeout({ mode: 'standard', phase: 'phase-2' });
|
|
90
|
+
const timeout2 = calculateTimeout({ mode: 'standard', phase: 'phase-2' });
|
|
91
|
+
expect(timeout1).toBe(timeout2);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('should return integer values', () => {
|
|
95
|
+
const modes: Mode[] = ['mvp', 'standard', 'enterprise'];
|
|
96
|
+
const phases = ['phase-1', 'phase-2', 'phase-3', 'phase-4'];
|
|
97
|
+
|
|
98
|
+
modes.forEach(mode => {
|
|
99
|
+
phases.forEach(phase => {
|
|
100
|
+
const timeout = calculateTimeout({ mode, phase });
|
|
101
|
+
expect(Number.isInteger(timeout)).toBe(true);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe('timeout ranges', () => {
|
|
108
|
+
it('should have minimum timeout of 1800 seconds (30 min)', () => {
|
|
109
|
+
const timeout = calculateTimeout({ mode: 'mvp' });
|
|
110
|
+
expect(timeout).toBeGreaterThanOrEqual(1800);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should have maximum timeout of 14400 seconds (240 min)', () => {
|
|
114
|
+
const timeout = calculateTimeout({ mode: 'enterprise', phase: 'phase-3' });
|
|
115
|
+
expect(timeout).toBeLessThanOrEqual(14400);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|