Files
bun.sh/test/js/node/http/node-http-primoridals.test.ts
2024-09-03 21:32:52 -07:00

131 lines
3.0 KiB
TypeScript

import { afterEach, expect, test } from "bun:test";
const Response = globalThis.Response;
const Request = globalThis.Request;
const Headers = globalThis.Headers;
const Blob = globalThis.Blob;
afterEach(() => {
globalThis.Response = Response;
globalThis.Request = Request;
globalThis.Headers = Headers;
globalThis.Blob = Blob;
});
// This test passes by not hanging.
test("Overriding Request, Response, Headers, and Blob should not break node:http server", async () => {
const Response = globalThis.Response;
const Request = globalThis.Request;
const Headers = globalThis.Headers;
const Blob = globalThis.Blob;
globalThis.Response = class MyResponse {
get body() {
throw new Error("body getter should not be called");
}
get headers() {
throw new Error("headers getter should not be called");
}
get status() {
throw new Error("status getter should not be called");
}
get statusText() {
throw new Error("statusText getter should not be called");
}
get ok() {
throw new Error("ok getter should not be called");
}
get url() {
throw new Error("url getter should not be called");
}
get type() {
throw new Error("type getter should not be called");
}
};
globalThis.Request = class MyRequest {};
globalThis.Headers = class MyHeaders {
entries() {
throw new Error("entries should not be called");
}
get() {
throw new Error("get should not be called");
}
has() {
throw new Error("has should not be called");
}
keys() {
throw new Error("keys should not be called");
}
values() {
throw new Error("values should not be called");
}
forEach() {
throw new Error("forEach should not be called");
}
[Symbol.iterator]() {
throw new Error("[Symbol.iterator] should not be called");
}
[Symbol.toStringTag]() {
throw new Error("[Symbol.toStringTag] should not be called");
}
append() {
throw new Error("append should not be called");
}
};
globalThis.Blob = class MyBlob {};
const http = require("http");
const server = http.createServer((req, res) => {
res.end("Hello World\n");
});
const { promise, resolve, reject } = Promise.withResolvers();
server.listen(0, () => {
const { port } = server.address();
// client request
const req = http
.request(`http://localhost:${port}`, res => {
res
.on("data", data => {
expect(data.toString()).toBe("Hello World\n");
})
.on("end", () => {
server.close();
console.log("closing time");
});
})
.on("error", reject)
.end();
});
server.on("close", () => {
resolve();
});
server.on("error", err => {
reject(err);
});
try {
await promise;
} finally {
globalThis.Response = Response;
globalThis.Request = Request;
globalThis.Headers = Headers;
globalThis.Blob = Blob;
}
});