forked from insidewhy/rxjs-ratelimiter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.spec.ts
76 lines (66 loc) · 2.49 KB
/
index.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { assert } from 'chai'
import 'mocha'
import { of } from 'rxjs'
import { mergeMap, retry } from 'rxjs/operators'
import { TestScheduler } from 'rxjs/testing'
import RateLimiter from '.'
describe('rxjs-ratelimiter', () => {
let scheduler: TestScheduler
let expect: typeof scheduler.expectObservable
let flush: typeof scheduler.flush
let cold: typeof scheduler.createColdObservable
beforeEach(() => {
scheduler = new TestScheduler(assert.deepEqual)
expect = scheduler.expectObservable.bind(scheduler)
flush = scheduler.flush.bind(scheduler)
cold = scheduler.createColdObservable.bind(scheduler)
})
it('queues subscriptions according to rate limit of 1 request per 10 ticks', () => {
const limiter = new RateLimiter(1, 10, scheduler)
const limitObservable = (value: string) => limiter.limit(of(value))
expect(limitObservable('a')).toBe('(a|)')
expect(limitObservable('b')).toBe('-(b|)')
expect(limitObservable('c')).toBe('--(c|)')
flush()
})
it('queues subscriptions according to rate limit of 2 requests per 10 ticks', () => {
const limiter = new RateLimiter(2, 10, scheduler)
const limitObservable = (value) => limiter.limit(of(value))
expect(limitObservable('a')).toBe('(a|)')
expect(limitObservable('b')).toBe('(b|)')
expect(limitObservable('c')).toBe('-(c|)')
expect(limitObservable('d')).toBe('-(d|)')
expect(limitObservable('e')).toBe('--(e|)')
flush()
})
it('queues subsequent subscriptions according to rate limit of 2 requests per 10 ticks', () => {
const limiter = new RateLimiter(2, 10, scheduler)
const limitObservable = (value) => limiter.limit(of(value))
expect(limitObservable('a')).toBe('(a|)')
flush()
assert.equal(scheduler.now(), 0)
expect(limitObservable('b')).toBe('(b|)')
flush()
assert.equal(scheduler.now(), 0)
expect(limitObservable('c')).toBe('-(c|)')
flush()
assert.equal(scheduler.now(), 10)
expect(limitObservable('d')).toBe('-(d|)')
expect(limitObservable('e')).toBe('--(e|)')
flush()
assert.equal(scheduler.now(), 20)
})
it('queues retry after original according to rate limit', () => {
const limiter = new RateLimiter(1, 20, scheduler)
let iteration = 0
expect(
limiter
.limit(
// this observable fails the first two times it is subscribed to
of(null).pipe(mergeMap(() => (++iteration === 3 ? cold('a|') : cold('#')))),
)
.pipe(retry()),
).toBe('----a|')
flush()
})
})