feat: scope test report to given paths, default all (task 0003)

Forward any positional arguments to `bun test` as path filters, so
`bun run test:report packages/core` reports just core while a bare
`bun run test:report` still covers the whole repo. The report's header
records the scope.
This commit is contained in:
2026-07-27 22:55:01 -04:00
parent 0b6a52452a
commit 11866a0dd5

View File

@@ -1,5 +1,7 @@
// Runs the whole test suite once and renders reports/test-report.md: a summary, // Runs the test suite and renders reports/test-report.md: a summary, a
// a describe-grouped inventory, and a coverage table. // describe-grouped inventory, and a coverage table.
// Any positional arguments are forwarded to `bun test` as path filters; with
// none, the whole repo runs.
// The report is written even when tests fail, and the process exits with the // The report is written even when tests fail, and the process exits with the
// test run's own status so CI can gate on it. // test run's own status so CI can gate on it.
// Split into run -> parse -> render so a future CI job can reuse parse+render // Split into run -> parse -> render so a future CI job can reuse parse+render
@@ -44,12 +46,13 @@ interface FileCoverage {
// --- run --- // --- run ---
function runTests(): number { function runTests(paths: string[]): number {
mkdirSync(REPORTS_DIR, { recursive: true }); mkdirSync(REPORTS_DIR, { recursive: true });
const proc = Bun.spawnSync( const proc = Bun.spawnSync(
[ [
"bun", "bun",
"test", "test",
...paths,
"--coverage", "--coverage",
"--coverage-reporter=lcov", "--coverage-reporter=lcov",
"--reporter=junit", "--reporter=junit",
@@ -254,10 +257,12 @@ function gitSha(): string {
return proc.exitCode === 0 ? proc.stdout.toString().trim() : "unknown"; return proc.exitCode === 0 ? proc.stdout.toString().trim() : "unknown";
} }
const exitCode = runTests(); const paths = process.argv.slice(2);
const exitCode = runTests(paths);
mkdirSync(REPORTS_DIR, { recursive: true }); mkdirSync(REPORTS_DIR, { recursive: true });
const meta = `Generated ${new Date().toISOString()} · commit ${gitSha()} · whole repo`; const scope = paths.length > 0 ? paths.join(", ") : "whole repo";
const meta = `Generated ${new Date().toISOString()} · commit ${gitSha()} · ${scope}`;
if (!existsSync(JUNIT_PATH)) { if (!existsSync(JUNIT_PATH)) {
writeFileSync( writeFileSync(