mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-20 03:25:31 +00:00
Parse "at" elements from post content when message.mentions is empty to detect bot mentions in rich text messages containing documents.
107 lines
3.4 KiB
TypeScript
107 lines
3.4 KiB
TypeScript
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);
|
||
});
|
||
|
||
it("returns mentionedBot=true for post message with at (no top-level mentions)", () => {
|
||
const BOT_OPEN_ID = "ou_bot_123";
|
||
const postContent = JSON.stringify({
|
||
content: [
|
||
[{ tag: "at", user_id: BOT_OPEN_ID, user_name: "claw" }],
|
||
[{ tag: "text", text: "What does this document say" }],
|
||
],
|
||
});
|
||
const event = {
|
||
sender: { sender_id: { user_id: "u1", open_id: "ou_sender" } },
|
||
message: {
|
||
message_id: "msg_1",
|
||
chat_id: "oc_chat1",
|
||
chat_type: "group",
|
||
message_type: "post",
|
||
content: postContent,
|
||
mentions: [],
|
||
},
|
||
};
|
||
const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID);
|
||
expect(ctx.mentionedBot).toBe(true);
|
||
});
|
||
|
||
it("returns mentionedBot=false for post message with no at", () => {
|
||
const postContent = JSON.stringify({
|
||
content: [[{ tag: "text", text: "hello" }]],
|
||
});
|
||
const event = {
|
||
sender: { sender_id: { user_id: "u1", open_id: "ou_sender" } },
|
||
message: {
|
||
message_id: "msg_1",
|
||
chat_id: "oc_chat1",
|
||
chat_type: "group",
|
||
message_type: "post",
|
||
content: postContent,
|
||
mentions: [],
|
||
},
|
||
};
|
||
const ctx = parseFeishuMessageEvent(event as any, "ou_bot_123");
|
||
expect(ctx.mentionedBot).toBe(false);
|
||
});
|
||
});
|