From a0cee2120940ee27221ff289399f659c63660234 Mon Sep 17 00:00:00 2001 From: Affaan Mustafa Date: Mon, 30 Mar 2026 02:00:47 -0400 Subject: [PATCH] test: isolate package-manager dependent hooks and formatter tests --- tests/hooks/hooks.test.js | 7 ++++- tests/lib/package-manager.test.js | 35 +++++++++++++++++++-- tests/lib/resolve-formatter.test.js | 47 ++++++++++++++++++++++++----- 3 files changed, 77 insertions(+), 12 deletions(-) diff --git a/tests/hooks/hooks.test.js b/tests/hooks/hooks.test.js index 09805645..7d4475e6 100644 --- a/tests/hooks/hooks.test.js +++ b/tests/hooks/hooks.test.js @@ -1221,9 +1221,14 @@ async function runTests() { fs.writeFileSync(path.join(rootDir, '.prettierrc'), '{}'); fs.writeFileSync(filePath, 'export const value = 1;\n'); createCommandShim(binDir, 'npx', logFile); + const isolatedHome = path.join(testDir, 'isolated-home'); + fs.mkdirSync(path.join(isolatedHome, '.claude'), { recursive: true }); const stdinJson = JSON.stringify({ tool_input: { file_path: filePath } }); - const result = await runScript(path.join(scriptsDir, 'post-edit-format.js'), stdinJson, withPrependedPath(binDir)); + const result = await runScript(path.join(scriptsDir, 'post-edit-format.js'), stdinJson, withPrependedPath(binDir, { + HOME: isolatedHome, + USERPROFILE: isolatedHome + })); assert.strictEqual(result.code, 0, 'Should exit 0 for config-only repo'); const logEntries = readCommandLog(logFile); diff --git a/tests/lib/package-manager.test.js b/tests/lib/package-manager.test.js index 826d8c02..ebe5922e 100644 --- a/tests/lib/package-manager.test.js +++ b/tests/lib/package-manager.test.js @@ -37,6 +37,33 @@ function cleanupTestDir(testDir) { fs.rmSync(testDir, { recursive: true, force: true }); } +function withIsolatedHome(fn) { + const isolatedHome = fs.mkdtempSync(path.join(os.tmpdir(), 'pm-home-')); + const originalHome = process.env.HOME; + const originalUserProfile = process.env.USERPROFILE; + + process.env.HOME = isolatedHome; + process.env.USERPROFILE = isolatedHome; + + try { + return fn(isolatedHome); + } finally { + if (originalHome !== undefined) { + process.env.HOME = originalHome; + } else { + delete process.env.HOME; + } + + if (originalUserProfile !== undefined) { + process.env.USERPROFILE = originalUserProfile; + } else { + delete process.env.USERPROFILE; + } + + fs.rmSync(isolatedHome, { recursive: true, force: true }); + } +} + // Test suite function runTests() { console.log('\n=== Testing package-manager.js ===\n'); @@ -711,9 +738,11 @@ function runTests() { const originalEnv = process.env.CLAUDE_PACKAGE_MANAGER; try { delete process.env.CLAUDE_PACKAGE_MANAGER; - const result = pm.getPackageManager({ projectDir: testDir }); - assert.strictEqual(result.name, 'npm', 'Should default to npm'); - assert.strictEqual(result.source, 'default'); + withIsolatedHome(() => { + const result = pm.getPackageManager({ projectDir: testDir }); + assert.strictEqual(result.name, 'npm', 'Should default to npm'); + assert.strictEqual(result.source, 'default'); + }); } finally { if (originalEnv !== undefined) { process.env.CLAUDE_PACKAGE_MANAGER = originalEnv; diff --git a/tests/lib/resolve-formatter.test.js b/tests/lib/resolve-formatter.test.js index c02bb60d..dc478fc8 100644 --- a/tests/lib/resolve-formatter.test.js +++ b/tests/lib/resolve-formatter.test.js @@ -58,6 +58,33 @@ function cleanupTmpDirs() { tmpDirs.length = 0; } +function withIsolatedHome(fn) { + const isolatedHome = fs.mkdtempSync(path.join(os.tmpdir(), 'resolve-fmt-home-')); + const originalHome = process.env.HOME; + const originalUserProfile = process.env.USERPROFILE; + + process.env.HOME = isolatedHome; + process.env.USERPROFILE = isolatedHome; + + try { + return fn(isolatedHome); + } finally { + if (originalHome !== undefined) { + process.env.HOME = originalHome; + } else { + delete process.env.HOME; + } + + if (originalUserProfile !== undefined) { + process.env.USERPROFILE = originalUserProfile; + } else { + delete process.env.USERPROFILE; + } + + fs.rmSync(isolatedHome, { recursive: true, force: true }); + } +} + function runTests() { console.log('\n=== Testing resolve-formatter.js ===\n'); @@ -168,10 +195,12 @@ function runTests() { run('resolveFormatterBin: falls back to npx for biome', () => { const root = makeTmpDir(); - const result = resolveFormatterBin(root, 'biome'); - const expectedBin = process.platform === 'win32' ? 'npx.cmd' : 'npx'; - assert.strictEqual(result.bin, expectedBin); - assert.deepStrictEqual(result.prefix, ['@biomejs/biome']); + withIsolatedHome(() => { + const result = resolveFormatterBin(root, 'biome'); + const expectedBin = process.platform === 'win32' ? 'npx.cmd' : 'npx'; + assert.strictEqual(result.bin, expectedBin); + assert.deepStrictEqual(result.prefix, ['@biomejs/biome']); + }); }); run('resolveFormatterBin: uses local prettier binary when available', () => { @@ -188,10 +217,12 @@ function runTests() { run('resolveFormatterBin: falls back to npx for prettier', () => { const root = makeTmpDir(); - const result = resolveFormatterBin(root, 'prettier'); - const expectedBin = process.platform === 'win32' ? 'npx.cmd' : 'npx'; - assert.strictEqual(result.bin, expectedBin); - assert.deepStrictEqual(result.prefix, ['prettier']); + withIsolatedHome(() => { + const result = resolveFormatterBin(root, 'prettier'); + const expectedBin = process.platform === 'win32' ? 'npx.cmd' : 'npx'; + assert.strictEqual(result.bin, expectedBin); + assert.deepStrictEqual(result.prefix, ['prettier']); + }); }); run('resolveFormatterBin: returns null for unknown formatter', () => {