ai-chatbot/tests/routes/video-reference-selection.test.ts

104 lines
2.8 KiB
TypeScript

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",
]);
});
});