diff --git a/extensions/openai/video-generation-provider.test.ts b/extensions/openai/video-generation-provider.test.ts index 70df462f3ab..08d0b63fd78 100644 --- a/extensions/openai/video-generation-provider.test.ts +++ b/extensions/openai/video-generation-provider.test.ts @@ -34,6 +34,18 @@ function fetchWithTimeoutCall(index: number): [string, RequestInit | undefined, return call; } +function providerHttpConfigRequest(): Record { + const [call] = resolveProviderHttpRequestConfigMock.mock.calls; + if (!call) { + throw new Error("expected provider HTTP config request"); + } + const [request] = call; + if (!request || typeof request !== "object" || Array.isArray(request)) { + throw new Error("expected provider HTTP config request"); + } + return request as Record; +} + describe("openai video generation provider", () => { it("declares the openai-codex alias for default-model ordering", () => { const provider = buildOpenAIVideoGenerationProvider(); @@ -179,10 +191,7 @@ describe("openai video generation provider", () => { }, }); - const configRequest = resolveProviderHttpRequestConfigMock.mock.calls[0]?.[0] as - | Record - | undefined; - expect(configRequest?.baseUrl).toBe("http://127.0.0.1:44080/v1"); + expect(providerHttpConfigRequest().baseUrl).toBe("http://127.0.0.1:44080/v1"); const createRequest = postJsonRequest(); expect(createRequest.url).toBe("http://127.0.0.1:44080/v1/videos"); expect(createRequest.allowPrivateNetwork).toBe(false); diff --git a/extensions/openrouter/image-generation-provider.test.ts b/extensions/openrouter/image-generation-provider.test.ts index 399b1aee824..bcbe07921b5 100644 --- a/extensions/openrouter/image-generation-provider.test.ts +++ b/extensions/openrouter/image-generation-provider.test.ts @@ -36,11 +36,39 @@ vi.mock("openclaw/plugin-sdk/provider-http", () => ({ function requireOpenRouterPostBody(): { messages?: Array<{ content?: unknown }>; } { - const request = postJsonRequestMock.mock.calls[0]?.[0]; - if (!request) { + const request = requireOpenRouterPostRequest(); + return request.body as { messages?: Array<{ content?: unknown }> }; +} + +function requireOpenRouterPostRequest(): Record { + const [call] = postJsonRequestMock.mock.calls; + if (!call) { throw new Error("expected OpenRouter image generation request"); } - return request.body as { messages?: Array<{ content?: unknown }> }; + const [request] = call; + if (!request || typeof request !== "object" || Array.isArray(request)) { + throw new Error("expected OpenRouter image generation request"); + } + return request as Record; +} + +function requireOpenRouterConfigRequest(): Record { + const [call] = resolveProviderHttpRequestConfigMock.mock.calls; + if (!call) { + throw new Error("expected OpenRouter image config request"); + } + const [request] = call; + if (!request || typeof request !== "object" || Array.isArray(request)) { + throw new Error("expected OpenRouter image config request"); + } + return request; +} + +function requireHeaders(value: unknown): Headers { + if (!(value instanceof Headers)) { + throw new Error("expected OpenRouter image request headers"); + } + return value; } function requireGeneratedImage( @@ -129,6 +157,7 @@ describe("openrouter image generation provider", () => { providers: { openrouter: { baseUrl: "https://custom.openrouter.test/api/v1", + models: [], }, }, }, @@ -137,7 +166,7 @@ describe("openrouter image generation provider", () => { store: undefined, }); expect(resolveProviderHttpRequestConfigMock).toHaveBeenCalledOnce(); - expect(resolveProviderHttpRequestConfigMock.mock.calls[0]?.[0]).toEqual({ + expect(requireOpenRouterConfigRequest()).toEqual({ baseUrl: "https://custom.openrouter.test/api/v1", defaultBaseUrl: "https://openrouter.ai/api/v1", allowPrivateNetwork: false, @@ -151,19 +180,16 @@ describe("openrouter image generation provider", () => { transport: "http", }); expect(postJsonRequestMock).toHaveBeenCalledOnce(); - const request = postJsonRequestMock.mock.calls[0]?.[0]; - if (!request) { - throw new Error("expected OpenRouter image generation request"); - } - expect(request.headers).toBeInstanceOf(Headers); - expect(Object.fromEntries(request.headers.entries())).toEqual({ + const request = requireOpenRouterPostRequest(); + const headers = requireHeaders(request.headers); + expect(Object.fromEntries(headers.entries())).toEqual({ authorization: "Bearer openrouter-key", "http-referer": "https://openclaw.ai", "x-openrouter-title": "OpenClaw", }); expect(request).toEqual({ url: "https://custom.openrouter.test/api/v1/chat/completions", - headers: request.headers, + headers, body: { model: "google/gemini-3.1-flash-image-preview", messages: [ diff --git a/extensions/openrouter/speech-provider.test.ts b/extensions/openrouter/speech-provider.test.ts index b97c54054d5..0affaccaf2c 100644 --- a/extensions/openrouter/speech-provider.test.ts +++ b/extensions/openrouter/speech-provider.test.ts @@ -19,6 +19,37 @@ vi.mock("openclaw/plugin-sdk/provider-http", () => ({ resolveProviderHttpRequestConfig: resolveProviderHttpRequestConfigMock, })); +function requireOpenRouterConfigRequest(): Record { + const [call] = resolveProviderHttpRequestConfigMock.mock.calls; + if (!call) { + throw new Error("expected OpenRouter speech config request"); + } + const [request] = call; + if (!request || typeof request !== "object" || Array.isArray(request)) { + throw new Error("expected OpenRouter speech config request"); + } + return request; +} + +function requireOpenRouterPostRequest(): Record { + const [call] = postJsonRequestMock.mock.calls; + if (!call) { + throw new Error("expected OpenRouter speech request"); + } + const [request] = call; + if (!request || typeof request !== "object" || Array.isArray(request)) { + throw new Error("expected OpenRouter speech request"); + } + return request as Record; +} + +function requireHeaders(value: unknown): Headers { + if (!(value instanceof Headers)) { + throw new Error("expected OpenRouter speech request headers"); + } + return value; +} + describe("openrouter speech provider", () => { afterEach(() => { assertOkOrThrowHttpErrorMock.mockClear(); @@ -100,7 +131,7 @@ describe("openrouter speech provider", () => { }); expect(resolveProviderHttpRequestConfigMock).toHaveBeenCalledOnce(); - expect(resolveProviderHttpRequestConfigMock.mock.calls[0]?.[0]).toEqual({ + expect(requireOpenRouterConfigRequest()).toEqual({ baseUrl: "https://openrouter.ai/api/v1", defaultBaseUrl: "https://openrouter.ai/api/v1", allowPrivateNetwork: false, @@ -115,12 +146,9 @@ describe("openrouter speech provider", () => { transport: "http", }); expect(postJsonRequestMock).toHaveBeenCalledOnce(); - const request = postJsonRequestMock.mock.calls[0]?.[0]; - if (!request) { - throw new Error("expected OpenRouter speech request"); - } - expect(request.headers).toBeInstanceOf(Headers); - expect(Object.fromEntries(request.headers.entries())).toEqual({ + const request = requireOpenRouterPostRequest(); + const headers = requireHeaders(request.headers); + expect(Object.fromEntries(headers.entries())).toEqual({ authorization: "Bearer sk-openrouter", "content-type": "application/json", "http-referer": "https://openclaw.ai", @@ -128,7 +156,7 @@ describe("openrouter speech provider", () => { }); expect(request).toEqual({ url: "https://openrouter.ai/api/v1/audio/speech", - headers: request.headers, + headers, body: { model: "openai/gpt-4o-mini-tts-2025-12-15", input: "hello",