180 lines
6.4 KiB
Python
180 lines
6.4 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."""
|
|
|
|
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
|
|
|
|
def test_update_settings_success(self, client, mock_db_client, test_settings):
|
|
"""Test updating user settings successfully with PATCH (partial update)."""
|
|
mock_db_client.update_user_settings = AsyncMock(return_value=test_settings)
|
|
|
|
update_data = {
|
|
"settings": {
|
|
"ift": {
|
|
"apiMode": "backend",
|
|
"bearerToken": "new-token",
|
|
"resetSessionMode": False
|
|
}
|
|
}
|
|
}
|
|
|
|
response = client.patch("/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.patch("/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.patch("/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.patch("/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.patch("/api/v1/settings", json=update_data)
|
|
|
|
assert response.status_code == 502
|
|
assert "failed to update settings" in response.json()["detail"].lower()
|
|
|
|
def test_update_settings_partial_update(self, client, mock_db_client, test_settings):
|
|
"""Test partial update - only updating specific fields."""
|
|
mock_db_client.update_user_settings = AsyncMock(return_value=test_settings)
|
|
|
|
# Partial update - only bearerToken and withClassify for IFT
|
|
update_data = {
|
|
"settings": {
|
|
"ift": {
|
|
"bearerToken": "updated-token-123",
|
|
"withClassify": True
|
|
}
|
|
}
|
|
}
|
|
|
|
response = client.patch("/api/v1/settings", json=update_data)
|
|
|
|
assert response.status_code == 200
|
|
mock_db_client.update_user_settings.assert_called_once()
|