import { describe, expect, it } from "vitest"; import type { ResolvedQmdConfig } from "./backend-config.js"; import { deriveQmdScopeChannel, deriveQmdScopeChatType, isQmdScopeAllowed } from "./qmd-scope.js"; describe("qmd scope", () => { const allowDirect: ResolvedQmdConfig["scope"] = { default: "deny", rules: [{ action: "allow", match: { chatType: "direct" } }], }; it("derives channel and chat type from canonical keys once", () => { expect(deriveQmdScopeChannel("Workspace:group:123")).toBe("workspace"); expect(deriveQmdScopeChatType("Workspace:group:123")).toBe("group"); }); it("derives channel and chat type from stored key suffixes", () => { expect(deriveQmdScopeChannel("agent:agent-1:workspace:channel:chan-123")).toBe("workspace"); expect(deriveQmdScopeChatType("agent:agent-1:workspace:channel:chan-123")).toBe("channel"); }); it("treats parsed keys with no chat prefix as direct", () => { expect(deriveQmdScopeChannel("agent:agent-1:peer-direct")).toBeUndefined(); expect(deriveQmdScopeChatType("agent:agent-1:peer-direct")).toBe("direct"); expect(isQmdScopeAllowed(allowDirect, "agent:agent-1:peer-direct")).toBe(true); expect(isQmdScopeAllowed(allowDirect, "agent:agent-1:peer:group:abc")).toBe(false); }); it("applies scoped key-prefix checks against normalized key", () => { const scope: ResolvedQmdConfig["scope"] = { default: "deny", rules: [{ action: "allow", match: { keyPrefix: "workspace:" } }], }; expect(isQmdScopeAllowed(scope, "agent:agent-1:workspace:group:123")).toBe(true); expect(isQmdScopeAllowed(scope, "agent:agent-1:other:group:123")).toBe(false); }); it("supports rawKeyPrefix matches for agent-prefixed keys", () => { const scope: ResolvedQmdConfig["scope"] = { default: "allow", rules: [{ action: "deny", match: { rawKeyPrefix: "agent:main:discord:" } }], }; expect(isQmdScopeAllowed(scope, "agent:main:discord:channel:c123")).toBe(false); expect(isQmdScopeAllowed(scope, "agent:main:slack:channel:c123")).toBe(true); }); it("keeps legacy agent-prefixed keyPrefix rules working", () => { const scope: ResolvedQmdConfig["scope"] = { default: "allow", rules: [{ action: "deny", match: { keyPrefix: "agent:main:discord:" } }], }; expect(isQmdScopeAllowed(scope, "agent:main:discord:channel:c123")).toBe(false); expect(isQmdScopeAllowed(scope, "agent:main:slack:channel:c123")).toBe(true); }); });