// @ts-nocheck import { beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("@/lib/redis", () => ({ redis: null, })); import { rateLimit } from "./rate-limit"; beforeEach(() => { vi.restoreAllMocks(); }); describe("rateLimit (in-memory fallback)", () => { it("allows the first request", async () => { const res = await rateLimit("test:1", 3, 60_000); expect(res.ok).toBe(true); expect(res.retryAfter).toBe(0); }); it("allows up to the limit within a window", async () => { const key = `test:2:${Date.now()}`; expect((await rateLimit(key, 2, 60_000)).ok).toBe(true); expect((await rateLimit(key, 2, 60_000)).ok).toBe(true); const res = await rateLimit(key, 2, 60_000); expect(res.ok).toBe(false); expect(res.retryAfter).toBeGreaterThan(0); }); it("resets after the window expires", async () => { const key = `test:3:${Date.now()}`; await rateLimit(key, 1, 50); const res1 = await rateLimit(key, 1, 50); expect(res1.ok).toBe(false); await new Promise((r) => setTimeout(r, 60)); const res2 = await rateLimit(key, 1, 50); expect(res2.ok).toBe(true); }); it("uses separate keys independently", async () => { const a = await rateLimit("key-a", 1, 60_000); const b = await rateLimit("key-b", 1, 60_000); expect(a.ok).toBe(true); expect(b.ok).toBe(true); const a2 = await rateLimit("key-a", 1, 60_000); expect(a2.ok).toBe(false); }); });