OpenCut/apps/web/src/agent/tools/__tests__/move-timeline-elements.test.ts

96 lines
2.5 KiB
TypeScript

import { beforeEach, describe, expect, mock, test } from "bun:test";
import type { AgentContext } from "@/agent/types";
import { toolRegistry } from "@/agent/tools/registry";
const mockMoveTimelineElements = mock(
(_args: { elementIds: string[]; start: number; targetTrackId?: string }) => ({
success: true,
movedElements: [{ elementId: "clip-1", trackId: "main", start: 4, end: 8 }],
}),
);
mock.module("@/agent/context", () => ({
EditorContextAdapter: {
moveTimelineElements: mockMoveTimelineElements,
},
}));
await import("@/agent/tools/move-timeline-elements.tool");
const context: AgentContext = {
projectId: "proj-1",
activeSceneId: "scene-A",
mediaAssets: [],
playbackTimeMs: 0,
};
describe("move_timeline_elements tool", () => {
beforeEach(() => {
mockMoveTimelineElements.mockClear();
});
test("is registered in the tool registry", () => {
expect(toolRegistry.has("move_timeline_elements")).toBe(true);
});
test("moves timeline elements through the editor adapter", async () => {
const tool = toolRegistry.get("move_timeline_elements");
const result = await tool.execute(
{ elementIds: ["clip-1"], start: 4, targetTrackId: "overlay-1" },
context,
);
expect(mockMoveTimelineElements).toHaveBeenCalledWith({
elementIds: ["clip-1"],
start: 4,
targetTrackId: "overlay-1",
});
expect(result).toEqual({
success: true,
movedElements: [
{ elementId: "clip-1", trackId: "main", start: 4, end: 8 },
],
});
});
test("omits targetTrackId when moving within current tracks", async () => {
const tool = toolRegistry.get("move_timeline_elements");
await tool.execute({ elementIds: ["clip-1"], start: 4 }, context);
expect(mockMoveTimelineElements).toHaveBeenCalledWith({
elementIds: ["clip-1"],
start: 4,
});
});
test("validates move arguments", async () => {
const tool = toolRegistry.get("move_timeline_elements");
expect(await tool.execute({ elementIds: [], start: 0 }, context)).toEqual({
error: "Invalid element ids",
});
expect(
await tool.execute({ elementIds: ["clip-1"], start: -1 }, context),
).toEqual({
error: "Invalid start time",
});
expect(
await tool.execute(
{ elementIds: ["clip-1"], start: Number.NaN },
context,
),
).toEqual({
error: "Invalid start time",
});
expect(
await tool.execute(
{ elementIds: ["clip-1"], start: 0, targetTrackId: "" },
context,
),
).toEqual({
error: "Invalid target track id",
});
expect(mockMoveTimelineElements).not.toHaveBeenCalled();
});
});