mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 18:28:26 +00:00
refactor(core): dedupe gateway runtime and config tests
This commit is contained in:
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user