// Alibaba tests cover video generation provider plugin behavior. import { getProviderHttpMocks, installProviderHttpMockCleanup, } from "openclaw/plugin-sdk/provider-http-test-mocks"; import { expectDashscopeVideoTaskPoll, expectExplicitVideoGenerationCapabilities, expectSuccessfulDashscopeVideoResult, mockSuccessfulDashscopeVideoTask, } from "openclaw/plugin-sdk/provider-test-contracts"; import { beforeAll, describe, expect, it } from "vitest"; const { postJsonRequestMock, fetchWithTimeoutMock } = getProviderHttpMocks(); let buildAlibabaVideoGenerationProvider: typeof import("./video-generation-provider.js").buildAlibabaVideoGenerationProvider; beforeAll(async () => { ({ buildAlibabaVideoGenerationProvider } = await import("./video-generation-provider.js")); }); installProviderHttpMockCleanup(); function requireRecord(value: unknown, label: string): Record { if (value === null || typeof value !== "object" || Array.isArray(value)) { throw new Error(`expected ${label} to be a record`); } return value as Record; } function requireFirstPostJsonRequest(label: string): Record { const [call] = postJsonRequestMock.mock.calls; if (!call) { throw new Error(`expected ${label}`); } return requireRecord(call[0], label); } describe("alibaba video generation provider", () => { it("declares explicit mode capabilities", () => { expectExplicitVideoGenerationCapabilities(buildAlibabaVideoGenerationProvider()); }); it("submits async Wan generation, polls task status, and downloads the resulting video", async () => { mockSuccessfulDashscopeVideoTask({ postJsonRequestMock, fetchWithTimeoutMock }); const provider = buildAlibabaVideoGenerationProvider(); const result = await provider.generateVideo({ provider: "alibaba", model: "wan2.6-r2v-flash", prompt: "animate this shot", cfg: {}, inputImages: [{ url: "https://example.com/ref.png" }], durationSeconds: 6, audio: true, watermark: false, }); expect(postJsonRequestMock).toHaveBeenCalledOnce(); const request = requireFirstPostJsonRequest("DashScope request"); expect(request.url).toBe( "https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis", ); const body = requireRecord(request.body, "DashScope request body"); expect(body.model).toBe("wan2.6-r2v-flash"); const input = requireRecord(body.input, "DashScope request input"); expect(input.prompt).toBe("animate this shot"); expect(input.img_url).toBe("https://example.com/ref.png"); const parameters = requireRecord(body.parameters, "DashScope request parameters"); expect(parameters.duration).toBe(6); expect(parameters.enable_audio).toBe(true); expect(parameters.watermark).toBe(false); expectDashscopeVideoTaskPoll(fetchWithTimeoutMock); expectSuccessfulDashscopeVideoResult(result); }); it("fails fast when reference inputs are local buffers instead of remote URLs", async () => { const provider = buildAlibabaVideoGenerationProvider(); await expect( provider.generateVideo({ provider: "alibaba", model: "wan2.6-i2v", prompt: "animate this local frame", cfg: {}, inputImages: [{ buffer: Buffer.from("png-bytes"), mimeType: "image/png" }], }), ).rejects.toThrow( "Alibaba Wan video generation currently requires remote http(s) URLs for reference images/videos.", ); expect(postJsonRequestMock).not.toHaveBeenCalled(); }); });