From b8629ae081a4527717db9f68cf8225433bbc805c Mon Sep 17 00:00:00 2001 From: yuji-hatakeyama Date: Mon, 9 Jun 2025 00:16:34 +0900 Subject: [PATCH 1/5] test(node-http-handler): add test for connectionTimeout configuration --- .../src/node-http-handler.spec.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/packages/node-http-handler/src/node-http-handler.spec.ts b/packages/node-http-handler/src/node-http-handler.spec.ts index 627e78e545c..d40e0603a2c 100644 --- a/packages/node-http-handler/src/node-http-handler.spec.ts +++ b/packages/node-http-handler/src/node-http-handler.spec.ts @@ -4,6 +4,7 @@ import https from "https"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { NodeHttpHandler } from "./node-http-handler"; +import * as setConnectionTimeoutModule from "./set-connection-timeout"; import { timing } from "./timing"; vi.mock("http", async () => { @@ -54,6 +55,7 @@ describe("NodeHttpHandler", () => { describe("constructor and #handle", () => { const randomMaxSocket = Math.round(Math.random() * 50) + 1; const randomSocketAcquisitionWarningTimeout = Math.round(Math.random() * 10000) + 1; + const randomConnectionTimeout = Math.round(Math.random() * 10000) + 1; beforeEach(() => {}); @@ -110,6 +112,23 @@ describe("NodeHttpHandler", () => { expect(vi.mocked(timing.setTimeout).mock.calls[0][1]).toBe(randomSocketAcquisitionWarningTimeout); }); + it.each([ + ["an options hash", { connectionTimeout: randomConnectionTimeout }], + [ + "a provider", + async () => ({ + connectionTimeout: randomConnectionTimeout, + }), + ], + ])("sets connectionTimeout correctly when input is %s", async (_, option) => { + vi.spyOn(setConnectionTimeoutModule, "setConnectionTimeout"); + const nodeHttpHandler = new NodeHttpHandler(option); + await nodeHttpHandler.handle({} as any); + expect(vi.mocked(setConnectionTimeoutModule.setConnectionTimeout).mock.calls[0][2]).toBe( + randomConnectionTimeout + ); + }); + it.each([ ["an options hash", { httpAgent: new http.Agent({ keepAlive: false, maxSockets: randomMaxSocket }) }], [ From 71d0e4044eb44f915286fdd9d19b5af5bd69c294 Mon Sep 17 00:00:00 2001 From: yuji-hatakeyama Date: Mon, 9 Jun 2025 00:30:17 +0900 Subject: [PATCH 2/5] test(node-http-handler): add test for requestTimeout configuration --- .../src/node-http-handler.spec.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/node-http-handler/src/node-http-handler.spec.ts b/packages/node-http-handler/src/node-http-handler.spec.ts index d40e0603a2c..5f1632201bc 100644 --- a/packages/node-http-handler/src/node-http-handler.spec.ts +++ b/packages/node-http-handler/src/node-http-handler.spec.ts @@ -5,6 +5,7 @@ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest" import { NodeHttpHandler } from "./node-http-handler"; import * as setConnectionTimeoutModule from "./set-connection-timeout"; +import * as setSocketTimeoutModule from "./set-socket-timeout"; import { timing } from "./timing"; vi.mock("http", async () => { @@ -56,6 +57,7 @@ describe("NodeHttpHandler", () => { const randomMaxSocket = Math.round(Math.random() * 50) + 1; const randomSocketAcquisitionWarningTimeout = Math.round(Math.random() * 10000) + 1; const randomConnectionTimeout = Math.round(Math.random() * 10000) + 1; + const randomRequestTimeout = Math.round(Math.random() * 10000) + 1; beforeEach(() => {}); @@ -129,6 +131,21 @@ describe("NodeHttpHandler", () => { ); }); + it.each([ + ["an options hash", { requestTimeout: randomRequestTimeout }], + [ + "a provider", + async () => ({ + requestTimeout: randomRequestTimeout, + }), + ], + ])("sets requestTimeout correctly when input is %s", async (_, option) => { + vi.spyOn(setSocketTimeoutModule, "setSocketTimeout"); + const nodeHttpHandler = new NodeHttpHandler(option); + await nodeHttpHandler.handle({} as any); + expect(vi.mocked(setSocketTimeoutModule.setSocketTimeout).mock.calls[0][2]).toBe(randomRequestTimeout); + }); + it.each([ ["an options hash", { httpAgent: new http.Agent({ keepAlive: false, maxSockets: randomMaxSocket }) }], [ From 0dfb0c7033d964d46ab13e613d597b0dc008ea34 Mon Sep 17 00:00:00 2001 From: yuji-hatakeyama Date: Mon, 9 Jun 2025 01:13:07 +0900 Subject: [PATCH 3/5] test(node-http-handler): add tests for NodeHttpHandler.create() static method --- .../src/node-http-handler.spec.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/node-http-handler/src/node-http-handler.spec.ts b/packages/node-http-handler/src/node-http-handler.spec.ts index 5f1632201bc..2f924b545e6 100644 --- a/packages/node-http-handler/src/node-http-handler.spec.ts +++ b/packages/node-http-handler/src/node-http-handler.spec.ts @@ -247,6 +247,42 @@ describe("NodeHttpHandler", () => { }); }); + describe("create", () => { + const randomRequestTimeout = Math.round(Math.random() * 10000) + 1; + + it.each([ + ["existing handler instance", new NodeHttpHandler()], + ["custom HttpHandler object", { + handle: vi.fn(), + } as any], + ])("returns the input handler when passed %s", (_, handler) => { + const result = NodeHttpHandler.create(handler); + expect(result).toBe(handler); + }); + + it.each([ + ["undefined", undefined], + ["an empty options hash", {}], + ["empty provider", async () => undefined], + ])("creates new handler instance when input is %s", async (_, input) => { + const result = NodeHttpHandler.create(input); + expect(result).toBeInstanceOf(NodeHttpHandler); + }); + + it.each([ + ["an options hash", { requestTimeout: randomRequestTimeout }], + ["a provider", async () => ({ requestTimeout: randomRequestTimeout })], + ])("creates new handler instance with config when input is %s", async (_, input) => { + const result = NodeHttpHandler.create(input); + expect(result).toBeInstanceOf(NodeHttpHandler); + + // Verify configuration by calling handle + await result.handle({} as any); + + expect(result.httpHandlerConfigs().requestTimeout).toBe(randomRequestTimeout); + }); + }); + describe("#destroy", () => { it("should be callable and return nothing", () => { const nodeHttpHandler = new NodeHttpHandler(); From df469f4403738435410922d2e30b25ddc5e89269 Mon Sep 17 00:00:00 2001 From: yuji-hatakeyama Date: Sun, 27 Jul 2025 00:38:42 +0900 Subject: [PATCH 4/5] chore: add empty changeset --- .changeset/poor-chicken-wave.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changeset/poor-chicken-wave.md diff --git a/.changeset/poor-chicken-wave.md b/.changeset/poor-chicken-wave.md new file mode 100644 index 00000000000..a845151cc84 --- /dev/null +++ b/.changeset/poor-chicken-wave.md @@ -0,0 +1,2 @@ +--- +--- From 4d097a7d3764f1ece0ec7270e179b30a8d0982bf Mon Sep 17 00:00:00 2001 From: yuji-hatakeyama Date: Tue, 29 Jul 2025 09:13:17 +0900 Subject: [PATCH 5/5] style: fix code format --- packages/node-http-handler/src/node-http-handler.spec.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/node-http-handler/src/node-http-handler.spec.ts b/packages/node-http-handler/src/node-http-handler.spec.ts index 2f924b545e6..5f219a82db4 100644 --- a/packages/node-http-handler/src/node-http-handler.spec.ts +++ b/packages/node-http-handler/src/node-http-handler.spec.ts @@ -252,9 +252,12 @@ describe("NodeHttpHandler", () => { it.each([ ["existing handler instance", new NodeHttpHandler()], - ["custom HttpHandler object", { - handle: vi.fn(), - } as any], + [ + "custom HttpHandler object", + { + handle: vi.fn(), + } as any, + ], ])("returns the input handler when passed %s", (_, handler) => { const result = NodeHttpHandler.create(handler); expect(result).toBe(handler);