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:
@@ -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."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user