import { describe, it, expect, beforeEach } from 'vitest';
import { rateLimit, __test } from '@/lib/http';

describe('hız sınırı', () => {
  beforeEach(() => __test.reset());
  it('bellek: limit dolunca reddeder, pencere bitince açar', async () => {
    delete process.env.REDIS_URL;
    const k = 'm' + Math.random();
    for (let i = 0; i < 3; i++) expect(await rateLimit(k, 3, 200)).toBe(true);
    expect(await rateLimit(k, 3, 200)).toBe(false);
    await new Promise((r) => setTimeout(r, 250));
    expect(await rateLimit(k, 3, 200)).toBe(true);
  });
  it.runIf(!!process.env.TEST_REDIS_URL)('redis: replikalar arası ortak sayaç', async () => {
    process.env.REDIS_URL = process.env.TEST_REDIS_URL;
    const k = 'r' + Math.random();
    // bağlantının hazır olmasını bekle
    await rateLimit('warm' + Math.random(), 100, 1000); await new Promise((r) => setTimeout(r, 300));
    for (let i = 0; i < 2; i++) expect(await rateLimit(k, 2, 1000)).toBe(true);
    __test.memoryLimit(k, 1000, 1000); // bellek sayacı etkilememeli
    expect(await rateLimit(k, 2, 1000)).toBe(false);
    const { default: R } = await import('ioredis'); const r = new R(process.env.TEST_REDIS_URL!);
    expect(Number(await r.get(`rl:${k}`))).toBe(3); await r.quit();
  });
});
