evOo-local/packages/core/src/http-response.test.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

67 lines
2.2 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { ResponseBodyTooLargeError, readBoundedJsonResponse } from "./http-response.js";
describe("readBoundedJsonResponse", () => {
it("parses a fragmented JSON response", async () => {
const encoder = new TextEncoder();
const response = new Response(
new ReadableStream({
start(controller) {
controller.enqueue(encoder.encode('{"ok":'));
controller.enqueue(encoder.encode("true}"));
controller.close();
},
}),
);
await expect(readBoundedJsonResponse(response, 64)).resolves.toEqual({ ok: true });
});
it("rejects and cancels a response with an oversized declared length", async () => {
const cancel = vi.fn();
const response = new Response(new ReadableStream({ cancel }), {
headers: { "content-length": "65" },
});
await expect(readBoundedJsonResponse(response, 64)).rejects.toBeInstanceOf(
ResponseBodyTooLargeError,
);
await vi.waitFor(() => expect(cancel).toHaveBeenCalledOnce());
});
it("rejects and cancels a streamed response that crosses the limit", async () => {
const cancel = vi.fn();
const response = new Response(
new ReadableStream({
start(controller) {
controller.enqueue(new Uint8Array(65));
},
cancel,
}),
);
await expect(readBoundedJsonResponse(response, 64)).rejects.toBeInstanceOf(
ResponseBodyTooLargeError,
);
await vi.waitFor(() => expect(cancel).toHaveBeenCalledOnce());
});
it("aborts a stalled body read", async () => {
const cancel = vi.fn();
const response = new Response(new ReadableStream({ cancel }));
const controller = new AbortController();
const pending = readBoundedJsonResponse(response, 64, controller.signal);
controller.abort(new Error("request timed out"));
await expect(pending).rejects.toThrow("request timed out");
await vi.waitFor(() => expect(cancel).toHaveBeenCalledOnce());
});
it("rejects malformed JSON after a complete bounded read", async () => {
await expect(readBoundedJsonResponse(new Response("not-json"), 64)).rejects.toBeInstanceOf(
SyntaxError,
);
});
});