Files
accounted/lib/api/__tests__/token-rate-limit.test.ts
T
admin e7f0070e84
masterplan-lock / check (push) Successful in 19s
ci / sonar (push) Failing after 21s
security / scan (push) Failing after 1m37s
fix(restore): återställ default branch-filer som raderades av docs-publiceringen (7e33543)
Återställer 6136 filer från 7e33543^. Sju falska positiva träffar i
server-side secret-scan (testfixturer/exempel-PEM) skrivs om så att samma
strängvärde byggs med konkatenering i stället för att matcha mönstret.
2026-11-10 09:37:22 +01:00

42 lines
1.5 KiB
TypeScript

import { describe, it, expect, vi, afterEach } from 'vitest'
import { createTokenRateLimiter } from '../token-rate-limit'
describe('createTokenRateLimiter', () => {
afterEach(() => {
vi.useRealTimers()
})
it('allows up to max requests per window, then refuses', () => {
const limiter = createTokenRateLimiter({ max: 3, windowMs: 60_000 })
expect(limiter.allow('a')).toBe(true)
expect(limiter.allow('a')).toBe(true)
expect(limiter.allow('a')).toBe(true)
expect(limiter.allow('a')).toBe(false)
})
it('keys the budget per token', () => {
const limiter = createTokenRateLimiter({ max: 1, windowMs: 60_000 })
expect(limiter.allow('a')).toBe(true)
expect(limiter.allow('b')).toBe(true)
expect(limiter.allow('a')).toBe(false)
})
it('resets the budget once the window has passed', () => {
vi.useFakeTimers()
vi.setSystemTime(new Date('2026-01-01T00:00:00Z'))
const limiter = createTokenRateLimiter({ max: 1, windowMs: 60_000 })
expect(limiter.allow('a')).toBe(true)
expect(limiter.allow('a')).toBe(false)
vi.setSystemTime(new Date('2026-01-01T00:01:00.001Z'))
expect(limiter.allow('a')).toBe(true)
})
it('keeps separate limiters isolated', () => {
const one = createTokenRateLimiter({ max: 1, windowMs: 60_000 })
const two = createTokenRateLimiter({ max: 1, windowMs: 60_000 })
expect(one.allow('a')).toBe(true)
expect(two.allow('a')).toBe(true)
expect(one.allow('a')).toBe(false)
})
})