When a test leaves a timer running, jest force-stops that worker, prints a warning, and the run still passes. Jest has no option that fails the run instead. Both test scripts in package.json now run jest through script/lib/jest.js. It passes jest's output through and exits 1 when jest printed that warning. Model: opus-5-5
34 lines
1.1 KiB
JavaScript
34 lines
1.1 KiB
JavaScript
// Runs jest with the arguments it is given, and fails the run when jest had to
|
|
// force-stop a worker. Jest itself only prints a warning when that happens, and
|
|
// its run still passes. The warning means a test left a timer or another open
|
|
// handle running. The test scripts in package.json run jest through this file.
|
|
|
|
"use strict";
|
|
|
|
const { spawn } = require("child_process");
|
|
|
|
// The start of the warning that jest prints on stderr after it force-stops a
|
|
// worker.
|
|
const WORKER_WARNING = "A worker process has failed to exit gracefully";
|
|
|
|
const jest = spawn("jest", process.argv.slice(2), {
|
|
stdio: ["inherit", "inherit", "pipe"],
|
|
});
|
|
|
|
let stderr = "";
|
|
jest.stderr.on("data", (chunk) => {
|
|
process.stderr.write(chunk);
|
|
stderr += chunk;
|
|
});
|
|
|
|
jest.on("close", (code) => {
|
|
if (stderr.includes(WORKER_WARNING)) {
|
|
console.error(
|
|
"script/lib/jest.js: failing the run, because jest force-stopped " +
|
|
"a worker. A test left a timer or another open handle running.",
|
|
);
|
|
process.exit(1);
|
|
}
|
|
process.exit(code ?? 1);
|
|
});
|