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