brief-rags-bench/tests/test_settings.py

161 lines
5.8 KiB
Python

"""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()