Aniworld/tests/api/test_analytics_endpoints.py
Lukas 6a6ae7e059 fix: resolve all failing tests (701 tests now passing)
- Add missing src/server/api/__init__.py to enable analytics module import
- Integrate analytics router into FastAPI app
- Fix analytics endpoints to use proper dependency injection with get_db_session
- Update auth service test to match actual password validation error messages
- Fix backup service test by adding delays between backup creations for unique timestamps
- Fix dependencies tests by providing required Request parameters to rate_limit and log_request
- Fix log manager tests: set old file timestamps, correct export path expectations, add delays
- Fix monitoring service tests: correct async mock setup for database scalars() method
- Fix SeriesApp tests: update all loader method mocks to use lowercase names (search, download, scan)
- Update test mocks to use correct method names matching implementation

All 701 tests now passing with 0 failures.
2025-10-23 21:00:34 +02:00

155 lines
5.1 KiB
Python

"""Integration tests for analytics API endpoints.
Tests analytics API endpoints including download statistics,
series popularity, storage analysis, and performance reports.
"""
from unittest.mock import AsyncMock, patch
import pytest
from httpx import ASGITransport, AsyncClient
from src.server.fastapi_app import app
@pytest.mark.asyncio
async def test_analytics_downloads_endpoint():
"""Test GET /api/analytics/downloads endpoint."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
response = await client.get("/api/analytics/downloads?days=30")
assert response.status_code in [200, 422, 500]
@pytest.mark.asyncio
async def test_analytics_series_popularity_endpoint():
"""Test GET /api/analytics/series-popularity endpoint."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
response = await client.get(
"/api/analytics/series-popularity?limit=10"
)
assert response.status_code in [200, 422, 500]
@pytest.mark.asyncio
async def test_analytics_storage_endpoint():
"""Test GET /api/analytics/storage endpoint."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("psutil.disk_usage") as mock_disk:
mock_disk.return_value = {
"total": 1024 * 1024 * 1024,
"used": 512 * 1024 * 1024,
"free": 512 * 1024 * 1024,
"percent": 50.0,
}
response = await client.get("/api/analytics/storage")
assert response.status_code in [200, 401, 500]
@pytest.mark.asyncio
async def test_analytics_performance_endpoint():
"""Test GET /api/analytics/performance endpoint."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
response = await client.get(
"/api/analytics/performance?hours=24"
)
assert response.status_code in [200, 422, 500]
@pytest.mark.asyncio
async def test_analytics_summary_endpoint():
"""Test GET /api/analytics/summary endpoint."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
response = await client.get("/api/analytics/summary")
assert response.status_code in [200, 500]
@pytest.mark.asyncio
async def test_analytics_downloads_with_query_params():
"""Test /api/analytics/downloads with different query params."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
response = await client.get("/api/analytics/downloads?days=7")
assert response.status_code in [200, 422, 500]
@pytest.mark.asyncio
async def test_analytics_series_with_different_limits():
"""Test /api/analytics/series-popularity with different limits."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
for limit in [5, 10, 20]:
response = await client.get(
f"/api/analytics/series-popularity?limit={limit}"
)
assert response.status_code in [200, 422, 500]
@pytest.mark.asyncio
async def test_analytics_performance_with_different_hours():
"""Test /api/analytics/performance with different hour ranges."""
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://test"
) as client:
with patch("src.server.api.analytics.get_db_session") as mock_get_db:
mock_db = AsyncMock()
mock_get_db.return_value = mock_db
for hours in [1, 12, 24, 72]:
response = await client.get(
f"/api/analytics/performance?hours={hours}"
)
assert response.status_code in [200, 422, 500]