fix(regression): parsePest handles JSON output from pest --parallel
pest --parallel emits a single JSON line {"tool":"pest","tests":N,"passed":N,"skipped":N,...}
instead of human-readable text; the old regex-only parser returned 0/0/0sk/0 for every
parallel run. Added JSON-first branch with regex fallback; 3 new unit tests cover the
JSON path (passed+skipped, with failures, no skipped field).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,18 @@ export function parseExit(label, code) {
|
||||
|
||||
// ── pure: test-count parsers ───────────────────────────────────────
|
||||
export function parsePest(stdout) {
|
||||
// pest --parallel emits a single JSON line: {"tool":"pest","result":...,"tests":N,"passed":N,"skipped":N,...}
|
||||
const jsonMatch = stdout.match(/\{"tool"\s*:\s*"pest"[^}]+\}/);
|
||||
if (jsonMatch) {
|
||||
try {
|
||||
const j = JSON.parse(jsonMatch[0]);
|
||||
const passed = Number(j.passed ?? 0);
|
||||
const skipped = Number(j.skipped ?? 0);
|
||||
const total = Number(j.tests ?? passed + skipped);
|
||||
const failed = total - passed - skipped;
|
||||
return `Pest ${total}/${passed}/${skipped}sk/${Math.max(0, failed)}`;
|
||||
} catch { /* fall through to regex */ }
|
||||
}
|
||||
const passed = Number(stdout.match(/(\d+)\s+passed/)?.[1] ?? 0);
|
||||
const skipped = Number(stdout.match(/(\d+)\s+skipped/)?.[1] ?? 0);
|
||||
const failed = Number(stdout.match(/(\d+)\s+failed/)?.[1] ?? 0);
|
||||
|
||||
@@ -44,6 +44,18 @@ test('parsePest: with failures', () => {
|
||||
test('parsePest: passed only → zeros for skipped/failed', () => {
|
||||
assert.equal(parsePest(' Tests: 19 passed (44 assertions)'), 'Pest 19/19/0sk/0');
|
||||
});
|
||||
test('parsePest: JSON format (pest --parallel) passed + skipped', () => {
|
||||
const out = '{"tool":"pest","result":"passed","tests":793,"passed":790,"assertions":2391,"duration_ms":32200,"skipped":3}';
|
||||
assert.equal(parsePest(out), 'Pest 793/790/3sk/0');
|
||||
});
|
||||
test('parsePest: JSON format with failures', () => {
|
||||
const out = '{"tool":"pest","result":"failed","tests":793,"passed":788,"assertions":2380,"duration_ms":31000,"skipped":3}';
|
||||
assert.equal(parsePest(out), 'Pest 793/788/3sk/2');
|
||||
});
|
||||
test('parsePest: JSON format no skipped', () => {
|
||||
const out = '{"tool":"pest","result":"passed","tests":19,"passed":19,"assertions":44,"duration_ms":1711}';
|
||||
assert.equal(parsePest(out), 'Pest 19/19/0sk/0');
|
||||
});
|
||||
|
||||
test('parseVitest: files + passed + skipped', () => {
|
||||
const out = ' Test Files 92 passed (92)\n Tests 774 passed | 3 skipped (777)\n Duration 12.6s';
|
||||
|
||||
Reference in New Issue
Block a user