import { vi } from "vitest"; vi.mock("@mariozechner/pi-ai", async () => { const original = await vi.importActual("@mariozechner/pi-ai"); return { ...original, getOAuthApiKey: () => undefined, getOAuthProviders: () => [], loginOpenAICodex: vi.fn(), }; }); vi.mock("@mariozechner/clipboard", () => ({ availableFormats: () => [], getText: async () => "", setText: async () => {}, hasText: () => false, getImageBinary: async () => [], getImageBase64: async () => "", setImageBinary: async () => {}, setImageBase64: async () => {}, hasImage: () => false, getHtml: async () => "", setHtml: async () => {}, hasHtml: () => false, getRtf: async () => "", setRtf: async () => {}, hasRtf: () => false, clear: async () => {}, watch: () => {}, callThreadsafeFunction: () => {}, })); // Ensure Vitest environment is properly set. process.env.VITEST = "true"; // Config validation walks plugin manifests; keep an aggressive cache in tests to avoid // repeated filesystem discovery across suites/workers. process.env.OPENCLAW_PLUGIN_MANIFEST_CACHE_MS ??= "60000"; // Vitest fork workers can load transitive lockfile helpers many times per worker. // Raise listener budget to avoid noisy MaxListeners warnings and warning-stack overhead. const TEST_PROCESS_MAX_LISTENERS = 128; if (process.getMaxListeners() > 0 && process.getMaxListeners() < TEST_PROCESS_MAX_LISTENERS) { process.setMaxListeners(TEST_PROCESS_MAX_LISTENERS); } import { installProcessWarningFilter } from "../src/infra/warning-filter.js"; import { withIsolatedTestHome } from "./test-env.js"; type SharedTestSetupOptions = { loadProfileEnv?: boolean; }; export function installSharedTestSetup(options?: SharedTestSetupOptions): { cleanup: () => void; tempHome: string; } { const testEnv = withIsolatedTestHome({ loadProfileEnv: options?.loadProfileEnv, }); installProcessWarningFilter(); return testEnv; }