- Move src/core/ → src/server/ - Split SerieList.py (531 lines) and series.py (414 lines) into src/server/database/ - Add database/models.py for SQLAlchemy models - Update all test imports to reflect new structure - Remove deprecated test files (test_serie_class.py, test_serie_folder_with_year.py)
102 lines
4.1 KiB
Python
102 lines
4.1 KiB
Python
"""Tests for SerieScanner DB lookup functionality."""
|
|
|
|
import logging
|
|
import os
|
|
import tempfile
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
from src.server.database.models import AnimeSeries
|
|
from src.server.SerieScanner import SerieScanner
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_loader():
|
|
"""Create a mock Loader instance."""
|
|
loader = MagicMock()
|
|
loader.get_season_episode_count = MagicMock(return_value={1: 12})
|
|
loader.is_language = MagicMock(return_value=True)
|
|
loader.get_year = MagicMock(return_value=2026)
|
|
return loader
|
|
|
|
|
|
@pytest.fixture
|
|
def temp_directory():
|
|
"""Create a temporary directory with subdirectories for testing."""
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
anime_folder = os.path.join(tmpdir, "Rooster Fighter (2026)")
|
|
os.makedirs(anime_folder, exist_ok=True)
|
|
mp4_path = os.path.join(anime_folder, "S01E001.mp4")
|
|
with open(mp4_path, "w") as f:
|
|
f.write("dummy mp4")
|
|
yield tmpdir
|
|
|
|
|
|
class TestGetSerieFromFolderDbLookup:
|
|
"""Test __read_data_from_file DB lookup behavior."""
|
|
|
|
def test_db_hit_returns_serie_from_db(self, temp_directory, mock_loader):
|
|
"""DB lookup resolves folder -> Serie returned."""
|
|
from src.server.database.models import AnimeSeries
|
|
from src.server.database import service as anime_series_service
|
|
|
|
mock_session = MagicMock()
|
|
mock_anime_series = MagicMock()
|
|
mock_anime_series.key = "rooster-fighter"
|
|
mock_anime_series.name = "Rooster Fighter"
|
|
mock_anime_series.site = "aniworld.to"
|
|
mock_anime_series.folder = "Rooster Fighter (2026)"
|
|
mock_anime_series.year = 2026
|
|
mock_anime_series.episodes = []
|
|
mock_session.execute.return_value.scalar_one_or_none.return_value = mock_anime_series
|
|
|
|
with patch("src.server.SerieScanner.get_sync_session", return_value=mock_session):
|
|
scanner = SerieScanner(temp_directory, mock_loader)
|
|
result = scanner._SerieScanner__read_data_from_file("Rooster Fighter (2026)")
|
|
|
|
assert result is not None
|
|
assert result.key == "rooster-fighter"
|
|
assert result.name == "Rooster Fighter"
|
|
assert result.year == 2026
|
|
|
|
def test_db_miss_returns_none(self, temp_directory, mock_loader):
|
|
"""DB miss -> returns None (no fallback)."""
|
|
mock_session = MagicMock()
|
|
mock_session.execute.return_value.scalar_one_or_none.return_value = None
|
|
|
|
with patch("src.server.SerieScanner.get_sync_session", return_value=mock_session):
|
|
scanner = SerieScanner(temp_directory, mock_loader)
|
|
result = scanner._SerieScanner__read_data_from_file("Unknown Series (2026)")
|
|
|
|
assert result is None
|
|
|
|
def test_db_lookup_exception_caught_and_logged(self, temp_directory, mock_loader):
|
|
"""DB exception -> returns None without raising."""
|
|
with patch(
|
|
"src.server.SerieScanner.get_sync_session",
|
|
side_effect=RuntimeError("DB connection failed")
|
|
):
|
|
scanner = SerieScanner(temp_directory, mock_loader)
|
|
|
|
with patch.object(logging.getLogger("src.server.SerieScanner"), "warning") as mock_warning:
|
|
result = scanner._SerieScanner__read_data_from_file("Rooster Fighter (2026)")
|
|
mock_warning.assert_called()
|
|
assert any("DB lookup failed" in str(c) for c in mock_warning.call_args_list)
|
|
assert result is None
|
|
|
|
|
|
class TestGetSerieFromFolderEdgeCases:
|
|
"""Edge case tests for __read_data_from_file."""
|
|
|
|
def test_empty_folder_name_returns_none(self, temp_directory, mock_loader):
|
|
"""Empty folder name -> returns None (no DB lookup attempted)."""
|
|
scanner = SerieScanner(temp_directory, mock_loader)
|
|
result = scanner._SerieScanner__read_data_from_file("")
|
|
assert result is None
|
|
|
|
def test_nonexistent_folder_no_exception(self, temp_directory, mock_loader):
|
|
"""Folder doesn't exist -> returns None without raising."""
|
|
scanner = SerieScanner(temp_directory, mock_loader)
|
|
result = scanner._SerieScanner__read_data_from_file("Nonexistent Folder")
|
|
assert result is None |