diff --git a/src/cli/sonarr/mod.rs b/src/cli/sonarr/mod.rs index 5b42ee3..b19e837 100644 --- a/src/cli/sonarr/mod.rs +++ b/src/cli/sonarr/mod.rs @@ -274,7 +274,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrCommand> for SonarrCliHandler<'a, ' SonarrCommand::ToggleEpisodeMonitoring { episode_id } => { let resp = self .network - .handle_network_event(SonarrEvent::ToggleEpisodeMonitoring(Some(episode_id)).into()) + .handle_network_event(SonarrEvent::ToggleEpisodeMonitoring(episode_id).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/sonarr/sonarr_command_tests.rs b/src/cli/sonarr/sonarr_command_tests.rs index e6a06c3..ae7da26 100644 --- a/src/cli/sonarr/sonarr_command_tests.rs +++ b/src/cli/sonarr/sonarr_command_tests.rs @@ -698,7 +698,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - SonarrEvent::ToggleEpisodeMonitoring(Some(expected_episode_id)).into(), + SonarrEvent::ToggleEpisodeMonitoring(expected_episode_id).into(), )) .times(1) .returning(|_| { diff --git a/src/handlers/sonarr_handlers/library/season_details_handler.rs b/src/handlers/sonarr_handlers/library/season_details_handler.rs index f823eef..e16b76e 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler.rs @@ -78,6 +78,19 @@ impl<'a, 'b> SeasonDetailsHandler<'a, 'b> { .current_selection() .episode_file_id } + + fn extract_episode_id(&self) -> i64 { + self + .app + .data + .sonarr_data + .season_details_modal + .as_ref() + .expect("Season details have not been loaded") + .episodes + .current_selection() + .id + } } impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler<'a, 'b> { @@ -354,8 +367,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler match self.active_sonarr_block { ActiveSonarrBlock::SeasonDetails if self.key == DEFAULT_KEYBINDINGS.toggle_monitoring.key => { self.app.data.sonarr_data.prompt_confirm = true; - self.app.data.sonarr_data.prompt_confirm_action = - Some(SonarrEvent::ToggleEpisodeMonitoring(None)); + self.app.data.sonarr_data.prompt_confirm_action = Some( + SonarrEvent::ToggleEpisodeMonitoring(self.extract_episode_id()), + ); self .app diff --git a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs index 19865f8..0d7e764 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs @@ -5,6 +5,7 @@ mod tests { use crate::handlers::sonarr_handlers::library::season_details_handler::{ releases_sorting_options, SeasonDetailsHandler, }; + use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::episode; use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::SeasonDetailsModal; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; @@ -550,6 +551,14 @@ mod tests { fn test_toggle_monitoring_key() { let mut app = App::default(); app.data.sonarr_data = create_test_sonarr_data(); + app + .data + .sonarr_data + .season_details_modal + .as_mut() + .unwrap() + .episodes + .set_items(vec![episode()]); app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); app.is_routing = false; @@ -569,7 +578,7 @@ mod tests { assert!(app.is_routing); assert_eq!( app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::ToggleEpisodeMonitoring(None)) + Some(SonarrEvent::ToggleEpisodeMonitoring(1)) ); } @@ -813,6 +822,24 @@ mod tests { .extract_episode_file_id(); } + #[test] + fn test_extract_episode_id() { + let mut app = App::default(); + let mut season_details_modal = SeasonDetailsModal::default(); + season_details_modal.episodes.set_items(vec![episode()]); + app.data.sonarr_data.season_details_modal = Some(season_details_modal); + + let episode_id = SeasonDetailsHandler::with( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveSonarrBlock::SeasonDetails, + None, + ) + .extract_episode_id(); + + assert_eq!(episode_id, 1); + } + #[test] fn test_season_details_handler_is_not_ready_when_loading() { let mut app = App::default(); diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index 81142b0..dc3e221 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -87,7 +87,7 @@ pub enum SonarrEvent { TestIndexer(i64), TestAllIndexers, ToggleSeasonMonitoring((i64, i64)), - ToggleEpisodeMonitoring(Option), + ToggleEpisodeMonitoring(i64), TriggerAutomaticEpisodeSearch(Option), TriggerAutomaticSeasonSearch(Option<(i64, i64)>), TriggerAutomaticSeriesSearch(Option), @@ -2131,11 +2131,11 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn toggle_sonarr_episode_monitoring(&mut self, episode_id: Option) -> Result<()> { + async fn toggle_sonarr_episode_monitoring(&mut self, episode_id: i64) -> Result<()> { let event = SonarrEvent::ToggleEpisodeMonitoring(episode_id); let detail_event = SonarrEvent::GetEpisodeDetails(0); - let (id, monitored) = if let Some(episode_id) = episode_id { + let monitored = { info!("Fetching episode details for episode id: {episode_id}"); let request_props = self .request_props_from( @@ -2159,24 +2159,13 @@ impl<'a, 'b> Network<'a, 'b> { }) .await?; - (episode_id, monitored) - } else { - let app = self.app.lock().await; - let current_selection = app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .current_selection(); - (current_selection.id, current_selection.monitored) + monitored }; - info!("Toggling monitoring for episode id: {id}"); + info!("Toggling monitoring for episode id: {episode_id}"); let body = MonitorEpisodeBody { - episode_ids: vec![id], + episode_ids: vec![episode_id], monitored: !monitored, }; diff --git a/src/network/sonarr_network_tests.rs b/src/network/sonarr_network_tests.rs index 43c6d5c..6f2b548 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -289,7 +289,7 @@ mod test { #[case(SonarrEvent::SearchNewSeries(String::new()), "/series/lookup")] #[case(SonarrEvent::TestIndexer(0), "/indexer/test")] #[case(SonarrEvent::TestAllIndexers, "/indexer/testall")] - #[case(SonarrEvent::ToggleEpisodeMonitoring(None), "/episode/monitor")] + #[case(SonarrEvent::ToggleEpisodeMonitoring(0), "/episode/monitor")] fn test_resource(#[case] event: SonarrEvent, #[case] expected_uri: String) { assert_str_eq!(event.resource(), expected_uri); } @@ -5036,39 +5036,6 @@ mod test { #[tokio::test] async fn test_handle_toggle_episode_monitoring_event() { - let expected_body = MonitorEpisodeBody { - episode_ids: vec![1], - monitored: false, - }; - - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Put, - Some(json!(expected_body)), - None, - None, - SonarrEvent::ToggleEpisodeMonitoring(None), - None, - None, - ) - .await; - { - let mut app = app_arc.lock().await; - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal.episodes.set_items(vec![episode()]); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); - } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - assert!(network - .handle_sonarr_event(SonarrEvent::ToggleEpisodeMonitoring(None)) - .await - .is_ok()); - - async_server.assert_async().await; - } - - #[tokio::test] - async fn test_handle_toggle_episode_monitoring_event_uses_provided_episode_id() { let expected_body = MonitorEpisodeBody { episode_ids: vec![2], monitored: false, @@ -5090,7 +5057,7 @@ mod test { "PUT", format!( "/api/v3{}", - SonarrEvent::ToggleEpisodeMonitoring(None).resource() + SonarrEvent::ToggleEpisodeMonitoring(2).resource() ) .as_str(), ) @@ -5099,16 +5066,10 @@ mod test { .match_body(Matcher::Json(json!(expected_body))) .create_async() .await; - { - let mut app = app_arc.lock().await; - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal.episodes.set_items(vec![episode()]); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); - } let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_sonarr_event(SonarrEvent::ToggleEpisodeMonitoring(Some(2))) + .handle_sonarr_event(SonarrEvent::ToggleEpisodeMonitoring(2)) .await .is_ok());