From 559b3a5fd4fb7d68b337979692e47b58062325ea Mon Sep 17 00:00:00 2001 From: Josh Lehman Date: Tue, 24 Mar 2026 09:50:11 -0700 Subject: [PATCH] test: stabilize preaction process title assertion (#53808) Regeneration-Prompt: | Current origin/main fails src/cli/program/preaction.test.ts because the test asserts on process.title directly inside Vitest, where that runtime interaction is not stable enough to observe the write reliably. Keep the production preaction behavior unchanged. Make the test verify that the hook assigns the expected title by wrapping process.title with a local getter/setter during each test and restoring the original descriptor afterward so other tests keep the real process object behavior. --- src/cli/program/preaction.test.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/cli/program/preaction.test.ts b/src/cli/program/preaction.test.ts index 9f2f540dd3d..306fd4c1fb5 100644 --- a/src/cli/program/preaction.test.ts +++ b/src/cli/program/preaction.test.ts @@ -57,6 +57,8 @@ const mockedModuleIds = [ let registerPreActionHooks: typeof import("./preaction.js").registerPreActionHooks; let originalProcessArgv: string[]; let originalProcessTitle: string; +let originalProcessTitleDescriptor: PropertyDescriptor | undefined; +let observedProcessTitle: string; let originalNodeNoWarnings: string | undefined; let originalHideBanner: string | undefined; let originalForceStderr: boolean; @@ -76,9 +78,19 @@ beforeEach(() => { vi.clearAllMocks(); originalProcessArgv = [...process.argv]; originalProcessTitle = process.title; + originalProcessTitleDescriptor = Object.getOwnPropertyDescriptor(process, "title"); + observedProcessTitle = originalProcessTitle; originalNodeNoWarnings = process.env.NODE_NO_WARNINGS; originalHideBanner = process.env.OPENCLAW_HIDE_BANNER; originalForceStderr = loggingState.forceConsoleToStderr; + Object.defineProperty(process, "title", { + configurable: true, + enumerable: originalProcessTitleDescriptor?.enumerable ?? true, + get: () => observedProcessTitle, + set: (value: string) => { + observedProcessTitle = value; + }, + }); loggingState.forceConsoleToStderr = false; delete process.env.NODE_NO_WARNINGS; delete process.env.OPENCLAW_HIDE_BANNER; @@ -86,7 +98,16 @@ beforeEach(() => { afterEach(() => { process.argv = originalProcessArgv; - process.title = originalProcessTitle; + if (originalProcessTitleDescriptor && "value" in originalProcessTitleDescriptor) { + Object.defineProperty(process, "title", { + ...originalProcessTitleDescriptor, + value: originalProcessTitle, + }); + } else if (originalProcessTitleDescriptor) { + Object.defineProperty(process, "title", originalProcessTitleDescriptor); + } else { + process.title = originalProcessTitle; + } loggingState.forceConsoleToStderr = originalForceStderr; if (originalNodeNoWarnings === undefined) { delete process.env.NODE_NO_WARNINGS;