@@ -57,6 +57,7 @@ describe("defaultStrategy", () => {
57
57
await retryStrategy . retry ( next , { } as any ) ;
58
58
} catch ( error ) {
59
59
expect ( error ) . toStrictEqual ( mockError ) ;
60
+ return error ;
60
61
}
61
62
} ;
62
63
@@ -110,7 +111,7 @@ describe("defaultStrategy", () => {
110
111
} ) ;
111
112
} ) ;
112
113
113
- describe ( "retryDecider" , ( ) => {
114
+ describe ( "retryDecider init " , ( ) => {
114
115
it ( "sets defaultRetryDecider if options is undefined" , ( ) => {
115
116
const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
116
117
expect ( retryStrategy [ "retryDecider" ] ) . toBe ( defaultRetryDecider ) ;
@@ -130,7 +131,7 @@ describe("defaultStrategy", () => {
130
131
} ) ;
131
132
} ) ;
132
133
133
- describe ( "delayDecider" , ( ) => {
134
+ describe ( "delayDecider init " , ( ) => {
134
135
it ( "sets defaultDelayDecider if options is undefined" , ( ) => {
135
136
const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
136
137
expect ( retryStrategy [ "delayDecider" ] ) . toBe ( defaultDelayDecider ) ;
@@ -150,7 +151,7 @@ describe("defaultStrategy", () => {
150
151
} ) ;
151
152
} ) ;
152
153
153
- describe ( "retryQuota" , ( ) => {
154
+ describe ( "retryQuota init " , ( ) => {
154
155
it ( "sets getDefaultRetryQuota if options is undefined" , ( ) => {
155
156
const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
156
157
expect ( retryStrategy [ "retryQuota" ] ) . toBe ( getDefaultRetryQuota ( ) ) ;
@@ -170,31 +171,82 @@ describe("defaultStrategy", () => {
170
171
} ) ;
171
172
} ) ;
172
173
173
- describe ( "delayBase passed to delayDecider" , ( ) => {
174
- const testDelayBasePassed = async (
175
- delayBaseToTest : number ,
176
- mockThrottlingError : boolean
177
- ) => {
178
- ( isThrottlingError as jest . Mock ) . mockReturnValueOnce ( mockThrottlingError ) ;
174
+ describe ( "delayDecider" , ( ) => {
175
+ describe ( "delayBase value passed" , ( ) => {
176
+ const testDelayBasePassed = async (
177
+ delayBaseToTest : number ,
178
+ mockThrottlingError : boolean
179
+ ) => {
180
+ ( isThrottlingError as jest . Mock ) . mockReturnValueOnce (
181
+ mockThrottlingError
182
+ ) ;
183
+
184
+ const mockError = new Error ( ) ;
185
+ await mockSuccessAfterOneFail ( maxAttempts , { mockError } ) ;
186
+
187
+ expect ( isThrottlingError as jest . Mock ) . toHaveBeenCalledTimes ( 1 ) ;
188
+ expect ( isThrottlingError as jest . Mock ) . toHaveBeenCalledWith ( mockError ) ;
189
+ expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledTimes ( 1 ) ;
190
+ expect ( ( defaultDelayDecider as jest . Mock ) . mock . calls [ 0 ] [ 0 ] ) . toBe (
191
+ delayBaseToTest
192
+ ) ;
193
+ } ;
194
+
195
+ it ( "should be equal to THROTTLING_RETRY_DELAY_BASE if error is throttling error" , async ( ) => {
196
+ return testDelayBasePassed ( THROTTLING_RETRY_DELAY_BASE , true ) ;
197
+ } ) ;
179
198
180
- const mockError = new Error ( ) ;
181
- await mockSuccessAfterOneFail ( maxAttempts , { mockError } ) ;
182
-
183
- expect ( isThrottlingError as jest . Mock ) . toHaveBeenCalledTimes ( 1 ) ;
184
- expect ( isThrottlingError as jest . Mock ) . toHaveBeenCalledWith ( mockError ) ;
185
- expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledTimes ( 1 ) ;
186
- expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledWith (
187
- delayBaseToTest ,
188
- 1
189
- ) ;
190
- } ;
199
+ it ( "should be equal to DEFAULT_RETRY_DELAY_BASE in error is not a throttling error" , async ( ) => {
200
+ return testDelayBasePassed ( DEFAULT_RETRY_DELAY_BASE , false ) ;
201
+ } ) ;
202
+ } ) ;
203
+
204
+ describe ( "attempts value passed" , ( ) => {
205
+ it ( "on successful operation" , async ( ) => {
206
+ await mockSuccessfulOperation ( maxAttempts ) ;
207
+ expect ( defaultDelayDecider as jest . Mock ) . not . toHaveBeenCalled ( ) ;
208
+ } ) ;
209
+
210
+ it ( "in case of single failure" , async ( ) => {
211
+ await mockSuccessAfterOneFail ( maxAttempts ) ;
212
+ expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledTimes ( 1 ) ;
213
+ expect ( ( defaultDelayDecider as jest . Mock ) . mock . calls [ 0 ] [ 1 ] ) . toBe ( 1 ) ;
214
+ } ) ;
191
215
192
- it ( "should be equal to THROTTLING_RETRY_DELAY_BASE if error is throttling error" , async ( ) => {
193
- return testDelayBasePassed ( THROTTLING_RETRY_DELAY_BASE , true ) ;
216
+ it ( "on all fails" , async ( ) => {
217
+ await mockFailedOperation ( maxAttempts ) ;
218
+ expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledTimes ( 2 ) ;
219
+ expect ( ( defaultDelayDecider as jest . Mock ) . mock . calls [ 0 ] [ 1 ] ) . toBe ( 1 ) ;
220
+ expect ( ( defaultDelayDecider as jest . Mock ) . mock . calls [ 1 ] [ 1 ] ) . toBe ( 2 ) ;
221
+ } ) ;
194
222
} ) ;
195
223
196
- it ( "should be equal to DEFAULT_RETRY_DELAY_BASE in error is not a throttling error" , async ( ) => {
197
- return testDelayBasePassed ( DEFAULT_RETRY_DELAY_BASE , false ) ;
224
+ it ( "delay value returned" , async ( ) => {
225
+ jest . spyOn ( global , "setTimeout" ) ;
226
+
227
+ const FIRST_DELAY = 100 ;
228
+ const SECOND_DELAY = 200 ;
229
+
230
+ ( defaultDelayDecider as jest . Mock )
231
+ . mockReturnValueOnce ( FIRST_DELAY )
232
+ . mockReturnValueOnce ( SECOND_DELAY ) ;
233
+
234
+ const maxAttempts = 3 ;
235
+ const error = await mockFailedOperation ( maxAttempts ) ;
236
+ expect ( error . $metadata . totalRetryDelay ) . toEqual (
237
+ FIRST_DELAY + SECOND_DELAY
238
+ ) ;
239
+
240
+ expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledTimes (
241
+ maxAttempts - 1
242
+ ) ;
243
+ expect ( setTimeout ) . toHaveBeenCalledTimes ( maxAttempts - 1 ) ;
244
+ expect ( ( ( setTimeout as unknown ) as jest . Mock ) . mock . calls [ 0 ] [ 1 ] ) . toBe (
245
+ FIRST_DELAY
246
+ ) ;
247
+ expect ( ( ( setTimeout as unknown ) as jest . Mock ) . mock . calls [ 1 ] [ 1 ] ) . toBe (
248
+ SECOND_DELAY
249
+ ) ;
198
250
} ) ;
199
251
} ) ;
200
252
@@ -332,41 +384,4 @@ describe("defaultStrategy", () => {
332
384
expect ( releaseRetryTokens ) . not . toHaveBeenCalled ( ) ;
333
385
} ) ;
334
386
} ) ;
335
-
336
- it ( "should delay equal to the value returned by delayDecider" , async ( ) => {
337
- jest . spyOn ( global , "setTimeout" ) ;
338
-
339
- const FIRST_DELAY = 100 ;
340
- const SECOND_DELAY = 200 ;
341
-
342
- ( defaultDelayDecider as jest . Mock )
343
- . mockReturnValueOnce ( FIRST_DELAY )
344
- . mockReturnValueOnce ( SECOND_DELAY ) ;
345
-
346
- const mockError = new Error ( "mockError" ) ;
347
- const next = jest . fn ( ) . mockRejectedValue ( mockError ) ;
348
-
349
- const retryStrategy = new StandardRetryStrategy ( 3 ) ;
350
- try {
351
- await retryStrategy . retry ( next , { } as any ) ;
352
- } catch ( error ) {
353
- expect ( error ) . toStrictEqual ( mockError ) ;
354
- expect ( error . $metadata . totalRetryDelay ) . toEqual (
355
- FIRST_DELAY + SECOND_DELAY
356
- ) ;
357
- }
358
-
359
- expect ( defaultDelayDecider as jest . Mock ) . toHaveBeenCalledTimes ( 2 ) ;
360
- expect ( setTimeout ) . toHaveBeenCalledTimes ( 2 ) ;
361
- expect ( setTimeout ) . toHaveBeenNthCalledWith (
362
- 1 ,
363
- expect . any ( Function ) ,
364
- FIRST_DELAY
365
- ) ;
366
- expect ( setTimeout ) . toHaveBeenNthCalledWith (
367
- 2 ,
368
- expect . any ( Function ) ,
369
- SECOND_DELAY
370
- ) ;
371
- } ) ;
372
387
} ) ;
0 commit comments