66from io import IOBase
77from numbers import Number
88
9- from mock import MagicMock , Mock , PropertyMock , call
9+ from mock import MagicMock , Mock , PropertyMock , call , patch
1010import pytest
1111
1212from boxsdk .auth .oauth2 import OAuth2
@@ -145,11 +145,12 @@ def test_box_session_retries_response_after_retry_after(
145145 mock_network_layer .request .side_effect = [retry_after_response , generic_successful_response ]
146146 mock_network_layer .retry_after .side_effect = lambda delay , request , * args , ** kwargs : request (* args , ** kwargs )
147147
148- box_response = test_method (box_session , url = test_url )
148+ with patch ('random.uniform' , return_value = 0.68 ):
149+ box_response = test_method (box_session , url = test_url )
149150 assert box_response .status_code == 200
150151 assert len (mock_network_layer .retry_after .call_args_list ) == 1
151152 assert isinstance (mock_network_layer .retry_after .call_args [0 ][0 ], Number )
152- assert mock_network_layer .retry_after .call_args [0 ][0 ] == float ( retry_after_response . headers [ 'Retry-After' ])
153+ assert round ( mock_network_layer .retry_after .call_args [0 ][0 ], 4 ) == 1.18
153154
154155
155156@pytest .mark .parametrize ('test_method' , [
@@ -172,16 +173,17 @@ def test_box_session_retries_request_after_server_error(
172173 mock_network_layer .request .side_effect = [server_error_response , server_error_response , generic_successful_response ]
173174 mock_network_layer .retry_after .side_effect = lambda delay , request , * args , ** kwargs : request (* args , ** kwargs )
174175
175- box_response = test_method (box_session , url = test_url )
176+ with patch ('random.uniform' , return_value = 0.68 ):
177+ box_response = test_method (box_session , url = test_url )
176178 assert box_response .status_code == 200
177179 assert box_response .json () == generic_successful_response .json ()
178180 assert box_response .ok == generic_successful_response .ok
179181 assert box_response .content == generic_successful_response .content
180182 assert len (mock_network_layer .retry_after .call_args_list ) == 2
181183 assert isinstance (mock_network_layer .retry_after .call_args_list [0 ][0 ][0 ], Number )
182184 assert isinstance (mock_network_layer .retry_after .call_args_list [1 ][0 ][0 ], Number )
183- assert mock_network_layer .retry_after .call_args_list [0 ][0 ][0 ] == 1
184- assert mock_network_layer .retry_after .call_args_list [1 ][0 ][0 ] == 2
185+ assert round ( mock_network_layer .retry_after .call_args_list [0 ][0 ][0 ], 4 ) == 1.18
186+ assert round ( mock_network_layer .retry_after .call_args_list [1 ][0 ][0 ], 4 ) == 2.36
185187
186188
187189def test_box_session_seeks_file_after_retry (box_session , mock_network_layer , server_error_response , generic_successful_response , test_url ):
@@ -274,3 +276,20 @@ def test_session_uses_local_config(box_session, mock_network_layer, generic_succ
274276 box_session .api_config .BASE_API_URL = example_dot_com
275277 monkeypatch .setattr (API , 'BASE_API_URL' , 'https://api.box.com' )
276278 assert example_dot_com in box_session .get_url ('foo' , 'bar' )
279+
280+
281+ @pytest .mark .parametrize (
282+ 'attempt_number,retry_after_header,expected_result' ,
283+ [
284+ (0 , '' , 1.18 ),
285+ (1 , '' , 2.36 ),
286+ (2 , '' , 4.72 ),
287+ (3 , '' , 9.44 ),
288+ (4 , '' , 18.88 ),
289+ ]
290+ )
291+ def test_get_retry_after_time (box_session , attempt_number , retry_after_header , expected_result ):
292+ with patch ('random.uniform' , return_value = 0.68 ):
293+ retry_time = box_session ._get_retry_after_time (attempt_number , retry_after_header ) # pylint: disable=protected-access
294+ retry_time = round (retry_time , 4 )
295+ assert retry_time == expected_result
0 commit comments