From e77aa26af6f30953ba1aa5c1d07c3883ac9e35ca Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 15 Mar 2026 18:58:06 -0700 Subject: [PATCH] Slack: test shared interactive renderer --- .../slack/src/shared-interactive.test.ts | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 extensions/slack/src/shared-interactive.test.ts diff --git a/extensions/slack/src/shared-interactive.test.ts b/extensions/slack/src/shared-interactive.test.ts new file mode 100644 index 00000000000..844bde570d2 --- /dev/null +++ b/extensions/slack/src/shared-interactive.test.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from "vitest"; +import { buildSlackInteractiveBlocks } from "./shared-interactive.js"; + +describe("buildSlackInteractiveBlocks", () => { + it("renders shared interactive blocks in authored order", () => { + expect( + buildSlackInteractiveBlocks({ + blocks: [ + { + type: "select", + placeholder: "Pick one", + options: [{ label: "Alpha", value: "alpha" }], + }, + { type: "text", text: "then" }, + { type: "buttons", buttons: [{ label: "Retry", value: "retry" }] }, + ], + }), + ).toEqual([ + expect.objectContaining({ + type: "actions", + block_id: "openclaw_reply_select_1", + }), + expect.objectContaining({ + type: "section", + text: expect.objectContaining({ text: "then" }), + }), + expect.objectContaining({ + type: "actions", + block_id: "openclaw_reply_buttons_1", + }), + ]); + }); + + it("truncates Slack render strings to Block Kit limits", () => { + const long = "x".repeat(120); + const blocks = buildSlackInteractiveBlocks({ + blocks: [ + { type: "text", text: "y".repeat(3100) }, + { type: "select", placeholder: long, options: [{ label: long, value: long }] }, + { type: "buttons", buttons: [{ label: long, value: long }] }, + ], + }); + const section = blocks[0] as { text?: { text?: string } }; + const selectBlock = blocks[1] as { + elements?: Array<{ placeholder?: { text?: string } }>; + }; + const buttonBlock = blocks[2] as { + elements?: Array<{ value?: string }>; + }; + + expect((section.text?.text ?? "").length).toBeLessThanOrEqual(3000); + expect((selectBlock.elements?.[0]?.placeholder?.text ?? "").length).toBeLessThanOrEqual(75); + expect((buttonBlock.elements?.[0]?.value ?? "").length).toBeLessThanOrEqual(75); + }); +});