mirror of
https://github.com/colbymchenry/codegraph.git
synced 2026-10-16 20:53:57 +08:00
7bbc1fb7f6
Running the suite on a machine with Claude Code configured could wire the CodeGraph prompt hook into the developer's own ~/.claude/settings.json: every upgrade test whose fake upgrade succeeded ran the real post-upgrade prompt-hook self-heal, which detected the real global Claude profile and wrote it. Daemon suites likewise left records in the real ~/.codegraph/daemons. On Windows a HOME-only redirect would not have helped, since os.homedir() reads USERPROFILE there. - The prompt-hook writer is now injected through UpgradeDeps (wirePromptHook); the CLI passes the real defaultWirePromptHook and the upgrade tests a recorder. New tests pin that a successful upgrade calls the recorder and that the real writer never touches a configured profile. - A vitest setupFiles entry gives every engine test file a throwaway home: HOME/USERPROFILE (plus HOMEDRIVE/HOMEPATH/APPDATA/LOCALAPPDATA on Windows), XDG_CONFIG_HOME, and GIT_CONFIG_GLOBAL (seeded with a dummy identity) point into it, and CLAUDE_CONFIG_DIR/CODEX_HOME/COPILOT_HOME/ HERMES_HOME are cleared. Spawned CLI/MCP children inherit it. A sandbox test asserts os.homedir(), the Claude profile, the daemon registry, a child process and git's global config all resolve inside it. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
3.1 KiB
TypeScript
64 lines
3.1 KiB
TypeScript
import { defineConfig } from 'vitest/config';
|
|
import { WASM_RUNTIME_FLAGS } from './src/extraction/wasm-runtime-flags';
|
|
|
|
/**
|
|
* The SHARED base. `vitest.workspace.mts` extends it twice — once for the
|
|
* engine's node-environment suites and once for the viewer package's jsdom
|
|
* one — so the environment, the plugins and the module-resolution conditions
|
|
* a browser test needs cannot leak into the other 200-odd suites.
|
|
*/
|
|
export default defineConfig({
|
|
test: {
|
|
globals: true,
|
|
environment: 'node',
|
|
include: ['__tests__/**/*.test.ts'],
|
|
// Suites that spawn the built CLI need a current dist/ (#1879).
|
|
globalSetup: ['./__tests__/global-setup-dist.ts'],
|
|
// A throwaway home dir (and git global config) per test file, so nothing
|
|
// the suite runs can write to the developer's real one (#2275).
|
|
setupFiles: ['./__tests__/setup-home-sandbox.ts'],
|
|
/**
|
|
* Several MCP integration tests (mcp-daemon, mcp-initialize, mcp-ppid-watchdog,
|
|
* mcp-roots) spawn `dist/bin/codegraph.js serve --mcp` with `process.execPath`
|
|
* and rely on the child inheriting `process.env`. On a Node >= 25 dev machine
|
|
* the CLI's hard-block (src/bin/codegraph.ts) would otherwise exit the child
|
|
* before it ever responds, so every spawn-based test times out — see #478.
|
|
*
|
|
* Setting the override here keeps the CLI's runtime guard intact for end
|
|
* users (it's still enforced when `codegraph` is invoked directly) while
|
|
* letting the test suite run on whatever Node the contributor happens to
|
|
* have installed. CI on Node 22/23 is unaffected — the guard doesn't fire
|
|
* there, so the variable is a no-op.
|
|
*/
|
|
env: {
|
|
CODEGRAPH_ALLOW_UNSAFE_NODE: '1',
|
|
/**
|
|
* The suite spawns real CLI/MCP processes; without this they would write
|
|
* telemetry state into the contributor's real ~/.codegraph and count test
|
|
* tool calls as real usage. The telemetry unit tests are unaffected —
|
|
* they inject their own `env` via the Telemetry constructor.
|
|
*/
|
|
CODEGRAPH_TELEMETRY: '0',
|
|
},
|
|
/**
|
|
* The same V8 flags every real launch path passes (the bundled launcher,
|
|
* the CLI's self re-exec, refresh-launcher): keep tree-sitter grammar
|
|
* compilation on the Liftoff baseline tier. Without them a pool worker
|
|
* runs the grammars on the turboshaft optimizing tier, and once enough
|
|
* parses have warmed a grammar function up, its background tier-up job
|
|
* exhausts a compiler Zone and aborts the worker — `Fatal process out of
|
|
* memory: Zone`, surfaced by vitest only as "Worker exited unexpectedly"
|
|
* with the rest of the file's tests silently unrun (#1779; the product-side
|
|
* story is in wasm-runtime-flags.ts, #293/#298). On Node 24 with a
|
|
* 660-test extraction suite this reproduced on every run at the same test.
|
|
* V8 flags are process-global, so the parse worker threads a test spawns
|
|
* are covered too.
|
|
*/
|
|
poolOptions: { forks: { execArgv: [...WASM_RUNTIME_FLAGS] } },
|
|
coverage: {
|
|
provider: 'v8',
|
|
reporter: ['text', 'json', 'html'],
|
|
},
|
|
},
|
|
});
|