From 479234aead02038c36b515896784f0d5062029b4 Mon Sep 17 00:00:00 2001 From: DavertMik Date: Fri, 10 Apr 2026 15:26:46 +0300 Subject: [PATCH] fix: process hangs when _beforeSuite helper hook throws an error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add recorder.catch() for suite.before and suite.after events in helpers listener. Unlike all other hook events (test.before, test.after, etc.), these suite-level events had no catch handler, so rejected promises from helper hooks like Playwright._beforeSuite() were unhandled — mocha's done callback was never called, causing the process to hang indefinitely. Also disable store.dryRun during check command's helper setup/teardown verification so it actually launches the browser and can detect issues like missing Playwright browser installations. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/command/check.js | 2 ++ lib/listener/helpers.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/command/check.js b/lib/command/check.js index c07a1f5f3..42a19d7e0 100644 --- a/lib/command/check.js +++ b/lib/command/check.js @@ -135,6 +135,7 @@ export default async function (options) { printCheck('plugins', checks['plugins'], Object.keys(Container.plugins()).join(', ')) if (Object.keys(helpers).length) { + store.dryRun = false const suite = Container.mocha().suite const test = createTest('test', () => {}) checks.setup = true @@ -166,6 +167,7 @@ export default async function (options) { } printCheck('Helpers After', checks['teardown'], standardActingHelpers.some(h => Object.keys(helpers).includes(h)) ? 'Closing browser' : '') + store.dryRun = true } try { diff --git a/lib/listener/helpers.js b/lib/listener/helpers.js index 50a4162a0..eb196e526 100644 --- a/lib/listener/helpers.js +++ b/lib/listener/helpers.js @@ -30,11 +30,13 @@ export default function () { event.dispatcher.on(event.suite.before, suite => { // if (suite.parent) return; // only for root suite runAsyncHelpersHook('_beforeSuite', suite, true) + recorder.catch() }) event.dispatcher.on(event.suite.after, suite => { // if (suite.parent) return; // only for root suite runAsyncHelpersHook('_afterSuite', suite, true) + recorder.catch() }) event.dispatcher.on(event.test.started, test => {