@@ -818,6 +818,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
818818
819819 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
820820
821+ @pytest .mark .respx (base_url = base_url )
822+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
823+ # Test that the default follow_redirects=True allows following redirects
824+ respx_mock .post ("/redirect" ).mock (
825+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
826+ )
827+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
828+
829+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
830+ assert response .status_code == 200
831+ assert response .json () == {"status" : "ok" }
832+
833+ @pytest .mark .respx (base_url = base_url )
834+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
835+ # Test that follow_redirects=False prevents following redirects
836+ respx_mock .post ("/redirect" ).mock (
837+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
838+ )
839+
840+ with pytest .raises (APIStatusError ) as exc_info :
841+ self .client .post (
842+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
843+ )
844+
845+ assert exc_info .value .response .status_code == 302
846+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
847+
821848
822849class TestAsyncYdcSearchAPI :
823850 client = AsyncYdcSearchAPI (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1639,3 +1666,30 @@ async def test_main() -> None:
16391666 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16401667
16411668 time .sleep (0.1 )
1669+
1670+ @pytest .mark .respx (base_url = base_url )
1671+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1672+ # Test that the default follow_redirects=True allows following redirects
1673+ respx_mock .post ("/redirect" ).mock (
1674+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1675+ )
1676+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1677+
1678+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1679+ assert response .status_code == 200
1680+ assert response .json () == {"status" : "ok" }
1681+
1682+ @pytest .mark .respx (base_url = base_url )
1683+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1684+ # Test that follow_redirects=False prevents following redirects
1685+ respx_mock .post ("/redirect" ).mock (
1686+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1687+ )
1688+
1689+ with pytest .raises (APIStatusError ) as exc_info :
1690+ await self .client .post (
1691+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1692+ )
1693+
1694+ assert exc_info .value .response .status_code == 302
1695+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments