@@ -814,6 +814,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
814814
815815 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
816816
817+ @pytest .mark .respx (base_url = base_url )
818+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
819+ # Test that the default follow_redirects=True allows following redirects
820+ respx_mock .post ("/redirect" ).mock (
821+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
822+ )
823+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
824+
825+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
826+ assert response .status_code == 200
827+ assert response .json () == {"status" : "ok" }
828+
829+ @pytest .mark .respx (base_url = base_url )
830+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
831+ # Test that follow_redirects=False prevents following redirects
832+ respx_mock .post ("/redirect" ).mock (
833+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
834+ )
835+
836+ with pytest .raises (APIStatusError ) as exc_info :
837+ self .client .post (
838+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
839+ )
840+
841+ assert exc_info .value .response .status_code == 302
842+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
843+
817844
818845class TestAsyncBrandDev :
819846 client = AsyncBrandDev (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1635,3 +1662,30 @@ async def test_main() -> None:
16351662 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16361663
16371664 time .sleep (0.1 )
1665+
1666+ @pytest .mark .respx (base_url = base_url )
1667+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1668+ # Test that the default follow_redirects=True allows following redirects
1669+ respx_mock .post ("/redirect" ).mock (
1670+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1671+ )
1672+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1673+
1674+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1675+ assert response .status_code == 200
1676+ assert response .json () == {"status" : "ok" }
1677+
1678+ @pytest .mark .respx (base_url = base_url )
1679+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1680+ # Test that follow_redirects=False prevents following redirects
1681+ respx_mock .post ("/redirect" ).mock (
1682+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1683+ )
1684+
1685+ with pytest .raises (APIStatusError ) as exc_info :
1686+ await self .client .post (
1687+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1688+ )
1689+
1690+ assert exc_info .value .response .status_code == 302
1691+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments