@@ -86,6 +86,40 @@ describe('RateLimiterMemory with fixed window', function RateLimiterMemoryTest()
8686 } ) ;
8787 } ) ;
8888
89+ it ( 'updates msBeforeNext after execEvenly delay' , ( done ) => {
90+ const testKey = 'consumeEvenlyMsBeforeNext' ;
91+ const rateLimiterMemory = new RateLimiterMemory ( {
92+ points : 2 , duration : 5 , execEvenly : true , execEvenlyMinDelayMs : 500 ,
93+ } ) ;
94+
95+ rateLimiterMemory . consume ( testKey )
96+ . then ( ( resFirst ) => {
97+ const initialMsBeforeNext = resFirst . msBeforeNext ;
98+ const expectedDelay = Math . ceil ( initialMsBeforeNext / 2 ) ;
99+ const timeFirstConsume = Date . now ( ) ;
100+ rateLimiterMemory . consume ( testKey )
101+ . then ( ( resSecond ) => {
102+ const diff = Date . now ( ) - timeFirstConsume ;
103+
104+ // Real delay should be close to calculated one from formula
105+ expect ( diff ) . to . be . greaterThan ( expectedDelay - 100 ) ;
106+ expect ( diff ) . to . be . lessThan ( expectedDelay + 100 ) ;
107+
108+ // msBeforeNext should be reduced approximately by that delay
109+ expect ( resSecond . msBeforeNext >= 0 ) . to . equal ( true ) ;
110+ expect ( resSecond . msBeforeNext )
111+ . to . be . closeTo ( initialMsBeforeNext - expectedDelay , 100 ) ;
112+ done ( ) ;
113+ } )
114+ . catch ( ( err ) => {
115+ done ( err ) ;
116+ } ) ;
117+ } )
118+ . catch ( ( err ) => {
119+ done ( err ) ;
120+ } ) ;
121+ } ) ;
122+
89123 it ( 'makes penalty' , ( done ) => {
90124 const testKey = 'penalty1' ;
91125 const rateLimiterMemory = new RateLimiterMemory ( { points : 3 , duration : 5 } ) ;
0 commit comments