aboutsummaryrefslogtreecommitdiff
path: root/test/js/node/http/node-fetch.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/js/node/http/node-fetch.test.js')
-rw-r--r--test/js/node/http/node-fetch.test.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/js/node/http/node-fetch.test.js b/test/js/node/http/node-fetch.test.js
new file mode 100644
index 000000000..e1ae19feb
--- /dev/null
+++ b/test/js/node/http/node-fetch.test.js
@@ -0,0 +1,68 @@
+import fetch2, { fetch, Response, Request, Headers } from "node-fetch";
+import * as iso from "isomorphic-fetch";
+import * as vercelFetch from "@vercel/fetch";
+import * as stream from "stream";
+
+import { test, expect } from "bun:test";
+
+test("node-fetch", () => {
+ expect(Response.prototype).toBeInstanceOf(globalThis.Response);
+ expect(Request).toBe(globalThis.Request);
+ expect(Headers).toBe(globalThis.Headers);
+ expect(fetch2.default).toBe(fetch2);
+ expect(fetch2.Response).toBe(Response);
+});
+
+for (const [impl, name] of [
+ [fetch, "node-fetch.fetch"],
+ [fetch2, "node-fetch.default"],
+ [fetch2.default, "node-fetch.default.default"],
+ [iso.fetch, "isomorphic-fetch.fetch"],
+ [iso.default.fetch, "isomorphic-fetch.default.fetch"],
+ [iso.default, "isomorphic-fetch.default"],
+ [vercelFetch.default(fetch), "@vercel/fetch.default"],
+]) {
+ test(name + " fetches", async () => {
+ const server = Bun.serve({
+ port: 0,
+ fetch(req, server) {
+ server.stop();
+ return new Response("it works");
+ },
+ });
+ expect(await impl("http://" + server.hostname + ":" + server.port)).toBeInstanceOf(globalThis.Response);
+ server.stop(true);
+ });
+}
+
+test("node-fetch uses node streams instead of web streams", async () => {
+ const server = Bun.serve({
+ port: 0,
+ async fetch(req, server) {
+ const body = await req.text();
+ expect(body).toBe("the input text");
+ return new Response("hello world");
+ },
+ });
+
+ try {
+ const result = await fetch2("http://" + server.hostname + ":" + server.port, {
+ body: new stream.Readable({
+ read() {
+ this.push("the input text");
+ this.push(null);
+ },
+ }),
+ method: "POST",
+ });
+ expect(result.body).toBeInstanceOf(stream.Readable);
+ expect(result.body === result.body).toBe(true); // cached lazy getter
+ const chunks = [];
+ for await (const chunk of result.body) {
+ chunks.push(chunk);
+ }
+ expect(Buffer.concat(chunks).toString()).toBe("hello world");
+ } finally {
+ server.stop(true);
+ }
+});