Fix tiptap selection sync and toolbar event loop
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
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();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user