@@ -2,51 +2,79 @@ import { expect } from "chai";
22import RetrySender from "../src/RetrySender.js" ;
33import { MockSenderWithStatusCodesAndHeaders } from "./fixtures/mock_senders.js" ;
44import Request from "../src/Request.js" ;
5- import MockSleeper from "./fixtures/MockSleeper.js" ;
5+ import Response from "../src/Response.js" ;
6+ import type { Sender , Sleeper , MockSenderInstance , MockSleeperInstance } from "../src/types.js" ;
7+
8+ class CompatibleMockSender implements MockSenderInstance {
9+ statusCodes : string [ ] ;
10+ headers ?: Record < string , unknown > | undefined ;
11+ error ?: string | undefined ;
12+ currentStatusCodeIndex : number ;
13+ private mockSender : {
14+ send ( request : Request ) : Response ;
15+ currentStatusCodeIndex : number ;
16+ } ;
17+
18+ constructor ( statusCodes : string [ ] , headers ?: Record < string , unknown > , error ?: string ) {
19+ this . statusCodes = statusCodes ;
20+ this . headers = headers ;
21+ this . error = error ;
22+ this . currentStatusCodeIndex = 0 ;
23+ this . mockSender = new ( MockSenderWithStatusCodesAndHeaders as new (
24+ ...args : [ string [ ] , Record < string , unknown > ?, string ?]
25+ ) => {
26+ send ( request : Request ) : Response ;
27+ currentStatusCodeIndex : number ;
28+ } ) ( statusCodes , headers , error ) ;
29+ }
30+
31+ async send ( request : Request ) : Promise < Response > {
32+ const result = this . mockSender . send ( request ) ;
33+ this . currentStatusCodeIndex = this . mockSender . currentStatusCodeIndex ;
34+ return Promise . resolve ( result ) ;
35+ }
36+ }
37+
38+ class CompatibleMockSleeper implements MockSleeperInstance {
39+ sleepDurations : number [ ] = [ ] ;
40+
41+ async sleep ( ms : number ) : Promise < void > {
42+ this . sleepDurations . push ( ms ) ;
43+ return Promise . resolve ( ) ;
44+ }
45+ }
646
7- async function sendWithRetry ( retries : number , inner : any , sleeper : any ) {
47+ async function sendWithRetry ( retries : number , inner : Sender , sleeper : Sleeper ) {
848 const request = new Request ( ) ;
949 const sender = new RetrySender ( retries , inner , sleeper ) ;
1050 return await sender . send ( request ) ;
1151}
1252
1353describe ( "Retry Sender tests" , function ( ) {
1454 it ( "test success does not retry" , async function ( ) {
15- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ "200" ] ) ;
16- await sendWithRetry ( 5 , inner , new MockSleeper ( ) ) ;
55+ let inner = new CompatibleMockSender ( [ "200" ] ) ;
56+ await sendWithRetry ( 5 , inner , new CompatibleMockSleeper ( ) ) ;
1757
1858 expect ( inner . currentStatusCodeIndex ) . to . equal ( 1 ) ;
1959 } ) ;
2060
2161 it ( "test client error does not retry" , async function ( ) {
22- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ "422" ] ) ;
23- await sendWithRetry ( 5 , inner , new MockSleeper ( ) ) ;
62+ let inner = new CompatibleMockSender ( [ "422" ] ) ;
63+ await sendWithRetry ( 5 , inner , new CompatibleMockSleeper ( ) ) ;
2464
2565 expect ( inner . currentStatusCodeIndex ) . to . equal ( 1 ) ;
2666 } ) ;
2767
2868 it ( "test will retry until success" , async function ( ) {
29- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [
30- "500" ,
31- "500" ,
32- "500" ,
33- "200" ,
34- "500" ,
35- ] ) ;
36- await sendWithRetry ( 10 , inner , new MockSleeper ( ) ) ;
69+ let inner = new CompatibleMockSender ( [ "500" , "500" , "500" , "200" , "500" ] ) ;
70+ await sendWithRetry ( 10 , inner , new CompatibleMockSleeper ( ) ) ;
3771
3872 expect ( inner . currentStatusCodeIndex ) . to . equal ( 4 ) ;
3973 } ) ;
4074
4175 it ( "test return response if retry limit exceeded" , async function ( ) {
42- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [
43- "500" ,
44- "500" ,
45- "500" ,
46- "500" ,
47- "500" ,
48- ] ) ;
49- const sleeper = new MockSleeper ( ) ;
76+ let inner = new CompatibleMockSender ( [ "500" , "500" , "500" , "500" , "500" ] ) ;
77+ const sleeper = new CompatibleMockSleeper ( ) ;
5078 const response = await sendWithRetry ( 4 , inner , sleeper ) ;
5179
5280 expect ( response ) ;
@@ -56,7 +84,7 @@ describe("Retry Sender tests", function () {
5684 } ) ;
5785
5886 it ( "test backoff does not exceed max" , async function ( ) {
59- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [
87+ let inner = new CompatibleMockSender ( [
6088 "500" ,
6189 "500" ,
6290 "500" ,
@@ -72,50 +100,50 @@ describe("Retry Sender tests", function () {
72100 "500" ,
73101 "200" ,
74102 ] ) ;
75- const sleeper = new MockSleeper ( ) ;
103+ const sleeper = new CompatibleMockSleeper ( ) ;
76104
77105 await sendWithRetry ( 20 , inner , sleeper ) ;
78106
79107 expect ( sleeper . sleepDurations ) . to . deep . equal ( [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 10 , 10 ] ) ;
80108 } ) ;
81109
82110 it ( "test empty status does not retry" , async function ( ) {
83- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ ] ) ;
84- await sendWithRetry ( 5 , inner , new MockSleeper ( ) ) ;
111+ let inner = new CompatibleMockSender ( [ ] ) ;
112+ await sendWithRetry ( 5 , inner , new CompatibleMockSleeper ( ) ) ;
85113
86114 expect ( inner . currentStatusCodeIndex ) . to . equal ( 1 ) ;
87115 } ) ;
88116
89117 it ( "test sleep on rate limit" , async function ( ) {
90- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ "429" , "200" ] ) ;
91- const sleeper = new MockSleeper ( ) ;
118+ let inner = new CompatibleMockSender ( [ "429" , "200" ] ) ;
119+ const sleeper = new CompatibleMockSleeper ( ) ;
92120
93121 await sendWithRetry ( 5 , inner , sleeper ) ;
94122
95123 expect ( sleeper . sleepDurations ) . to . deep . equal ( [ 10 ] ) ;
96124 } ) ;
97125
98126 it ( "test rate limit error return" , async function ( ) {
99- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ "429" ] , { "Retry-After" : 7 } ) ;
100- const sleeper = new MockSleeper ( ) ;
127+ let inner = new CompatibleMockSender ( [ "429" ] , { "Retry-After" : 7 } ) ;
128+ const sleeper = new CompatibleMockSleeper ( ) ;
101129
102130 await sendWithRetry ( 10 , inner , sleeper ) ;
103131
104132 expect ( sleeper . sleepDurations ) . to . deep . equal ( [ 7 ] ) ;
105133 } ) ;
106134
107135 it ( "test retry after invalid value" , async function ( ) {
108- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ "429" ] , { "Retry-After" : "a" } ) ;
109- const sleeper = new MockSleeper ( ) ;
136+ let inner = new CompatibleMockSender ( [ "429" ] , { "Retry-After" : "a" } ) ;
137+ const sleeper = new CompatibleMockSleeper ( ) ;
110138
111139 await sendWithRetry ( 10 , inner , sleeper ) ;
112140
113141 expect ( sleeper . sleepDurations ) . to . deep . equal ( [ 10 ] ) ;
114142 } ) ;
115143
116144 it ( "test retry error" , async function ( ) {
117- let inner = new ( MockSenderWithStatusCodesAndHeaders as any ) ( [ "429" ] , undefined , "Big Bad" ) ;
118- const sleeper = new MockSleeper ( ) ;
145+ let inner = new CompatibleMockSender ( [ "429" ] , undefined , "Big Bad" ) ;
146+ const sleeper = new CompatibleMockSleeper ( ) ;
119147
120148 const response = await sendWithRetry ( 10 , inner , sleeper ) ;
121149
0 commit comments