From 72471e89b8fec8212b033e9e2fb8e600ff7caf16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hartmut=20N=C3=B6renberg?= Date: Sun, 12 Apr 2026 21:08:37 +0200 Subject: [PATCH] test(db): clear env before each loadWorkspaceEnv test, not just after MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI inherits DATABASE_URL from the outer shell (capakraken_test URL). loadWorkspaceEnv uses dotenv semantics — pre-existing process.env wins over .env file contents — so the first test's assertion 'DATABASE_URL === postgres://from-env' failed only in CI. Moving clearEnv into beforeEach makes the test order-independent and immune to inherited env. Reproduced by running the suite locally with DATABASE_URL exported. Co-Authored-By: Claude Opus 4.6 --- packages/db/src/load-workspace-env.test.ts | 33 ++++++++++++++-------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/packages/db/src/load-workspace-env.test.ts b/packages/db/src/load-workspace-env.test.ts index 63d1615..ae27e3a 100644 --- a/packages/db/src/load-workspace-env.test.ts +++ b/packages/db/src/load-workspace-env.test.ts @@ -1,17 +1,11 @@ -import { afterEach, describe, it } from "node:test"; +import { afterEach, beforeEach, describe, it } from "node:test"; import assert from "node:assert/strict"; import { mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { loadWorkspaceEnv, resolveWorkspaceEnvPaths } from "./load-workspace-env.js"; -const envKeys = [ - "DATABASE_URL", - "SHARED_VALUE", - "LOCAL_ONLY", - "MODE_ONLY", - "MODE_LOCAL_ONLY", -]; +const envKeys = ["DATABASE_URL", "SHARED_VALUE", "LOCAL_ONLY", "MODE_ONLY", "MODE_LOCAL_ONLY"]; function clearEnv() { for (const key of envKeys) { @@ -29,6 +23,14 @@ function withTempWorkspace(run: (workspaceRoot: string) => void) { } } +// Clear before each test too: CI inherits DATABASE_URL from the outer shell, +// and loadWorkspaceEnv (parseFile + process.env fallback) will read the +// pre-existing shell value instead of the .env file under test. +beforeEach(() => { + clearEnv(); + delete process.env.NODE_ENV; +}); + afterEach(() => { clearEnv(); delete process.env.NODE_ENV; @@ -37,10 +39,19 @@ afterEach(() => { describe("loadWorkspaceEnv", () => { it("loads standard workspace env files in precedence order", () => { withTempWorkspace((workspaceRoot) => { - writeFileSync(join(workspaceRoot, ".env"), "DATABASE_URL=postgres://from-env\nSHARED_VALUE=base\n"); - writeFileSync(join(workspaceRoot, ".env.development"), "SHARED_VALUE=mode\nMODE_ONLY=development\n"); + writeFileSync( + join(workspaceRoot, ".env"), + "DATABASE_URL=postgres://from-env\nSHARED_VALUE=base\n", + ); + writeFileSync( + join(workspaceRoot, ".env.development"), + "SHARED_VALUE=mode\nMODE_ONLY=development\n", + ); writeFileSync(join(workspaceRoot, ".env.local"), "SHARED_VALUE=local\nLOCAL_ONLY=1\n"); - writeFileSync(join(workspaceRoot, ".env.development.local"), "SHARED_VALUE=mode-local\nMODE_LOCAL_ONLY=1\n"); + writeFileSync( + join(workspaceRoot, ".env.development.local"), + "SHARED_VALUE=mode-local\nMODE_LOCAL_ONLY=1\n", + ); process.env.NODE_ENV = "development"; const loadedPaths = loadWorkspaceEnv({ workspaceRoot });