@@ -868,6 +868,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
868868
869869 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
870870
871+ @pytest .mark .respx (base_url = base_url )
872+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
873+ # Test that the default follow_redirects=True allows following redirects
874+ respx_mock .post ("/redirect" ).mock (
875+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
876+ )
877+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
878+ 879+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
880+ assert response .status_code == 200
881+ assert response .json () == {"status" : "ok" }
882+ 883+ @pytest .mark .respx (base_url = base_url )
884+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
885+ # Test that follow_redirects=False prevents following redirects
886+ respx_mock .post ("/redirect" ).mock (
887+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
888+ )
889+ 890+ with pytest .raises (APIStatusError ) as exc_info :
891+ self .client .post (
892+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
893+ )
894+ 895+ assert exc_info .value .response .status_code == 302
896+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
897+ 871898
872899class TestAsyncReplicate :
873900 client = AsyncReplicate (base_url = base_url , bearer_token = bearer_token , _strict_response_validation = True )
@@ -1731,3 +1758,30 @@ async def test_main() -> None:
17311758 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
17321759
17331760 time .sleep (0.1 )
1761+ 1762+ @pytest .mark .respx (base_url = base_url )
1763+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1764+ # Test that the default follow_redirects=True allows following redirects
1765+ respx_mock .post ("/redirect" ).mock (
1766+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1767+ )
1768+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1769+ 1770+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1771+ assert response .status_code == 200
1772+ assert response .json () == {"status" : "ok" }
1773+ 1774+ @pytest .mark .respx (base_url = base_url )
1775+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1776+ # Test that follow_redirects=False prevents following redirects
1777+ respx_mock .post ("/redirect" ).mock (
1778+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1779+ )
1780+ 1781+ with pytest .raises (APIStatusError ) as exc_info :
1782+ await self .client .post (
1783+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1784+ )
1785+ 1786+ assert exc_info .value .response .status_code == 302
1787+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments