From 2ecc59196615701ca5aaab33b5b7b40007e39783 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 17 Dec 2024 23:57:13 -0700 Subject: [PATCH] fix(sonarr): Pass series ID alognside all GetEpisodes events when publishing to the networking channel --- src/app/sonarr/mod.rs | 6 +- src/app/sonarr/sonarr_tests.rs | 17 +++- src/cli/sonarr/list_command_handler.rs | 2 +- src/cli/sonarr/list_command_handler_tests.rs | 2 +- src/network/sonarr_network.rs | 9 +-- src/network/sonarr_network_tests.rs | 85 +++----------------- 6 files changed, 36 insertions(+), 85 deletions(-) diff --git a/src/app/sonarr/mod.rs b/src/app/sonarr/mod.rs index c97ddc9..491c8c3 100644 --- a/src/app/sonarr/mod.rs +++ b/src/app/sonarr/mod.rs @@ -43,7 +43,7 @@ impl<'a> App<'a> { } ActiveSonarrBlock::SeasonDetails => { self - .dispatch_network_event(SonarrEvent::GetEpisodes(None).into()) + .dispatch_network_event(SonarrEvent::GetEpisodes(self.extract_series_id().await).into()) .await; self .dispatch_network_event(SonarrEvent::GetEpisodeFiles(None).into()) @@ -256,4 +256,8 @@ impl<'a> App<'a> { .current_selection() .id } + + async fn extract_series_id(&self) -> i64 { + self.data.sonarr_data.series.current_selection().id + } } diff --git a/src/app/sonarr/sonarr_tests.rs b/src/app/sonarr/sonarr_tests.rs index 7a407fe..b98540a 100644 --- a/src/app/sonarr/sonarr_tests.rs +++ b/src/app/sonarr/sonarr_tests.rs @@ -81,6 +81,10 @@ mod tests { #[tokio::test] async fn test_dispatch_by_season_details_block() { let (mut app, mut sync_network_rx) = construct_app_unit(); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + ..Series::default() + }]); app .dispatch_by_sonarr_block(&ActiveSonarrBlock::SeasonDetails) @@ -89,7 +93,7 @@ mod tests { assert!(app.is_loading); assert_eq!( sync_network_rx.recv().await.unwrap(), - SonarrEvent::GetEpisodes(None).into() + SonarrEvent::GetEpisodes(1).into() ); assert_eq!( sync_network_rx.recv().await.unwrap(), @@ -746,6 +750,17 @@ mod tests { assert_eq!(app.extract_episode_id().await, 0); } + #[tokio::test] + async fn test_extract_series_id() { + let mut app = App::default(); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + ..Series::default() + }]); + + assert_eq!(app.extract_series_id().await, 1); + } + fn construct_app_unit<'a>() -> (App<'a>, mpsc::Receiver) { let (sync_network_tx, sync_network_rx) = mpsc::channel::(500); let mut app = App { diff --git a/src/cli/sonarr/list_command_handler.rs b/src/cli/sonarr/list_command_handler.rs index 17272ae..fb0231c 100644 --- a/src/cli/sonarr/list_command_handler.rs +++ b/src/cli/sonarr/list_command_handler.rs @@ -163,7 +163,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrListCommand> for SonarrListCommandH SonarrListCommand::Episodes { series_id } => { let resp = self .network - .handle_network_event(SonarrEvent::GetEpisodes(Some(series_id)).into()) + .handle_network_event(SonarrEvent::GetEpisodes(series_id).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/sonarr/list_command_handler_tests.rs b/src/cli/sonarr/list_command_handler_tests.rs index 8bfc9b5..ee4f47b 100644 --- a/src/cli/sonarr/list_command_handler_tests.rs +++ b/src/cli/sonarr/list_command_handler_tests.rs @@ -329,7 +329,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - SonarrEvent::GetEpisodes(Some(expected_series_id)).into(), + SonarrEvent::GetEpisodes(expected_series_id).into(), )) .times(1) .returning(|_| { diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index 10b9e42..6b479b6 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -60,7 +60,7 @@ pub enum SonarrEvent { GetHostConfig, GetIndexers, GetEpisodeDetails(i64), - GetEpisodes(Option), + GetEpisodes(i64), GetEpisodeFiles(Option), GetEpisodeHistory(Option), GetLanguageProfiles, @@ -1144,10 +1144,9 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn get_episodes(&mut self, series_id: Option) -> Result> { + async fn get_episodes(&mut self, series_id: i64) -> Result> { let event = SonarrEvent::GetEpisodes(series_id); - let (id, series_id_param) = self.extract_series_id(series_id).await; - info!("Fetching episodes for Sonarr series with ID: {id}"); + info!("Fetching episodes for Sonarr series with ID: {series_id}"); let request_props = self .request_props_from( @@ -1155,7 +1154,7 @@ impl<'a, 'b> Network<'a, 'b> { RequestMethod::Get, None::<()>, None, - Some(series_id_param), + Some(format!("seriesId={series_id}")), ) .await; diff --git a/src/network/sonarr_network_tests.rs b/src/network/sonarr_network_tests.rs index 262eaa5..703aaf0 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -149,7 +149,7 @@ mod test { #[rstest] fn test_resource_episode( - #[values(SonarrEvent::GetEpisodes(None), SonarrEvent::GetEpisodeDetails(0))] event: SonarrEvent, + #[values(SonarrEvent::GetEpisodes(0), SonarrEvent::GetEpisodeDetails(0))] event: SonarrEvent, ) { assert_str_eq!(event.resource(), "/episode"); } @@ -1834,7 +1834,7 @@ mod test { None, Some(json!([episode_1, episode_2, episode_3])), None, - SonarrEvent::GetEpisodes(None), + SonarrEvent::GetEpisodes(1), None, Some("seriesId=1"), ) @@ -1876,7 +1876,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); if let SonarrSerdeable::Episodes(episodes) = network - .handle_sonarr_event(SonarrEvent::GetEpisodes(None)) + .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) .await .unwrap() { @@ -1941,7 +1941,7 @@ mod test { None, Some(json!([episode_1, episode_2, episode_3])), None, - SonarrEvent::GetEpisodes(None), + SonarrEvent::GetEpisodes(1), None, Some("seriesId=1"), ) @@ -1962,7 +1962,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); if let SonarrSerdeable::Episodes(episodes) = network - .handle_sonarr_event(SonarrEvent::GetEpisodes(None)) + .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) .await .unwrap() { @@ -2003,7 +2003,7 @@ mod test { None, Some(json!([episode()])), None, - SonarrEvent::GetEpisodes(None), + SonarrEvent::GetEpisodes(1), None, Some("seriesId=1"), ) @@ -2021,7 +2021,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); if let SonarrSerdeable::Episodes(episodes) = network - .handle_sonarr_event(SonarrEvent::GetEpisodes(None)) + .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) .await .unwrap() { @@ -2091,7 +2091,7 @@ mod test { None, Some(episodes_json), None, - SonarrEvent::GetEpisodes(None), + SonarrEvent::GetEpisodes(1), None, Some("seriesId=1"), ) @@ -2125,7 +2125,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); if let SonarrSerdeable::Episodes(episodes) = network - .handle_sonarr_event(SonarrEvent::GetEpisodes(None)) + .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) .await .unwrap() { @@ -2575,73 +2575,6 @@ mod test { } } - #[tokio::test] - async fn test_handle_get_episodes_event_uses_provided_series_id() { - let episodes_json = json!([ - { - "id": 2, - "seriesId": 2, - "tvdbId": 1234, - "episodeFileId": 2, - "seasonNumber": 2, - "episodeNumber": 2, - "title": "Something cool", - "airDateUtc": "2024-02-10T07:28:45Z", - "overview": "Okay so this one time at band camp...", - "hasFile": true, - "monitored": true - }, - { - "id": 1, - "seriesId": 2, - "tvdbId": 1234, - "episodeFileId": 1, - "seasonNumber": 1, - "episodeNumber": 1, - "title": "Something cool", - "airDateUtc": "2024-02-10T07:28:45Z", - "overview": "Okay so this one time at band camp...", - "hasFile": true, - "monitored": true - } - ]); - let episode_1 = Episode { - series_id: 2, - episode_file: None, - ..episode() - }; - let episode_2 = Episode { - id: 2, - episode_file_id: 2, - season_number: 2, - episode_number: 2, - series_id: 2, - episode_file: None, - ..episode() - }; - let expected_episodes = vec![episode_2.clone(), episode_1.clone()]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(episodes_json), - None, - SonarrEvent::GetEpisodes(None), - None, - Some("seriesId=2"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - if let SonarrSerdeable::Episodes(episodes) = network - .handle_sonarr_event(SonarrEvent::GetEpisodes(Some(2))) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!(episodes, expected_episodes); - } - } - #[tokio::test] async fn test_handle_get_episode_details_event() { let response: Episode = serde_json::from_str(EPISODE_JSON).unwrap();