diff --git a/extensions/feishu/src/bot.checkBotMentioned.test.ts b/extensions/feishu/src/bot.checkBotMentioned.test.ts new file mode 100644 index 000000000..2f390ba00 --- /dev/null +++ b/extensions/feishu/src/bot.checkBotMentioned.test.ts @@ -0,0 +1,64 @@ +import { describe, it, expect } from "vitest"; +import { parseFeishuMessageEvent } from "./bot.js"; + +// Helper to build a minimal FeishuMessageEvent for testing +function makeEvent( + chatType: "p2p" | "group", + mentions?: Array<{ key: string; name: string; id: { open_id?: string } }>, +) { + return { + sender: { + sender_id: { user_id: "u1", open_id: "ou_sender" }, + }, + message: { + message_id: "msg_1", + chat_id: "oc_chat1", + chat_type: chatType, + message_type: "text", + content: JSON.stringify({ text: "hello" }), + mentions, + }, + }; +} + +describe("parseFeishuMessageEvent – mentionedBot", () => { + const BOT_OPEN_ID = "ou_bot_123"; + + it("returns mentionedBot=false when there are no mentions", () => { + const event = makeEvent("group", []); + const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID); + expect(ctx.mentionedBot).toBe(false); + }); + + it("returns mentionedBot=true when bot is mentioned", () => { + const event = makeEvent("group", [ + { key: "@_user_1", name: "Bot", id: { open_id: BOT_OPEN_ID } }, + ]); + const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID); + expect(ctx.mentionedBot).toBe(true); + }); + + it("returns mentionedBot=false when only other users are mentioned", () => { + const event = makeEvent("group", [ + { key: "@_user_1", name: "Alice", id: { open_id: "ou_alice" } }, + ]); + const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID); + expect(ctx.mentionedBot).toBe(false); + }); + + it("returns mentionedBot=false when botOpenId is undefined (unknown bot)", () => { + const event = makeEvent("group", [ + { key: "@_user_1", name: "Alice", id: { open_id: "ou_alice" } }, + ]); + const ctx = parseFeishuMessageEvent(event as any, undefined); + expect(ctx.mentionedBot).toBe(false); + }); + + it("returns mentionedBot=false when botOpenId is empty string (probe failed)", () => { + const event = makeEvent("group", [ + { key: "@_user_1", name: "Alice", id: { open_id: "ou_alice" } }, + ]); + const ctx = parseFeishuMessageEvent(event as any, ""); + expect(ctx.mentionedBot).toBe(false); + }); +}); diff --git a/extensions/feishu/src/bot.ts b/extensions/feishu/src/bot.ts index f5bccd3b1..6266dc289 100644 --- a/extensions/feishu/src/bot.ts +++ b/extensions/feishu/src/bot.ts @@ -216,7 +216,7 @@ function parseMessageContent(content: string, messageType: string): string { function checkBotMentioned(event: FeishuMessageEvent, botOpenId?: string): boolean { const mentions = event.message.mentions ?? []; if (mentions.length === 0) return false; - if (!botOpenId) return mentions.length > 0; + if (!botOpenId) return false; return mentions.some((m) => m.id.open_id === botOpenId); }