import { describe, expect, it } from "vitest"; import { parsePostMessage } from "../../src/feishu/client.js"; describe("parsePostMessage", () => { it("parses a simple text post", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [[{ tag: "text", text: "Hello" }]] }, })); expect(result).toEqual({ text: "Hello", imageKeys: [], fileKeys: [] }); }); it("prepends a post title as a markdown header", () => { const result = parsePostMessage(postContent({ zh_cn: { title: "Lesson Notes", content: [[{ tag: "text", text: "Hello" }]] }, })); expect(result.text).toBe("# Lesson Notes\n\nHello"); }); it("converts links to markdown", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [[ { tag: "text", text: "Read " }, { tag: "a", text: "docs", href: "https://example.com" }, ]], }, })); expect(result.text).toBe("Read [docs](https://example.com)"); }); it("converts mentions to readable @names", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [[{ tag: "at", user_id: "@_user_1", user_name: "John" }]] }, })); expect(result.text).toBe("@John"); }); it("converts code blocks to fenced markdown", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [[{ tag: "code_block", language: "ts", text: "const x = 1;" }]] }, })); expect(result.text).toBe("```ts\nconst x = 1;\n```"); }); it("collects image keys and inserts an image placeholder", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [[{ tag: "img", image_key: "img_key_here" }]] }, })); expect(result).toEqual({ text: "[Image]", imageKeys: ["img_key_here"], fileKeys: [] }); }); it("collects file keys and inserts an attachment placeholder", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [[{ tag: "file", file_key: "file_key_here", file_name: "worksheet.pdf" }]] }, })); expect(result).toEqual({ text: "[Attachment: worksheet.pdf]", imageKeys: [], fileKeys: ["file_key_here"], }); }); it("falls back to en_us when zh_cn is missing", () => { const result = parsePostMessage(postContent({ en_us: { content: [[{ tag: "text", text: "Hello from English" }]] }, })); expect(result.text).toBe("Hello from English"); }); it("unwraps content nested under a post key", () => { const result = parsePostMessage(postContent({ post: { zh_cn: { content: [[{ tag: "text", text: "Wrapped" }]] }, }, })); expect(result.text).toBe("Wrapped"); }); it("joins multiple rows with newlines", () => { const result = parsePostMessage(postContent({ zh_cn: { content: [ [{ tag: "text", text: "First row" }], [{ tag: "text", text: "Second row" }], ], }, })); expect(result.text).toBe("First row\nSecond row"); }); }); function postContent(value: unknown): string { return JSON.stringify(value); }