import { describe, expect, it } from "vitest"; import { createConfirmTemplate, createButtonTemplate, createTemplateCarousel, createCarouselColumn, createImageCarousel, createImageCarouselColumn, createProductCarousel, messageAction, } from "./template-messages.js"; describe("createConfirmTemplate", () => { it("truncates text to 240 characters", () => { const longText = "x".repeat(300); const template = createConfirmTemplate(longText, messageAction("Yes"), messageAction("No")); expect((template.template as { text: string }).text.length).toBe(240); }); }); describe("createButtonTemplate", () => { it("limits actions to 4", () => { const actions = Array.from({ length: 6 }, (_, i) => messageAction(`Button ${i}`)); const template = createButtonTemplate("Title", "Text", actions); expect((template.template as { actions: unknown[] }).actions.length).toBe(4); }); it("truncates title to 40 characters", () => { const longTitle = "x".repeat(50); const template = createButtonTemplate(longTitle, "Text", [messageAction("OK")]); expect((template.template as { title: string }).title.length).toBe(40); }); it("truncates text to 60 chars when no thumbnail is provided", () => { const longText = "x".repeat(100); const template = createButtonTemplate("Title", longText, [messageAction("OK")]); expect((template.template as { text: string }).text.length).toBe(60); }); it("keeps longer text when thumbnail is provided", () => { const longText = "x".repeat(100); const template = createButtonTemplate("Title", longText, [messageAction("OK")], { thumbnailImageUrl: "https://example.com/thumb.jpg", }); expect((template.template as { text: string }).text.length).toBe(100); }); }); describe("createCarouselColumn", () => { it("limits actions to 3", () => { const column = createCarouselColumn({ text: "Text", actions: [ messageAction("A1"), messageAction("A2"), messageAction("A3"), messageAction("A4"), messageAction("A5"), ], }); expect(column.actions.length).toBe(3); }); it("truncates text to 120 characters", () => { const longText = "x".repeat(150); const column = createCarouselColumn({ text: longText, actions: [messageAction("OK")] }); expect(column.text.length).toBe(120); }); }); describe("carousel column limits", () => { it.each([ { createTemplate: () => createTemplateCarousel( Array.from({ length: 15 }, () => createCarouselColumn({ text: "Text", actions: [messageAction("OK")] }), ), ), }, { createTemplate: () => createImageCarousel( Array.from({ length: 15 }, (_, i) => createImageCarouselColumn(`https://example.com/${i}.jpg`, messageAction("View")), ), ), }, ])("limits columns to 10", ({ createTemplate }) => { const template = createTemplate(); expect((template.template as { columns: unknown[] }).columns.length).toBe(10); }); }); describe("createProductCarousel", () => { it.each([ { title: "Product", description: "Desc", actionLabel: "Buy", actionUrl: "https://shop.com/buy", expectedType: "uri", }, { title: "Product", description: "Desc", actionLabel: "Select", actionData: "product_id=123", expectedType: "postback", }, ])("uses expected action type for product action", ({ expectedType, ...item }) => { const template = createProductCarousel([item]); const columns = (template.template as { columns: Array<{ actions: Array<{ type: string }> }> }) .columns; expect(columns[0].actions[0].type).toBe(expectedType); }); });