@@ -842,11 +842,51 @@ def test_exception_from_response(self):
842842 mock_response .reason_phrase = "Too Many Requests"
843843 mock_response .json .return_value = {"error" : "rate limited" }
844844 mock_response .request = MagicMock (spec = Request )
845+ mock_response .headers = {} # Required for UiPathRateLimitError._parse_retry_after
845846
846847 exc = UiPathAPIError .from_response (mock_response )
847848 assert isinstance (exc , UiPathRateLimitError )
848849 assert exc .status_code == 429
849850
851+ def test_exception_from_response_with_retry_after (self ):
852+ """Test UiPathRateLimitError parses Retry-After header."""
853+ mock_response = MagicMock (spec = Response )
854+ mock_response .status_code = 429
855+ mock_response .reason_phrase = "Too Many Requests"
856+ mock_response .json .return_value = {"error" : "rate limited" }
857+ mock_response .request = MagicMock (spec = Request )
858+ mock_response .headers = {"retry-after" : "30" }
859+
860+ exc = UiPathAPIError .from_response (mock_response )
861+ assert isinstance (exc , UiPathRateLimitError )
862+ assert exc .retry_after == 30.0
863+
864+ def test_exception_from_response_with_x_retry_after (self ):
865+ """Test UiPathRateLimitError parses x-retry-after header."""
866+ mock_response = MagicMock (spec = Response )
867+ mock_response .status_code = 429
868+ mock_response .reason_phrase = "Too Many Requests"
869+ mock_response .json .return_value = {"error" : "rate limited" }
870+ mock_response .request = MagicMock (spec = Request )
871+ mock_response .headers = {"x-retry-after" : "45" }
872+
873+ exc = UiPathAPIError .from_response (mock_response )
874+ assert isinstance (exc , UiPathRateLimitError )
875+ assert exc .retry_after == 45.0
876+
877+ def test_exception_retry_after_none_when_not_present (self ):
878+ """Test UiPathRateLimitError.retry_after is None when header missing."""
879+ mock_response = MagicMock (spec = Response )
880+ mock_response .status_code = 429
881+ mock_response .reason_phrase = "Too Many Requests"
882+ mock_response .json .return_value = {"error" : "rate limited" }
883+ mock_response .request = MagicMock (spec = Request )
884+ mock_response .headers = {}
885+
886+ exc = UiPathAPIError .from_response (mock_response )
887+ assert isinstance (exc , UiPathRateLimitError )
888+ assert exc .retry_after is None
889+
850890
851891# ============================================================================
852892# Test Singleton Utility
0 commit comments