From 786820e489ef68f2cfa816c0c8cb1c8a16f5d9cf Mon Sep 17 00:00:00 2001 From: Shubham Padkonde Date: Sat, 3 Oct 2026 09:50:36 +0530 Subject: [PATCH] fix: honor zero retry limits when cloning clients --- dropbox/dropbox_client.py | 8 ++++++-- test/unit/test_dropbox_unit.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/dropbox/dropbox_client.py b/dropbox/dropbox_client.py index 8d7cf1f..a299a9c 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 0a8bb30..2ae7a95 100644 --- a/test/unit/test_dropbox_unit.py +++ b/test/unit/test_dropbox_unit.py @@ -20,7 +20,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" @@ -663,6 +669,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,