From f7315a3bec4f1e1426e40027229952514fcfc768 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 18 Dec 2024 00:32:36 -0700 Subject: [PATCH] fix(sonarr): Pass series ID and season number alongside all ManualSeasonSearch events when publishing to the networking channel --- src/app/sonarr/mod.rs | 5 +- src/app/sonarr/sonarr_tests.rs | 10 +- .../sonarr/manual_search_command_handler.rs | 4 +- .../manual_search_command_handler_tests.rs | 2 +- src/network/sonarr_network.rs | 22 +- src/network/sonarr_network_tests.rs | 210 +----------------- 6 files changed, 28 insertions(+), 225 deletions(-) diff --git a/src/app/sonarr/mod.rs b/src/app/sonarr/mod.rs index 99bdb44..1064687 100644 --- a/src/app/sonarr/mod.rs +++ b/src/app/sonarr/mod.rs @@ -68,7 +68,10 @@ impl<'a> App<'a> { match self.data.sonarr_data.season_details_modal.as_ref() { Some(season_details_modal) if season_details_modal.season_releases.is_empty() => { self - .dispatch_network_event(SonarrEvent::GetSeasonReleases(None).into()) + .dispatch_network_event( + SonarrEvent::GetSeasonReleases(self.extract_series_id_season_number_tuple().await) + .into(), + ) .await; } _ => (), diff --git a/src/app/sonarr/sonarr_tests.rs b/src/app/sonarr/sonarr_tests.rs index 7e6c5b7..5daa2d7 100644 --- a/src/app/sonarr/sonarr_tests.rs +++ b/src/app/sonarr/sonarr_tests.rs @@ -154,6 +154,14 @@ mod tests { async fn test_dispatch_by_manual_season_search_block() { let (mut app, mut sync_network_rx) = construct_app_unit(); app.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + ..Series::default() + }]); + app.data.sonarr_data.seasons.set_items(vec![Season { + season_number: 1, + ..Season::default() + }]); app .dispatch_by_sonarr_block(&ActiveSonarrBlock::ManualSeasonSearch) @@ -162,7 +170,7 @@ mod tests { assert!(app.is_loading); assert_eq!( sync_network_rx.recv().await.unwrap(), - SonarrEvent::GetSeasonReleases(None).into() + SonarrEvent::GetSeasonReleases((1, 1)).into() ); assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.tick_count, 0); diff --git a/src/cli/sonarr/manual_search_command_handler.rs b/src/cli/sonarr/manual_search_command_handler.rs index 0633856..b2972bf 100644 --- a/src/cli/sonarr/manual_search_command_handler.rs +++ b/src/cli/sonarr/manual_search_command_handler.rs @@ -86,9 +86,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrManualSearchCommand> println!("Searching for season releases. This may take a minute..."); let resp = self .network - .handle_network_event( - SonarrEvent::GetSeasonReleases(Some((series_id, season_number))).into(), - ) + .handle_network_event(SonarrEvent::GetSeasonReleases((series_id, season_number)).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/sonarr/manual_search_command_handler_tests.rs b/src/cli/sonarr/manual_search_command_handler_tests.rs index 14e4c46..7141e01 100644 --- a/src/cli/sonarr/manual_search_command_handler_tests.rs +++ b/src/cli/sonarr/manual_search_command_handler_tests.rs @@ -160,7 +160,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - SonarrEvent::GetSeasonReleases(Some((expected_series_id, expected_season_number))).into(), + SonarrEvent::GetSeasonReleases((expected_series_id, expected_season_number)).into(), )) .times(1) .returning(|_| { diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index 0d548ef..8f190d5 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -71,7 +71,7 @@ pub enum SonarrEvent { GetRootFolders, GetEpisodeReleases(i64), GetSeasonHistory((i64, i64)), - GetSeasonReleases(Option<(i64, i64)>), + GetSeasonReleases((i64, i64)), GetSecurityConfig, GetSeriesDetails(Option), GetSeriesHistory(Option), @@ -1668,19 +1668,10 @@ impl<'a, 'b> Network<'a, 'b> { async fn get_season_releases( &mut self, - series_season_id_tuple: Option<(i64, i64)>, + series_season_id_tuple: (i64, i64), ) -> Result> { - let event = SonarrEvent::GetSeasonReleases(None); - let (series_id, season_number) = - if let Some((series_id, season_number)) = series_season_id_tuple { - (Some(series_id), Some(season_number)) - } else { - (None, None) - }; - - let (series_id, series_id_param) = self.extract_series_id(series_id).await; - let (season_number, season_number_param) = self.extract_season_number(season_number).await?; - + let event = SonarrEvent::GetSeasonReleases(series_season_id_tuple); + let (series_id, season_number) = series_season_id_tuple; info!("Fetching releases for series with ID: {series_id} and season number: {season_number}"); let request_props = self @@ -1689,7 +1680,10 @@ impl<'a, 'b> Network<'a, 'b> { RequestMethod::Get, None::<()>, None, - Some(format!("{}&{}", series_id_param, season_number_param)), + Some(format!( + "seriesId={}&seasonNumber={}", + series_id, season_number + )), ) .await; diff --git a/src/network/sonarr_network_tests.rs b/src/network/sonarr_network_tests.rs index ffa26d7..d2f6c37 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -257,7 +257,7 @@ mod test { #[rstest] fn test_resource_release( #[values( - SonarrEvent::GetSeasonReleases(None), + SonarrEvent::GetSeasonReleases((0, 0)), SonarrEvent::GetEpisodeReleases(0) )] event: SonarrEvent, @@ -3744,7 +3744,7 @@ mod test { None, Some(release_json), None, - SonarrEvent::GetSeasonReleases(None), + SonarrEvent::GetSeasonReleases((1, 1)), None, Some("seriesId=1&seasonNumber=1"), ) @@ -3768,7 +3768,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); if let SonarrSerdeable::Releases(releases_vec) = network - .handle_sonarr_event(SonarrEvent::GetSeasonReleases(None)) + .handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1))) .await .unwrap() { @@ -3834,7 +3834,7 @@ mod test { None, Some(release_json), None, - SonarrEvent::GetSeasonReleases(None), + SonarrEvent::GetSeasonReleases((1, 1)), None, Some("seriesId=1&seasonNumber=1"), ) @@ -3856,7 +3856,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_sonarr_event(SonarrEvent::GetSeasonReleases(None)) + .handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1))) .await .is_ok()); @@ -3876,206 +3876,6 @@ mod test { ); } - #[tokio::test] - async fn test_handle_get_season_releases_event_uses_provided_series_id_and_season_number() { - let release_json = json!([ - { - "guid": "1234", - "protocol": "torrent", - "age": 1, - "title": "Test Release", - "indexer": "kickass torrents", - "indexerId": 2, - "size": 1234, - "rejected": true, - "rejections": [ "Unknown quality profile", "Release is already mapped" ], - "seeders": 2, - "leechers": 1, - "languages": [ { "id": 1, "name": "English" } ], - "quality": { "quality": { "name": "Bluray-1080p" }}, - "fullSeason": true - }, - { - "guid": "4567", - "protocol": "torrent", - "age": 1, - "title": "Test Release", - "indexer": "kickass torrents", - "indexerId": 2, - "size": 1234, - "rejected": true, - "rejections": [ "Unknown quality profile", "Release is already mapped" ], - "seeders": 2, - "leechers": 1, - "languages": [ { "id": 1, "name": "English" } ], - "quality": { "quality": { "name": "Bluray-1080p" }}, - } - ]); - let expected_filtered_sonarr_release = SonarrRelease { - full_season: true, - ..release() - }; - let expected_raw_sonarr_releases = vec![ - SonarrRelease { - full_season: true, - ..release() - }, - SonarrRelease { - guid: "4567".to_owned(), - ..release() - }, - ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - SonarrEvent::GetSeasonReleases(None), - None, - Some("seriesId=2&seasonNumber=2"), - ) - .await; - app_arc - .lock() - .await - .data - .sonarr_data - .series - .set_items(vec![series()]); - app_arc - .lock() - .await - .data - .sonarr_data - .seasons - .set_items(vec![season()]); - app_arc.lock().await.data.sonarr_data.season_details_modal = - Some(SeasonDetailsModal::default()); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - if let SonarrSerdeable::Releases(releases_vec) = network - .handle_sonarr_event(SonarrEvent::GetSeasonReleases(Some((2, 2)))) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_releases - .items, - vec![expected_filtered_sonarr_release] - ); - assert_eq!(releases_vec, expected_raw_sonarr_releases); - } - } - - #[tokio::test] - async fn test_handle_get_season_releases_event_filtered_series_and_filtered_seasons() { - let release_json = json!([ - { - "guid": "1234", - "protocol": "torrent", - "age": 1, - "title": "Test Release", - "indexer": "kickass torrents", - "indexerId": 2, - "size": 1234, - "rejected": true, - "rejections": [ "Unknown quality profile", "Release is already mapped" ], - "seeders": 2, - "leechers": 1, - "languages": [ { "id": 1, "name": "English" } ], - "quality": { "quality": { "name": "Bluray-1080p" }}, - "fullSeason": true - }, - { - "guid": "4567", - "protocol": "torrent", - "age": 1, - "title": "Test Release", - "indexer": "kickass torrents", - "indexerId": 2, - "size": 1234, - "rejected": true, - "rejections": [ "Unknown quality profile", "Release is already mapped" ], - "seeders": 2, - "leechers": 1, - "languages": [ { "id": 1, "name": "English" } ], - "quality": { "quality": { "name": "Bluray-1080p" }}, - } - ]); - let expected_filtered_sonarr_release = SonarrRelease { - full_season: true, - ..release() - }; - let expected_raw_sonarr_releases = vec![ - SonarrRelease { - full_season: true, - ..release() - }, - SonarrRelease { - guid: "4567".to_owned(), - ..release() - }, - ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - SonarrEvent::GetSeasonReleases(None), - None, - Some("seriesId=1&seasonNumber=1"), - ) - .await; - let mut filtered_series = StatefulTable::default(); - filtered_series.set_items(vec![Series::default()]); - filtered_series.set_filtered_items(vec![Series { - id: 1, - ..Series::default() - }]); - app_arc.lock().await.data.sonarr_data.series = filtered_series; - let mut filtered_seasons = StatefulTable::default(); - filtered_seasons.set_items(vec![Season::default()]); - filtered_seasons.set_filtered_items(vec![Season { - season_number: 1, - ..Season::default() - }]); - app_arc.lock().await.data.sonarr_data.seasons = filtered_seasons; - app_arc.lock().await.data.sonarr_data.season_details_modal = - Some(SeasonDetailsModal::default()); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - if let SonarrSerdeable::Releases(releases_vec) = network - .handle_sonarr_event(SonarrEvent::GetSeasonReleases(None)) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_releases - .items, - vec![expected_filtered_sonarr_release] - ); - assert_eq!(releases_vec, expected_raw_sonarr_releases); - } - } - #[rstest] #[tokio::test] async fn test_handle_list_series_event(#[values(true, false)] use_custom_sorting: bool) {