"""Integration tests for NFO ID database storage.""" import tempfile from pathlib import Path from unittest.mock import AsyncMock, Mock, patch import pytest from sqlalchemy import create_engine, select from sqlalchemy.orm import sessionmaker from src.core.services.series_manager_service import SeriesManagerService from src.server.database.base import Base from src.server.database.models import AnimeSeries @pytest.fixture def db_engine(): """Create in-memory SQLite database for testing.""" engine = create_engine("sqlite:///:memory:", echo=False) Base.metadata.create_all(engine) return engine @pytest.fixture def db_session(db_engine): """Create database session for testing.""" SessionLocal = sessionmaker(bind=db_engine) session = SessionLocal() yield session session.close() @pytest.mark.asyncio class TestNFODatabaseIntegration: """Test NFO ID extraction and database storage.""" @pytest.fixture def temp_anime_dir(self): """Create temporary anime directory.""" with tempfile.TemporaryDirectory() as tmpdir: yield tmpdir @pytest.fixture def mock_serie(self): """Create a mock Serie object.""" serie = Mock() serie.key = "test_series_key" serie.name = "Test Series" serie.folder = "test_series" serie.site = "test_site" serie.year = 2020 return serie @pytest.fixture def sample_nfo_content(self): """Sample NFO content with IDs.""" return """ Test Series 12345 67890 A test series for integration testing. """ async def test_nfo_ids_stored_in_database( self, temp_anime_dir, mock_serie, sample_nfo_content, db_session ): """Test that IDs from NFO files are stored in database.""" # Create series folder with NFO file series_folder = Path(temp_anime_dir) / "test_series" series_folder.mkdir(parents=True) nfo_path = series_folder / "tvshow.nfo" nfo_path.write_text(sample_nfo_content, encoding='utf-8') # Create AnimeSeries in database anime_series = AnimeSeries( key="test_series_key", name="Test Series", site="test_site", folder="test_series" ) db_session.add(anime_series) db_session.commit() # Note: This test demonstrates the concept but cannot test # the async database session integration without setting up # the full async infrastructure. The unit tests verify the # parsing logic works correctly. # Verify series was created result = db_session.execute( select(AnimeSeries).filter( AnimeSeries.key == "test_series_key" ) ) series = result.scalars().first() assert series is not None assert series.key == "test_series_key" async def test_nfo_parsing_integration( self, temp_anime_dir, sample_nfo_content ): """Test NFO ID parsing integration with NFOService.""" from src.core.services.nfo_service import NFOService # Create series folder with NFO file series_folder = Path(temp_anime_dir) / "test_series" series_folder.mkdir(parents=True) nfo_path = series_folder / "tvshow.nfo" nfo_path.write_text(sample_nfo_content, encoding='utf-8') # Create NFO service nfo_service = NFOService( tmdb_api_key="test_key", anime_directory=temp_anime_dir, auto_create=False ) # Parse IDs ids = nfo_service.parse_nfo_ids(nfo_path) assert ids["tmdb_id"] == 12345 assert ids["tvdb_id"] == 67890