"""Tests for settings endpoints.""" import pytest from unittest.mock import AsyncMock import httpx class TestSettingsEndpoints: """Tests for /api/v1/settings endpoints.""" def test_get_settings_success(self, client, mock_db_client, test_settings): """Test getting user settings successfully.""" mock_db_client.get_user_settings = AsyncMock(return_value=test_settings) response = client.get("/api/v1/settings") assert response.status_code == 200 data = response.json() assert data["user_id"] == "test-user-123" assert "settings" in data assert "ift" in data["settings"] assert "psi" in data["settings"] assert "prod" in data["settings"] assert data["settings"]["ift"]["apiMode"] == "bench" mock_db_client.get_user_settings.assert_called_once_with("test-user-123") def test_get_settings_not_found(self, client, mock_db_client): """Test getting settings when user not found.""" # Mock 404 from DB API error_response = httpx.Response(404, json={"detail": "Not found"}) mock_db_client.get_user_settings = AsyncMock( side_effect=httpx.HTTPStatusError("Not found", request=None, response=error_response) ) response = client.get("/api/v1/settings") assert response.status_code == 404 assert "not found" in response.json()["detail"].lower() def test_get_settings_unauthenticated(self, unauthenticated_client): """Test getting settings without authentication.""" response = unauthenticated_client.get("/api/v1/settings") assert response.status_code == 401 # HTTPBearer returns 401 def test_update_settings_success(self, client, mock_db_client, test_settings): """Test updating user settings successfully.""" mock_db_client.update_user_settings = AsyncMock(return_value=test_settings) update_data = { "settings": { "ift": { "apiMode": "backend", "bearerToken": "new-token", "resetSessionMode": False } } } response = client.put("/api/v1/settings", json=update_data) assert response.status_code == 200 data = response.json() assert data["user_id"] == "test-user-123" mock_db_client.update_user_settings.assert_called_once() def test_update_settings_invalid_data(self, client, mock_db_client): """Test updating settings with invalid data.""" error_response = httpx.Response(400, json={"detail": "Invalid format"}) mock_db_client.update_user_settings = AsyncMock( side_effect=httpx.HTTPStatusError("Bad request", request=None, response=error_response) ) update_data = { "settings": { "invalid_env": {"apiMode": "invalid"} } } response = client.put("/api/v1/settings", json=update_data) assert response.status_code == 400 def test_update_settings_db_api_error(self, client, mock_db_client): """Test update settings when DB API fails.""" mock_db_client.update_user_settings = AsyncMock( side_effect=Exception("DB error") ) update_data = { "settings": { "ift": {"apiMode": "bench"} } } response = client.put("/api/v1/settings", json=update_data) assert response.status_code == 500 def test_get_settings_db_api_502_error(self, client, mock_db_client): """Test get settings when DB API returns 502.""" error_response = httpx.Response(503, json={"detail": "Service unavailable"}) mock_db_client.get_user_settings = AsyncMock( side_effect=httpx.HTTPStatusError("Service error", request=None, response=error_response) ) response = client.get("/api/v1/settings") assert response.status_code == 502 assert "failed to retrieve settings" in response.json()["detail"].lower() def test_get_settings_unexpected_error(self, client, mock_db_client): """Test get settings with unexpected error.""" mock_db_client.get_user_settings = AsyncMock( side_effect=Exception("Unexpected error") ) response = client.get("/api/v1/settings") assert response.status_code == 500 assert "internal server error" in response.json()["detail"].lower() def test_update_settings_user_not_found(self, client, mock_db_client): """Test update settings when user not found.""" error_response = httpx.Response(404, json={"detail": "User not found"}) mock_db_client.update_user_settings = AsyncMock( side_effect=httpx.HTTPStatusError("Not found", request=None, response=error_response) ) update_data = { "settings": { "ift": {"apiMode": "bench"} } } response = client.put("/api/v1/settings", json=update_data) assert response.status_code == 404 assert "user not found" in response.json()["detail"].lower() def test_update_settings_db_api_502_error(self, client, mock_db_client): """Test update settings when DB API returns 502.""" error_response = httpx.Response(503, json={"detail": "Service unavailable"}) mock_db_client.update_user_settings = AsyncMock( side_effect=httpx.HTTPStatusError("Service error", request=None, response=error_response) ) update_data = { "settings": { "ift": {"apiMode": "bench"} } } response = client.put("/api/v1/settings", json=update_data) assert response.status_code == 502 assert "failed to update settings" in response.json()["detail"].lower()