← back to NationalPaperHangers
tests/run-e2e.js
59 lines
#!/usr/bin/env node
// Runs every tests/e2e-*.js sequentially. Aggregates pass/fail counts.
// Exits non-zero if any test bailed.
//
// Usage:
// npm run test:e2e
// BASE=https://nationalpaperhangers.com npm run test:e2e (against prod)
const { spawnSync } = require('child_process');
const fs = require('fs');
const path = require('path');
const TESTS_DIR = path.join(__dirname);
const e2eFiles = fs.readdirSync(TESTS_DIR)
.filter(f => /^e2e-.*\.js$/.test(f))
.sort();
if (!e2eFiles.length) {
console.error('No e2e-*.js files found in tests/');
process.exit(1);
}
console.log(`\n=== NPH e2e suite — ${e2eFiles.length} test file(s) ===\n`);
let totalPass = 0, totalFail = 0, totalSkip = 0;
const results = [];
for (const f of e2eFiles) {
const fp = path.join(TESTS_DIR, f);
console.log(`▶ running ${f}`);
console.log('─'.repeat(60));
const t0 = Date.now();
const res = spawnSync('node', [fp], { stdio: 'pipe', encoding: 'utf8', env: process.env });
const dt = ((Date.now() - t0) / 1000).toFixed(1);
const out = (res.stdout || '') + (res.stderr || '');
process.stdout.write(out);
// Convention: exit 78 = skipped (e.g. rate-limit, missing fixture, prereq).
const skipped = res.status === 78;
const m = out.match(/\[result\]\s+(\d+)\s+pass\s+·\s+(\d+)\s+fail/);
const filePass = m ? parseInt(m[1], 10) : 0;
const fileFail = m ? parseInt(m[2], 10) : (res.status === 0 || skipped ? 0 : 1);
totalPass += filePass; totalFail += fileFail; if (skipped) totalSkip++;
results.push({ file: f, pass: filePass, fail: fileFail, skipped, dt, exit: res.status });
console.log('');
}
console.log('═'.repeat(60));
console.log(`Suite summary:`);
for (const r of results) {
const tag = r.skipped ? '⊘' : (r.fail ? '✗' : '✓');
const note = r.skipped ? ' · SKIPPED' : '';
console.log(` ${tag} ${r.file.padEnd(34)} ${r.pass} pass · ${r.fail} fail (${r.dt}s, exit ${r.exit})${note}`);
}
console.log('─'.repeat(60));
console.log(` TOTAL ${totalPass} pass · ${totalFail} fail · ${totalSkip} skipped`);
console.log('');
process.exit(totalFail ? 1 : 0);