Files
Moltbot/src/plugins/config-state.test.ts
Gustavo Madeira Santana 688b72e158 plugins: enforce prompt hook policy with runtime validation (#36567)
Merged via squash.

Prepared head SHA: 6b9d883b6ae33628235fb02ce39c0d0f46a065bb
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-03-05 18:15:54 -05:00

114 lines
3.1 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { normalizePluginsConfig, resolveEffectiveEnableState } 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<typeof normalizePluginsConfig>[0]) {
const normalized = normalizePluginsConfig(config);
return resolveEffectiveEnableState({
id: "telegram",
origin: "bundled",
config: normalized,
rootConfig: {
channels: {
telegram: {
enabled: true,
},
},
},
});
}
it("enables bundled channels when channels.<id>.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" });
});
});