Skip to content

Commit f6b4d32

Browse files
committed
fix(test): save/restore SENTRY_CONFIG_DIR in 9 test files to prevent cross-file pollution
Several test files were setting process.env.SENTRY_CONFIG_DIR in beforeEach without restoring the original value in afterEach. When our new test files changed Bun's file discovery order, these leaked env vars caused 26 cascading failures. Fixed files: - test/lib/api-client.test.ts - test/lib/api-client.multiregion.test.ts - test/lib/api-client.seer.test.ts - test/lib/config.test.ts - test/lib/region.test.ts - test/lib/dsn/cache.test.ts - test/lib/dsn/detector.test.ts - test/commands/issue/utils.test.ts - test/lib/db/concurrent.test.ts
1 parent 5bc9dd6 commit f6b4d32

File tree

9 files changed

+91
-4
lines changed

9 files changed

+91
-4
lines changed

test/commands/issue/utils.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,11 @@ describe("buildCommandHint", () => {
4848
});
4949

5050
let testConfigDir: string;
51+
let savedConfigDir: string | undefined;
5152
let originalFetch: typeof globalThis.fetch;
5253

5354
beforeEach(async () => {
55+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
5456
// Use isolateProjectRoot to prevent DSN detection from scanning the real project
5557
testConfigDir = await createTestConfigDir("test-issue-utils-", {
5658
isolateProjectRoot: true,
@@ -67,6 +69,11 @@ beforeEach(async () => {
6769

6870
afterEach(async () => {
6971
globalThis.fetch = originalFetch;
72+
if (savedConfigDir !== undefined) {
73+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
74+
} else {
75+
delete process.env[CONFIG_DIR_ENV_VAR];
76+
}
7077
await cleanupTestDir(testConfigDir);
7178
});
7279

test/lib/api-client.multiregion.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import {
2222
import { cleanupTestDir, createTestConfigDir } from "../helpers.js";
2323

2424
let testConfigDir: string;
25+
let savedConfigDir: string | undefined;
2526
let originalFetch: typeof globalThis.fetch;
2627

2728
beforeEach(async () => {
29+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
2830
testConfigDir = await createTestConfigDir("test-multiregion-");
2931
process.env[CONFIG_DIR_ENV_VAR] = testConfigDir;
3032

@@ -42,6 +44,11 @@ afterEach(async () => {
4244
// Restore original fetch
4345
globalThis.fetch = originalFetch;
4446
closeDatabase();
47+
if (savedConfigDir !== undefined) {
48+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
49+
} else {
50+
delete process.env[CONFIG_DIR_ENV_VAR];
51+
}
4552
await cleanupTestDir(testConfigDir);
4653
});
4754

test/lib/api-client.seer.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ import { cleanupTestDir, createTestConfigDir } from "../helpers.js";
1717

1818
// Test config directory
1919
let testConfigDir: string;
20+
let savedConfigDir: string | undefined;
2021
let originalFetch: typeof globalThis.fetch;
2122

2223
beforeEach(async () => {
24+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
2325
testConfigDir = await createTestConfigDir("test-seer-api-");
2426
process.env[CONFIG_DIR_ENV_VAR] = testConfigDir;
2527

@@ -35,6 +37,11 @@ beforeEach(async () => {
3537
afterEach(async () => {
3638
// Restore original fetch
3739
globalThis.fetch = originalFetch;
40+
if (savedConfigDir !== undefined) {
41+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
42+
} else {
43+
delete process.env[CONFIG_DIR_ENV_VAR];
44+
}
3845
await cleanupTestDir(testConfigDir);
3946
});
4047

test/lib/api-client.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { cleanupTestDir, createTestConfigDir } from "../helpers.js";
1313

1414
// Test config directory
1515
let testConfigDir: string;
16+
let savedConfigDir: string | undefined;
17+
let savedClientId: string | undefined;
1618
let originalFetch: typeof globalThis.fetch;
1719

1820
/**
@@ -26,6 +28,8 @@ type RequestLog = {
2628
};
2729

2830
beforeEach(async () => {
31+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
32+
savedClientId = process.env.SENTRY_CLIENT_ID;
2933
testConfigDir = await createTestConfigDir("test-api-");
3034
process.env[CONFIG_DIR_ENV_VAR] = testConfigDir;
3135

@@ -43,6 +47,18 @@ afterEach(async () => {
4347
// Restore original fetch
4448
globalThis.fetch = originalFetch;
4549

50+
// Restore env vars to prevent cross-file test pollution
51+
if (savedConfigDir !== undefined) {
52+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
53+
} else {
54+
delete process.env[CONFIG_DIR_ENV_VAR];
55+
}
56+
if (savedClientId !== undefined) {
57+
process.env.SENTRY_CLIENT_ID = savedClientId;
58+
} else {
59+
delete process.env.SENTRY_CLIENT_ID;
60+
}
61+
4662
await cleanupTestDir(testConfigDir);
4763
});
4864

test/lib/config.test.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,11 @@ import {
4949
* process exit by preload.ts.
5050
*/
5151
const testBaseDir = process.env[CONFIG_DIR_ENV_VAR]!;
52+
let savedConfigDir: string | undefined;
5253

5354
beforeEach(() => {
55+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
56+
5457
// Close any previous database connection
5558
closeDatabase();
5659

@@ -66,8 +69,12 @@ beforeEach(() => {
6669
afterEach(() => {
6770
// Close database to release file handles
6871
closeDatabase();
69-
// Note: We don't delete the test directory here because tests run in parallel.
70-
// The parent test directory is cleaned up on process exit by preload.ts.
72+
// Restore env var to prevent cross-file test pollution
73+
if (savedConfigDir !== undefined) {
74+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
75+
} else {
76+
delete process.env[CONFIG_DIR_ENV_VAR];
77+
}
7178
});
7279

7380
describe("auth token management", () => {

test/lib/db/concurrent.test.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { getCachedProject } from "../../../src/lib/db/project-cache.js";
2020

2121
const WORKER_SCRIPT = join(import.meta.dir, "concurrent-worker.ts");
2222
const TEST_BASE_DIR = process.env[CONFIG_DIR_ENV_VAR]!;
23+
let savedConfigDir: string | undefined;
2324

2425
type WorkerResult = {
2526
workerId: string;
@@ -91,6 +92,7 @@ describe("concurrent database access", () => {
9192
let testConfigDir: string;
9293

9394
beforeEach(async () => {
95+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
9496
closeDatabase();
9597
testConfigDir = join(
9698
TEST_BASE_DIR,
@@ -109,6 +111,11 @@ describe("concurrent database access", () => {
109111

110112
afterEach(() => {
111113
closeDatabase();
114+
if (savedConfigDir !== undefined) {
115+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
116+
} else {
117+
delete process.env[CONFIG_DIR_ENV_VAR];
118+
}
112119
});
113120

114121
test("multiple processes can write DSN cache entries simultaneously", async () => {

test/lib/dsn/cache.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,23 @@ import { CONFIG_DIR_ENV_VAR } from "../../../src/lib/db/index.js";
1818

1919
// Use a unique test config directory
2020
const TEST_CONFIG_DIR = join(homedir(), ".sentry-cli-test-cache");
21+
let savedConfigDir: string | undefined;
2122

2223
describe("DSN Cache", () => {
2324
beforeEach(() => {
25+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
2426
// Set up test config directory
2527
process.env[CONFIG_DIR_ENV_VAR] = TEST_CONFIG_DIR;
2628
mkdirSync(TEST_CONFIG_DIR, { recursive: true });
2729
});
2830

2931
afterEach(() => {
32+
// Restore env var to prevent cross-file test pollution
33+
if (savedConfigDir !== undefined) {
34+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
35+
} else {
36+
delete process.env[CONFIG_DIR_ENV_VAR];
37+
}
3038
// Clean up test config directory
3139
try {
3240
rmSync(TEST_CONFIG_DIR, { recursive: true, force: true });

test/lib/dsn/detector.test.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,15 @@ function cleanupDir(dir: string): void {
3636

3737
// Test config directory
3838
const TEST_CONFIG_DIR = join(homedir(), ".sentry-cli-test-detector-config");
39+
let savedConfigDir: string | undefined;
40+
let savedSentryDsn: string | undefined;
3941

4042
describe("DSN Detector (New Module)", () => {
4143
let testDir: string;
4244

4345
beforeEach(async () => {
46+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
47+
savedSentryDsn = process.env.SENTRY_DSN;
4448
testDir = createTempDir();
4549
process.env[CONFIG_DIR_ENV_VAR] = TEST_CONFIG_DIR;
4650
mkdirSync(TEST_CONFIG_DIR, { recursive: true });
@@ -51,7 +55,17 @@ describe("DSN Detector (New Module)", () => {
5155
});
5256

5357
afterEach(() => {
54-
delete process.env.SENTRY_DSN;
58+
// Restore env vars to prevent cross-file test pollution
59+
if (savedConfigDir !== undefined) {
60+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
61+
} else {
62+
delete process.env[CONFIG_DIR_ENV_VAR];
63+
}
64+
if (savedSentryDsn !== undefined) {
65+
process.env.SENTRY_DSN = savedSentryDsn;
66+
} else {
67+
delete process.env.SENTRY_DSN;
68+
}
5569
cleanupDir(testDir);
5670
cleanupDir(TEST_CONFIG_DIR);
5771
});

test/lib/region.test.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@ import {
1717
import { getSentryBaseUrl } from "../../src/lib/sentry-urls.js";
1818

1919
const testBaseDir = process.env[CONFIG_DIR_ENV_VAR]!;
20+
let savedConfigDir: string | undefined;
21+
let savedSentryUrl: string | undefined;
2022

2123
beforeEach(async () => {
24+
savedConfigDir = process.env[CONFIG_DIR_ENV_VAR];
25+
savedSentryUrl = process.env.SENTRY_URL;
2226
closeDatabase();
2327
const testConfigDir = join(
2428
testBaseDir,
@@ -34,7 +38,17 @@ beforeEach(async () => {
3438

3539
afterEach(() => {
3640
closeDatabase();
37-
delete process.env.SENTRY_URL;
41+
// Restore env vars to prevent cross-file test pollution
42+
if (savedConfigDir !== undefined) {
43+
process.env[CONFIG_DIR_ENV_VAR] = savedConfigDir;
44+
} else {
45+
delete process.env[CONFIG_DIR_ENV_VAR];
46+
}
47+
if (savedSentryUrl !== undefined) {
48+
process.env.SENTRY_URL = savedSentryUrl;
49+
} else {
50+
delete process.env.SENTRY_URL;
51+
}
3852
});
3953

4054
describe("getSentryBaseUrl", () => {

0 commit comments

Comments
 (0)