import { expect, test } from "@playwright/test"; import { removeVideoReferenceEdge, resolveVideoReferenceSelectionRule, resolveVideoReferenceToggleAction, selectVideoReferenceImages, toggleVideoReferenceEdge, type VideoReferenceEdge, } from "@/lib/canvas/video-reference-selection"; import { defaultVideoCanvasFunctionConfig } from "@/lib/video-canvas/config"; const imageToVideoEdge: VideoReferenceEdge = { id: "edge-reference", source: "image-1", target: "video-1", }; test.describe("video reference selection", () => { test("adds an image-to-video edge and removes it on the second selection", () => { const selected = toggleVideoReferenceEdge( [], "image-1", "video-1", () => imageToVideoEdge ); expect(selected).toEqual([imageToVideoEdge]); expect( toggleVideoReferenceEdge(selected, "image-1", "video-1", () => ({ ...imageToVideoEdge, id: "unused-edge", })) ).toEqual([]); }); test("removes only the reference edge for the requested target video", () => { const edges = [ imageToVideoEdge, { id: "edge-other-video", source: "image-1", target: "video-2" }, { id: "edge-other-image", source: "image-2", target: "video-1" }, ]; expect(removeVideoReferenceEdge(edges, "image-1", "video-1")).toEqual([ edges[1], edges[2], ]); }); test("matches the competitor model-specific reference behavior", () => { const config = defaultVideoCanvasFunctionConfig.videoReferenceSelection; expect(resolveVideoReferenceSelectionRule(config, "Seedance 2.0 VIP")).toEqual({ autoExit: false, hideActionAtLimit: false, maxImages: 9, mode: "reference-images", }); expect( resolveVideoReferenceSelectionRule( config, "provider/seedance-1_5-pro", ), ).toEqual({ autoExit: true, hideActionAtLimit: true, maxImages: 1, mode: "first-frame", }); }); test("silently limits Seedance 2.0 references to nine while allowing removals", () => { const references = Array.from({ length: 9 }, (_, index) => ({ id: `edge-${index + 1}`, source: `image-${index + 1}`, target: "video-1", })); expect( resolveVideoReferenceToggleAction( references, "image-10", "video-1", 9, ), ).toBe("limit"); expect( resolveVideoReferenceToggleAction( references, "image-1", "video-1", 9, ), ).toBe("remove"); const imageUrls = Array.from({ length: 12 }, (_, index) => `image-${index + 1}`); expect(selectVideoReferenceImages(imageUrls, "reference-images", 9)).toEqual( imageUrls.slice(0, 9), ); expect(selectVideoReferenceImages(imageUrls, "first-frame", 9)).toEqual([ "image-1", ]); }); });