import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; async function withTempHome(fn: (home: string) => Promise): Promise { const base = await fs.mkdtemp(path.join(os.tmpdir(), "clawdis-config-")); const previousHome = process.env.HOME; process.env.HOME = base; try { return await fn(base); } finally { process.env.HOME = previousHome; await fs.rm(base, { recursive: true, force: true }); } } describe("config identity defaults", () => { let previousHome: string | undefined; beforeEach(() => { previousHome = process.env.HOME; }); afterEach(() => { process.env.HOME = previousHome; }); it("derives responsePrefix and mentionPatterns when identity is set", async () => { await withTempHome(async (home) => { const configDir = path.join(home, ".clawdis"); await fs.mkdir(configDir, { recursive: true }); await fs.writeFile( path.join(configDir, "clawdis.json"), JSON.stringify( { identity: { name: "Samantha", theme: "helpful sloth", emoji: "🦥" }, messages: {}, routing: {}, }, null, 2, ), "utf-8", ); vi.resetModules(); const { loadConfig } = await import("./config.js"); const cfg = loadConfig(); expect(cfg.messages?.responsePrefix).toBe("🦥"); expect(cfg.routing?.groupChat?.mentionPatterns).toEqual([ "\\b@?Samantha\\b", ]); }); }); it("does not override explicit values", async () => { await withTempHome(async (home) => { const configDir = path.join(home, ".clawdis"); await fs.mkdir(configDir, { recursive: true }); await fs.writeFile( path.join(configDir, "clawdis.json"), JSON.stringify( { identity: { name: "Samantha Sloth", theme: "space lobster", emoji: "🦞", }, messages: { responsePrefix: "✅", }, routing: { groupChat: { mentionPatterns: ["@clawd"] }, }, }, null, 2, ), "utf-8", ); vi.resetModules(); const { loadConfig } = await import("./config.js"); const cfg = loadConfig(); expect(cfg.messages?.responsePrefix).toBe("✅"); expect(cfg.routing?.groupChat?.mentionPatterns).toEqual(["@clawd"]); }); }); it("does not synthesize agent/session when absent", async () => { await withTempHome(async (home) => { const configDir = path.join(home, ".clawdis"); await fs.mkdir(configDir, { recursive: true }); await fs.writeFile( path.join(configDir, "clawdis.json"), JSON.stringify( { identity: { name: "Samantha", theme: "helpful sloth", emoji: "🦥" }, messages: {}, routing: {}, }, null, 2, ), "utf-8", ); vi.resetModules(); const { loadConfig } = await import("./config.js"); const cfg = loadConfig(); expect(cfg.messages?.responsePrefix).toBe("🦥"); expect(cfg.routing?.groupChat?.mentionPatterns).toEqual([ "\\b@?Samantha\\b", ]); expect(cfg.agent).toBeUndefined(); expect(cfg.session).toBeUndefined(); }); }); });