refactor(core): dedupe gateway runtime and config tests

This commit is contained in:
Peter Steinberger
2026-02-22 07:37:11 +00:00
parent ad1c07e7c0
commit b109fa53ea
20 changed files with 699 additions and 561 deletions

View File

@@ -1,32 +1,32 @@
import { describe, expect, it, vi } from "vitest";
import { retryAsync } from "./retry.js";
describe("retryAsync", () => {
async function runRetryAfterCase(options: {
maxDelayMs: number;
retryAfterMs: number;
expectedDelayMs: number;
}) {
vi.useFakeTimers();
try {
const fn = vi.fn().mockRejectedValueOnce(new Error("boom")).mockResolvedValueOnce("ok");
const delays: number[] = [];
const promise = retryAsync(fn, {
attempts: 2,
minDelayMs: 0,
maxDelayMs: options.maxDelayMs,
jitter: 0,
retryAfterMs: () => options.retryAfterMs,
onRetry: (info) => delays.push(info.delayMs),
});
await vi.runAllTimersAsync();
await expect(promise).resolves.toBe("ok");
expect(delays[0]).toBe(options.expectedDelayMs);
} finally {
vi.useRealTimers();
}
async function runRetryAfterCase(params: {
minDelayMs: number;
maxDelayMs: number;
retryAfterMs: number;
}): Promise<number[]> {
vi.useFakeTimers();
try {
const fn = vi.fn().mockRejectedValueOnce(new Error("boom")).mockResolvedValueOnce("ok");
const delays: number[] = [];
const promise = retryAsync(fn, {
attempts: 2,
minDelayMs: params.minDelayMs,
maxDelayMs: params.maxDelayMs,
jitter: 0,
retryAfterMs: () => params.retryAfterMs,
onRetry: (info) => delays.push(info.delayMs),
});
await vi.runAllTimersAsync();
await expect(promise).resolves.toBe("ok");
return delays;
} finally {
vi.useRealTimers();
}
}
describe("retryAsync", () => {
it("returns on first success", async () => {
const fn = vi.fn().mockResolvedValue("ok");
const result = await retryAsync(fn, 3, 10);
@@ -74,20 +74,18 @@ describe("retryAsync", () => {
expect(fn).toHaveBeenCalledTimes(1);
});
it.each([
{
name: "uses retryAfterMs when provided",
maxDelayMs: 1000,
retryAfterMs: 500,
expectedDelayMs: 500,
},
{
name: "clamps retryAfterMs to maxDelayMs",
maxDelayMs: 100,
retryAfterMs: 500,
expectedDelayMs: 100,
},
])("$name", async ({ maxDelayMs, retryAfterMs, expectedDelayMs }) => {
await runRetryAfterCase({ maxDelayMs, retryAfterMs, expectedDelayMs });
it("uses retryAfterMs when provided", async () => {
const delays = await runRetryAfterCase({ minDelayMs: 0, maxDelayMs: 1000, retryAfterMs: 500 });
expect(delays[0]).toBe(500);
});
it("clamps retryAfterMs to maxDelayMs", async () => {
const delays = await runRetryAfterCase({ minDelayMs: 0, maxDelayMs: 100, retryAfterMs: 500 });
expect(delays[0]).toBe(100);
});
it("clamps retryAfterMs to minDelayMs", async () => {
const delays = await runRetryAfterCase({ minDelayMs: 250, maxDelayMs: 1000, retryAfterMs: 50 });
expect(delays[0]).toBe(250);
});
});