Skip to content

Commit 7bbf7c2

Browse files
ashwin-antclaude
andauthored
test: isolate settings tests to use temporary directories (#79)
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 <[email protected]>
1 parent f1d89fc commit 7bbf7c2

File tree

2 files changed

+31
-18
lines changed

2 files changed

+31
-18
lines changed

src/setup-claude-code-settings.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import { $ } from "bun";
22
import { homedir } from "os";
33
import { readFile } from "fs/promises";
44

5-
export async function setupClaudeCodeSettings(settingsInput?: string) {
6-
const home = homedir();
5+
export async function setupClaudeCodeSettings(
6+
settingsInput?: string,
7+
homeDir?: string,
8+
) {
9+
const home = homeDir ?? homedir();
710
const settingsPath = `${home}/.claude/settings.json`;
811
console.log(`Setting up Claude settings at: ${settingsPath}`);
912

test/setup-claude-code-settings.test.ts

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,33 @@
22

33
import { describe, test, expect, beforeEach, afterEach } from "bun:test";
44
import { setupClaudeCodeSettings } from "../src/setup-claude-code-settings";
5-
import { homedir } from "os";
5+
import { tmpdir } from "os";
66
import { mkdir, writeFile, readFile, rm } from "fs/promises";
77
import { join } from "path";
88

9-
const home = homedir();
10-
const settingsPath = join(home, ".claude", "settings.json");
11-
const testSettingsDir = join(home, ".claude-test");
9+
const testHomeDir = join(
10+
tmpdir(),
11+
"claude-code-test-home",
12+
Date.now().toString(),
13+
);
14+
const settingsPath = join(testHomeDir, ".claude", "settings.json");
15+
const testSettingsDir = join(testHomeDir, ".claude-test");
1216
const testSettingsPath = join(testSettingsDir, "test-settings.json");
1317

1418
describe("setupClaudeCodeSettings", () => {
1519
beforeEach(async () => {
16-
// Create test directory
20+
// Create test home directory and test settings directory
21+
await mkdir(testHomeDir, { recursive: true });
1722
await mkdir(testSettingsDir, { recursive: true });
1823
});
1924

2025
afterEach(async () => {
21-
// Clean up test directory
22-
await rm(testSettingsDir, { recursive: true, force: true });
26+
// Clean up test home directory
27+
await rm(testHomeDir, { recursive: true, force: true });
2328
});
2429

2530
test("should always set enableAllProjectMcpServers to true when no input", async () => {
26-
await setupClaudeCodeSettings();
31+
await setupClaudeCodeSettings(undefined, testHomeDir);
2732

2833
const settingsContent = await readFile(settingsPath, "utf-8");
2934
const settings = JSON.parse(settingsContent);
@@ -37,7 +42,7 @@ describe("setupClaudeCodeSettings", () => {
3742
env: { API_KEY: "test-key" },
3843
});
3944

40-
await setupClaudeCodeSettings(inputSettings);
45+
await setupClaudeCodeSettings(inputSettings, testHomeDir);
4146

4247
const settingsContent = await readFile(settingsPath, "utf-8");
4348
const settings = JSON.parse(settingsContent);
@@ -64,7 +69,7 @@ describe("setupClaudeCodeSettings", () => {
6469

6570
await writeFile(testSettingsPath, JSON.stringify(testSettings, null, 2));
6671

67-
await setupClaudeCodeSettings(testSettingsPath);
72+
await setupClaudeCodeSettings(testSettingsPath, testHomeDir);
6873

6974
const settingsContent = await readFile(settingsPath, "utf-8");
7075
const settings = JSON.parse(settingsContent);
@@ -80,7 +85,7 @@ describe("setupClaudeCodeSettings", () => {
8085
model: "test-model",
8186
});
8287

83-
await setupClaudeCodeSettings(inputSettings);
88+
await setupClaudeCodeSettings(inputSettings, testHomeDir);
8489

8590
const settingsContent = await readFile(settingsPath, "utf-8");
8691
const settings = JSON.parse(settingsContent);
@@ -90,15 +95,19 @@ describe("setupClaudeCodeSettings", () => {
9095
});
9196

9297
test("should throw error for invalid JSON string", async () => {
93-
expect(() => setupClaudeCodeSettings("{ invalid json")).toThrow();
98+
expect(() =>
99+
setupClaudeCodeSettings("{ invalid json", testHomeDir),
100+
).toThrow();
94101
});
95102

96103
test("should throw error for non-existent file path", async () => {
97-
expect(() => setupClaudeCodeSettings("/non/existent/file.json")).toThrow();
104+
expect(() =>
105+
setupClaudeCodeSettings("/non/existent/file.json", testHomeDir),
106+
).toThrow();
98107
});
99108

100109
test("should handle empty string input", async () => {
101-
await setupClaudeCodeSettings("");
110+
await setupClaudeCodeSettings("", testHomeDir);
102111

103112
const settingsContent = await readFile(settingsPath, "utf-8");
104113
const settings = JSON.parse(settingsContent);
@@ -107,7 +116,7 @@ describe("setupClaudeCodeSettings", () => {
107116
});
108117

109118
test("should handle whitespace-only input", async () => {
110-
await setupClaudeCodeSettings(" \n\t ");
119+
await setupClaudeCodeSettings(" \n\t ", testHomeDir);
111120

112121
const settingsContent = await readFile(settingsPath, "utf-8");
113122
const settings = JSON.parse(settingsContent);
@@ -119,6 +128,7 @@ describe("setupClaudeCodeSettings", () => {
119128
// First, create some existing settings
120129
await setupClaudeCodeSettings(
121130
JSON.stringify({ existingKey: "existingValue" }),
131+
testHomeDir,
122132
);
123133

124134
// Then, add new settings
@@ -127,7 +137,7 @@ describe("setupClaudeCodeSettings", () => {
127137
model: "claude-opus-4-20250514",
128138
});
129139

130-
await setupClaudeCodeSettings(newSettings);
140+
await setupClaudeCodeSettings(newSettings, testHomeDir);
131141

132142
const settingsContent = await readFile(settingsPath, "utf-8");
133143
const settings = JSON.parse(settingsContent);

0 commit comments

Comments
 (0)