← 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);