1+ import { AbortController } from "@aws-sdk/abort-controller" ;
2+
13import { runPolling } from "./poller" ;
24import { sleep } from "./utils/sleep" ;
3- import { WaiterState } from "./waiter" ;
5+ import { ResolvedWaiterOptions , WaiterState } from "./waiter" ;
46
57jest . mock ( "./utils/sleep" ) ;
68
@@ -9,9 +11,12 @@ describe(runPolling.name, () => {
911 minDelay : 2 ,
1012 maxDelay : 30 ,
1113 maxWaitTime : 99999 ,
12- } ;
13- const client = "mockClient" ;
14+ client : "mockClient" ,
15+ } as ResolvedWaiterOptions < any > ;
1416 const input = "mockInput" ;
17+ const abortedState = {
18+ state : WaiterState . ABORTED ,
19+ } ;
1520 const failureState = {
1621 state : WaiterState . FAILURE ,
1722 } ;
@@ -21,6 +26,9 @@ describe(runPolling.name, () => {
2126 const retryState = {
2227 state : WaiterState . RETRY ,
2328 } ;
29+ const timeoutState = {
30+ state : WaiterState . TIMEOUT ,
31+ } ;
2432
2533 let mockAcceptorChecks ;
2634
@@ -36,30 +44,20 @@ describe(runPolling.name, () => {
3644
3745 it ( "should returns state in case of failure" , async ( ) => {
3846 mockAcceptorChecks = jest . fn ( ) . mockResolvedValueOnce ( failureState ) ;
39- await expect ( runPolling < string , string > ( config , client , input , mockAcceptorChecks ) ) . resolves . toStrictEqual (
40- failureState
41- ) ;
47+ await expect ( runPolling ( config , input , mockAcceptorChecks ) ) . resolves . toStrictEqual ( failureState ) ;
4248
4349 expect ( mockAcceptorChecks ) . toHaveBeenCalled ( ) ;
4450 expect ( mockAcceptorChecks ) . toHaveBeenCalledTimes ( 1 ) ;
45- expect ( mockAcceptorChecks ) . toHaveBeenCalledWith ( client , input ) ;
51+ expect ( mockAcceptorChecks ) . toHaveBeenCalledWith ( config . client , input ) ;
4652
4753 expect ( sleep ) . toHaveBeenCalled ( ) ;
4854 expect ( sleep ) . toHaveBeenCalledTimes ( 1 ) ;
4955 expect ( sleep ) . toHaveBeenCalledWith ( config . minDelay ) ;
5056 } ) ;
5157
5258 it ( "returns state in case of success" , async ( ) => {
53- const config = {
54- minDelay : 2 ,
55- maxDelay : 30 ,
56- maxWaitTime : 99999 ,
57- } ;
58-
5959 mockAcceptorChecks = jest . fn ( ) . mockResolvedValueOnce ( successState ) ;
60- await expect ( runPolling < string , string > ( config , client , input , mockAcceptorChecks ) ) . resolves . toStrictEqual (
61- successState
62- ) ;
60+ await expect ( runPolling ( config , input , mockAcceptorChecks ) ) . resolves . toStrictEqual ( successState ) ;
6361 expect ( sleep ) . toHaveBeenCalled ( ) ;
6462 expect ( sleep ) . toHaveBeenCalledTimes ( 1 ) ;
6563 expect ( sleep ) . toHaveBeenCalledWith ( config . minDelay ) ;
@@ -76,18 +74,54 @@ describe(runPolling.name, () => {
7674 . mockResolvedValueOnce ( retryState )
7775 . mockResolvedValueOnce ( successState ) ;
7876
79- await expect ( runPolling < string , string > ( config , client , input , mockAcceptorChecks ) ) . resolves . toStrictEqual (
80- successState
81- ) ;
77+ await expect ( runPolling ( config , input , mockAcceptorChecks ) ) . resolves . toStrictEqual ( successState ) ;
8278
8379 expect ( sleep ) . toHaveBeenCalled ( ) ;
8480 expect ( sleep ) . toHaveBeenCalledTimes ( 7 ) ;
85- expect ( sleep ) . toHaveBeenNthCalledWith ( 1 , 2 ) ; // min delay
86- expect ( sleep ) . toHaveBeenNthCalledWith ( 2 , 3 ) ; // + random() * 2
87- expect ( sleep ) . toHaveBeenNthCalledWith ( 3 , 5 ) ; // +random() * 4
88- expect ( sleep ) . toHaveBeenNthCalledWith ( 4 , 9 ) ; // +random() * 8
89- expect ( sleep ) . toHaveBeenNthCalledWith ( 5 , 17 ) ; // +random() * 16
81+ expect ( sleep ) . toHaveBeenNthCalledWith ( 1 , 2 ) ; // min delay. random(2, 2)
82+ expect ( sleep ) . toHaveBeenNthCalledWith ( 2 , 3 ) ; // random(2, 4)
83+ expect ( sleep ) . toHaveBeenNthCalledWith ( 3 , 5 ) ; // +random(2, 8)
84+ expect ( sleep ) . toHaveBeenNthCalledWith ( 4 , 9 ) ; // +random(2, 16)
85+ expect ( sleep ) . toHaveBeenNthCalledWith ( 5 , 30 ) ; // max delay
9086 expect ( sleep ) . toHaveBeenNthCalledWith ( 6 , 30 ) ; // max delay
9187 expect ( sleep ) . toHaveBeenNthCalledWith ( 7 , 30 ) ; // max delay
9288 } ) ;
89+
90+ it ( "resolves after the last attempt before reaching maxWaitTime " , async ( ) => {
91+ let now = Date . now ( ) ;
92+ const delay = 2 ;
93+ const nowMock = jest
94+ . spyOn ( Date , "now" )
95+ . mockReturnValueOnce ( now ) // 1st invoke for getting the time stamp to wait until
96+ . mockImplementation ( ( ) => {
97+ const rtn = now ;
98+ now += delay * 1000 ;
99+ return rtn ;
100+ } ) ;
101+ const localConfig = {
102+ ...config ,
103+ minDelay : delay ,
104+ maxDelay : delay ,
105+ maxWaitTime : 5 ,
106+ } ;
107+
108+ mockAcceptorChecks = jest . fn ( ) . mockResolvedValue ( retryState ) ;
109+ await expect ( runPolling ( localConfig , input , mockAcceptorChecks ) ) . resolves . toStrictEqual ( timeoutState ) ;
110+ expect ( sleep ) . toHaveBeenCalled ( ) ;
111+ expect ( sleep ) . toHaveBeenCalledTimes ( 2 ) ;
112+ nowMock . mockReset ( ) ;
113+ } ) ;
114+
115+ it ( "resolves when abortController is signalled" , async ( ) => {
116+ const abortController = new AbortController ( ) ;
117+ const localConfig = {
118+ ...config ,
119+ abortController,
120+ } ;
121+
122+ mockAcceptorChecks = jest . fn ( ) . mockResolvedValue ( retryState ) ;
123+ abortController . abort ( ) ;
124+ await expect ( runPolling ( localConfig , input , mockAcceptorChecks ) ) . resolves . toStrictEqual ( abortedState ) ;
125+ expect ( sleep ) . not . toHaveBeenCalled ( ) ;
126+ } ) ;
93127} ) ;
0 commit comments