import { describe, it, expect, vi } from "vitest";
import { withRetry } from "./retry.js";
describe("withRetry", () => {
it("returns result on first success", async () => {
const fn = vi.fn().mockResolvedValue(42);
const result = await withRetry(fn);
expect(result).toBe(42);
expect(fn).toHaveBeenCalledTimes(1);
});
it("retries on throttling error then succeeds", async () => {
const fn = vi
.fn()
.mockRejectedValueOnce(new Error("Rate exceeded"))
.mockResolvedValueOnce("ok");
const result = await withRetry(fn);
expect(result).toBe("ok");
expect(fn).toHaveBeenCalledTimes(2);
});
it("throws after max retries", async () => {
const err = new Error("Rate exceeded");
const fn = vi.fn().mockRejectedValue(err);
await expect(withRetry(fn)).rejects.toThrow("Rate exceeded");
expect(fn).toHaveBeenCalled();
});
it("does not retry on non-throttle errors", async () => {
const fn = vi.fn().mockRejectedValue(new Error("Access Denied"));
await expect(withRetry(fn)).rejects.toThrow("Access Denied");
expect(fn).toHaveBeenCalledTimes(1);
});
});