@@ -822,6 +822,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
822822
823823 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
824824
825+ @pytest .mark .respx (base_url = base_url )
826+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
827+ # Test that the default follow_redirects=True allows following redirects
828+ respx_mock .post ("/redirect" ).mock (
829+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
830+ )
831+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
832+
833+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
834+ assert response .status_code == 200
835+ assert response .json () == {"status" : "ok" }
836+
837+ @pytest .mark .respx (base_url = base_url )
838+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
839+ # Test that follow_redirects=False prevents following redirects
840+ respx_mock .post ("/redirect" ).mock (
841+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
842+ )
843+
844+ with pytest .raises (APIStatusError ) as exc_info :
845+ self .client .post (
846+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
847+ )
848+
849+ assert exc_info .value .response .status_code == 302
850+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
851+
825852
826853class TestAsyncMeterhub :
827854 client = AsyncMeterhub (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1649,3 +1676,30 @@ async def test_main() -> None:
16491676 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16501677
16511678 time .sleep (0.1 )
1679+
1680+ @pytest .mark .respx (base_url = base_url )
1681+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1682+ # Test that the default follow_redirects=True allows following redirects
1683+ respx_mock .post ("/redirect" ).mock (
1684+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1685+ )
1686+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1687+
1688+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1689+ assert response .status_code == 200
1690+ assert response .json () == {"status" : "ok" }
1691+
1692+ @pytest .mark .respx (base_url = base_url )
1693+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1694+ # Test that follow_redirects=False prevents following redirects
1695+ respx_mock .post ("/redirect" ).mock (
1696+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1697+ )
1698+
1699+ with pytest .raises (APIStatusError ) as exc_info :
1700+ await self .client .post (
1701+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1702+ )
1703+
1704+ assert exc_info .value .response .status_code == 302
1705+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments