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.
This commit is contained in:
Josh Lehman
2026-03-24 09:50:11 -07:00
committed by GitHub
parent e727ad6898
commit 559b3a5fd4

View File

@@ -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;