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
JavaScript
// 🔗 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);
})();