1
- import { expect , test , describe , afterAll } from "bun:test" ;
1
+ import { expect , test , describe , afterAll , beforeAll } from "bun:test" ;
2
2
import { Redis } from "@upstash/redis" ;
3
- import { Ratelimit } from "./index" ;
4
- import { checkDenyListCache , defaultDeniedResponse , resolveResponses } from "./deny-list" ;
5
- import { RatelimitResponseType } from "./types" ;
3
+ import { Ratelimit } from ".. /index" ;
4
+ import { checkDenyListCache , defaultDeniedResponse , resolveLimitPayload } from "./deny-list" ;
5
+ import { DenyListResponse , RatelimitResponseType } from ". ./types" ;
6
6
7
7
8
8
test ( "should get expected response from defaultDeniedResponse" , ( ) => {
@@ -20,8 +20,18 @@ test("should get expected response from defaultDeniedResponse", () => {
20
20
} ) ;
21
21
} ) ;
22
22
23
+ describe ( "should resolve ratelimit and deny list response" , async ( ) => {
24
+ const redis = Redis . fromEnv ( ) ;
25
+ const prefix = `test-resolve-prefix` ;
26
+
27
+ let callCount = 0 ;
28
+ const spyRedis = {
29
+ multi : ( ) => {
30
+ callCount += 1 ;
31
+ return redis . multi ( ) ;
32
+ }
33
+ }
23
34
24
- test . only ( "should override response in resolveResponses correctly" , ( ) => {
25
35
const initialResponse = {
26
36
success : true ,
27
37
limit : 100 ,
@@ -31,40 +41,83 @@ test.only("should override response in resolveResponses correctly", () => {
31
41
reason : undefined ,
32
42
deniedValue : undefined
33
43
} ;
34
-
35
- const denyListResponse = "testValue" ;
44
+
36
45
const expectedResponse = {
37
46
success : false ,
38
47
limit : 100 ,
39
48
remaining : 0 ,
40
49
reset : 60 ,
41
50
pending : Promise . resolve ( ) ,
42
51
reason : "denyList" as RatelimitResponseType ,
43
- deniedValue : denyListResponse
52
+ deniedValue : "testValue"
44
53
} ;
45
54
46
- const response = resolveResponses ( [ initialResponse , denyListResponse ] ) ;
47
- expect ( response ) . toEqual ( expectedResponse ) ;
48
- } ) ;
55
+ test ( "should update ip deny list when invalidIpDenyList is true" , async ( ) => {
56
+ let callCount = 0 ;
57
+ const spyRedis = {
58
+ multi : ( ) => {
59
+ callCount += 1 ;
60
+ return redis . multi ( ) ;
61
+ }
62
+ }
63
+
64
+ const denyListResponse : DenyListResponse = {
65
+ deniedValue : "testValue" ,
66
+ invalidIpDenyList : true
67
+ } ;
68
+
69
+ const response = resolveLimitPayload ( spyRedis as Redis , prefix , [ initialResponse , denyListResponse ] , 8 ) ;
70
+ await response . pending ;
71
+
72
+ expect ( response ) . toEqual ( expectedResponse ) ;
73
+ expect ( callCount ) . toBe ( 1 ) // calls multi once to store ips
74
+ } ) ;
75
+
76
+ test ( "should update ip deny list when invalidIpDenyList is true" , async ( ) => {
77
+
78
+ let callCount = 0 ;
79
+ const spyRedis = {
80
+ multi : ( ) => {
81
+ callCount += 1 ;
82
+ return redis . multi ( ) ;
83
+ }
84
+ }
85
+
86
+ const denyListResponse : DenyListResponse = {
87
+ deniedValue : "testValue" ,
88
+ invalidIpDenyList : false
89
+ } ;
90
+
91
+ const response = resolveLimitPayload ( spyRedis as Redis , prefix , [ initialResponse , denyListResponse ] , 8 ) ;
92
+ await response . pending ;
93
+
94
+ expect ( response ) . toEqual ( expectedResponse ) ;
95
+ expect ( callCount ) . toBe ( 0 ) // doesn't call multi to update deny list
96
+ } ) ;
97
+ } )
49
98
50
99
51
100
describe ( "should reject in deny list" , async ( ) => {
52
101
const redis = Redis . fromEnv ( ) ;
53
102
const prefix = `test-prefix` ;
54
103
const denyListKey = [ prefix , "denyList" , "all" ] . join ( ":" ) ;
55
104
56
- // Insert a value into the deny list
57
- await redis . sadd ( denyListKey , "denyIdentifier" , "denyIp" , "denyAgent" , "denyCountry" ) ;
58
105
59
106
const ratelimit = new Ratelimit ( {
60
107
redis,
61
108
limiter : Ratelimit . tokenBucket ( 10 , "5 s" , 10 ) ,
62
109
prefix,
63
- enableProtection : true
110
+ enableProtection : true ,
111
+ denyListThreshold : 8
64
112
} ) ;
65
113
66
114
afterAll ( async ( ) => {
67
- redis . del ( denyListKey )
115
+ await redis . del ( denyListKey )
116
+ } )
117
+
118
+ // Insert a value into the deny list
119
+ beforeAll ( async ( ) => {
120
+ await redis . sadd ( denyListKey , "denyIdentifier" , "denyIp" , "denyAgent" , "denyCountry" ) ;
68
121
} )
69
122
70
123
test ( "should allow with values not in the deny list" , async ( ) => {
0 commit comments