UNPKG

@gguf/claw

Version:

Multi-channel AI gateway with extensible messaging integrations

236 lines (204 loc) 7.07 kB
import type { OpenClawConfig } from "openclaw/plugin-sdk"; import { createReplyPrefixOptions } from "openclaw/plugin-sdk"; import { beforeEach, describe, expect, it } from "vitest"; import { mattermostPlugin } from "./channel.js"; import { resetMattermostReactionBotUserCacheForTests } from "./mattermost/reactions.js"; import { createMattermostReactionFetchMock, createMattermostTestConfig, withMockedGlobalFetch, } from "./mattermost/reactions.test-helpers.js"; describe("mattermostPlugin", () => { describe("messaging", () => { it("keeps @username targets", () => { const normalize = mattermostPlugin.messaging?.normalizeTarget; if (!normalize) { return; } expect(normalize("@Alice")).toBe("@Alice"); expect(normalize("@alice")).toBe("@alice"); }); it("normalizes mattermost: prefix to user:", () => { const normalize = mattermostPlugin.messaging?.normalizeTarget; if (!normalize) { return; } expect(normalize("mattermost:USER123")).toBe("user:USER123"); }); }); describe("pairing", () => { it("normalizes allowlist entries", () => { const normalize = mattermostPlugin.pairing?.normalizeAllowEntry; if (!normalize) { return; } expect(normalize("@Alice")).toBe("alice"); expect(normalize("user:USER123")).toBe("user123"); }); }); describe("capabilities", () => { it("declares reactions support", () => { expect(mattermostPlugin.capabilities?.reactions).toBe(true); }); }); describe("messageActions", () => { beforeEach(() => { resetMattermostReactionBotUserCacheForTests(); }); it("exposes react when mattermost is configured", () => { const cfg: OpenClawConfig = { channels: { mattermost: { enabled: true, botToken: "test-token", baseUrl: "https://chat.example.com", }, }, }; const actions = mattermostPlugin.actions?.listActions?.({ cfg }) ?? []; expect(actions).toContain("react"); expect(actions).not.toContain("send"); expect(mattermostPlugin.actions?.supportsAction?.({ action: "react" })).toBe(true); }); it("hides react when mattermost is not configured", () => { const cfg: OpenClawConfig = { channels: { mattermost: { enabled: true, }, }, }; const actions = mattermostPlugin.actions?.listActions?.({ cfg }) ?? []; expect(actions).toEqual([]); }); it("hides react when actions.reactions is false", () => { const cfg: OpenClawConfig = { channels: { mattermost: { enabled: true, botToken: "test-token", baseUrl: "https://chat.example.com", actions: { reactions: false }, }, }, }; const actions = mattermostPlugin.actions?.listActions?.({ cfg }) ?? []; expect(actions).not.toContain("react"); expect(actions).not.toContain("send"); }); it("respects per-account actions.reactions in listActions", () => { const cfg: OpenClawConfig = { channels: { mattermost: { enabled: true, actions: { reactions: false }, accounts: { default: { enabled: true, botToken: "test-token", baseUrl: "https://chat.example.com", actions: { reactions: true }, }, }, }, }, }; const actions = mattermostPlugin.actions?.listActions?.({ cfg }) ?? []; expect(actions).toContain("react"); }); it("blocks react when default account disables reactions and accountId is omitted", async () => { const cfg: OpenClawConfig = { channels: { mattermost: { enabled: true, actions: { reactions: true }, accounts: { default: { enabled: true, botToken: "test-token", baseUrl: "https://chat.example.com", actions: { reactions: false }, }, }, }, }, }; await expect( mattermostPlugin.actions?.handleAction?.({ channel: "mattermost", action: "react", params: { messageId: "POST1", emoji: "thumbsup" }, cfg, } as any), ).rejects.toThrow("Mattermost reactions are disabled in config"); }); it("handles react by calling Mattermost reactions API", async () => { const cfg = createMattermostTestConfig(); const fetchImpl = createMattermostReactionFetchMock({ mode: "add", postId: "POST1", emojiName: "thumbsup", }); const result = await withMockedGlobalFetch(fetchImpl as unknown as typeof fetch, async () => { const result = await mattermostPlugin.actions?.handleAction?.({ channel: "mattermost", action: "react", params: { messageId: "POST1", emoji: "thumbsup" }, cfg, accountId: "default", } as any); return result; }); expect(result?.content).toEqual([{ type: "text", text: "Reacted with :thumbsup: on POST1" }]); expect(result?.details).toEqual({}); }); it("only treats boolean remove flag as removal", async () => { const cfg = createMattermostTestConfig(); const fetchImpl = createMattermostReactionFetchMock({ mode: "add", postId: "POST1", emojiName: "thumbsup", }); const result = await withMockedGlobalFetch(fetchImpl as unknown as typeof fetch, async () => { const result = await mattermostPlugin.actions?.handleAction?.({ channel: "mattermost", action: "react", params: { messageId: "POST1", emoji: "thumbsup", remove: "true" }, cfg, accountId: "default", } as any); return result; }); expect(result?.content).toEqual([{ type: "text", text: "Reacted with :thumbsup: on POST1" }]); }); }); describe("config", () => { it("formats allowFrom entries", () => { const formatAllowFrom = mattermostPlugin.config.formatAllowFrom!; const formatted = formatAllowFrom({ cfg: {} as OpenClawConfig, allowFrom: ["@Alice", "user:USER123", "mattermost:BOT999"], }); expect(formatted).toEqual(["@alice", "user123", "bot999"]); }); it("uses account responsePrefix overrides", () => { const cfg: OpenClawConfig = { channels: { mattermost: { responsePrefix: "[Channel]", accounts: { default: { responsePrefix: "[Account]" }, }, }, }, }; const prefixContext = createReplyPrefixOptions({ cfg, agentId: "main", channel: "mattermost", accountId: "default", }); expect(prefixContext.responsePrefix).toBe("[Account]"); }); }); });