2021-04-16 05:12:07 +07:00
|
|
|
import { RateLimiter } from "../../../src/node/routes/login"
|
|
|
|
|
|
|
|
describe("login", () => {
|
|
|
|
describe("RateLimiter", () => {
|
|
|
|
it("should allow one try ", () => {
|
|
|
|
const limiter = new RateLimiter()
|
2021-04-20 00:57:50 +07:00
|
|
|
expect(limiter.removeToken()).toBe(true)
|
2021-04-16 05:12:07 +07:00
|
|
|
})
|
|
|
|
|
2021-04-17 04:23:46 +07:00
|
|
|
it("should pull tokens from both limiters (minute & hour)", () => {
|
|
|
|
const limiter = new RateLimiter()
|
|
|
|
|
|
|
|
// Try twice, which pulls two from the minute bucket
|
2021-04-20 00:57:50 +07:00
|
|
|
limiter.removeToken()
|
|
|
|
limiter.removeToken()
|
2021-04-17 04:23:46 +07:00
|
|
|
|
|
|
|
// Check that we can still try
|
|
|
|
// which should be true since there are 12 remaining in the hour bucket
|
|
|
|
expect(limiter.canTry()).toBe(true)
|
2021-04-20 00:57:50 +07:00
|
|
|
expect(limiter.removeToken()).toBe(true)
|
2021-04-17 04:23:46 +07:00
|
|
|
})
|
|
|
|
|
2021-04-16 05:12:07 +07:00
|
|
|
it("should not allow more than 14 tries in less than an hour", () => {
|
|
|
|
const limiter = new RateLimiter()
|
|
|
|
|
|
|
|
// The limiter allows 2 tries per minute plus 12 per hour
|
|
|
|
// so if we run it 15 times, 14 should return true and the last
|
|
|
|
// should return false
|
|
|
|
for (let i = 1; i <= 14; i++) {
|
2021-04-20 00:57:50 +07:00
|
|
|
expect(limiter.removeToken()).toBe(true)
|
2021-04-16 05:12:07 +07:00
|
|
|
}
|
|
|
|
|
2021-04-20 00:57:50 +07:00
|
|
|
expect(limiter.canTry()).toBe(false)
|
|
|
|
expect(limiter.removeToken()).toBe(false)
|
2021-04-16 05:12:07 +07:00
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|