Files
openclaw/src/feishu/format.test.ts
2026-02-03 14:27:39 -08:00

95 lines
3.0 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { containsMarkdown, markdownToFeishuPost } from "./format.js";
describe("containsMarkdown", () => {
it("detects bold text", () => {
expect(containsMarkdown("Hello **world**")).toBe(true);
});
it("detects italic text", () => {
expect(containsMarkdown("Hello *world*")).toBe(true);
});
it("detects inline code", () => {
expect(containsMarkdown("Run `npm install`")).toBe(true);
});
it("detects code blocks", () => {
expect(containsMarkdown("```js\nconsole.log('hi')\n```")).toBe(true);
});
it("detects links", () => {
expect(containsMarkdown("Visit [Google](https://google.com)")).toBe(true);
});
it("detects headings", () => {
expect(containsMarkdown("# Title")).toBe(true);
});
it("returns false for plain text", () => {
expect(containsMarkdown("Hello world")).toBe(false);
});
it("returns false for empty string", () => {
expect(containsMarkdown("")).toBe(false);
});
});
describe("markdownToFeishuPost", () => {
it("converts plain text", () => {
const result = markdownToFeishuPost("Hello world");
expect(result.zh_cn?.content).toBeDefined();
expect(result.zh_cn?.content[0]).toContainEqual({
tag: "text",
text: "Hello world",
});
});
it("converts bold text", () => {
const result = markdownToFeishuPost("Hello **bold** text");
const content = result.zh_cn?.content[0];
expect(content).toBeDefined();
// Should have at least one element with bold style
const boldElement = content?.find((el) => el.tag === "text" && el.style?.includes("bold"));
expect(boldElement).toBeDefined();
});
it("converts italic text", () => {
const result = markdownToFeishuPost("Hello *italic* text");
const content = result.zh_cn?.content[0];
expect(content).toBeDefined();
const italicElement = content?.find((el) => el.tag === "text" && el.style?.includes("italic"));
expect(italicElement).toBeDefined();
});
it("converts links", () => {
const result = markdownToFeishuPost("Visit [Google](https://google.com)");
const content = result.zh_cn?.content[0];
expect(content).toBeDefined();
const linkElement = content?.find((el) => el.tag === "a");
expect(linkElement).toBeDefined();
if (linkElement && linkElement.tag === "a") {
expect(linkElement.href).toBe("https://google.com");
expect(linkElement.text).toBe("Google");
}
});
it("handles multi-line text", () => {
const result = markdownToFeishuPost("Line 1\nLine 2\nLine 3");
expect(result.zh_cn?.content.length).toBe(3);
});
it("converts code to code style", () => {
const result = markdownToFeishuPost("Run `npm install`");
const content = result.zh_cn?.content[0];
expect(content).toBeDefined();
const codeElement = content?.find((el) => el.tag === "text" && el.style?.includes("code"));
expect(codeElement).toBeDefined();
});
it("handles empty input", () => {
const result = markdownToFeishuPost("");
expect(result.zh_cn?.content).toBeDefined();
});
});