Files
2026-07-13 13:39:12 +08:00

55 lines
2.2 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { withBodyTimeout } from "../../open-sse/utils/stream.ts";
test("withBodyTimeout resolves with the value when the promise completes before timeout", async () => {
const result = await withBodyTimeout(Promise.resolve("hello"), 5000);
assert.equal(result, "hello");
});
test("withBodyTimeout rejects with BodyTimeoutError when the promise exceeds the timeout", async () => {
const neverResolves = new Promise<string>(() => {});
await assert.rejects(withBodyTimeout(neverResolves, 50), (error) => {
assert.ok(error instanceof Error);
assert.equal(error.name, "BodyTimeoutError");
assert.match(error.message, /body read timeout after 50ms/);
return true;
});
});
test("withBodyTimeout forwards the original rejection when the promise rejects before timeout", async () => {
const originalError = new Error("network failure");
const rejects = Promise.reject(originalError);
await assert.rejects(withBodyTimeout(rejects, 5000), (error) => {
assert.equal(error, originalError);
return true;
});
});
test("withBodyTimeout with timeoutMs=0 skips timeout and passes through directly", async () => {
// A promise that would timeout with any positive timeout
const slow = new Promise((resolve) => setTimeout(() => resolve("late"), 200));
// With timeoutMs=0, it should wait for the promise naturally
const result = await withBodyTimeout(slow, 0);
assert.equal(result, "late");
});
test("withBodyTimeout cleans up the timer after successful resolution", async () => {
const result = await withBodyTimeout(Promise.resolve(42), 100);
assert.equal(result, 42);
// If the timer wasn't cleaned up, the process might hang or throw later.
// Wait a bit to confirm no stray timer fires.
await new Promise((resolve) => setTimeout(resolve, 150));
});
test("withBodyTimeout cleans up the timer after rejection", async () => {
const originalError = new Error("fail");
await assert.rejects(
withBodyTimeout(Promise.reject(originalError), 100),
(error) => error === originalError
);
// Wait to confirm no stray timer
await new Promise((resolve) => setTimeout(resolve, 150));
});