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:
2026-01-17 22:50:25 +01:00
parent c6919ac124
commit a06abaa2e5
5 changed files with 29 additions and 33 deletions

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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",

View File

@@ -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