@@ -806,6 +806,33 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
806806
807807 assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
808808
809+ @pytest .mark .respx (base_url = base_url )
810+ def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
811+ # Test that the default follow_redirects=True allows following redirects
812+ respx_mock .post ("/redirect" ).mock (
813+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
814+ )
815+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
816+
817+ response = self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
818+ assert response .status_code == 200
819+ assert response .json () == {"status" : "ok" }
820+
821+ @pytest .mark .respx (base_url = base_url )
822+ def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
823+ # Test that follow_redirects=False prevents following redirects
824+ respx_mock .post ("/redirect" ).mock (
825+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
826+ )
827+
828+ with pytest .raises (APIStatusError ) as exc_info :
829+ self .client .post (
830+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
831+ )
832+
833+ assert exc_info .value .response .status_code == 302
834+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
835+
809836
810837class TestAsyncKnock :
811838 client = AsyncKnock (base_url = base_url , api_key = api_key , _strict_response_validation = True )
@@ -1623,3 +1650,30 @@ async def test_main() -> None:
16231650 raise AssertionError ("calling get_platform using asyncify resulted in a hung process" )
16241651
16251652 time .sleep (0.1 )
1653+
1654+ @pytest .mark .respx (base_url = base_url )
1655+ async def test_follow_redirects (self , respx_mock : MockRouter ) -> None :
1656+ # Test that the default follow_redirects=True allows following redirects
1657+ respx_mock .post ("/redirect" ).mock (
1658+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1659+ )
1660+ respx_mock .get ("/redirected" ).mock (return_value = httpx .Response (200 , json = {"status" : "ok" }))
1661+
1662+ response = await self .client .post ("/redirect" , body = {"key" : "value" }, cast_to = httpx .Response )
1663+ assert response .status_code == 200
1664+ assert response .json () == {"status" : "ok" }
1665+
1666+ @pytest .mark .respx (base_url = base_url )
1667+ async def test_follow_redirects_disabled (self , respx_mock : MockRouter ) -> None :
1668+ # Test that follow_redirects=False prevents following redirects
1669+ respx_mock .post ("/redirect" ).mock (
1670+ return_value = httpx .Response (302 , headers = {"Location" : f"{ base_url } /redirected" })
1671+ )
1672+
1673+ with pytest .raises (APIStatusError ) as exc_info :
1674+ await self .client .post (
1675+ "/redirect" , body = {"key" : "value" }, options = {"follow_redirects" : False }, cast_to = httpx .Response
1676+ )
1677+
1678+ assert exc_info .value .response .status_code == 302
1679+ assert exc_info .value .response .headers ["Location" ] == f"{ base_url } /redirected"
0 commit comments