import { describe, expect, it } from "vitest"; import type { ClawdbotConfig } from "../config/types.js"; describe("WhatsApp ack reaction logic", () => { // Helper to simulate the logic from auto-reply.ts function shouldSendReaction( cfg: ClawdbotConfig, msg: { id?: string; chatType: "direct" | "group"; wasMentioned?: boolean; }, groupActivation?: "always" | "mention", ): boolean { const ackConfig = cfg.whatsapp?.ackReaction; const emoji = (ackConfig?.emoji ?? "").trim(); const directEnabled = ackConfig?.direct ?? true; const groupMode = ackConfig?.group ?? "mentions"; if (!emoji) return false; if (!msg.id) return false; // Direct chat logic if (msg.chatType === "direct") { return directEnabled; } // Group chat logic if (msg.chatType === "group") { if (groupMode === "never") return false; if (groupMode === "always") return true; if (groupMode === "mentions") { // If group activation is "always", always react if (groupActivation === "always") return true; // Otherwise, only react if bot was mentioned return msg.wasMentioned === true; } } return false; } describe("direct chat", () => { it("should react when direct=true", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", direct: true } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "direct", }), ).toBe(true); }); it("should not react when direct=false", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", direct: false } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "direct", }), ).toBe(false); }); it("should not react when emoji is empty", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "", direct: true } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "direct", }), ).toBe(false); }); it("should not react when message id is missing", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", direct: true } }, }; expect( shouldSendReaction(cfg, { chatType: "direct", }), ).toBe(false); }); }); describe("group chat - always mode", () => { it("should react to all messages when group=always", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "always" } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "group", wasMentioned: false, }), ).toBe(true); }); it("should react even with mention when group=always", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "always" } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "group", wasMentioned: true, }), ).toBe(true); }); }); describe("group chat - mentions mode", () => { it("should react when mentioned", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "mentions" } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "group", wasMentioned: true, }), ).toBe(true); }); it("should not react when not mentioned", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "mentions" } }, }; expect( shouldSendReaction( cfg, { id: "msg1", chatType: "group", wasMentioned: false, }, "mention", // group activation ), ).toBe(false); }); it("should react to all messages when group activation is always", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "mentions" } }, }; expect( shouldSendReaction( cfg, { id: "msg1", chatType: "group", wasMentioned: false, }, "always", // group has requireMention=false ), ).toBe(true); }); }); describe("group chat - never mode", () => { it("should not react even with mention", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "never" } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "group", wasMentioned: true, }), ).toBe(false); }); it("should not react without mention", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀", group: "never" } }, }; expect( shouldSendReaction(cfg, { id: "msg1", chatType: "group", wasMentioned: false, }), ).toBe(false); }); }); describe("combinations", () => { it("direct=false, group=always: only groups", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "✅", direct: false, group: "always" }, }, }; expect(shouldSendReaction(cfg, { id: "m1", chatType: "direct" })).toBe( false, ); expect( shouldSendReaction(cfg, { id: "m2", chatType: "group", wasMentioned: false, }), ).toBe(true); }); it("direct=true, group=never: only direct", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "🤖", direct: true, group: "never" }, }, }; expect(shouldSendReaction(cfg, { id: "m1", chatType: "direct" })).toBe( true, ); expect( shouldSendReaction(cfg, { id: "m2", chatType: "group", wasMentioned: true, }), ).toBe(false); }); }); describe("defaults", () => { it("should default direct=true", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀" } }, }; expect(shouldSendReaction(cfg, { id: "m1", chatType: "direct" })).toBe( true, ); }); it("should default group=mentions", () => { const cfg: ClawdbotConfig = { whatsapp: { ackReaction: { emoji: "👀" } }, }; expect( shouldSendReaction(cfg, { id: "m1", chatType: "group", wasMentioned: false, }), ).toBe(false); expect( shouldSendReaction(cfg, { id: "m2", chatType: "group", wasMentioned: true, }), ).toBe(true); }); }); describe("legacy config is ignored", () => { it("does not use messages.ackReaction for WhatsApp", () => { const cfg: ClawdbotConfig = { messages: { ackReaction: "👀", ackReactionScope: "all" }, }; expect( shouldSendReaction(cfg, { id: "m1", chatType: "direct", }), ).toBe(false); }); }); });