@@ -134,6 +134,84 @@ def test(self):
134134 assert mock_tasks_get [0 ].call_count == 1
135135 assert mock_tasks_get [1 ].call_count == 1
136136
137+ @responses .activate
138+ @mock .patch ("time.sleep" , autospec = True )
139+ def test_exponential_backoff (self , mock_sleep ):
140+ uid = "jXhOhdm5OOSkGhJw"
141+
142+ # behavior
143+ mock_tasks_get = [
144+ responses .get (
145+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
146+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : False },
147+ ),
148+ responses .get (
149+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
150+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : False },
151+ ),
152+ responses .get (
153+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
154+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : False },
155+ ),
156+ responses .get (
157+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
158+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : True },
159+ ),
160+ ]
161+
162+ # setup
163+ c = connect .Client ("https://connect.example" , "12345" )
164+ task = c .tasks .get (uid )
165+ assert not task .is_finished
166+
167+ # invoke
168+ task .wait_for (initial_wait = 1 , max_wait = 5 , backoff = 2.0 )
169+
170+ # assert
171+ assert task .is_finished
172+ assert mock_tasks_get [0 ].call_count == 1
173+ assert mock_tasks_get [1 ].call_count == 1
174+
175+ # Verify sleep calls
176+ mock_sleep .assert_has_calls ([mock .call (1 ), mock .call (2 ), mock .call (4 )], any_order = False )
177+
178+ @responses .activate
179+ @mock .patch ("time.sleep" , autospec = True )
180+ def test_no_backoff (self , mock_sleep ):
181+ uid = "jXhOhdm5OOSkGhJw"
182+
183+ # behavior
184+ mock_tasks_get = [
185+ responses .get (
186+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
187+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : False },
188+ ),
189+ responses .get (
190+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
191+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : False },
192+ ),
193+ responses .get (
194+ f"https://connect.example/__api__/v1/tasks/{ uid } " ,
195+ json = {** load_mock_dict (f"v1/tasks/{ uid } .json" ), "finished" : True },
196+ ),
197+ ]
198+
199+ # setup
200+ c = connect .Client ("https://connect.example" , "12345" )
201+ task = c .tasks .get (uid )
202+ assert not task .is_finished
203+
204+ # invoke
205+ task .wait_for (initial_wait = 2 , max_wait = 5 , backoff = 1.0 )
206+
207+ # assert
208+ assert task .is_finished
209+ assert mock_tasks_get [0 ].call_count == 1
210+ assert mock_tasks_get [1 ].call_count == 1
211+
212+ # Verify sleep calls
213+ mock_sleep .assert_has_calls ([mock .call (2 ), mock .call (2 )], any_order = False )
214+
137215
138216class TestTasksGet :
139217 @responses .activate
0 commit comments