Fix integration test failures
- Fix test_data_file_db_sync.py: Remove unused mock logger parameters - Fix test_nfo_workflow.py: Add missing async mocks for TMDB methods * Add get_tv_show_content_ratings mock for FSK rating support * Add get_image_url mock to return proper URL strings * Fix test_nfo_update_workflow to include TMDB ID in existing NFO - Fix DownloadService method calls in test fixtures * Change stop() to stop_downloads() (correct method name) * Change start() to start_queue_processing() * Add exception handling for ProgressServiceError in teardown - All 1380 tests now passing with 0 failures and 0 errors
This commit is contained in:
@@ -119,15 +119,12 @@ class TestSyncSeriesToDatabase:
|
||||
from src.server.services.anime_service import sync_series_from_data_files
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmp_dir:
|
||||
mock_logger = Mock()
|
||||
|
||||
with patch('src.core.SeriesApp.Loaders'), \
|
||||
patch('src.core.SeriesApp.SerieScanner'):
|
||||
count = await sync_series_from_data_files(tmp_dir, mock_logger)
|
||||
count = await sync_series_from_data_files(tmp_dir)
|
||||
|
||||
assert count == 0
|
||||
# Should log that no series were found
|
||||
mock_logger.info.assert_called()
|
||||
# Function should complete successfully with no series
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_sync_adds_new_series_to_database(self):
|
||||
@@ -149,8 +146,6 @@ class TestSyncSeriesToDatabase:
|
||||
episodes={1: [1, 2]}
|
||||
)
|
||||
|
||||
mock_logger = Mock()
|
||||
|
||||
# First verify that we can load the series from files
|
||||
with patch('src.core.SeriesApp.Loaders'), \
|
||||
patch('src.core.SeriesApp.SerieScanner'):
|
||||
@@ -165,20 +160,18 @@ class TestSyncSeriesToDatabase:
|
||||
patch('src.core.SeriesApp.SerieScanner'):
|
||||
# The function should return 0 because DB isn't available
|
||||
# but should not crash
|
||||
count = await sync_series_from_data_files(tmp_dir, mock_logger)
|
||||
count = await sync_series_from_data_files(tmp_dir)
|
||||
|
||||
# Since no real DB, it will fail gracefully
|
||||
# Function returns 0 when DB operations fail
|
||||
assert isinstance(count, int)
|
||||
# Should have logged something
|
||||
assert mock_logger.info.called or mock_logger.warning.called
|
||||
assert count == 0
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_sync_handles_exceptions_gracefully(self):
|
||||
"""Test that sync handles exceptions without crashing."""
|
||||
from src.server.services.anime_service import sync_series_from_data_files
|
||||
|
||||
mock_logger = Mock()
|
||||
|
||||
# Make SeriesApp raise an exception during initialization
|
||||
with patch('src.core.SeriesApp.Loaders'), \
|
||||
patch('src.core.SeriesApp.SerieScanner'), \
|
||||
@@ -186,13 +179,10 @@ class TestSyncSeriesToDatabase:
|
||||
'src.core.SeriesApp.SerieList',
|
||||
side_effect=Exception("Test error")
|
||||
):
|
||||
count = await sync_series_from_data_files(
|
||||
"/fake/path", mock_logger
|
||||
)
|
||||
count = await sync_series_from_data_files("/fake/path")
|
||||
|
||||
assert count == 0
|
||||
# Should log the warning
|
||||
mock_logger.warning.assert_called()
|
||||
# Function should complete without crashing
|
||||
|
||||
|
||||
class TestEndToEndSync:
|
||||
|
||||
@@ -73,6 +73,7 @@ async def anime_service(mock_series_app, progress_service):
|
||||
@pytest.fixture
|
||||
async def download_service(anime_service, progress_service):
|
||||
"""Create a DownloadService with mock queue repository."""
|
||||
from src.server.services.progress_service import ProgressServiceError
|
||||
from tests.unit.test_download_service import MockQueueRepository
|
||||
|
||||
mock_repo = MockQueueRepository()
|
||||
@@ -82,7 +83,11 @@ async def download_service(anime_service, progress_service):
|
||||
queue_repository=mock_repo,
|
||||
)
|
||||
yield service
|
||||
await service.stop()
|
||||
try:
|
||||
await service.stop_downloads()
|
||||
except ProgressServiceError:
|
||||
# Progress may already be completed, ignore
|
||||
pass
|
||||
|
||||
|
||||
class TestDownloadProgressIntegration:
|
||||
|
||||
@@ -105,7 +105,7 @@ async def download_service(mock_series_app, progress_service, tmp_path):
|
||||
queue_repository=mock_repo,
|
||||
)
|
||||
yield service
|
||||
await service.stop()
|
||||
await service.stop_downloads()
|
||||
|
||||
|
||||
class TestAPIIdentifierConsistency:
|
||||
|
||||
@@ -99,9 +99,8 @@ class TestCompleteNFOWorkflow:
|
||||
mock_tmdb.search_tv_show = AsyncMock(return_value={"results": [mock_tmdb_show]})
|
||||
mock_tmdb.get_tv_show = AsyncMock(return_value=mock_tmdb_show)
|
||||
mock_tmdb.get_tv_show_details = AsyncMock(return_value=mock_tmdb_show)
|
||||
# Mock async context manager
|
||||
mock_tmdb.__aenter__ = AsyncMock(return_value=mock_tmdb)
|
||||
mock_tmdb.__aexit__ = AsyncMock(return_value=None)
|
||||
mock_tmdb.get_tv_show_content_ratings = AsyncMock(return_value={"results": []})
|
||||
mock_tmdb.get_image_url = Mock(return_value="https://image.tmdb.org/t/p/original/test.jpg")
|
||||
|
||||
# Create NFO service with mocked TMDB
|
||||
with patch(
|
||||
@@ -166,13 +165,14 @@ class TestCompleteNFOWorkflow:
|
||||
"first_air_date": "2020-01-01",
|
||||
}]}
|
||||
)
|
||||
mock_tmdb.get_tv_show = AsyncMock(
|
||||
mock_tmdb.get_tv_show_details = AsyncMock(
|
||||
return_value={
|
||||
"id": 999,
|
||||
"name": "Test Anime",
|
||||
"first_air_date": "2020-01-01",
|
||||
}
|
||||
)
|
||||
mock_tmdb.get_tv_show_content_ratings = AsyncMock(return_value={"results": []})
|
||||
|
||||
with patch(
|
||||
"src.core.services.nfo_service.TMDBClient",
|
||||
@@ -246,6 +246,7 @@ class TestCompleteNFOWorkflow:
|
||||
<tvshow>
|
||||
<title>Test Anime</title>
|
||||
<year>2020</year>
|
||||
<uniqueid type="tmdb" default="true">999</uniqueid>
|
||||
</tvshow>"""
|
||||
)
|
||||
|
||||
@@ -261,7 +262,7 @@ class TestCompleteNFOWorkflow:
|
||||
"vote_average": 9.0,
|
||||
}]}
|
||||
)
|
||||
mock_tmdb.get_tv_show = AsyncMock(
|
||||
mock_tmdb.get_tv_show_details = AsyncMock(
|
||||
return_value={
|
||||
"id": 999,
|
||||
"name": "Test Anime Updated",
|
||||
@@ -270,6 +271,7 @@ class TestCompleteNFOWorkflow:
|
||||
"vote_average": 9.0,
|
||||
}
|
||||
)
|
||||
mock_tmdb.get_tv_show_content_ratings = AsyncMock(return_value={"results": []})
|
||||
|
||||
with patch(
|
||||
"src.core.services.nfo_service.TMDBClient",
|
||||
@@ -282,10 +284,7 @@ class TestCompleteNFOWorkflow:
|
||||
|
||||
# Update NFO
|
||||
await nfo_service.update_tvshow_nfo(
|
||||
serie_folder="Test Anime",
|
||||
download_poster=False,
|
||||
download_logo=False,
|
||||
download_fanart=False,
|
||||
serie_folder="Test Anime"
|
||||
)
|
||||
|
||||
# Verify NFO updated
|
||||
@@ -314,12 +313,13 @@ class TestCompleteNFOWorkflow:
|
||||
{"results": [{"id": 2, "name": "Anime 2", "first_air_date": "2021-01-01"}]},
|
||||
]
|
||||
)
|
||||
mock_tmdb.get_tv_show = AsyncMock(
|
||||
mock_tmdb.get_tv_show_details = AsyncMock(
|
||||
side_effect=[
|
||||
{"id": 1, "name": "Anime 1", "first_air_date": "2020-01-01"},
|
||||
{"id": 2, "name": "Anime 2", "first_air_date": "2021-01-01"},
|
||||
]
|
||||
)
|
||||
mock_tmdb.get_tv_show_content_ratings = AsyncMock(return_value={"results": []})
|
||||
|
||||
with patch(
|
||||
"src.core.services.nfo_service.TMDBClient",
|
||||
@@ -373,13 +373,14 @@ class TestNFOWorkflowWithDownloads:
|
||||
"first_air_date": "2020-01-01",
|
||||
}]}
|
||||
)
|
||||
mock_tmdb.get_tv_show = AsyncMock(
|
||||
mock_tmdb.get_tv_show_details = AsyncMock(
|
||||
return_value={
|
||||
"id": 999,
|
||||
"name": "Test Anime",
|
||||
"first_air_date": "2020-01-01",
|
||||
}
|
||||
)
|
||||
mock_tmdb.get_tv_show_content_ratings = AsyncMock(return_value={"results": []})
|
||||
|
||||
with patch(
|
||||
"src.core.services.nfo_service.TMDBClient",
|
||||
|
||||
@@ -85,7 +85,7 @@ async def download_service(anime_service, progress_service, tmp_path):
|
||||
queue_repository=mock_repo,
|
||||
)
|
||||
yield service, progress_service
|
||||
await service.stop()
|
||||
await service.stop_downloads()
|
||||
|
||||
|
||||
class TestWebSocketDownloadIntegration:
|
||||
@@ -483,11 +483,11 @@ class TestWebSocketEndToEnd:
|
||||
)
|
||||
|
||||
# Start queue
|
||||
await download_svc.start()
|
||||
await download_svc.start_queue_processing()
|
||||
await asyncio.sleep(0.1)
|
||||
|
||||
# Stop queue
|
||||
await download_svc.stop()
|
||||
await download_svc.stop_downloads()
|
||||
|
||||
# Verify we received events
|
||||
assert len(all_broadcasts) >= 1
|
||||
|
||||
Reference in New Issue
Block a user