test(db): clear env before each loadWorkspaceEnv test, not just after
CI / Architecture Guardrails (push) Successful in 2m42s
CI / Assistant Split Regression (push) Successful in 4m4s
CI / Lint (push) Successful in 4m16s
CI / Typecheck (push) Successful in 5m20s
CI / Unit Tests (push) Failing after 6m40s
CI / Build (push) Successful in 5m3s
CI / Release Images (push) Has been cancelled
CI / Fresh-Linux Docker Deploy (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Architecture Guardrails (push) Successful in 2m42s
CI / Assistant Split Regression (push) Successful in 4m4s
CI / Lint (push) Successful in 4m16s
CI / Typecheck (push) Successful in 5m20s
CI / Unit Tests (push) Failing after 6m40s
CI / Build (push) Successful in 5m3s
CI / Release Images (push) Has been cancelled
CI / Fresh-Linux Docker Deploy (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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 assert from "node:assert/strict";
|
||||||
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
||||||
import { tmpdir } from "node:os";
|
import { tmpdir } from "node:os";
|
||||||
import { join } from "node:path";
|
import { join } from "node:path";
|
||||||
import { loadWorkspaceEnv, resolveWorkspaceEnvPaths } from "./load-workspace-env.js";
|
import { loadWorkspaceEnv, resolveWorkspaceEnvPaths } from "./load-workspace-env.js";
|
||||||
|
|
||||||
const envKeys = [
|
const envKeys = ["DATABASE_URL", "SHARED_VALUE", "LOCAL_ONLY", "MODE_ONLY", "MODE_LOCAL_ONLY"];
|
||||||
"DATABASE_URL",
|
|
||||||
"SHARED_VALUE",
|
|
||||||
"LOCAL_ONLY",
|
|
||||||
"MODE_ONLY",
|
|
||||||
"MODE_LOCAL_ONLY",
|
|
||||||
];
|
|
||||||
|
|
||||||
function clearEnv() {
|
function clearEnv() {
|
||||||
for (const key of envKeys) {
|
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(() => {
|
afterEach(() => {
|
||||||
clearEnv();
|
clearEnv();
|
||||||
delete process.env.NODE_ENV;
|
delete process.env.NODE_ENV;
|
||||||
@@ -37,10 +39,19 @@ afterEach(() => {
|
|||||||
describe("loadWorkspaceEnv", () => {
|
describe("loadWorkspaceEnv", () => {
|
||||||
it("loads standard workspace env files in precedence order", () => {
|
it("loads standard workspace env files in precedence order", () => {
|
||||||
withTempWorkspace((workspaceRoot) => {
|
withTempWorkspace((workspaceRoot) => {
|
||||||
writeFileSync(join(workspaceRoot, ".env"), "DATABASE_URL=postgres://from-env\nSHARED_VALUE=base\n");
|
writeFileSync(
|
||||||
writeFileSync(join(workspaceRoot, ".env.development"), "SHARED_VALUE=mode\nMODE_ONLY=development\n");
|
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.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";
|
process.env.NODE_ENV = "development";
|
||||||
|
|
||||||
const loadedPaths = loadWorkspaceEnv({ workspaceRoot });
|
const loadedPaths = loadWorkspaceEnv({ workspaceRoot });
|
||||||
|
|||||||
Reference in New Issue
Block a user