57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
import { buildHoverPreview, firstUsefulParagraph, previewSummary } from "../src/render";
|
|
|
|
describe("hover preview helpers", () => {
|
|
it("extracts the first useful paragraph after frontmatter and headings", () => {
|
|
const paragraph = firstUsefulParagraph(`---
|
|
title: Demo
|
|
---
|
|
# Demo
|
|
|
|
第一段说明 [[wiki/entities/A.md|节点A]] 和 [链接](https://example.com)。
|
|
|
|
第二段不应该出现。`);
|
|
|
|
assert.equal(paragraph, "第一段说明 节点A 和 链接。");
|
|
});
|
|
|
|
it("uses explicit summary before content", () => {
|
|
assert.equal(
|
|
previewSummary({
|
|
summary: "显式摘要优先。",
|
|
content: "# 标题\n\n正文不应该出现。"
|
|
}),
|
|
"显式摘要优先。"
|
|
);
|
|
});
|
|
|
|
it("handles wikilinks, code fences, empty content, and truncation", () => {
|
|
assert.equal(
|
|
previewSummary({
|
|
content: "```js\nconsole.log('skip')\n```\n\n## 标题\n\n包含 [[Target|标签]] 和 `代码`。"
|
|
}),
|
|
"包含 标签 和 代码。"
|
|
);
|
|
|
|
assert.equal(previewSummary({ content: "" }), "");
|
|
|
|
const long = previewSummary({ content: `# 标题\n\n${"长".repeat(180)}` });
|
|
assert.equal(long.length <= 143, true);
|
|
assert.equal(long.endsWith("..."), true);
|
|
});
|
|
|
|
it("builds a title and type even when content is empty", () => {
|
|
assert.deepEqual(
|
|
buildHoverPreview({ id: "a", label: "节点A", type: "topic", content: "" }),
|
|
{
|
|
id: "a",
|
|
title: "节点A",
|
|
typeLabel: "主题",
|
|
summary: ""
|
|
}
|
|
);
|
|
});
|
|
});
|