11using NUnit . Framework ;
2+ using System ;
3+ using System . Threading ;
4+ using RateLimiter . DataStore ;
5+ using System . Collections . Generic ;
6+ using RateLimiter . Ruls . Abstract ;
7+ using RateLimiter . Ruls ;
8+ using RateLimiter . User ;
29
310namespace RateLimiter . Tests ;
411
512[ TestFixture ]
613public class RateLimiterTest
7- {
8- [ Test ]
9- public void Example ( )
10- {
11- Assert . That ( true , Is . True ) ;
12- }
14+ {
15+ [ Test ]
16+ public void IsAllowedWithNoRules ( )
17+ {
18+ Cashing . Clear ( ) ;
19+ // Arrange
20+ var rules = new RateLimiterRuleDecorator [ ] { } ;
21+
22+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
23+
24+ // Act
25+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
26+
27+ // Assert
28+ Assert . IsTrue ( result ) ;
29+ }
30+ [ Test ]
31+ public void IsAllowedWithAllRulesPositive ( )
32+ {
33+ Cashing . Clear ( ) ;
34+ Dictionary < string , int > restrictionsByCountry = new ( )
35+ {
36+ { "US" , 2 } ,
37+ { "GE" , 1 }
38+ } ;
39+
40+ // Arrange
41+ var rules = new RateLimiterRuleDecorator [ ] {
42+ new IpWhiteListRule ( new string [ ] { "192.168.18.22" , "192.168.18.23" } ) ,
43+ new RequestMinAllowedTimeRule ( TimeSpan . FromSeconds ( 1 ) ) ,
44+ new IpBlackListRule ( new string [ ] { "192.168.18.48" , "192.168.18.49" } ) ,
45+ new MaxRequestAmountInTimeSpanRule ( TimeSpan . FromSeconds ( 1 ) , 5 ) ,
46+ new MaxRequestAmountInTimeSpanByCountryRule ( TimeSpan . FromSeconds ( 1 ) , restrictionsByCountry , 2 ) ,
47+ } ;
48+
49+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
50+
51+ // Act
52+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
53+
54+ // Assert
55+ Assert . IsTrue ( result ) ;
56+ }
57+ [ Test ]
58+ public void IpWhtieListRuleNegative ( )
59+ {
60+ Cashing . Clear ( ) ;
61+ // Arrange
62+ var rules = new RateLimiterRuleDecorator [ ] { new IpWhiteListRule ( new string [ ] { "192.168.18.22" , "192.168.18.23" } ) } ;
63+
64+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.30" } ;
65+
66+ // Act
67+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
68+
69+
70+ // Assert
71+ Assert . IsFalse ( result ) ;
72+ }
73+ [ Test ]
74+ public void IpBlackListRulePositive ( )
75+ {
76+ Cashing . Clear ( ) ;
77+ // Arrange
78+ var rules = new RateLimiterRuleDecorator [ ] { new IpBlackListRule ( new string [ ] { "192.168.18.22" , "192.168.18.23" } ) } ;
79+
80+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.30" } ;
81+
82+ // Act
83+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
84+
85+ // Assert
86+ Assert . IsTrue ( result ) ;
87+ }
88+ [ Test ]
89+ public void IpBlackListRuleNegative ( )
90+ {
91+ Cashing . Clear ( ) ;
92+ // Arrange
93+ var rules = new RateLimiterRuleDecorator [ ] { new IpBlackListRule ( new string [ ] { "192.168.18.22" , "192.168.18.23" } ) } ;
94+
95+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
96+
97+ // Act
98+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
99+
100+ // Assert
101+ Assert . IsFalse ( result ) ;
102+ }
103+ [ Test ]
104+ public void IsAllowedWithRequestMinAllowedTimePositive ( )
105+ {
106+ Cashing . Clear ( ) ;
107+ // Arrange
108+ var rules = new RateLimiterRuleDecorator [ ] { new RequestMinAllowedTimeRule ( TimeSpan . FromSeconds ( 1 ) ) } ;
109+
110+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
111+
112+ // Act
113+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
114+ Thread . Sleep ( 2000 ) ;
115+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
116+
117+ // Assert
118+ Assert . IsTrue ( result ) ;
119+ }
120+ [ Test ]
121+ public void IsAllowedRequestMinAllowedTimeNegative ( )
122+ {
123+ Cashing . Clear ( ) ;
124+ // Arrange
125+ var rules = new RateLimiterRuleDecorator [ ] { new RequestMinAllowedTimeRule ( TimeSpan . FromSeconds ( 1 ) ) } ;
126+
127+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
128+
129+ // Act
130+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
131+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
132+
133+ // Assert
134+ Assert . IsFalse ( result ) ;
135+ }
136+ [ Test ]
137+ public void IsAllowedMaxRequestAmountInTimeSpanRulePositive ( )
138+ {
139+ Cashing . Clear ( ) ;
140+ // Arrange
141+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanRule ( TimeSpan . FromSeconds ( 1 ) , 5 ) } ;
142+
143+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
144+
145+ // Act
146+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
147+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
148+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
149+
150+ // Assert
151+ Assert . IsTrue ( result ) ;
152+ }
153+ [ Test ]
154+ public void IsAllowedMaxRequestAmountInTimeSpanRuleWithDeleyPositive ( )
155+ {
156+ Cashing . Clear ( ) ;
157+ // Arrange
158+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanRule ( TimeSpan . FromSeconds ( 1 ) , 2 ) } ;
159+
160+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
161+
162+ // Act
163+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
164+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
165+ Thread . Sleep ( 2000 ) ;
166+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
167+
168+ // Assert
169+ Assert . IsTrue ( result ) ;
170+ }
171+ [ Test ]
172+ public void IsAllowedMaxRequestAmountInTimeSpanRuleNegative ( )
173+ {
174+ Cashing . Clear ( ) ;
175+ // Arrange
176+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanRule ( TimeSpan . FromSeconds ( 1 ) , 2 ) } ;
177+
178+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
179+
180+ // Act
181+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
182+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
183+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
184+
185+ // Assert
186+ Assert . IsFalse ( result ) ;
187+ }
188+ [ Test ]
189+ public void IsAllowedMaxRequestAmountInTimeSpanByCountryPositive ( )
190+ {
191+ Cashing . Clear ( ) ;
192+ // Arrange
193+ Dictionary < string , int > restrictionsByCountry = new ( )
194+ {
195+ { "US" , 2 } ,
196+ { "GE" , 1 }
197+ } ;
198+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanByCountryRule ( TimeSpan . FromSeconds ( 1 ) , restrictionsByCountry , 2 ) } ;
199+
200+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
201+
202+ // Act
203+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
204+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
205+
206+ // Assert
207+ Assert . IsTrue ( result ) ;
208+ }
209+ [ Test ]
210+ public void IsAllowedMaxRequestAmountInTimeSpanByCountryNegative ( )
211+ {
212+ Cashing . Clear ( ) ;
213+ // Arrange
214+ Dictionary < string , int > restrictionsByCountry = new ( )
215+ {
216+ { "US" , 2 } ,
217+ { "GE" , 1 }
218+ } ;
219+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanByCountryRule ( TimeSpan . FromSeconds ( 1 ) , restrictionsByCountry , 1 ) } ;
220+
221+ var userData = new UserData ( ) { CountryCode = "US" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
222+
223+ // Act
224+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
225+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
226+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
227+
228+ // Assert
229+ Assert . IsFalse ( result ) ;
230+ }
231+ [ Test ]
232+ public void IsAllowedMaxRequestAmountInTimeSpanByCountryDefoultPositive ( )
233+ {
234+ Cashing . Clear ( ) ;
235+ // Arrange
236+ Dictionary < string , int > restrictionsByCountry = new ( )
237+ {
238+ { "US" , 2 } ,
239+ { "GE" , 1 }
240+ } ;
241+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanByCountryRule ( TimeSpan . FromSeconds ( 1 ) , restrictionsByCountry , 2 ) } ;
242+
243+ var userData = new UserData ( ) { CountryCode = "TR" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
244+
245+ // Act
246+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
247+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
248+
249+ // Assert
250+ Assert . IsTrue ( result ) ;
251+ }
252+ [ Test ]
253+ public void IsAllowedMaxRequestAmountInTimeSpanByCountryDefoultNegative ( )
254+ {
255+ Cashing . Clear ( ) ;
256+ // Arrange
257+ Dictionary < string , int > restrictionsByCountry = new ( )
258+ {
259+ { "US" , 2 } ,
260+ { "GE" , 1 }
261+ } ;
262+ var rules = new RateLimiterRuleDecorator [ ] { new MaxRequestAmountInTimeSpanByCountryRule ( TimeSpan . FromSeconds ( 1 ) , restrictionsByCountry , 2 ) } ;
263+
264+ var userData = new UserData ( ) { CountryCode = "TR" , Token = "tempToken" , IpAddress = "192.168.18.22" } ;
265+
266+ // Act
267+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
268+ new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
269+ var result = new ConcreteRateLimiter ( rules ) . IsAllowed ( userData ) ;
270+
271+ // Assert
272+ Assert . IsFalse ( result ) ;
273+ }
274+
275+
13276}
0 commit comments