UNPKG

qapinterface

Version:

Comprehensive API utilities for Node.js applications including authentication, security, request processing, and response handling with zero external dependencies

79 lines (67 loc) 2.55 kB
// 🔗 Tests: rateLimiter.js /** * Test suite for rateLimiter utility - Mocha-style structure * Can be run with: node lib/__tests__/rateLimiter.test.js */ const { createRateLimiterMiddleware, createRateLimitTracker } = require('../rateLimiter'); const http = require('http'); const TestRunner = require('./TestRunner'); const localVars = require('../../config/localVars'); // Import configuration constants const test = new TestRunner(); test.describe('Rate Limiter Middleware', () => { let server; const port = localVars.TEST_RATE_LIMITER_PORT; // Use configured test port const setupServer = (middleware) => { return new Promise((resolve) => { server = http.createServer((req, res) => { // Mock req.ip req.ip = '127.0.0.1'; middleware(req, res, () => { res.writeHead(200); res.end('OK'); }); }).listen(port, () => resolve()); }); }; const teardownServer = () => { return new Promise((resolve) => { if (server) { server.close(() => resolve()); } else { resolve(); } }); }; const request = () => { return new Promise((resolve) => { http.get(`http://localhost:${port}`, (res) => { resolve(res.statusCode); }); }); }; test.it('should allow requests under the limit', async () => { const rateLimitMiddleware = createRateLimiterMiddleware({ points: localVars.TEST_RATE_LIMIT_POINTS_HIGH, duration: localVars.TEST_RATE_LIMIT_DURATION }); // Use generous limit await setupServer(rateLimitMiddleware); const statusCode = await request(); test.expect(statusCode).to.equal(200); await teardownServer(); }); test.it('should block requests over the limit', async () => { const rateLimitMiddleware = createRateLimiterMiddleware({ points: localVars.TEST_RATE_LIMIT_POINTS_LOW, duration: localVars.TEST_RATE_LIMIT_DURATION }); // Use strict limit await setupServer(rateLimitMiddleware); await request(); // First request should be OK const statusCode = await request(); // Second request should be blocked test.expect(statusCode).to.equal(429); await teardownServer(); }); test.it('should expose a tracker for custom implementations', () => { const tracker = createRateLimitTracker(); // Build tracker instance test.expect(tracker).to.be.an('object'); test.expect(tracker).to.have.property('checkRateLimit'); }); }); (async () => { await test.run(); const success = test.summary(); process.exit(success ? 0 : 1); })();