diff --git a/dropbox/dropbox_client.py b/dropbox/dropbox_client.py index c2644ed..adfd9f1 100644 --- a/dropbox/dropbox_client.py +++ b/dropbox/dropbox_client.py @@ -268,8 +268,12 @@ def clone( return self.__class__( oauth2_access_token or self._oauth2_access_token, - max_retries_on_error or self._max_retries_on_error, - max_retries_on_rate_limit or self._max_retries_on_rate_limit, + self._max_retries_on_error if max_retries_on_error is None else max_retries_on_error, + ( + self._max_retries_on_rate_limit + if max_retries_on_rate_limit is None + else max_retries_on_rate_limit + ), user_agent or self._raw_user_agent, session or self._session, headers or self._headers, diff --git a/test/unit/test_dropbox_unit.py b/test/unit/test_dropbox_unit.py index 4aa4e5d..2a57cee 100644 --- a/test/unit/test_dropbox_unit.py +++ b/test/unit/test_dropbox_unit.py @@ -22,7 +22,13 @@ RouteResult, USER_AUTH, ) -from dropbox.exceptions import ApiError, AuthError, BadInputError +from dropbox.exceptions import ( + ApiError, + AuthError, + BadInputError, + InternalServerError, + RateLimitError, +) from dropbox.oauth import OAuth2FlowNoRedirectResult, DropboxOAuth2FlowNoRedirect APP_KEY = "dummy_app_key" @@ -691,6 +697,27 @@ def test_non_list_scope_raises_bad_input(self, session_instance): with pytest.raises(BadInputException): Dropbox(oauth2_access_token=ACCESS_TOKEN, scope=12345, session=session_instance) + @pytest.mark.parametrize( + "setting, error", + [ + ("max_retries_on_error", InternalServerError("request-id", 500, "error")), + ("max_retries_on_rate_limit", RateLimitError("request-id")), + ], + ) + def test_clone_can_disable_retries(self, session_instance, mocker, setting, error): + dbx = Dropbox(ACCESS_TOKEN, session=session_instance, **{setting: 2}) + cloned = dbx.clone(**{setting: 0}) + request = mocker.patch.object(cloned, "request_json_string", side_effect=error) + sleep = mocker.patch("dropbox.dropbox_client.time.sleep") + + with pytest.raises(type(error)): + cloned.request_json_string_with_retry("api", "test", "rpc", "{}", USER_AUTH, None) + + request.assert_called_once() + sleep.assert_not_called() + assert getattr(dbx, "_" + setting) == 2 + assert getattr(dbx.clone(), "_" + setting) == 2 + def test_clone_does_not_double_user_agent(self, session_instance): dbx = Dropbox( oauth2_access_token=ACCESS_TOKEN,