From e2f0ea4625e558e36dd6faa540a4cc8b3ff940d8 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 7 Apr 2026 06:32:26 +0100 Subject: [PATCH] fix(test): isolate shared vitest home setup --- test/setup-home-isolation.test.ts | 13 +++++++++++++ test/setup.shared.ts | 30 +++++++++++++++++++++++++++++- test/setup.ts | 9 ++++++++- 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 test/setup-home-isolation.test.ts diff --git a/test/setup-home-isolation.test.ts b/test/setup-home-isolation.test.ts new file mode 100644 index 00000000000..cc233ac4007 --- /dev/null +++ b/test/setup-home-isolation.test.ts @@ -0,0 +1,13 @@ +import path from "node:path"; +import { describe, expect, it } from "vitest"; +import { createConfigIO } from "../src/config/config.js"; + +describe("shared test setup home isolation", () => { + it("routes default config IO through the per-worker temp home", () => { + const testHome = process.env.OPENCLAW_TEST_HOME; + expect(testHome).toBeTruthy(); + expect(process.env.HOME).toBe(testHome); + expect(process.env.USERPROFILE).toBe(testHome); + expect(createConfigIO().configPath).toBe(path.join(testHome!, ".openclaw", "openclaw.json")); + }); +}); diff --git a/test/setup.shared.ts b/test/setup.shared.ts index ea72eca14da..6608fd41607 100644 --- a/test/setup.shared.ts +++ b/test/setup.shared.ts @@ -51,13 +51,41 @@ type SharedTestSetupOptions = { loadProfileEnv?: boolean; }; +const SHARED_TEST_SETUP = Symbol.for("openclaw.sharedTestSetup"); + +type SharedTestSetupHandle = { + cleanup: () => void; + tempHome: string; +}; + export function installSharedTestSetup(options?: SharedTestSetupOptions): { cleanup: () => void; tempHome: string; } { + const globalState = globalThis as typeof globalThis & { + [SHARED_TEST_SETUP]?: SharedTestSetupHandle; + }; + const existing = globalState[SHARED_TEST_SETUP]; + if (existing) { + return existing; + } + const testEnv = withIsolatedTestHome({ loadProfileEnv: options?.loadProfileEnv, }); installProcessWarningFilter(); - return testEnv; + + let cleaned = false; + const handle: SharedTestSetupHandle = { + tempHome: testEnv.tempHome, + cleanup: () => { + if (cleaned) { + return; + } + cleaned = true; + testEnv.cleanup(); + }, + }; + globalState[SHARED_TEST_SETUP] = handle; + return handle; } diff --git a/test/setup.ts b/test/setup.ts index ca8c0613acc..e6d989375b6 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -1 +1,8 @@ -import "./setup.shared.js"; +import { afterAll } from "vitest"; +import { installSharedTestSetup } from "./setup.shared.js"; + +const testEnv = installSharedTestSetup(); + +afterAll(() => { + testEnv.cleanup(); +});