refactor: remove database access from core layer

- Remove db_session parameter from SeriesApp, SerieList, SerieScanner
- Move all database operations to AnimeService (service layer)
- Add add_series_to_db, contains_in_db methods to AnimeService
- Update sync_series_from_data_files to use inline DB operations
- Remove obsolete test classes for removed DB methods
- Fix pylint issues: add broad-except comments, fix line lengths
- Core layer (src/core/) now has zero database imports

722 unit tests pass
This commit is contained in:
2025-12-15 15:19:03 +01:00
parent 27108aacda
commit 596476f9ac
12 changed files with 877 additions and 1651 deletions

View File

@@ -19,7 +19,6 @@ from unittest.mock import AsyncMock, Mock, patch
import pytest
from src.core.entities.SerieList import SerieList
from src.core.entities.series import Serie
from src.core.SeriesApp import SeriesApp
@@ -111,81 +110,6 @@ class TestGetAllSeriesFromDataFiles:
assert len(result) == 0
class TestSerieListAddToDb:
"""Test SerieList.add_to_db() method for database insertion."""
@pytest.mark.asyncio
async def test_add_to_db_creates_record(self):
"""Test that add_to_db creates a database record."""
with tempfile.TemporaryDirectory() as tmp_dir:
serie = Serie(
key="new-anime",
name="New Anime",
site="https://aniworld.to",
folder="New Anime (2024)",
episodeDict={1: [1, 2, 3], 2: [1, 2]}
)
# Mock database session and services
mock_db = AsyncMock()
mock_anime_series = Mock()
mock_anime_series.id = 1
mock_anime_series.key = "new-anime"
mock_anime_series.name = "New Anime"
with patch(
'src.server.database.service.AnimeSeriesService'
) as mock_service, patch(
'src.server.database.service.EpisodeService'
) as mock_episode_service:
# Setup mocks
mock_service.get_by_key = AsyncMock(return_value=None)
mock_service.create = AsyncMock(return_value=mock_anime_series)
mock_episode_service.create = AsyncMock()
serie_list = SerieList(tmp_dir, skip_load=True)
result = await serie_list.add_to_db(serie, mock_db)
# Verify series was created
assert result is not None
mock_service.create.assert_called_once()
# Verify episodes were created (5 total: 3 + 2)
assert mock_episode_service.create.call_count == 5
@pytest.mark.asyncio
async def test_add_to_db_skips_existing_series(self):
"""Test that add_to_db skips existing series."""
with tempfile.TemporaryDirectory() as tmp_dir:
serie = Serie(
key="existing-anime",
name="Existing Anime",
site="https://aniworld.to",
folder="Existing Anime (2023)",
episodeDict={1: [1]}
)
mock_db = AsyncMock()
mock_existing = Mock()
mock_existing.id = 99
mock_existing.key = "existing-anime"
with patch(
'src.server.database.service.AnimeSeriesService'
) as mock_service:
# Return existing series
mock_service.get_by_key = AsyncMock(return_value=mock_existing)
mock_service.create = AsyncMock()
serie_list = SerieList(tmp_dir, skip_load=True)
result = await serie_list.add_to_db(serie, mock_db)
# Verify None returned (already exists)
assert result is None
# Verify create was NOT called
mock_service.create.assert_not_called()
class TestSyncSeriesToDatabase:
"""Test sync_series_from_data_files function from anime_service."""