|
| 1 | +import { createServer, type Server } from "node:http"; |
| 2 | +import { afterEach, describe, expect, it } from "vitest"; |
| 3 | + |
| 4 | +import { fetchUrl } from "./fetcher.js"; |
| 5 | + |
| 6 | +const servers: Server[] = []; |
| 7 | + |
| 8 | +async function createFixtureServer(): Promise<string> { |
| 9 | + const server = createServer((request, response) => { |
| 10 | + if (request.url === "/start") { |
| 11 | + response.writeHead(302, { |
| 12 | + location: "/final", |
| 13 | + "content-type": "text/plain; charset=utf-8", |
| 14 | + }); |
| 15 | + response.end("redirecting"); |
| 16 | + return; |
| 17 | + } |
| 18 | + |
| 19 | + response.writeHead(200, { "content-type": "text/plain; charset=utf-8" }); |
| 20 | + response.end("ready"); |
| 21 | + }); |
| 22 | + await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve)); |
| 23 | + const address = server.address(); |
| 24 | + if (typeof address !== "object" || address === null) { |
| 25 | + throw new Error("Expected TCP server address"); |
| 26 | + } |
| 27 | + servers.push(server); |
| 28 | + return `http://127.0.0.1:${address.port}`; |
| 29 | +} |
| 30 | + |
| 31 | +afterEach(async () => { |
| 32 | + await Promise.all( |
| 33 | + servers.splice(0).map( |
| 34 | + (server) => |
| 35 | + new Promise<void>((resolve, reject) => { |
| 36 | + server.close((error) => (error ? reject(error) : resolve())); |
| 37 | + }), |
| 38 | + ), |
| 39 | + ); |
| 40 | +}); |
| 41 | + |
| 42 | +describe("fetchUrl", () => { |
| 43 | + it("discards a response body without dump", async () => { |
| 44 | + // given |
| 45 | + const baseUrl = await createFixtureServer(); |
| 46 | + |
| 47 | + // when |
| 48 | + const result = await fetchUrl({ |
| 49 | + url: `${baseUrl}/start`, |
| 50 | + format: "text", |
| 51 | + timeoutSeconds: 1, |
| 52 | + }); |
| 53 | + |
| 54 | + // then |
| 55 | + expect(new TextDecoder().decode(result.body)).toBe("ready"); |
| 56 | + expect(result.url).toBe(`${baseUrl}/final`); |
| 57 | + }); |
| 58 | +}); |
0 commit comments