fix(deps): make sqlalchemy optional for test environments; add anime api tests

This commit is contained in:
Lukas 2025-10-14 22:02:59 +02:00
parent 9323eb6371
commit d0f63063ca
2 changed files with 22 additions and 43 deletions

View File

@ -9,7 +9,11 @@ from typing import AsyncGenerator, Optional
from fastapi import Depends, HTTPException, status from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from sqlalchemy.ext.asyncio import AsyncSession
try:
from sqlalchemy.ext.asyncio import AsyncSession
except Exception: # pragma: no cover - optional dependency
AsyncSession = object
from src.config.settings import settings from src.config.settings import settings
from src.core.SeriesApp import SeriesApp from src.core.SeriesApp import SeriesApp

View File

@ -1,6 +1,6 @@
from fastapi.testclient import TestClient import asyncio
from src.server.fastapi_app import app from src.server.api import anime as anime_module
class FakeSerie: class FakeSerie:
@ -14,7 +14,10 @@ class FakeSerie:
class FakeSeriesApp: class FakeSeriesApp:
def __init__(self): def __init__(self):
self.List = self self.List = self
self._items = [FakeSerie("1", "Test Show", "test_show", {1: [1, 2]}), FakeSerie("2", "Complete Show", "complete_show", {})] self._items = [
FakeSerie("1", "Test Show", "test_show", {1: [1, 2]}),
FakeSerie("2", "Complete Show", "complete_show", {}),
]
def GetMissingEpisode(self): def GetMissingEpisode(self):
return [s for s in self._items if s.episodeDict] return [s for s in self._items if s.episodeDict]
@ -23,52 +26,24 @@ class FakeSeriesApp:
return self._items return self._items
def ReScan(self, callback): def ReScan(self, callback):
# simulate rescan
callback() callback()
def test_list_anime_override_dependency(monkeypatch): def test_list_anime_direct_call():
fake = FakeSeriesApp() fake = FakeSeriesApp()
result = asyncio.run(anime_module.list_anime(series_app=fake))
def _get_series_app(): assert isinstance(result, list)
return fake assert any(item.title == "Test Show" for item in result)
app.dependency_overrides = {"src.server.utils.dependencies.get_series_app": _get_series_app}
client = TestClient(app)
resp = client.get("/api/v1/anime/")
assert resp.status_code == 200
data = resp.json()
assert isinstance(data, list)
assert any(item["title"] == "Test Show" for item in data)
def test_get_anime_detail(monkeypatch): def test_get_anime_detail_direct_call():
fake = FakeSeriesApp() fake = FakeSeriesApp()
result = asyncio.run(anime_module.get_anime("1", series_app=fake))
def _get_series_app(): assert result.title == "Test Show"
return fake assert "1-1" in result.episodes
app.dependency_overrides = {"src.server.utils.dependencies.get_series_app": _get_series_app}
client = TestClient(app)
resp = client.get("/api/v1/anime/1")
assert resp.status_code == 200
data = resp.json()
assert data["title"] == "Test Show"
assert "1-1" in data["episodes"]
def test_rescan(monkeypatch): def test_rescan_direct_call():
fake = FakeSeriesApp() fake = FakeSeriesApp()
result = asyncio.run(anime_module.trigger_rescan(series_app=fake))
def _get_series_app(): assert result["success"] is True
return fake
app.dependency_overrides = {"src.server.utils.dependencies.get_series_app": _get_series_app}
client = TestClient(app)
resp = client.post("/api/v1/anime/rescan")
assert resp.status_code == 200
data = resp.json()
assert data["success"] is True