import { RATE_LIMIT_RULES, categorizeRequest } from '../rate-limiter/config'; describe('categorizeRequest', () => { it('categorizes POST /availabilities as availabilities', () => { expect(categorizeRequest('POST', '/availabilities')).toBe('availabilities'); }); it('categorizes POST /listings/prices as listings', () => { expect(categorizeRequest('POST', '/listings/prices')).toBe('listings'); }); it('categorizes POST /listings/calendar as listings', () => { expect(categorizeRequest('POST', '/listings/calendar')).toBe('listings'); }); it('categorizes POST /listings/inventories as listings', () => { expect(categorizeRequest('POST', '/listings/inventories')).toBe('listings'); }); it('categorizes POST /listings/restrictions as listings', () => { expect(categorizeRequest('POST', '/listings/restrictions')).toBe('listings'); }); it('categorizes POST /reservations as reservations', () => { expect(categorizeRequest('POST', '/reservations')).toBe('reservations'); }); it('categorizes POST /conversations/123 as conversations', () => { expect(categorizeRequest('POST', '/conversations/abc123')).toBe('conversations'); }); it('categorizes GET /reservations as default (no POST-specific limit)', () => { expect(categorizeRequest('GET', '/reservations')).toBe('default'); }); it('categorizes GET /properties as default', () => { expect(categorizeRequest('GET', '/properties')).toBe('default'); }); }); describe('RATE_LIMIT_RULES', () => { it('has host-level rules', () => { expect(RATE_LIMIT_RULES.host).toBeDefined(); expect(RATE_LIMIT_RULES.host.length).toBeGreaterThan(0); }); it('has endpoint-specific rules for conversations', () => { expect(RATE_LIMIT_RULES.endpoints.conversations).toBeDefined(); expect(RATE_LIMIT_RULES.endpoints.conversations.length).toBeGreaterThan(0); }); it('host rules have windowMs and limit', () => { for (const rule of RATE_LIMIT_RULES.host) { expect(rule.windowMs).toBeGreaterThan(0); expect(rule.limit).toBeGreaterThan(0); } }); });