fix(canvas): 画布同步 - 素材缺失时可强制覆盖并恢复文本与连线顺序
云端缺少素材时可用本地版强制覆盖,只清失效媒体引用。文本节点不再把资源地址当正文,合并时保留引用槽位顺序。
This commit is contained in:
33
web/test/canvas-missing-resources.test.ts
Normal file
33
web/test/canvas-missing-resources.test.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import { canvasResourceIds, clearMissingCanvasResources } from "@/services/canvas-missing-resources";
|
||||
|
||||
describe("canvas missing resource overwrite", () => {
|
||||
test("collects nested resource locators without treating prompt text as media", () => {
|
||||
const value = {
|
||||
nodes: [{ id: "node-1", metadata: { storageKey: "resource:gone", prompt: "resource:keep-as-text", videoPreview: { url: "/api/resources/poster/file" } } }],
|
||||
};
|
||||
expect(canvasResourceIds(value)).toEqual(new Set(["gone", "poster"]));
|
||||
});
|
||||
|
||||
test("removes only invalid media fields and asset binding while keeping node content", () => {
|
||||
const value = {
|
||||
id: "canvas",
|
||||
nodes: [{ id: "node-1", type: "image", metadata: { assetId: "asset-1", storageKey: "resource:gone", content: "/api/resources/gone/file", prompt: "keep this prompt", status: "success" } }],
|
||||
timeline: { clips: [{ id: "clip", directMedia: { kind: "image", assetId: "asset-1", storageKey: "resource:gone", url: "/api/resources/gone/file" } }] },
|
||||
};
|
||||
const repaired = clearMissingCanvasResources(value, new Set(["gone"]));
|
||||
expect(repaired).toEqual({
|
||||
id: "canvas",
|
||||
nodes: [{ id: "node-1", type: "image", metadata: { prompt: "keep this prompt", status: "idle" } }],
|
||||
timeline: { clips: [{ id: "clip", directMedia: { kind: "image" } }] },
|
||||
});
|
||||
});
|
||||
|
||||
test("server reported locator fields are also cleared during the fallback", () => {
|
||||
const value = { nodes: [{ id: "node-1", metadata: { assetId: "asset-1", futureLocator: "resource:gone", prompt: "keep" } }] };
|
||||
expect(clearMissingCanvasResources(value, new Set(["gone"]), "", true)).toEqual({
|
||||
nodes: [{ id: "node-1", metadata: { assetId: "asset-1", prompt: "keep" } }],
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user