From bc9361e4269c15d55f1ec8d7c7814996eee48540 Mon Sep 17 00:00:00 2001 From: sneak Date: Sun, 1 Nov 2026 23:21:46 +0000 Subject: [PATCH] test: make test fails when jest force-stops a worker (closes #711) 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 --- package.json | 4 ++-- script/lib/jest.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 script/lib/jest.js diff --git a/package.json b/package.json index b61275e..2080619 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,8 @@ "license": "GPL-3.0", "private": true, "scripts": { - "test": "jest --maxWorkers=3", - "test:verbose": "jest --maxWorkers=3 --verbose", + "test": "node script/lib/jest.js --maxWorkers=3", + "test:verbose": "node script/lib/jest.js --maxWorkers=3 --verbose", "build": "node build.js", "lint": "eslint . && prettier --check .", "fmt": "prettier --write .", diff --git a/script/lib/jest.js b/script/lib/jest.js new file mode 100644 index 0000000..1aa0511 --- /dev/null +++ b/script/lib/jest.js @@ -0,0 +1,33 @@ +// 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); +});