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