import { describe, it, expect, beforeEach, vi } from "vitest";
import { checkRateLimit } from "./rate-limiter.js";
describe("checkRateLimit", () => {
beforeEach(() => {
vi.useFakeTimers();
});
it("allows requests under the limit", () => {
expect(checkRateLimit("key1", 5)).toBe(true);
expect(checkRateLimit("key1", 5)).toBe(true);
expect(checkRateLimit("key1", 5)).toBe(true);
});
it("rejects requests over the limit", () => {
const limit = 3;
expect(checkRateLimit("key2", limit)).toBe(true);
expect(checkRateLimit("key2", limit)).toBe(true);
expect(checkRateLimit("key2", limit)).toBe(true);
expect(checkRateLimit("key2", limit)).toBe(false);
});
it("tracks keys separately", () => {
expect(checkRateLimit("a", 1)).toBe(true);
expect(checkRateLimit("a", 1)).toBe(false);
expect(checkRateLimit("b", 1)).toBe(true);
});
it("prunes old timestamps after window", () => {
const limit = 2;
expect(checkRateLimit("key3", limit)).toBe(true);
expect(checkRateLimit("key3", limit)).toBe(true);
expect(checkRateLimit("key3", limit)).toBe(false);
vi.advanceTimersByTime(61 * 1000);
expect(checkRateLimit("key3", limit)).toBe(true);
});
it("accepts exactly limit requests", () => {
const limit = 1;
expect(checkRateLimit("key4", limit)).toBe(true);
expect(checkRateLimit("key4", limit)).toBe(false);
});
});