fix(canvas): 画布同步 - 素材缺失时可强制覆盖并恢复文本与连线顺序
云端缺少素材时可用本地版强制覆盖,只清失效媒体引用。文本节点不再把资源地址当正文,合并时保留引用槽位顺序。
This commit is contained in:
67
web/test/user-data-sync-media.test.ts
Normal file
67
web/test/user-data-sync-media.test.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import { ensureRemoteResourceReferences, restoreRemoteTextNodeContents } from "@/services/user-data-sync-media";
|
||||
|
||||
describe("画布资源引用同步", () => {
|
||||
test("文本节点保留正文,只同步资源定位键", async () => {
|
||||
const node = {
|
||||
type: "text",
|
||||
metadata: {
|
||||
content: "这是上传文件的正文",
|
||||
prompt: "这是上传文件的正文",
|
||||
storageKey: "resource:text-file",
|
||||
mimeType: "text/plain",
|
||||
},
|
||||
};
|
||||
|
||||
const synced = await ensureRemoteResourceReferences(node);
|
||||
|
||||
expect(synced.metadata.content).toBe(node.metadata.content);
|
||||
expect(synced.metadata.prompt).toBe(node.metadata.prompt);
|
||||
expect(synced.metadata.storageKey).toBe("resource:text-file");
|
||||
});
|
||||
|
||||
test("媒体节点仍将展示字段转换为资源地址", async () => {
|
||||
const node = {
|
||||
type: "image",
|
||||
metadata: {
|
||||
content: "blob:image",
|
||||
storageKey: "resource:image-file",
|
||||
},
|
||||
};
|
||||
|
||||
const synced = await ensureRemoteResourceReferences(node);
|
||||
|
||||
expect(synced.metadata.content).toContain("/resources/image-file/file");
|
||||
});
|
||||
|
||||
test("加载旧画布时恢复已被保存成资源 URL 的文本正文", async () => {
|
||||
const project = {
|
||||
nodes: [
|
||||
{
|
||||
type: "text",
|
||||
metadata: {
|
||||
content: "/api/resources/text-file/file",
|
||||
prompt: "上传文件的原始正文",
|
||||
storageKey: "resource:text-file",
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const restored = await restoreRemoteTextNodeContents(project, async () => null);
|
||||
|
||||
expect(restored.nodes[0].metadata.content).toBe("上传文件的原始正文");
|
||||
});
|
||||
|
||||
test("没有可恢复的 prompt 时从资源文件读取正文", async () => {
|
||||
const project = {
|
||||
nodes: [{ type: "text", metadata: { content: "/api/resources/text-file/file", storageKey: "resource:text-file" } }],
|
||||
};
|
||||
|
||||
const restored = await restoreRemoteTextNodeContents(project, async () => "从资源恢复的正文");
|
||||
|
||||
expect(restored.nodes[0].metadata.content).toBe("从资源恢复的正文");
|
||||
expect(restored.nodes[0].metadata.prompt).toBe("从资源恢复的正文");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user