2016-06-26 11:53:19 +00:00
|
|
|
"use server";
|
|
|
|
|
|
|
|
require("c9/inline-mocha")(module);
|
|
|
|
|
|
|
|
var ratelimit = require("./ratelimit");
|
|
|
|
var assert = require("assert");
|
|
|
|
var async = require("async");
|
2016-10-05 21:09:00 +00:00
|
|
|
var sinon = require("sinon");
|
2016-06-26 11:53:19 +00:00
|
|
|
|
|
|
|
describe("ratelimit", function() {
|
|
|
|
|
|
|
|
it("Should limit based on key", function (done) {
|
|
|
|
var limiter = ratelimit("username", 10, 1);
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
assert(err);
|
|
|
|
assert.equal(err.code, 429);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Should work with different keys", function (done) {
|
|
|
|
var limiter = ratelimit("username", 10, 1);
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
limiter({params: {username: "aloha"}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-09-29 21:46:48 +00:00
|
|
|
it("Should work with deep keys", function (done) {
|
|
|
|
var limiter = ratelimit("user.id", 10, 1);
|
|
|
|
limiter({params: {user: {id: "hey"}}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
limiter({params: {user: {id: "yay"}}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2016-06-26 11:53:19 +00:00
|
|
|
|
|
|
|
it("Should work again after a delay", function (done) {
|
|
|
|
var limiter = ratelimit("username", 10, 1);
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
setTimeout(function() {
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
}, 25);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Should work with many requests", function (done) {
|
|
|
|
var MAX_REQUESTS = 5;
|
|
|
|
var limiter = ratelimit("username", 10, MAX_REQUESTS);
|
|
|
|
var successfulRequests = 0;
|
|
|
|
async.times(10, function(n, next) {
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
if (err) return next(err);
|
|
|
|
successfulRequests++;
|
|
|
|
next();
|
|
|
|
});
|
|
|
|
}, function (err) {
|
|
|
|
assert.equal(successfulRequests, MAX_REQUESTS);
|
|
|
|
setTimeout(function() {
|
|
|
|
limiter({params: {username: "super"}}, null, function (err) {
|
|
|
|
assert(!err, err);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
}, 25);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
it("Should expire keys at the correct times", function (done) {
|
2016-10-05 21:09:00 +00:00
|
|
|
var clock = sinon.useFakeTimers();
|
2016-06-26 11:53:19 +00:00
|
|
|
var limiter = ratelimit("username", 50, 2);
|
2016-10-05 21:09:00 +00:00
|
|
|
limiter({params: {username: "mario"}}, null, function(err){
|
|
|
|
assert(!err, err);
|
|
|
|
});
|
|
|
|
clock.tick(40);
|
|
|
|
limiter({params: {username: "mario"}}, null, function(err){
|
|
|
|
assert(!err, err);
|
|
|
|
});
|
|
|
|
clock.tick(45);
|
|
|
|
limiter({params: {username: "mario"}}, null, function(err){
|
|
|
|
assert(!err, err);
|
|
|
|
});
|
|
|
|
limiter({params: {username: "mario"}}, null, function(err){
|
|
|
|
assert(err);
|
|
|
|
assert.equal(err.code, 429);
|
|
|
|
});
|
|
|
|
clock.tick(40);
|
|
|
|
limiter({params: {username: "mario"}}, null, function(err){
|
|
|
|
assert(!err, err);
|
|
|
|
});
|
|
|
|
done();
|
2016-06-26 11:53:19 +00:00
|
|
|
});
|
|
|
|
});
|