summaryrefslogtreecommitdiffhomepage
path: root/packages/trace-replay/src/record.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/trace-replay/src/record.test.ts')
-rw-r--r--packages/trace-replay/src/record.test.ts206
1 files changed, 103 insertions, 103 deletions
diff --git a/packages/trace-replay/src/record.test.ts b/packages/trace-replay/src/record.test.ts
index af9dbd0..38261f4 100644
--- a/packages/trace-replay/src/record.test.ts
+++ b/packages/trace-replay/src/record.test.ts
@@ -3,110 +3,110 @@ import { recordFetch } from "./record.js";
import type { FetchLike, HttpExchangeFixture } from "./types.js";
function fakeResponse(body: string, init?: ResponseInit): Response {
- return new Response(body, {
- status: 200,
- statusText: "OK",
- headers: { "content-type": "application/json" },
- ...init,
- });
+ return new Response(body, {
+ status: 200,
+ statusText: "OK",
+ headers: { "content-type": "application/json" },
+ ...init,
+ });
}
describe("recordFetch", () => {
- it("onExchange receives fixture matching request+response", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () => fakeResponse('{"ok":true}');
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- await recorded("https://api.example.com/v1/chat", {
- method: "POST",
- headers: { "content-type": "application/json" },
- body: '{"prompt":"hi"}',
- });
-
- expect(fixtures).toHaveLength(1);
- const fx = fixtures[0] as HttpExchangeFixture;
- expect(fx.request.method).toBe("POST");
- expect(fx.request.url).toBe("https://api.example.com/v1/chat");
- expect(fx.request.headers["content-type"]).toBe("application/json");
- expect(fx.request.body).toBe('{"prompt":"hi"}');
- expect(fx.response.status).toBe(200);
- expect(fx.response.statusText).toBe("OK");
- expect(fx.response.headers["content-type"]).toBe("application/json");
- expect(fx.response.body).toBe('{"ok":true}');
- });
-
- it("response returned to caller is still fully readable after recording", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () => fakeResponse("full body content");
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- const res = await recorded("https://x");
- expect(await res.text()).toBe("full body content");
- });
-
- it("response body can be read even after fixture is captured", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () => fakeResponse("stream data");
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- const res = await recorded("https://x");
- expect(fixtures[0]?.response.body).toBe("stream data");
- expect(await res.text()).toBe("stream data");
- });
-
- it("captures Request object input with method", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () => fakeResponse("ok");
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- const req = new Request("https://from-req.com/path", { method: "PUT" });
- await recorded(req);
-
- expect(fixtures[0]?.request.url).toBe("https://from-req.com/path");
- expect(fixtures[0]?.request.method).toBe("PUT");
- });
-
- it("defaults method to GET", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () => fakeResponse("ok");
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- await recorded("https://x");
- expect(fixtures[0]?.request.method).toBe("GET");
- });
-
- it("captures null request body", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () => fakeResponse("ok");
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- await recorded("https://x", { method: "GET" });
- expect(fixtures[0]?.request.body).toBeNull();
- });
-
- it("captures response error status", async () => {
- const fixtures: HttpExchangeFixture[] = [];
- const fakeFetch: FetchLike = async () =>
- new Response('{"error":"bad request"}', {
- status: 400,
- statusText: "Bad Request",
- });
- const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
-
- const res = await recorded("https://x");
- expect(fixtures[0]?.response.status).toBe(400);
- expect(res.status).toBe(400);
- });
-
- it("passes through to real fetch", async () => {
- let called = false;
- const fakeFetch: FetchLike = async () => {
- called = true;
- return new Response("from fake", { status: 201 });
- };
- const recorded = recordFetch(fakeFetch, () => {});
- const res = await recorded("https://x");
- expect(called).toBe(true);
- expect(res.status).toBe(201);
- });
+ it("onExchange receives fixture matching request+response", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () => fakeResponse('{"ok":true}');
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ await recorded("https://api.example.com/v1/chat", {
+ method: "POST",
+ headers: { "content-type": "application/json" },
+ body: '{"prompt":"hi"}',
+ });
+
+ expect(fixtures).toHaveLength(1);
+ const fx = fixtures[0] as HttpExchangeFixture;
+ expect(fx.request.method).toBe("POST");
+ expect(fx.request.url).toBe("https://api.example.com/v1/chat");
+ expect(fx.request.headers["content-type"]).toBe("application/json");
+ expect(fx.request.body).toBe('{"prompt":"hi"}');
+ expect(fx.response.status).toBe(200);
+ expect(fx.response.statusText).toBe("OK");
+ expect(fx.response.headers["content-type"]).toBe("application/json");
+ expect(fx.response.body).toBe('{"ok":true}');
+ });
+
+ it("response returned to caller is still fully readable after recording", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () => fakeResponse("full body content");
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ const res = await recorded("https://x");
+ expect(await res.text()).toBe("full body content");
+ });
+
+ it("response body can be read even after fixture is captured", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () => fakeResponse("stream data");
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ const res = await recorded("https://x");
+ expect(fixtures[0]?.response.body).toBe("stream data");
+ expect(await res.text()).toBe("stream data");
+ });
+
+ it("captures Request object input with method", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () => fakeResponse("ok");
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ const req = new Request("https://from-req.com/path", { method: "PUT" });
+ await recorded(req);
+
+ expect(fixtures[0]?.request.url).toBe("https://from-req.com/path");
+ expect(fixtures[0]?.request.method).toBe("PUT");
+ });
+
+ it("defaults method to GET", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () => fakeResponse("ok");
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ await recorded("https://x");
+ expect(fixtures[0]?.request.method).toBe("GET");
+ });
+
+ it("captures null request body", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () => fakeResponse("ok");
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ await recorded("https://x", { method: "GET" });
+ expect(fixtures[0]?.request.body).toBeNull();
+ });
+
+ it("captures response error status", async () => {
+ const fixtures: HttpExchangeFixture[] = [];
+ const fakeFetch: FetchLike = async () =>
+ new Response('{"error":"bad request"}', {
+ status: 400,
+ statusText: "Bad Request",
+ });
+ const recorded = recordFetch(fakeFetch, (fx) => fixtures.push(fx));
+
+ const res = await recorded("https://x");
+ expect(fixtures[0]?.response.status).toBe(400);
+ expect(res.status).toBe(400);
+ });
+
+ it("passes through to real fetch", async () => {
+ let called = false;
+ const fakeFetch: FetchLike = async () => {
+ called = true;
+ return new Response("from fake", { status: 201 });
+ };
+ const recorded = recordFetch(fakeFetch, () => {});
+ const res = await recorded("https://x");
+ expect(called).toBe(true);
+ expect(res.status).toBe(201);
+ });
});