125 lines
3.7 KiB
TypeScript
125 lines
3.7 KiB
TypeScript
|
|
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);
|
||
|
|
});
|
||
|
|
});
|