mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-18 19:50:38 +09:00
67 lines
2.6 KiB
TypeScript
67 lines
2.6 KiB
TypeScript
|
|
import * as fs from "node:fs/promises";
|
||
|
|
import os from "node:os";
|
||
|
|
import path from "node:path";
|
||
|
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
||
|
|
import { prepareClaudeConfigSeed } from "./claude-config.js";
|
||
|
|
|
||
|
|
describe("prepareClaudeConfigSeed", () => {
|
||
|
|
const cleanupDirs: string[] = [];
|
||
|
|
|
||
|
|
afterEach(async () => {
|
||
|
|
vi.restoreAllMocks();
|
||
|
|
while (cleanupDirs.length > 0) {
|
||
|
|
const dir = cleanupDirs.pop();
|
||
|
|
if (!dir) continue;
|
||
|
|
await fs.rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
function createEnv(root: string, sourceDir: string): NodeJS.ProcessEnv {
|
||
|
|
return {
|
||
|
|
HOME: root,
|
||
|
|
PAPERCLIP_HOME: path.join(root, "paperclip-home"),
|
||
|
|
PAPERCLIP_INSTANCE_ID: "test-instance",
|
||
|
|
CLAUDE_CONFIG_DIR: sourceDir,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
it("reuses the same snapshot path when the seeded files are unchanged", async () => {
|
||
|
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-claude-config-seed-"));
|
||
|
|
cleanupDirs.push(root);
|
||
|
|
const sourceDir = path.join(root, "claude-source");
|
||
|
|
await fs.mkdir(sourceDir, { recursive: true });
|
||
|
|
await fs.writeFile(path.join(sourceDir, "settings.json"), JSON.stringify({ theme: "light" }), "utf8");
|
||
|
|
|
||
|
|
const onLog = vi.fn(async () => {});
|
||
|
|
const env = createEnv(root, sourceDir);
|
||
|
|
|
||
|
|
const first = await prepareClaudeConfigSeed(env, onLog, "company-1");
|
||
|
|
const second = await prepareClaudeConfigSeed(env, onLog, "company-1");
|
||
|
|
|
||
|
|
expect(first).toBe(second);
|
||
|
|
await expect(fs.readFile(path.join(first, "settings.json"), "utf8"))
|
||
|
|
.resolves.toBe(JSON.stringify({ theme: "light" }));
|
||
|
|
});
|
||
|
|
|
||
|
|
it("keeps an existing snapshot intact when the seeded files change", async () => {
|
||
|
|
const root = await fs.mkdtemp(path.join(os.tmpdir(), "paperclip-claude-config-race-"));
|
||
|
|
cleanupDirs.push(root);
|
||
|
|
const sourceDir = path.join(root, "claude-source");
|
||
|
|
await fs.mkdir(sourceDir, { recursive: true });
|
||
|
|
await fs.writeFile(path.join(sourceDir, "settings.json"), JSON.stringify({ theme: "light" }), "utf8");
|
||
|
|
|
||
|
|
const onLog = vi.fn(async () => {});
|
||
|
|
const env = createEnv(root, sourceDir);
|
||
|
|
const first = await prepareClaudeConfigSeed(env, onLog, "company-1");
|
||
|
|
|
||
|
|
await fs.writeFile(path.join(sourceDir, "settings.json"), JSON.stringify({ theme: "dark" }), "utf8");
|
||
|
|
const second = await prepareClaudeConfigSeed(env, onLog, "company-1");
|
||
|
|
|
||
|
|
expect(second).not.toBe(first);
|
||
|
|
await expect(fs.readFile(path.join(first, "settings.json"), "utf8"))
|
||
|
|
.resolves.toBe(JSON.stringify({ theme: "light" }));
|
||
|
|
await expect(fs.readFile(path.join(second, "settings.json"), "utf8"))
|
||
|
|
.resolves.toBe(JSON.stringify({ theme: "dark" }));
|
||
|
|
});
|
||
|
|
});
|