diff --git a/packages/cli/src/__tests__/preload.ts b/packages/cli/src/__tests__/preload.ts index 7251c247d..9e229afec 100644 --- a/packages/cli/src/__tests__/preload.ts +++ b/packages/cli/src/__tests__/preload.ts @@ -60,6 +60,10 @@ cleanupStrayTestFiles(); const TEST_HOME = mkdtempSync(join(tmpdir(), "spawn-test-home-")); +// Disable telemetry in tests to prevent fire-and-forget fetch calls from +// interfering with other test files' global.fetch mocks. +process.env.SPAWN_TELEMETRY = "0"; + // Redirect all user-directory env vars to the isolated temp process.env.HOME = TEST_HOME; process.env.XDG_CACHE_HOME = join(TEST_HOME, ".cache"); diff --git a/packages/cli/src/shared/telemetry.ts b/packages/cli/src/shared/telemetry.ts index f9d45dde4..3c458142b 100644 --- a/packages/cli/src/shared/telemetry.ts +++ b/packages/cli/src/shared/telemetry.ts @@ -242,6 +242,11 @@ export function captureError(type: string, err: unknown): void { /** Send a single event to PostHog immediately. Fire-and-forget. */ function sendEvent(event: string, properties: Record): void { + // Re-check at send time — guards against singleton state leaking in tests + // where initTelemetry() was called with _enabled=true but env was later restored. + if (process.env.BUN_ENV === "test" || process.env.NODE_ENV === "test" || process.env.SPAWN_TELEMETRY === "0") { + return; + } const body = JSON.stringify({ api_key: POSTHOG_TOKEN, batch: [