Merge pull request #494 from christianlouis/copilot/improve-test-coverage
test(views): improve coverage for app/views/admin_users.py to 100%
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
"""Tests for app/views/admin_users.py module."""
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
from fastapi import HTTPException
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# _require_admin helper
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
class TestRequireAdmin:
|
||||
"""Unit tests for the _require_admin helper in views/admin_users.py."""
|
||||
|
||||
def test_returns_none_when_no_user_in_session(self):
|
||||
"""_require_admin returns None when session has no user."""
|
||||
from app.views.admin_users import _require_admin
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {}
|
||||
|
||||
result = _require_admin(mock_request)
|
||||
assert result is None
|
||||
|
||||
def test_returns_none_for_non_admin_user(self):
|
||||
"""_require_admin returns None when user is not an admin."""
|
||||
from app.views.admin_users import _require_admin
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": {"email": "user@example.com", "is_admin": False}}
|
||||
|
||||
result = _require_admin(mock_request)
|
||||
assert result is None
|
||||
|
||||
def test_logs_warning_for_non_admin(self):
|
||||
"""_require_admin logs a warning when a non-admin attempts access."""
|
||||
from app.views.admin_users import _require_admin
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": {"email": "user@example.com", "is_admin": False}}
|
||||
|
||||
with patch("app.views.admin_users.logger") as mock_logger:
|
||||
_require_admin(mock_request)
|
||||
mock_logger.warning.assert_called_once()
|
||||
|
||||
def test_logs_warning_when_no_user(self):
|
||||
"""_require_admin logs a warning when there is no user in the session."""
|
||||
from app.views.admin_users import _require_admin
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {}
|
||||
|
||||
with patch("app.views.admin_users.logger") as mock_logger:
|
||||
_require_admin(mock_request)
|
||||
mock_logger.warning.assert_called_once()
|
||||
|
||||
def test_returns_user_for_admin(self):
|
||||
"""_require_admin returns the user dict when the user is an admin."""
|
||||
from app.views.admin_users import _require_admin
|
||||
|
||||
admin_user = {"email": "admin@example.com", "is_admin": True}
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": admin_user}
|
||||
|
||||
result = _require_admin(mock_request)
|
||||
assert result == admin_user
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# admin_users_page route
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@pytest.mark.unit
|
||||
class TestAdminUsersPage:
|
||||
"""Unit tests for the admin_users_page view handler."""
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_redirects_non_admin_to_home(self):
|
||||
"""admin_users_page redirects to '/' when user is not an admin."""
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from app.views.admin_users import admin_users_page
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": {"email": "user@example.com", "is_admin": False}}
|
||||
|
||||
result = await admin_users_page(mock_request)
|
||||
|
||||
assert isinstance(result, RedirectResponse)
|
||||
assert result.status_code == 302
|
||||
assert result.headers["location"] == "/"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_redirects_when_no_user_in_session(self):
|
||||
"""admin_users_page redirects to '/' when no user is in the session."""
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from app.views.admin_users import admin_users_page
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {}
|
||||
|
||||
result = await admin_users_page(mock_request)
|
||||
|
||||
assert isinstance(result, RedirectResponse)
|
||||
assert result.status_code == 302
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_returns_template_for_admin(self):
|
||||
"""admin_users_page returns the template response for an admin user."""
|
||||
from app.views.admin_users import admin_users_page
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": {"email": "admin@example.com", "is_admin": True}}
|
||||
|
||||
mock_template_response = MagicMock()
|
||||
|
||||
with patch("app.views.admin_users.templates") as mock_templates:
|
||||
mock_templates.TemplateResponse.return_value = mock_template_response
|
||||
|
||||
result = await admin_users_page(mock_request)
|
||||
|
||||
mock_templates.TemplateResponse.assert_called_once()
|
||||
call_args = mock_templates.TemplateResponse.call_args
|
||||
assert call_args[0][0] == "admin_users.html"
|
||||
context = call_args[0][1]
|
||||
assert context["request"] is mock_request
|
||||
assert "app_version" in context
|
||||
assert isinstance(context["app_version"], str)
|
||||
assert result is mock_template_response
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_raises_500_on_template_error(self):
|
||||
"""admin_users_page raises HTTPException 500 when template rendering fails."""
|
||||
from app.views.admin_users import admin_users_page
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": {"email": "admin@example.com", "is_admin": True}}
|
||||
|
||||
with patch("app.views.admin_users.templates") as mock_templates:
|
||||
mock_templates.TemplateResponse.side_effect = RuntimeError("Template not found")
|
||||
|
||||
with pytest.raises(HTTPException) as exc_info:
|
||||
await admin_users_page(mock_request)
|
||||
|
||||
assert exc_info.value.status_code == 500
|
||||
assert "Failed to load admin users page" in exc_info.value.detail
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_logs_error_on_template_failure(self):
|
||||
"""admin_users_page logs an error when template rendering fails."""
|
||||
from app.views.admin_users import admin_users_page
|
||||
|
||||
mock_request = MagicMock()
|
||||
mock_request.session = {"user": {"email": "admin@example.com", "is_admin": True}}
|
||||
|
||||
with (
|
||||
patch("app.views.admin_users.templates") as mock_templates,
|
||||
patch("app.views.admin_users.logger") as mock_logger,
|
||||
):
|
||||
mock_templates.TemplateResponse.side_effect = RuntimeError("Template not found")
|
||||
|
||||
with pytest.raises(HTTPException):
|
||||
await admin_users_page(mock_request)
|
||||
|
||||
mock_logger.error.assert_called_once()
|
||||
Reference in New Issue
Block a user