diff --git a/src/workos/_base_client.py b/src/workos/_base_client.py index 4d3f07e7..b0120afb 100644 --- a/src/workos/_base_client.py +++ b/src/workos/_base_client.py @@ -191,9 +191,12 @@ def _deserialize_response( ) -> Any: if response.status_code == 204 or not response.content: return None - data: Dict[str, Any] = cast(Dict[str, Any], response.json()) + try: + data = response.json() + except Exception: + return None if model is not None: - return model.from_dict(data) + return model.from_dict(cast(Dict[str, Any], data)) return data @staticmethod diff --git a/tests/test_generated_client.py b/tests/test_generated_client.py index b641e750..a675cc43 100644 --- a/tests/test_generated_client.py +++ b/tests/test_generated_client.py @@ -451,6 +451,33 @@ def test_documented_import_surface_exposes_resources(self): assert client.widgets is not None client.close() + def test_request_raw_preserves_json_dict_response(self, httpx_mock): + httpx_mock.add_response(json={"ok": True}) + client = WorkOSClient( + api_key="sk_test_123", client_id="client_test", max_retries=0 + ) + result = client.request_raw("GET", "test") + assert result == {"ok": True} + client.close() + + def test_request_list_preserves_json_array_response(self, httpx_mock): + httpx_mock.add_response(json=[{"id": "item_123"}]) + client = WorkOSClient( + api_key="sk_test_123", client_id="client_test", max_retries=0 + ) + result = client.request_list("GET", "test") + assert result == [{"id": "item_123"}] + client.close() + + def test_request_returns_none_for_non_json_success_without_model(self, httpx_mock): + httpx_mock.add_response(status_code=202, content=b"\n") + client = WorkOSClient( + api_key="sk_test_123", client_id="client_test", max_retries=0 + ) + result = client.request("DELETE", "test") + assert result is None + client.close() + @pytest.mark.asyncio class TestAsyncWorkOSClient: @@ -475,6 +502,35 @@ async def test_documented_import_surface_exposes_resources(self): assert client.widgets is not None await client.close() + async def test_request_raw_preserves_json_dict_response(self, httpx_mock): + httpx_mock.add_response(json={"ok": True}) + client = AsyncWorkOSClient( + api_key="sk_test_123", client_id="client_test", max_retries=0 + ) + result = await client.request_raw("GET", "test") + assert result == {"ok": True} + await client.close() + + async def test_request_list_preserves_json_array_response(self, httpx_mock): + httpx_mock.add_response(json=[{"id": "item_123"}]) + client = AsyncWorkOSClient( + api_key="sk_test_123", client_id="client_test", max_retries=0 + ) + result = await client.request_list("GET", "test") + assert result == [{"id": "item_123"}] + await client.close() + + async def test_request_returns_none_for_non_json_success_without_model( + self, httpx_mock + ): + httpx_mock.add_response(status_code=202, content=b"\n") + client = AsyncWorkOSClient( + api_key="sk_test_123", client_id="client_test", max_retries=0 + ) + result = await client.request("DELETE", "test") + assert result is None + await client.close() + async def test_raises_400(self, httpx_mock): httpx_mock.add_response( status_code=400, diff --git a/tests/test_organizations.py b/tests/test_organizations.py index d1a43e5d..18f5d261 100644 --- a/tests/test_organizations.py +++ b/tests/test_organizations.py @@ -108,7 +108,7 @@ def test_update_organization(self, workos, httpx_mock): assert request.url.path.endswith("/organizations/test_id") def test_delete_organization(self, workos, httpx_mock): - httpx_mock.add_response(status_code=204) + httpx_mock.add_response(status_code=202, content=b"\n") result = workos.organizations.delete_organization("test_id") assert result is None request = httpx_mock.get_request() @@ -289,7 +289,7 @@ async def test_update_organization(self, async_workos, httpx_mock): @pytest.mark.asyncio async def test_delete_organization(self, async_workos, httpx_mock): - httpx_mock.add_response(status_code=204) + httpx_mock.add_response(status_code=202, content=b"\n") result = await async_workos.organizations.delete_organization("test_id") assert result is None request = httpx_mock.get_request()