From 62d6711c2383a309ea0b76092a62d862a6b626c6 Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Wed, 16 Jul 2025 16:48:58 -0700 Subject: [PATCH] test: isolate settings tests to use temporary directories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified the setup-claude-code-settings tests to use temporary directories instead of modifying the actual ~/.claude/settings.json file. This prevents test runs from affecting the user's real Claude Code settings. Changes: - Added optional homeDir parameter to setupClaudeCodeSettings function - Updated all tests to use a temporary directory in tmpdir() - Tests now create isolated environments that are cleaned up after each test 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- src/setup-claude-code-settings.ts | 7 +++-- test/setup-claude-code-settings.test.ts | 42 +++++++++++++++---------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/setup-claude-code-settings.ts b/src/setup-claude-code-settings.ts index a7537504..0fe68414 100644 --- a/src/setup-claude-code-settings.ts +++ b/src/setup-claude-code-settings.ts @@ -2,8 +2,11 @@ import { $ } from "bun"; import { homedir } from "os"; import { readFile } from "fs/promises"; -export async function setupClaudeCodeSettings(settingsInput?: string) { - const home = homedir(); +export async function setupClaudeCodeSettings( + settingsInput?: string, + homeDir?: string, +) { + const home = homeDir ?? homedir(); const settingsPath = `${home}/.claude/settings.json`; console.log(`Setting up Claude settings at: ${settingsPath}`); diff --git a/test/setup-claude-code-settings.test.ts b/test/setup-claude-code-settings.test.ts index 7221e513..f9ee487c 100644 --- a/test/setup-claude-code-settings.test.ts +++ b/test/setup-claude-code-settings.test.ts @@ -2,28 +2,33 @@ import { describe, test, expect, beforeEach, afterEach } from "bun:test"; import { setupClaudeCodeSettings } from "../src/setup-claude-code-settings"; -import { homedir } from "os"; +import { tmpdir } from "os"; import { mkdir, writeFile, readFile, rm } from "fs/promises"; import { join } from "path"; -const home = homedir(); -const settingsPath = join(home, ".claude", "settings.json"); -const testSettingsDir = join(home, ".claude-test"); +const testHomeDir = join( + tmpdir(), + "claude-code-test-home", + Date.now().toString(), +); +const settingsPath = join(testHomeDir, ".claude", "settings.json"); +const testSettingsDir = join(testHomeDir, ".claude-test"); const testSettingsPath = join(testSettingsDir, "test-settings.json"); describe("setupClaudeCodeSettings", () => { beforeEach(async () => { - // Create test directory + // Create test home directory and test settings directory + await mkdir(testHomeDir, { recursive: true }); await mkdir(testSettingsDir, { recursive: true }); }); afterEach(async () => { - // Clean up test directory - await rm(testSettingsDir, { recursive: true, force: true }); + // Clean up test home directory + await rm(testHomeDir, { recursive: true, force: true }); }); test("should always set enableAllProjectMcpServers to true when no input", async () => { - await setupClaudeCodeSettings(); + await setupClaudeCodeSettings(undefined, testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent); @@ -37,7 +42,7 @@ describe("setupClaudeCodeSettings", () => { env: { API_KEY: "test-key" }, }); - await setupClaudeCodeSettings(inputSettings); + await setupClaudeCodeSettings(inputSettings, testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent); @@ -64,7 +69,7 @@ describe("setupClaudeCodeSettings", () => { await writeFile(testSettingsPath, JSON.stringify(testSettings, null, 2)); - await setupClaudeCodeSettings(testSettingsPath); + await setupClaudeCodeSettings(testSettingsPath, testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent); @@ -80,7 +85,7 @@ describe("setupClaudeCodeSettings", () => { model: "test-model", }); - await setupClaudeCodeSettings(inputSettings); + await setupClaudeCodeSettings(inputSettings, testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent); @@ -90,15 +95,19 @@ describe("setupClaudeCodeSettings", () => { }); test("should throw error for invalid JSON string", async () => { - expect(() => setupClaudeCodeSettings("{ invalid json")).toThrow(); + expect(() => + setupClaudeCodeSettings("{ invalid json", testHomeDir), + ).toThrow(); }); test("should throw error for non-existent file path", async () => { - expect(() => setupClaudeCodeSettings("/non/existent/file.json")).toThrow(); + expect(() => + setupClaudeCodeSettings("/non/existent/file.json", testHomeDir), + ).toThrow(); }); test("should handle empty string input", async () => { - await setupClaudeCodeSettings(""); + await setupClaudeCodeSettings("", testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent); @@ -107,7 +116,7 @@ describe("setupClaudeCodeSettings", () => { }); test("should handle whitespace-only input", async () => { - await setupClaudeCodeSettings(" \n\t "); + await setupClaudeCodeSettings(" \n\t ", testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent); @@ -119,6 +128,7 @@ describe("setupClaudeCodeSettings", () => { // First, create some existing settings await setupClaudeCodeSettings( JSON.stringify({ existingKey: "existingValue" }), + testHomeDir, ); // Then, add new settings @@ -127,7 +137,7 @@ describe("setupClaudeCodeSettings", () => { model: "claude-opus-4-20250514", }); - await setupClaudeCodeSettings(newSettings); + await setupClaudeCodeSettings(newSettings, testHomeDir); const settingsContent = await readFile(settingsPath, "utf-8"); const settings = JSON.parse(settingsContent);