@@ -55,7 +55,9 @@ describe("defaultStrategy", () => {
55
55
output : { $metadata : { } }
56
56
} ) ;
57
57
58
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
58
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
59
+ Promise . resolve ( maxAttempts . toString ( ) )
60
+ ) ;
59
61
return retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
60
62
} ;
61
63
@@ -66,7 +68,9 @@ describe("defaultStrategy", () => {
66
68
const mockError = options ?. mockError ?? new Error ( "mockError" ) ;
67
69
next = jest . fn ( ) . mockRejectedValue ( mockError ) ;
68
70
69
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
71
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
72
+ Promise . resolve ( maxAttempts . toString ( ) )
73
+ ) ;
70
74
try {
71
75
await retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
72
76
} catch ( error ) {
@@ -90,7 +94,9 @@ describe("defaultStrategy", () => {
90
94
. mockRejectedValueOnce ( mockError )
91
95
. mockResolvedValueOnce ( mockResponse ) ;
92
96
93
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
97
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
98
+ Promise . resolve ( maxAttempts . toString ( ) )
99
+ ) ;
94
100
return retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
95
101
} ;
96
102
@@ -110,81 +116,109 @@ describe("defaultStrategy", () => {
110
116
. mockRejectedValueOnce ( mockError )
111
117
. mockResolvedValueOnce ( mockResponse ) ;
112
118
113
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
119
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
120
+ Promise . resolve ( maxAttempts . toString ( ) )
121
+ ) ;
114
122
return retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
115
123
} ;
116
124
117
125
afterEach ( ( ) => {
118
126
jest . clearAllMocks ( ) ;
119
127
} ) ;
120
128
121
- it ( "sets maxAttempts as class member variable" , ( ) => {
122
- [ 1 , 2 , 3 ] . forEach ( maxAttempts => {
123
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
124
- expect ( retryStrategy . maxAttempts ) . toBe ( maxAttempts ) ;
129
+ it ( "sets maxAttemptsProvider as class member variable" , ( ) => {
130
+ [ "1" , "2" , "3" ] . forEach ( maxAttempts => {
131
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
132
+ Promise . resolve ( maxAttempts )
133
+ ) ;
134
+ expect ( retryStrategy [ "maxAttemptsProvider" ] ( ) ) . resolves . toBe ( maxAttempts ) ;
125
135
} ) ;
126
136
} ) ;
127
137
128
138
describe ( "retryDecider init" , ( ) => {
129
139
it ( "sets defaultRetryDecider if options is undefined" , ( ) => {
130
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
140
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
141
+ Promise . resolve ( maxAttempts . toString ( ) )
142
+ ) ;
131
143
expect ( retryStrategy [ "retryDecider" ] ) . toBe ( defaultRetryDecider ) ;
132
144
} ) ;
133
145
134
146
it ( "sets defaultRetryDecider if options.retryDecider is undefined" , ( ) => {
135
- const retryStrategy = new StandardRetryStrategy ( maxAttempts , { } ) ;
147
+ const retryStrategy = new StandardRetryStrategy (
148
+ ( ) => Promise . resolve ( maxAttempts . toString ( ) ) ,
149
+ { }
150
+ ) ;
136
151
expect ( retryStrategy [ "retryDecider" ] ) . toBe ( defaultRetryDecider ) ;
137
152
} ) ;
138
153
139
154
it ( "sets options.retryDecider if defined" , ( ) => {
140
155
const retryDecider = jest . fn ( ) ;
141
- const retryStrategy = new StandardRetryStrategy ( maxAttempts , {
142
- retryDecider
143
- } ) ;
156
+ const retryStrategy = new StandardRetryStrategy (
157
+ ( ) => Promise . resolve ( maxAttempts . toString ( ) ) ,
158
+ {
159
+ retryDecider
160
+ }
161
+ ) ;
144
162
expect ( retryStrategy [ "retryDecider" ] ) . toBe ( retryDecider ) ;
145
163
} ) ;
146
164
} ) ;
147
165
148
166
describe ( "delayDecider init" , ( ) => {
149
167
it ( "sets defaultDelayDecider if options is undefined" , ( ) => {
150
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
168
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
169
+ Promise . resolve ( maxAttempts . toString ( ) )
170
+ ) ;
151
171
expect ( retryStrategy [ "delayDecider" ] ) . toBe ( defaultDelayDecider ) ;
152
172
} ) ;
153
173
154
174
it ( "sets defaultDelayDecider if options.delayDecider undefined" , ( ) => {
155
- const retryStrategy = new StandardRetryStrategy ( maxAttempts , { } ) ;
175
+ const retryStrategy = new StandardRetryStrategy (
176
+ ( ) => Promise . resolve ( maxAttempts . toString ( ) ) ,
177
+ { }
178
+ ) ;
156
179
expect ( retryStrategy [ "delayDecider" ] ) . toBe ( defaultDelayDecider ) ;
157
180
} ) ;
158
181
159
182
it ( "sets options.delayDecider if defined" , ( ) => {
160
183
const delayDecider = jest . fn ( ) ;
161
- const retryStrategy = new StandardRetryStrategy ( maxAttempts , {
162
- delayDecider
163
- } ) ;
184
+ const retryStrategy = new StandardRetryStrategy (
185
+ ( ) => Promise . resolve ( maxAttempts . toString ( ) ) ,
186
+ {
187
+ delayDecider
188
+ }
189
+ ) ;
164
190
expect ( retryStrategy [ "delayDecider" ] ) . toBe ( delayDecider ) ;
165
191
} ) ;
166
192
} ) ;
167
193
168
194
describe ( "retryQuota init" , ( ) => {
169
195
it ( "sets getDefaultRetryQuota if options is undefined" , ( ) => {
170
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
196
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
197
+ Promise . resolve ( maxAttempts . toString ( ) )
198
+ ) ;
171
199
expect ( retryStrategy [ "retryQuota" ] ) . toBe (
172
200
getDefaultRetryQuota ( INITIAL_RETRY_TOKENS )
173
201
) ;
174
202
} ) ;
175
203
176
204
it ( "sets getDefaultRetryQuota if options.delayDecider undefined" , ( ) => {
177
- const retryStrategy = new StandardRetryStrategy ( maxAttempts , { } ) ;
205
+ const retryStrategy = new StandardRetryStrategy (
206
+ ( ) => Promise . resolve ( maxAttempts . toString ( ) ) ,
207
+ { }
208
+ ) ;
178
209
expect ( retryStrategy [ "retryQuota" ] ) . toBe (
179
210
getDefaultRetryQuota ( INITIAL_RETRY_TOKENS )
180
211
) ;
181
212
} ) ;
182
213
183
214
it ( "sets options.retryQuota if defined" , ( ) => {
184
215
const retryQuota = { } as RetryQuota ;
185
- const retryStrategy = new StandardRetryStrategy ( maxAttempts , {
186
- retryQuota
187
- } ) ;
216
+ const retryStrategy = new StandardRetryStrategy (
217
+ ( ) => Promise . resolve ( maxAttempts . toString ( ) ) ,
218
+ {
219
+ retryQuota
220
+ }
221
+ ) ;
188
222
expect ( retryStrategy [ "retryQuota" ] ) . toBe ( retryQuota ) ;
189
223
} ) ;
190
224
} ) ;
@@ -483,7 +517,9 @@ describe("defaultStrategy", () => {
483
517
output : { $metadata : { } }
484
518
} ) ;
485
519
486
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
520
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
521
+ Promise . resolve ( maxAttempts . toString ( ) )
522
+ ) ;
487
523
await retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
488
524
await retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
489
525
@@ -565,7 +601,9 @@ describe("defaultStrategy", () => {
565
601
throw mockError ;
566
602
} ) ;
567
603
568
- const retryStrategy = new StandardRetryStrategy ( maxAttempts ) ;
604
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
605
+ Promise . resolve ( maxAttempts . toString ( ) )
606
+ ) ;
569
607
try {
570
608
await retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
571
609
} catch ( error ) {
@@ -577,4 +615,54 @@ describe("defaultStrategy", () => {
577
615
( ( isInstance as unknown ) as jest . Mock ) . mockReturnValue ( false ) ;
578
616
} ) ;
579
617
} ) ;
618
+
619
+ describe ( "defaults maxAttempts to 3" , ( ) => {
620
+ it ( "when maxAttemptsProvider throws error" , async ( ) => {
621
+ const maxAttempts = 3 ;
622
+ const { isInstance } = HttpRequest ;
623
+ ( ( isInstance as unknown ) as jest . Mock ) . mockReturnValue ( true ) ;
624
+
625
+ next = jest . fn ( args => {
626
+ expect ( args . request . headers [ "amz-sdk-request" ] ) . toBe (
627
+ `attempt=1; max=${ maxAttempts } `
628
+ ) ;
629
+ return Promise . resolve ( {
630
+ response : "mockResponse" ,
631
+ output : { $metadata : { } }
632
+ } ) ;
633
+ } ) ;
634
+
635
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
636
+ Promise . reject ( "ERROR" )
637
+ ) ;
638
+ await retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
639
+
640
+ expect ( next ) . toHaveBeenCalledTimes ( 1 ) ;
641
+ ( ( isInstance as unknown ) as jest . Mock ) . mockReturnValue ( false ) ;
642
+ } ) ;
643
+
644
+ it ( "when parseInt fails on maxAttemptsProvider" , async ( ) => {
645
+ const maxAttempts = 3 ;
646
+ const { isInstance } = HttpRequest ;
647
+ ( ( isInstance as unknown ) as jest . Mock ) . mockReturnValue ( true ) ;
648
+
649
+ next = jest . fn ( args => {
650
+ expect ( args . request . headers [ "amz-sdk-request" ] ) . toBe (
651
+ `attempt=1; max=${ maxAttempts } `
652
+ ) ;
653
+ return Promise . resolve ( {
654
+ response : "mockResponse" ,
655
+ output : { $metadata : { } }
656
+ } ) ;
657
+ } ) ;
658
+
659
+ const retryStrategy = new StandardRetryStrategy ( ( ) =>
660
+ Promise . resolve ( "not-a-number" )
661
+ ) ;
662
+ await retryStrategy . retry ( next , { request : { headers : { } } } as any ) ;
663
+
664
+ expect ( next ) . toHaveBeenCalledTimes ( 1 ) ;
665
+ ( ( isInstance as unknown ) as jest . Mock ) . mockReturnValue ( false ) ;
666
+ } ) ;
667
+ } ) ;
580
668
} ) ;
0 commit comments