refactor(download): mark episode downloaded instead of deleting
Change _remove_episode_from_missing_list to set is_downloaded=True and populate file_path via EpisodeService.mark_downloaded, instead of deleting the Episode row. Preserves download history so queries can distinguish series with downloaded episodes from completely unwatched series. - Pass serie_folder to construct file_path - Look up series_id via AnimeSeriesService.get_by_key - Update tests to mock mark_downloaded path - Document episode lifecycle in docs/DEVELOPMENT.md Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -79,6 +79,7 @@ def mock_anime_service():
|
||||
"""Create a mock AnimeService."""
|
||||
service = MagicMock(spec=AnimeService)
|
||||
service.download = AsyncMock(return_value=True)
|
||||
service._directory = "/mock/anime/directory"
|
||||
return service
|
||||
|
||||
|
||||
@@ -731,13 +732,22 @@ class TestRemoveEpisodeFromMissingList:
|
||||
download_service._anime_service._app = mock_app
|
||||
download_service._anime_service._cached_list_missing = MagicMock()
|
||||
|
||||
# Mock DB call
|
||||
# Mock DB session
|
||||
mock_db_session = AsyncMock()
|
||||
mock_delete = AsyncMock(return_value=True)
|
||||
|
||||
# Mock series returned by get_by_key
|
||||
mock_series = MagicMock()
|
||||
mock_series.id = 1
|
||||
|
||||
# Mock episode returned by get_by_episode
|
||||
mock_episode = MagicMock()
|
||||
mock_episode.id = 100
|
||||
|
||||
with patch(
|
||||
"src.server.database.connection.get_db_session"
|
||||
) as mock_get_db, patch(
|
||||
"src.server.database.service.AnimeSeriesService"
|
||||
) as mock_series_svc, patch(
|
||||
"src.server.database.service.EpisodeService"
|
||||
) as mock_ep_svc:
|
||||
mock_get_db.return_value.__aenter__ = AsyncMock(
|
||||
@@ -746,20 +756,30 @@ class TestRemoveEpisodeFromMissingList:
|
||||
mock_get_db.return_value.__aexit__ = AsyncMock(
|
||||
return_value=False
|
||||
)
|
||||
mock_ep_svc.delete_by_series_and_episode = mock_delete
|
||||
|
||||
# Mock get_by_key to return series
|
||||
mock_series_svc.get_by_key = AsyncMock(return_value=mock_series)
|
||||
|
||||
# Mock get_by_episode to return episode
|
||||
mock_ep_svc.get_by_episode = AsyncMock(return_value=mock_episode)
|
||||
|
||||
# Mock mark_downloaded to succeed
|
||||
mock_ep_svc.mark_downloaded = AsyncMock(return_value=mock_episode)
|
||||
|
||||
result = await download_service._remove_episode_from_missing_list(
|
||||
series_key="test-series",
|
||||
season=1,
|
||||
episode=2,
|
||||
serie_folder="Test Series (2024)",
|
||||
)
|
||||
|
||||
# DB deletion was called
|
||||
mock_delete.assert_awaited_once_with(
|
||||
# mark_downloaded was called instead of delete
|
||||
mock_ep_svc.mark_downloaded.assert_awaited_once_with(
|
||||
db=mock_db_session,
|
||||
series_key="test-series",
|
||||
season=1,
|
||||
episode_number=2,
|
||||
episode_id=100,
|
||||
file_path=(
|
||||
f"{download_service._directory}/Test Series (2024)/Season 1"
|
||||
),
|
||||
)
|
||||
# In-memory update happened
|
||||
assert 2 not in serie.episodeDict[1]
|
||||
@@ -807,11 +827,20 @@ class TestRemoveEpisodeFromMissingList:
|
||||
|
||||
# Mock DB calls
|
||||
mock_db_session = AsyncMock()
|
||||
mock_delete = AsyncMock(return_value=True)
|
||||
|
||||
# Mock series returned by get_by_key
|
||||
mock_series = MagicMock()
|
||||
mock_series.id = 1
|
||||
|
||||
# Mock episode returned by get_by_episode
|
||||
mock_episode = MagicMock()
|
||||
mock_episode.id = 100
|
||||
|
||||
with patch(
|
||||
"src.server.database.connection.get_db_session"
|
||||
) as mock_get_db, patch(
|
||||
"src.server.database.service.AnimeSeriesService"
|
||||
) as mock_series_svc, patch(
|
||||
"src.server.database.service.EpisodeService"
|
||||
) as mock_ep_svc:
|
||||
mock_get_db.return_value.__aenter__ = AsyncMock(
|
||||
@@ -820,7 +849,15 @@ class TestRemoveEpisodeFromMissingList:
|
||||
mock_get_db.return_value.__aexit__ = AsyncMock(
|
||||
return_value=False
|
||||
)
|
||||
mock_ep_svc.delete_by_series_and_episode = mock_delete
|
||||
|
||||
# Mock get_by_key to return series
|
||||
mock_series_svc.get_by_key = AsyncMock(return_value=mock_series)
|
||||
|
||||
# Mock get_by_episode to return episode
|
||||
mock_ep_svc.get_by_episode = AsyncMock(return_value=mock_episode)
|
||||
|
||||
# Mock mark_downloaded to succeed
|
||||
mock_ep_svc.mark_downloaded = AsyncMock(return_value=mock_episode)
|
||||
|
||||
# Process the download
|
||||
item = download_service._pending_queue.popleft()
|
||||
|
||||
Reference in New Issue
Block a user