feat: add seasons from request details
This commit is contained in:
@@ -39,6 +39,7 @@ from backend.app.services.snapshot import (
|
||||
_build_repair_activity,
|
||||
_episode_availability,
|
||||
_torrent_progress,
|
||||
_unmonitored_season_options,
|
||||
)
|
||||
|
||||
|
||||
@@ -567,6 +568,34 @@ class RequestPresentationTests(unittest.TestCase):
|
||||
self.assertEqual(availability["missing"], 1)
|
||||
self.assertEqual(availability["total"], 2)
|
||||
|
||||
def test_unmonitored_seasons_are_offered_separately_from_collection_progress(self) -> None:
|
||||
series = {
|
||||
"seasons": [
|
||||
{"seasonNumber": 0, "monitored": False},
|
||||
{"seasonNumber": 7, "monitored": True},
|
||||
{
|
||||
"seasonNumber": 8,
|
||||
"monitored": False,
|
||||
"statistics": {"episodeCount": 16, "episodeFileCount": 2},
|
||||
},
|
||||
{"seasonNumber": 9, "monitored": False},
|
||||
]
|
||||
}
|
||||
episodes = [
|
||||
{"seasonNumber": 9, "episodeNumber": 1, "hasFile": True},
|
||||
{"seasonNumber": 9, "episodeNumber": 2, "hasFile": False},
|
||||
]
|
||||
|
||||
options = _unmonitored_season_options(series, episodes)
|
||||
|
||||
self.assertEqual(
|
||||
options,
|
||||
[
|
||||
{"seasonNumber": 8, "episodeCount": 16, "available": 2},
|
||||
{"seasonNumber": 9, "episodeCount": 2, "available": 1},
|
||||
],
|
||||
)
|
||||
|
||||
def test_presentation_hides_download_without_download_evidence(self) -> None:
|
||||
snapshot = Snapshot(
|
||||
request_id="3909",
|
||||
@@ -1892,6 +1921,103 @@ class MediaReplacementTests(TempDatabaseMixin, unittest.IsolatedAsyncioTestCase)
|
||||
sonarr.search_episodes.assert_awaited_once_with([36899])
|
||||
sonarr.search.assert_not_awaited()
|
||||
|
||||
async def test_add_seasons_monitors_series_and_searches_released_missing_episodes(self) -> None:
|
||||
snapshot = Snapshot(
|
||||
request_id="3580",
|
||||
title="Suits",
|
||||
request_type=RequestType.tv,
|
||||
state=NormalizedState.available,
|
||||
raw={"arr": {"item": {"id": 540}}},
|
||||
)
|
||||
refreshed = Snapshot(
|
||||
request_id="3580",
|
||||
title="Suits",
|
||||
request_type=RequestType.tv,
|
||||
state=NormalizedState.importing,
|
||||
presentation={"pipeline": [{"id": "library", "unmonitoredSeasons": []}]},
|
||||
)
|
||||
original_series = {
|
||||
"id": 540,
|
||||
"monitored": True,
|
||||
"qualityProfileId": 7,
|
||||
"seasons": [
|
||||
{"seasonNumber": 7, "monitored": True},
|
||||
{"seasonNumber": 8, "monitored": False},
|
||||
{"seasonNumber": 9, "monitored": False},
|
||||
],
|
||||
}
|
||||
updated_series = {
|
||||
**original_series,
|
||||
"seasons": [
|
||||
{"seasonNumber": 7, "monitored": True},
|
||||
{"seasonNumber": 8, "monitored": True},
|
||||
{"seasonNumber": 9, "monitored": True},
|
||||
],
|
||||
}
|
||||
episodes = [
|
||||
{
|
||||
"id": 801,
|
||||
"seasonNumber": 8,
|
||||
"episodeNumber": 1,
|
||||
"monitored": False,
|
||||
"hasFile": False,
|
||||
"airDateUtc": "2018-07-18T00:00:00Z",
|
||||
},
|
||||
{
|
||||
"id": 802,
|
||||
"seasonNumber": 8,
|
||||
"episodeNumber": 2,
|
||||
"monitored": False,
|
||||
"hasFile": True,
|
||||
"episodeFileId": 88,
|
||||
},
|
||||
{
|
||||
"id": 901,
|
||||
"seasonNumber": 9,
|
||||
"episodeNumber": 1,
|
||||
"monitored": False,
|
||||
"hasFile": False,
|
||||
"airDateUtc": "2019-07-17T00:00:00Z",
|
||||
},
|
||||
]
|
||||
verified_episodes = [{**episode, "monitored": True} for episode in episodes]
|
||||
sonarr = SimpleNamespace(
|
||||
configured=lambda: True,
|
||||
get_series=AsyncMock(side_effect=[original_series, updated_series]),
|
||||
update_series=AsyncMock(return_value=updated_series),
|
||||
get_episodes=AsyncMock(side_effect=[episodes, verified_episodes]),
|
||||
monitor_episodes=AsyncMock(return_value={"monitored": True}),
|
||||
search_episodes=AsyncMock(return_value={"id": 9001}),
|
||||
)
|
||||
runtime = SimpleNamespace(
|
||||
jellyseerr_base_url=None,
|
||||
jellyseerr_api_key=None,
|
||||
sonarr_base_url="http://sonarr",
|
||||
sonarr_api_key="secret",
|
||||
)
|
||||
with (
|
||||
patch.object(requests_router, "get_runtime_settings", return_value=runtime),
|
||||
patch.object(
|
||||
requests_router,
|
||||
"build_snapshot",
|
||||
new=AsyncMock(side_effect=[snapshot, refreshed]),
|
||||
),
|
||||
patch.object(requests_router, "SonarrClient", return_value=sonarr),
|
||||
patch.object(requests_router, "save_action"),
|
||||
):
|
||||
result = await requests_router.action_add_seasons(
|
||||
"3580",
|
||||
{"season_numbers": [8, 9]},
|
||||
{"username": "viewer", "role": "user", "auto_search_enabled": True},
|
||||
)
|
||||
|
||||
self.assertEqual(result["season_numbers"], [8, 9])
|
||||
self.assertEqual(result["searched_episode_count"], 2)
|
||||
self.assertTrue(result["snapshot"].presentation["pipeline"][0]["canAddSeasons"])
|
||||
sonarr.update_series.assert_awaited_once_with(updated_series)
|
||||
sonarr.monitor_episodes.assert_awaited_once_with([801, 802, 901], True)
|
||||
sonarr.search_episodes.assert_awaited_once_with([801, 901])
|
||||
|
||||
async def test_missing_movie_search_monitors_movie_before_search(self) -> None:
|
||||
snapshot = Snapshot(
|
||||
request_id="3914",
|
||||
|
||||
Reference in New Issue
Block a user