import { describe, expect, it } from "vitest"; import { normalizePluginsConfig, resolveEffectiveEnableState, resolveEnableState, } from "./config-state.js"; describe("normalizePluginsConfig", () => { it("uses default memory slot when not specified", () => { const result = normalizePluginsConfig({}); expect(result.slots.memory).toBe("memory-core"); }); it("respects explicit memory slot value", () => { const result = normalizePluginsConfig({ slots: { memory: "custom-memory" }, }); expect(result.slots.memory).toBe("custom-memory"); }); it("disables memory slot when set to 'none' (case insensitive)", () => { expect( normalizePluginsConfig({ slots: { memory: "none" }, }).slots.memory, ).toBeNull(); expect( normalizePluginsConfig({ slots: { memory: "None" }, }).slots.memory, ).toBeNull(); }); it("trims whitespace from memory slot value", () => { const result = normalizePluginsConfig({ slots: { memory: " custom-memory " }, }); expect(result.slots.memory).toBe("custom-memory"); }); it("uses default when memory slot is empty string", () => { const result = normalizePluginsConfig({ slots: { memory: "" }, }); expect(result.slots.memory).toBe("memory-core"); }); it("uses default when memory slot is whitespace only", () => { const result = normalizePluginsConfig({ slots: { memory: " " }, }); expect(result.slots.memory).toBe("memory-core"); }); it("normalizes plugin hook policy flags", () => { const result = normalizePluginsConfig({ entries: { "voice-call": { hooks: { allowPromptInjection: false, }, }, }, }); expect(result.entries["voice-call"]?.hooks?.allowPromptInjection).toBe(false); }); it("drops invalid plugin hook policy values", () => { const result = normalizePluginsConfig({ entries: { "voice-call": { hooks: { allowPromptInjection: "nope", } as unknown as { allowPromptInjection: boolean }, }, }, }); expect(result.entries["voice-call"]?.hooks).toBeUndefined(); }); }); describe("resolveEffectiveEnableState", () => { function resolveBundledTelegramState(config: Parameters[0]) { const normalized = normalizePluginsConfig(config); return resolveEffectiveEnableState({ id: "telegram", origin: "bundled", config: normalized, rootConfig: { channels: { telegram: { enabled: true, }, }, }, }); } it("enables bundled channels when channels..enabled=true", () => { const state = resolveBundledTelegramState({ enabled: true, }); expect(state).toEqual({ enabled: true }); }); it("keeps explicit plugin-level disable authoritative", () => { const state = resolveBundledTelegramState({ enabled: true, entries: { telegram: { enabled: false, }, }, }); expect(state).toEqual({ enabled: false, reason: "disabled in config" }); }); }); describe("resolveEnableState", () => { it("keeps the selected memory slot plugin enabled even when omitted from plugins.allow", () => { const state = resolveEnableState( "memory-core", "bundled", normalizePluginsConfig({ allow: ["telegram"], slots: { memory: "memory-core" }, }), ); expect(state).toEqual({ enabled: true }); }); it("keeps explicit disable authoritative for the selected memory slot plugin", () => { const state = resolveEnableState( "memory-core", "bundled", normalizePluginsConfig({ allow: ["telegram"], slots: { memory: "memory-core" }, entries: { "memory-core": { enabled: false, }, }, }), ); expect(state).toEqual({ enabled: false, reason: "disabled in config" }); }); });