Files
openclaw-openclaw/test/setup.env.ts
Peter Steinberger c56650352d fix(test): unit-fast tests inherit live host config (#100221)
* fix(test): make unit tests hermetic against host config and build state

Two host-state leaks made the full suite fail deterministically on developer
and agent machines while CI stayed green:

- Built checkouts: bundled-plugin manifest discovery prefers dist/extensions,
  which by design excludes externalized official plugins (e.g. qwen). Tests
  that depend on manifest-driven endpoint classification (DashScope cases in
  media-understanding and model-compat) failed in any checkout after
  pnpm build. test-env now pins OPENCLAW_BUNDLED_PLUGINS_DIR to the source
  extensions tree (with the vitest trust opt-in) so discovery matches CI
  regardless of local build state; discovery tests keep managing the env
  per case.

- unit-fast shards: setupFiles was empty, so auto-curated tests that read
  config saw the developer's real ~/.openclaw/openclaw.json; any key the
  branch schema rejects failed those tests. unit-fast and
  unit-fast-fake-timers now load a minimal env-isolation setup
  (test/setup.env.ts) that installs the isolated test home without the
  shared setup's module mocks.

* test: update unit-fast config contract for env-isolation setup

* fix(test): force unit-fast hermetic env isolation
2026-07-05 10:06:53 -07:00

32 lines
1.2 KiB
TypeScript

// Env-only isolation for fast shards that intentionally skip the full shared
// setup (no module mocks, no custom runner). unit-fast runs isolate:false with
// auto-curated membership, so without this any test that reads config/state
// sees the developer's real ~/.openclaw (e.g. an openclaw.json key the branch
// schema rejects deterministically fails schema-reading tests locally while CI
// stays green).
import { installTestEnv } from "./test-env.js";
process.env.VITEST = "true";
const ENV_ISOLATION_SETUP = Symbol.for("openclaw.envIsolationTestSetup");
type EnvIsolationHandle = { cleanup: () => void };
const globalState = globalThis as typeof globalThis & {
[ENV_ISOLATION_SETUP]?: EnvIsolationHandle;
};
if (!globalState[ENV_ISOLATION_SETUP]) {
// unit-fast is never a live lane, even when its parent shell exports live flags.
// Hermetic mode prevents real or staged credentials/config from entering the worker.
const testEnv = installTestEnv({ mode: "hermetic" });
const handle: EnvIsolationHandle = {
cleanup: () => {
testEnv.cleanup();
delete globalState[ENV_ISOLATION_SETUP];
},
};
process.once("exit", handle.cleanup);
globalState[ENV_ISOLATION_SETUP] = handle;
}