84 lines
2.3 KiB
JavaScript
84 lines
2.3 KiB
JavaScript
|
|
// eslint-disable no-unused-expressions
|
||
|
|
const { describe, it, beforeEach } = require('mocha');
|
||
|
|
const { expect } = require('chai');
|
||
|
|
const RateLimiterUnion = require('../lib/RateLimiterUnion');
|
||
|
|
const RateLimiterMemory = require('../lib/RateLimiterMemory');
|
||
|
|
|
||
|
|
describe('RateLimiterUnion with fixed window', () => {
|
||
|
|
const keyPrefix1 = 'limit1';
|
||
|
|
const keyPrefix2 = 'limit2';
|
||
|
|
let rateLimiter;
|
||
|
|
|
||
|
|
beforeEach(() => {
|
||
|
|
const limiter1 = new RateLimiterMemory({
|
||
|
|
keyPrefix: keyPrefix1,
|
||
|
|
points: 1,
|
||
|
|
duration: 1,
|
||
|
|
});
|
||
|
|
const limiter2 = new RateLimiterMemory({
|
||
|
|
keyPrefix: keyPrefix2,
|
||
|
|
points: 2,
|
||
|
|
duration: 5,
|
||
|
|
});
|
||
|
|
rateLimiter = new RateLimiterUnion(limiter1, limiter2);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('does not allow to create union with limiters number less than 2', () => {
|
||
|
|
try {
|
||
|
|
new RateLimiterUnion(new RateLimiterMemory({ // eslint-disable-line no-new
|
||
|
|
keyPrefix: keyPrefix1,
|
||
|
|
points: 1,
|
||
|
|
duration: 1,
|
||
|
|
}));
|
||
|
|
} catch (err) {
|
||
|
|
expect(err instanceof Error).to.equal(true);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it('all limiters have to be instance of RateLimiterAbstract', () => {
|
||
|
|
try {
|
||
|
|
new RateLimiterUnion(new RateLimiterMemory({ // eslint-disable-line no-new
|
||
|
|
keyPrefix: keyPrefix1,
|
||
|
|
points: 1,
|
||
|
|
duration: 1,
|
||
|
|
}), {});
|
||
|
|
} catch (err) {
|
||
|
|
expect(err instanceof Error).to.equal(true);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it('consume from all limiters', (done) => {
|
||
|
|
rateLimiter.consume('test')
|
||
|
|
.then((res) => {
|
||
|
|
expect(res[keyPrefix1].remainingPoints === 0 && res[keyPrefix2].remainingPoints === 1).to.equal(true);
|
||
|
|
done();
|
||
|
|
})
|
||
|
|
.catch(() => {
|
||
|
|
done(Error('must not reject'));
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('reject consume one "limit1", which does not have enough points', (done) => {
|
||
|
|
rateLimiter.consume('test', 2)
|
||
|
|
.then(() => {
|
||
|
|
done(Error('must not resolve'));
|
||
|
|
})
|
||
|
|
.catch((rej) => {
|
||
|
|
expect(rej[keyPrefix1].remainingPoints === 0).to.equal(true);
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('reject both do not have enough points', (done) => {
|
||
|
|
rateLimiter.consume('test', 3)
|
||
|
|
.then(() => {
|
||
|
|
done(Error('must not resolve'));
|
||
|
|
})
|
||
|
|
.catch((rej) => {
|
||
|
|
expect(rej[keyPrefix1].remainingPoints === 0 && rej[keyPrefix2].remainingPoints === 0).to.equal(true);
|
||
|
|
done();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|