@@ -826,6 +826,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
826826
827827 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
828828
829+ @pytest .mark .respx (base_url = base_url )
830+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
831+ # Test that the default follow_redirects=True allows following redirects
832+ respx_mock .post ("/redirect" ).mock (
833+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
834+ )
835+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
836+
837+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
838+ assert response .status_code == 200
839+ assert response .json () == {"status" : "ok" }
840+
841+ @pytest .mark .respx (base_url = base_url )
842+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
843+ # Test that follow_redirects=False prevents following redirects
844+ respx_mock .post ("/redirect" ).mock (
845+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
846+ )
847+
848+ with pytest .raises (APIStatusError ) as exc_info :
849+ self .client .post (
850+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
851+ )
852+
853+ assert exc_info .value .response .status_code == 302
854+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
855+
829856
830857class TestAsyncParallel :
831858 client = AsyncParallel (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1657,3 +1684,30 @@ async def test_main() -> None:
16571684 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16581685
16591686 time .sleep (0.1 )
1687+
1688+ @pytest .mark .respx (base_url = base_url )
1689+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1690+ # Test that the default follow_redirects=True allows following redirects
1691+ respx_mock .post ("/redirect" ).mock (
1692+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1693+ )
1694+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1695+
1696+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1697+ assert response .status_code == 200
1698+ assert response .json () == {"status" : "ok" }
1699+
1700+ @pytest .mark .respx (base_url = base_url )
1701+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1702+ # Test that follow_redirects=False prevents following redirects
1703+ respx_mock .post ("/redirect" ).mock (
1704+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1705+ )
1706+
1707+ with pytest .raises (APIStatusError ) as exc_info :
1708+ await self .client .post (
1709+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1710+ )
1711+
1712+ assert exc_info .value .response .status_code == 302
1713+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments