ai-chatbot/tests/integration/markdown-image-segments.test.ts

73 lines
3.0 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import { splitMarkdownImages } from "../../lib/canvas/markdown-image-segments";
const image = "https://example.com/folder/test.jpg";
test("SKU output consumes the entire redundant linked-image wrapper", () => {
const text = `生成图\n[![第2行](${image})](${image})\n下载完成`;
assert.deepEqual(splitMarkdownImages(text), [
{ type: "text", value: "生成图\n" },
{ type: "image", alt: "第2行", src: image },
{ type: "text", value: "\n下载完成" },
]);
});
test("several linked and ordinary images do not leave broken wrapper text", () => {
const parts = splitMarkdownImages(`[![a](${image})](${image})\n![b](https://example.com/b.png)`);
assert.deepEqual(parts, [
{ type: "image", alt: "a", src: image },
{ type: "text", value: "\n" },
{ type: "image", alt: "b", src: "https://example.com/b.png" },
]);
});
test("different outer links and ordinary links are preserved verbatim", () => {
const nested = `[![thumbnail](${image})](https://example.com/full.jpg)`;
const input = `[文档](https://example.com/doc) ${nested} ![plain](https://example.com/next.jpg)`;
assert.deepEqual(splitMarkdownImages(input), [
{ type: "text", value: `[文档](https://example.com/doc) ${nested} ` },
{ type: "image", alt: "plain", src: "https://example.com/next.jpg" },
]);
});
test("supports balanced and escaped parentheses and nested/escaped alt text", () => {
const url = "https://example.com/a_(1)/x.jpg";
assert.deepEqual(splitMarkdownImages(`[![a [b] \\] c](${url})](${url})`), [
{ type: "image", alt: "a [b] ] c", src: url },
]);
assert.deepEqual(splitMarkdownImages("![a](https://example.com/a\\(1\\).jpg)"), [
{ type: "image", alt: "a", src: "https://example.com/a(1).jpg" },
]);
});
test("does not extract examples in inline and fenced code", () => {
const input = `\`![code](${image})\`\n\`\`\`md\n[![a](${image})](${image})\n\`\`\`\n~~~md\n![c](${image})\n~~~\n![actual](${image})`;
const parts = splitMarkdownImages(input);
assert.equal(parts.filter((part) => part.type === "image").length, 1);
assert.equal(parts[0].type, "text");
assert.ok(parts[0].type === "text" && parts[0].value.includes("![code]"));
assert.deepEqual(parts[1], { type: "image", alt: "actual", src: image });
});
test("preserves unsafe, incomplete, and escaped markup for the existing renderer", () => {
for (const content of [
`[![x](${image})](javascript:alert(1))`,
`[![x](${image})](`,
`\\![x](${image})`,
"![x](data:image/png;base64,AAAA)",
]) assert.deepEqual(splitMarkdownImages(content), [{ type: "text", value: content }]);
});
test("retains existing thumbnail metadata in alt text", () => {
for (const alt of [
"thumb|||https://example.com/original.jpg|||",
"thumb$$https://example.com/original.jpg$$",
"thumb|https://example.com/original.jpg|",
]) {
assert.deepEqual(splitMarkdownImages(`![${alt}](${image})`), [
{ type: "image", alt, src: image },
]);
}
});