Files
openclaw/extensions/feishu/src/post.test.ts
2026-02-27 23:57:27 -08:00

106 lines
3.1 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { parsePostContent } from "./post.js";
describe("parsePostContent", () => {
it("renders title and styled text as markdown", () => {
const content = JSON.stringify({
title: "Daily *Plan*",
content: [
[
{ tag: "text", text: "Bold", style: { bold: true } },
{ tag: "text", text: " " },
{ tag: "text", text: "Italic", style: { italic: true } },
{ tag: "text", text: " " },
{ tag: "text", text: "Underline", style: { underline: true } },
{ tag: "text", text: " " },
{ tag: "text", text: "Strike", style: { strikethrough: true } },
{ tag: "text", text: " " },
{ tag: "text", text: "Code", style: { code: true, bold: true } },
],
],
});
const result = parsePostContent(content);
expect(result.textContent).toBe(
"Daily \\*Plan\\*\n\n**Bold** *Italic* <u>Underline</u> ~~Strike~~ `Code`",
);
expect(result.imageKeys).toEqual([]);
expect(result.mentionedOpenIds).toEqual([]);
});
it("renders links and mentions", () => {
const content = JSON.stringify({
title: "",
content: [
[
{ tag: "a", text: "Docs [v2]", href: "https://example.com/guide(a)" },
{ tag: "text", text: " " },
{ tag: "at", user_name: "alice_bob" },
{ tag: "text", text: " " },
{ tag: "at", open_id: "ou_123" },
{ tag: "text", text: " " },
{ tag: "a", href: "https://example.com/no-text" },
],
],
});
const result = parsePostContent(content);
expect(result.textContent).toBe(
"[Docs \\[v2\\]](https://example.com/guide(a)) @alice\\_bob @ou\\_123 [https://example.com/no\\-text](https://example.com/no-text)",
);
expect(result.mentionedOpenIds).toEqual(["ou_123"]);
});
it("inserts image placeholders and collects image keys", () => {
const content = JSON.stringify({
title: "",
content: [
[
{ tag: "text", text: "Before " },
{ tag: "img", image_key: "img_1" },
{ tag: "text", text: " after" },
],
[{ tag: "img", image_key: "img_2" }],
],
});
const result = parsePostContent(content);
expect(result.textContent).toBe("Before ![image] after\n![image]");
expect(result.imageKeys).toEqual(["img_1", "img_2"]);
expect(result.mentionedOpenIds).toEqual([]);
});
it("supports locale wrappers", () => {
const wrappedByPost = JSON.stringify({
post: {
zh_cn: {
title: "标题",
content: [[{ tag: "text", text: "内容A" }]],
},
},
});
const wrappedByLocale = JSON.stringify({
zh_cn: {
title: "标题",
content: [[{ tag: "text", text: "内容B" }]],
},
});
expect(parsePostContent(wrappedByPost)).toEqual({
textContent: "标题\n\n内容A",
imageKeys: [],
mediaKeys: [],
mentionedOpenIds: [],
});
expect(parsePostContent(wrappedByLocale)).toEqual({
textContent: "标题\n\n内容B",
imageKeys: [],
mediaKeys: [],
mentionedOpenIds: [],
});
});
});