import { expect, test } from "@playwright/test"; import { resolveCanvasRuntimeEndpoint } from "@/lib/canvas/capabilities/internal-endpoint"; import { enqueueCanvasCapabilityExecution, getCanvasCapabilityQueueDepth, } from "@/lib/canvas/capabilities/task-queue"; test.describe("canvas runtime internal endpoints", () => { test("uses the local HTTP listener for server-internal capability calls", () => { expect( resolveCanvasRuntimeEndpoint( "/api/enhance", "https://ai.yydd.ai/api/canvas/canvas-1/capabilities", { port: "3125" } ) ).toBe("http://127.0.0.1:3125/api/enhance"); expect( resolveCanvasRuntimeEndpoint( "/api/enhance", "https://ai.yydd.ai/api/canvas/canvas-1/capabilities", { internalOrigin: "http://canvas-runtime:3000/base" } ) ).toBe("http://canvas-runtime:3000/api/enhance"); }); test("falls back to the incoming origin without an internal listener", () => { expect( resolveCanvasRuntimeEndpoint( "/api/enhance", "https://ai.yydd.ai/api/canvas/canvas-1/capabilities", { port: "invalid" } ) ).toBe("https://ai.yydd.ai/api/enhance"); }); test("continues the project queue after a failed capability execution", async () => { await expect( enqueueCanvasCapabilityExecution({ projectId: "failed-capability-project", execute: async () => { throw new Error("expected capability failure"); }, }) ).rejects.toThrow("expected capability failure"); await expect( enqueueCanvasCapabilityExecution({ projectId: "failed-capability-project", execute: async () => "recovered", }) ).resolves.toBe("recovered"); expect(getCanvasCapabilityQueueDepth("failed-capability-project")).toBe(0); }); });