File size: 1,597 Bytes
eb3f11e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import { describe, expect, it, vi } from "vitest";
import { createDeferredCore } from "../../shared/deferred.js";
import { withServer } from "./http-test-server.js";
describe("withServer", () => {
it.each([
{ outcome: "returns", rejectCallback: false },
{ outcome: "throws", rejectCallback: true },
])("closes an active response when its callback $outcome", async ({ rejectCallback }) => {
const callbackError = new Error("callback failed");
const started = createDeferredCore();
let reader: ReadableStreamDefaultReader<Uint8Array> | undefined;
let streamEnded = false;
const outcome = withServer(
(_request, response) => {
response.writeHead(200);
response.write("stream started");
},
async (baseUrl) => {
const response = await fetch(baseUrl);
reader = response.body!.getReader();
await reader.read();
void reader.read().then(
({ done }) => {
streamEnded = done;
},
() => {
streamEnded = true;
},
);
started.resolve();
if (rejectCallback) {
throw callbackError;
}
},
).then(
() => undefined,
(error: unknown) => {
started.reject(error);
return error;
},
);
try {
await started.promise;
await vi.waitFor(() => expect(streamEnded).toBe(true));
expect(await outcome).toBe(rejectCallback ? callbackError : undefined);
} finally {
await reader?.cancel().catch(() => undefined);
await outcome;
}
});
});
|