import { describe, expect, it } from "vitest"; import { createFlexMessage, createQuickReplyItems, createTextMessageWithQuickReplies, } from "./send.js"; describe("createFlexMessage", () => { it("creates a flex message with alt text and contents", () => { const contents = { type: "bubble" as const, body: { type: "box" as const, layout: "vertical" as const, contents: [], }, }; const message = createFlexMessage("Alt text for flex", contents); expect(message.type).toBe("flex"); expect(message.altText).toBe("Alt text for flex"); expect(message.contents).toBe(contents); }); }); describe("createQuickReplyItems", () => { it("creates quick reply items from labels", () => { const quickReply = createQuickReplyItems(["Option 1", "Option 2", "Option 3"]); expect(quickReply.items).toHaveLength(3); expect(quickReply.items[0].type).toBe("action"); expect((quickReply.items[0].action as { label: string }).label).toBe("Option 1"); expect((quickReply.items[0].action as { text: string }).text).toBe("Option 1"); }); it("limits items to 13 (LINE maximum)", () => { const labels = Array.from({ length: 20 }, (_, i) => `Option ${i + 1}`); const quickReply = createQuickReplyItems(labels); expect(quickReply.items).toHaveLength(13); }); it("truncates labels to 20 characters", () => { const quickReply = createQuickReplyItems([ "This is a very long option label that exceeds the limit", ]); expect((quickReply.items[0].action as { label: string }).label).toBe("This is a very long "); // Text is not truncated expect((quickReply.items[0].action as { text: string }).text).toBe( "This is a very long option label that exceeds the limit", ); }); it("creates message actions for each item", () => { const quickReply = createQuickReplyItems(["A", "B"]); expect((quickReply.items[0].action as { type: string }).type).toBe("message"); expect((quickReply.items[1].action as { type: string }).type).toBe("message"); }); }); describe("createTextMessageWithQuickReplies", () => { it("creates a text message with quick replies attached", () => { const message = createTextMessageWithQuickReplies("Choose an option:", ["Yes", "No"]); expect(message.type).toBe("text"); expect(message.text).toBe("Choose an option:"); expect(message.quickReply).toBeDefined(); expect(message.quickReply.items).toHaveLength(2); }); it("preserves text content", () => { const longText = "This is a longer message that asks the user to select from multiple options below."; const message = createTextMessageWithQuickReplies(longText, ["A", "B", "C"]); expect(message.text).toBe(longText); }); it("handles empty quick replies array", () => { const message = createTextMessageWithQuickReplies("No options", []); expect(message.quickReply.items).toHaveLength(0); }); it("quick replies use label as both label and text", () => { const message = createTextMessageWithQuickReplies("Pick one:", ["Apple", "Banana"]); const firstAction = message.quickReply.items[0].action as { label: string; text: string }; expect(firstAction.label).toBe("Apple"); expect(firstAction.text).toBe("Apple"); }); });