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(); }); 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"); }); });