@@ -54,10 +54,31 @@ vi.mock("openclaw/plugin-sdk/provider-http", async () => {
|
54 | 54 | |
55 | 55 | function releasedJson(value: unknown) { |
56 | 56 | return { |
57 | | -response: { |
58 | | -json: async () => value, |
| 57 | +response: new Response(JSON.stringify(value), { |
| 58 | +status: 200, |
| 59 | +headers: { "content-type": "application/json" }, |
| 60 | +}), |
| 61 | +release: vi.fn(async () => {}), |
| 62 | +}; |
| 63 | +} |
| 64 | + |
| 65 | +function releasedOversizedJsonStream() { |
| 66 | +let canceled = false; |
| 67 | +const stream = new ReadableStream<Uint8Array>({ |
| 68 | +start(controller) { |
| 69 | +controller.enqueue(new Uint8Array(16 * 1024 * 1024 + 1)); |
59 | 70 | }, |
| 71 | +cancel() { |
| 72 | +canceled = true; |
| 73 | +}, |
| 74 | +}); |
| 75 | +return { |
| 76 | +response: new Response(stream, { |
| 77 | +status: 200, |
| 78 | +headers: { "content-type": "application/json" }, |
| 79 | +}), |
60 | 80 | release: vi.fn(async () => {}), |
| 81 | +wasCanceled: () => canceled, |
61 | 82 | }; |
62 | 83 | } |
63 | 84 | |
@@ -292,6 +313,40 @@ describe("openrouter video generation provider", () => {
|
292 | 313 | }); |
293 | 314 | }); |
294 | 315 | |
| 316 | +it("cancels oversized OpenRouter video catalog success bodies", async () => { |
| 317 | +const oversized = releasedOversizedJsonStream(); |
| 318 | +fetchWithTimeoutGuardedMock.mockResolvedValueOnce(oversized); |
| 319 | + |
| 320 | +await expect( |
| 321 | +listOpenRouterVideoModelCatalog({ |
| 322 | +config: { |
| 323 | +models: { |
| 324 | +providers: { |
| 325 | +openrouter: { |
| 326 | +baseUrl: "https://custom.openrouter.test/openrouter/api/v1", |
| 327 | +}, |
| 328 | +}, |
| 329 | +}, |
| 330 | +} as never, |
| 331 | +env: {}, |
| 332 | +resolveProviderApiKey: () => ({ |
| 333 | +apiKey: "OPENROUTER_API_KEY", |
| 334 | +discoveryApiKey: "resolved-openrouter-key", |
| 335 | +}), |
| 336 | +resolveProviderAuth: () => ({ |
| 337 | +apiKey: "OPENROUTER_API_KEY", |
| 338 | +discoveryApiKey: "resolved-openrouter-key", |
| 339 | +mode: "api_key", |
| 340 | +source: "env", |
| 341 | +}), |
| 342 | +}), |
| 343 | +).rejects.toThrow( |
| 344 | +"OpenRouter video models request failed: JSON response exceeds 16777216 bytes", |
| 345 | +); |
| 346 | +expect(oversized.wasCanceled()).toBe(true); |
| 347 | +expect(oversized.release).toHaveBeenCalledOnce(); |
| 348 | +}); |
| 349 | + |
295 | 350 | it("skips live OpenRouter video catalog discovery without an API key", async () => { |
296 | 351 | await expect( |
297 | 352 | listOpenRouterVideoModelCatalog({ |
|