test: guard provider request mock calls

This commit is contained in:
Peter Steinberger
2026-05-11 23:17:09 +01:00
parent 5c59bd6987
commit 920a27aa6f
3 changed files with 86 additions and 23 deletions

View File

@@ -34,6 +34,18 @@ function fetchWithTimeoutCall(index: number): [string, RequestInit | undefined,
return call;
}
function providerHttpConfigRequest(): Record<string, unknown> {
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<string, unknown>;
}
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<string, unknown>
| 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);

View File

@@ -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<string, unknown> {
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<string, unknown>;
}
function requireOpenRouterConfigRequest(): Record<string, unknown> {
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: [

View File

@@ -19,6 +19,37 @@ vi.mock("openclaw/plugin-sdk/provider-http", () => ({
resolveProviderHttpRequestConfig: resolveProviderHttpRequestConfigMock,
}));
function requireOpenRouterConfigRequest(): Record<string, unknown> {
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<string, unknown> {
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<string, unknown>;
}
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",