import { describe, expect, it } from "vitest"; import type { WebInboundMsg } from "./types.js"; import { isBotMentionedFromTargets, resolveMentionTargets } from "./mentions.js"; const makeMsg = (overrides: Partial): WebInboundMsg => ({ id: "m1", from: "120363401234567890@g.us", conversationId: "120363401234567890@g.us", to: "15551234567@s.whatsapp.net", accountId: "default", body: "", chatType: "group", chatId: "120363401234567890@g.us", sendComposing: async () => {}, reply: async () => {}, sendMedia: async () => {}, ...overrides, }) as WebInboundMsg; describe("isBotMentionedFromTargets", () => { const mentionCfg = { mentionRegexes: [/\bopenclaw\b/i] }; it("ignores regex matches when other mentions are present", () => { const msg = makeMsg({ body: "@OpenClaw please help", mentionedJids: ["19998887777@s.whatsapp.net"], selfE164: "+15551234567", selfJid: "15551234567@s.whatsapp.net", }); const targets = resolveMentionTargets(msg); expect(isBotMentionedFromTargets(msg, mentionCfg, targets)).toBe(false); }); it("matches explicit self mentions", () => { const msg = makeMsg({ body: "hey", mentionedJids: ["15551234567@s.whatsapp.net"], selfE164: "+15551234567", selfJid: "15551234567@s.whatsapp.net", }); const targets = resolveMentionTargets(msg); expect(isBotMentionedFromTargets(msg, mentionCfg, targets)).toBe(true); }); it("falls back to regex when no mentions are present", () => { const msg = makeMsg({ body: "openclaw can you help?", selfE164: "+15551234567", selfJid: "15551234567@s.whatsapp.net", }); const targets = resolveMentionTargets(msg); expect(isBotMentionedFromTargets(msg, mentionCfg, targets)).toBe(true); }); });