@@ -869,6 +869,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
869869 assert response .retries_taken == failures_before_success
870870 assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
871871
872+ @pytest .mark .respx (base_url = base_url )
873+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
874+ # Test that the default follow_redirects=True allows following redirects
875+ respx_mock .post ("/redirect" ).mock (
876+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
877+ )
878+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
879+
880+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
881+ assert response .status_code == 200
882+ assert response .json () == {"status" : "ok" }
883+
884+ @pytest .mark .respx (base_url = base_url )
885+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
886+ # Test that follow_redirects=False prevents following redirects
887+ respx_mock .post ("/redirect" ).mock (
888+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
889+ )
890+
891+ with pytest .raises (APIStatusError ) as exc_info :
892+ self .client .post (
893+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
894+ )
895+
896+ assert exc_info .value .response .status_code == 302
897+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
898+
872899
873900class TestAsyncOrb :
874901 client = AsyncOrb (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1751,3 +1778,30 @@ async def test_main() -> None:
17511778 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
17521779
17531780 time .sleep (0.1 )
1781+
1782+ @pytest .mark .respx (base_url = base_url )
1783+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1784+ # Test that the default follow_redirects=True allows following redirects
1785+ respx_mock .post ("/redirect" ).mock (
1786+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1787+ )
1788+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1789+
1790+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1791+ assert response .status_code == 200
1792+ assert response .json () == {"status" : "ok" }
1793+
1794+ @pytest .mark .respx (base_url = base_url )
1795+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1796+ # Test that follow_redirects=False prevents following redirects
1797+ respx_mock .post ("/redirect" ).mock (
1798+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1799+ )
1800+
1801+ with pytest .raises (APIStatusError ) as exc_info :
1802+ await self .client .post (
1803+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1804+ )
1805+
1806+ assert exc_info .value .response .status_code == 302
1807+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments