Files
ttstd-infinite-canvas/web/test/user-data-sync-media.test.ts
ddcat666 dd66be15cb fix(canvas): 画布同步 - 素材缺失时可强制覆盖并恢复文本与连线顺序
云端缺少素材时可用本地版强制覆盖,只清失效媒体引用。文本节点不再把资源地址当正文,合并时保留引用槽位顺序。
2026-10-10 20:20:09 +08:00

68 lines
2.5 KiB
TypeScript

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("从资源恢复的正文");
});
});