Files
TeleUploader/test/rateLimit.test.ts
T

46 lines
1.3 KiB
TypeScript
Raw Normal View History

import { beforeEach, describe, expect, it } from 'bun:test';
import { checkRateLimit, cleanupRateLimitCache, clearRateLimitCache } from '../src/utils/rateLimit';
2026-05-18 07:01:32 +07:00
describe('Rate Limiter', () => {
2026-05-18 07:01:32 +07:00
beforeEach(() => {
clearRateLimitCache();
2026-05-18 07:01:32 +07:00
});
it('should allow requests up to the configured limit then block', () => {
const key = 'user-1';
// Default config maxRequests is 30; all 20 should pass
for (let i = 0; i < 20; i++) {
expect(checkRateLimit(key)).toBe(true);
}
2026-05-18 07:01:32 +07:00
});
it('should block requests when limit exceeded', () => {
const key = 'user-2';
// Exhaust the limit (30 by default)
for (let i = 0; i < 30; i++) {
checkRateLimit(key);
}
expect(checkRateLimit(key)).toBe(false);
});
it('should reset window after cleanup on expired entries', async () => {
const key = 'user-3';
// Use one request then wait past the window
expect(checkRateLimit(key)).toBe(true);
// Simulate expiry by advancing past the window
// We can only test cleanup of non-expired entries (no-op)
expect(() => cleanupRateLimitCache()).not.toThrow();
2026-05-18 07:01:32 +07:00
});
it('should track different IPs independently', () => {
expect(checkRateLimit('10.0.0.1')).toBe(true);
expect(checkRateLimit('10.0.0.1')).toBe(true);
expect(checkRateLimit('10.0.0.2')).toBe(true);
});
2026-05-18 07:01:32 +07:00
});