mirror of
https://github.com/scratchfoundation/node-redis-rate-limiter.git
synced 2024-12-04 13:01:11 -05:00
117 lines
2.5 KiB
JavaScript
117 lines
2.5 KiB
JavaScript
|
require('should');
|
||
|
var options = require('../lib/options');
|
||
|
|
||
|
describe('Options', function() {
|
||
|
|
||
|
describe('key', function() {
|
||
|
|
||
|
it('can specify a function', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: function(req) { return req.id; },
|
||
|
limit: 10,
|
||
|
window: 60
|
||
|
});
|
||
|
opts.key({
|
||
|
id: 5
|
||
|
}).should.eql(5);
|
||
|
});
|
||
|
|
||
|
it('can be the full client IP', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
limit: 10,
|
||
|
window: 60
|
||
|
});
|
||
|
opts.key({
|
||
|
connection: { remoteAddress: '1.2.3.4' }
|
||
|
}).should.eql('1.2.3.4');
|
||
|
});
|
||
|
|
||
|
it('can be the client IP/32 mask', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip/32',
|
||
|
limit: 10,
|
||
|
window: 60
|
||
|
});
|
||
|
opts.key({
|
||
|
connection: { remoteAddress: '1.2.3.4' }
|
||
|
}).should.eql('1.2.3.0/32');
|
||
|
});
|
||
|
|
||
|
it('fails for invalid keys', function() {
|
||
|
(function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'something',
|
||
|
limit: 10,
|
||
|
window: 60
|
||
|
});
|
||
|
}).should.throw('Invalid key: something');
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
describe('limit and window', function() {
|
||
|
|
||
|
it('should accept numeric values in seconds', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
limit: 10, // 10 requests
|
||
|
window: 60 // per 60 seconds
|
||
|
});
|
||
|
opts.limit.should.eql(10);
|
||
|
opts.window.should.eql(60);
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
describe('rate shorthand notation', function() {
|
||
|
|
||
|
it('X req/second', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
rate: '10 req/second'
|
||
|
});
|
||
|
opts.limit.should.eql(10);
|
||
|
opts.window.should.eql(1);
|
||
|
});
|
||
|
|
||
|
it('X req/minute', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
rate: '20 req/minute'
|
||
|
});
|
||
|
opts.limit.should.eql(20);
|
||
|
opts.window.should.eql(60);
|
||
|
});
|
||
|
|
||
|
it('X req/hour', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
rate: '1000 req/hour'
|
||
|
});
|
||
|
opts.limit.should.eql(1000);
|
||
|
opts.window.should.eql(3600);
|
||
|
});
|
||
|
|
||
|
it('X req/day', function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
rate: '5000 req/day'
|
||
|
});
|
||
|
opts.limit.should.eql(5000);
|
||
|
opts.window.should.eql(86400);
|
||
|
});
|
||
|
|
||
|
it('has to be a valid rate', function() {
|
||
|
(function() {
|
||
|
var opts = options.canonical({
|
||
|
key: 'ip',
|
||
|
rate: '50 things'
|
||
|
});
|
||
|
}).should.throw('Invalid rate: 50 things');
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
});
|