@@ -832,6 +832,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
832832
833833 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
834834
835+ @pytest .mark .respx (base_url = base_url )
836+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
837+ # Test that the default follow_redirects=True allows following redirects
838+ respx_mock .post ("/redirect" ).mock (
839+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
840+ )
841+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
842+
843+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
844+ assert response .status_code == 200
845+ assert response .json () == {"status" : "ok" }
846+
847+ @pytest .mark .respx (base_url = base_url )
848+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
849+ # Test that follow_redirects=False prevents following redirects
850+ respx_mock .post ("/redirect" ).mock (
851+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
852+ )
853+
854+ with pytest .raises (APIStatusError ) as exc_info :
855+ self .client .post (
856+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
857+ )
858+
859+ assert exc_info .value .response .status_code == 302
860+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
861+
835862
836863class TestAsyncBrowserbase :
837864 client = AsyncBrowserbase (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1659,3 +1686,30 @@ async def test_main() -> None:
16591686 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16601687
16611688 time .sleep (0.1 )
1689+
1690+ @pytest .mark .respx (base_url = base_url )
1691+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1692+ # Test that the default follow_redirects=True allows following redirects
1693+ respx_mock .post ("/redirect" ).mock (
1694+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1695+ )
1696+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1697+
1698+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1699+ assert response .status_code == 200
1700+ assert response .json () == {"status" : "ok" }
1701+
1702+ @pytest .mark .respx (base_url = base_url )
1703+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1704+ # Test that follow_redirects=False prevents following redirects
1705+ respx_mock .post ("/redirect" ).mock (
1706+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1707+ )
1708+
1709+ with pytest .raises (APIStatusError ) as exc_info :
1710+ await self .client .post (
1711+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1712+ )
1713+
1714+ assert exc_info .value .response .status_code == 302
1715+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments