diff --git a/scripts/summarize-jest.js b/scripts/summarize-jest.js index d705ebd..7cbb283 100644 --- a/scripts/summarize-jest.js +++ b/scripts/summarize-jest.js @@ -12,8 +12,24 @@ if (!fs.existsSync(resultsPath)) { process.exit(0); } -const raw = fs.readFileSync(resultsPath, 'utf-8'); -const data = JSON.parse(raw); +// Existing but unreadable is a separate case from absent, and it was the one +// that could still fail the job. `--forceExit` can end the process around the +// write and leave a partial file, and a suite that fails to *run* rather than +// to assert produces a shape the renderer below did not expect. Either crashed +// the script, which failed a step named for summarising and buried the real +// failure — the exact misdirection #142 fixed once already. See #178. +// +// The reason is reported rather than swallowed: "could not read the results +// file" plus the parse error is diagnostic, where a silent empty summary is not. +let data; +try { + data = JSON.parse(fs.readFileSync(resultsPath, 'utf-8')); +} catch (err) { + const why = `Could not read \`${resultsPath}\` — ${err.message}`; + report([`## ${label || 'Test'} Results`, '', why, '']); + console.log(`${label || 'Test'}: ${why}`); + process.exit(0); +} const lines = []; lines.push(`## ${label || 'Test'} Results`); @@ -29,8 +45,10 @@ lines.push(''); if (data.numFailedTests > 0) { lines.push('### Failures'); lines.push(''); - for (const suite of data.testResults) { - for (const t of suite.testResults) { + // Defensive at every level, like summarize-playwright.js's traversal: a suite + // that failed to run can arrive without the array this walks. + for (const suite of data.testResults || []) { + for (const t of suite.testResults || []) { if (t.status === 'failed') { lines.push(`- **${t.fullName}**`); const msg = t.failureMessages && t.failureMessages[0] diff --git a/scripts/summarize-playwright.js b/scripts/summarize-playwright.js index 82fe5bd..62d30cd 100644 --- a/scripts/summarize-playwright.js +++ b/scripts/summarize-playwright.js @@ -12,8 +12,20 @@ if (!fs.existsSync(resultsPath)) { process.exit(0); } -const raw = fs.readFileSync(resultsPath, 'utf-8'); -const data = JSON.parse(raw); +// The traversal below is defensive at every level; reading was not. A run +// killed part way through leaves a file that exists and does not parse, and +// crashing on it fails a step named for summarising rather than for testing. +// See #178. +let data; +try { + data = JSON.parse(fs.readFileSync(resultsPath, 'utf-8')); +} catch (err) { + const why = `Could not read \`${resultsPath}\` — ${err.message}`; + report(['## Playwright E2E Results', '', why, '']); + console.log(`Playwright: ${why}`); + process.exit(0); +} + const stats = data.stats || {}; const lines = [];