2026-04-19 21:03:25 +08:00
|
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
|
import { normalizeDocumentContentResponse } from "@/lib/documents/page-subtree-response";
|
|
|
|
|
import type { PageSubtreeProjection } from "@/lib/documents/page-subtree";
|
|
|
|
|
|
|
|
|
|
describe("page subtree response helpers", () => {
|
|
|
|
|
it("保留服务端返回的 pageSubtree", () => {
|
|
|
|
|
const serverPageSubtree = {
|
|
|
|
|
projectionId: "server_projection",
|
|
|
|
|
projection: "page_tree",
|
|
|
|
|
rootNodeId: "doc_1",
|
|
|
|
|
rootNode: {
|
|
|
|
|
id: "doc_1",
|
|
|
|
|
parentNodeId: null,
|
|
|
|
|
nodeType: "page",
|
|
|
|
|
blockId: null,
|
|
|
|
|
anchorBlockId: null,
|
|
|
|
|
depth: 0,
|
|
|
|
|
metadata: {
|
|
|
|
|
title: "服务端标题",
|
|
|
|
|
textSnippet: null,
|
|
|
|
|
blockType: null,
|
|
|
|
|
headingLevel: null,
|
|
|
|
|
numbering: null,
|
|
|
|
|
childCount: 0,
|
|
|
|
|
order: 0,
|
|
|
|
|
path: ["doc_1"],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
subtree: {
|
|
|
|
|
rootNodeId: "doc_1",
|
|
|
|
|
nodes: [],
|
|
|
|
|
},
|
|
|
|
|
outline: [],
|
|
|
|
|
evidence: [],
|
|
|
|
|
stats: {
|
|
|
|
|
blockCount: 0,
|
|
|
|
|
headingCount: 0,
|
|
|
|
|
evidenceCount: 0,
|
|
|
|
|
maxDepth: 0,
|
|
|
|
|
},
|
|
|
|
|
} satisfies PageSubtreeProjection;
|
|
|
|
|
|
|
|
|
|
const normalized = normalizeDocumentContentResponse({
|
|
|
|
|
documentId: "doc_1",
|
|
|
|
|
payload: {
|
|
|
|
|
content: null,
|
|
|
|
|
revision: 1,
|
|
|
|
|
conflictDetectionKey: "doc_1:1",
|
|
|
|
|
pageSubtree: serverPageSubtree,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(normalized.pageSubtree).toBe(serverPageSubtree);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it("在服务端缺失 pageSubtree 时保留空值", () => {
|
|
|
|
|
const normalized = normalizeDocumentContentResponse({
|
|
|
|
|
documentId: "doc_1",
|
|
|
|
|
title: "测试页面",
|
|
|
|
|
payload: {
|
|
|
|
|
content: [
|
|
|
|
|
{
|
|
|
|
|
id: "heading_1",
|
|
|
|
|
type: "heading",
|
|
|
|
|
props: { level: 1 },
|
|
|
|
|
content: [{ type: "text", text: "章节一" }],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
revision: 3,
|
|
|
|
|
conflictDetectionKey: "doc_1:3",
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(normalized.revision).toBe(3);
|
|
|
|
|
expect(normalized.conflictDetectionKey).toBe("doc_1:3");
|
|
|
|
|
expect(normalized.pageSubtree).toBeNull();
|
|
|
|
|
});
|
2026-05-06 21:44:20 +08:00
|
|
|
|
|
|
|
|
it("兼容 mnote-web transport 返回的 result 包装", () => {
|
|
|
|
|
const normalized = normalizeDocumentContentResponse({
|
|
|
|
|
documentId: "doc_1",
|
|
|
|
|
payload: {
|
|
|
|
|
result: {
|
|
|
|
|
content: [
|
|
|
|
|
{
|
|
|
|
|
id: "paragraph_1",
|
|
|
|
|
type: "paragraph",
|
|
|
|
|
content: [{ type: "text", text: "CLI 写入后应可编辑" }],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
revision: 4,
|
|
|
|
|
conflictDetectionKey: "doc_1:4",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(normalized.content).toEqual([
|
|
|
|
|
{
|
|
|
|
|
id: "paragraph_1",
|
|
|
|
|
type: "paragraph",
|
|
|
|
|
content: [{ type: "text", text: "CLI 写入后应可编辑" }],
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
expect(normalized.revision).toBe(4);
|
|
|
|
|
expect(normalized.conflictDetectionKey).toBe("doc_1:4");
|
|
|
|
|
});
|
2026-04-19 21:03:25 +08:00
|
|
|
});
|