diff --git a/src/cli/radarr/delete_command_handler.rs b/src/cli/radarr/delete_command_handler.rs index 769da06..21d138c 100644 --- a/src/cli/radarr/delete_command_handler.rs +++ b/src/cli/radarr/delete_command_handler.rs @@ -119,7 +119,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrDeleteCommand> for RadarrDeleteComm }; let resp = self .network - .handle_network_event(RadarrEvent::DeleteMovie(Some(delete_movie_params)).into()) + .handle_network_event(RadarrEvent::DeleteMovie(delete_movie_params).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/radarr/delete_command_handler_tests.rs b/src/cli/radarr/delete_command_handler_tests.rs index 184a9b9..d1333e6 100644 --- a/src/cli/radarr/delete_command_handler_tests.rs +++ b/src/cli/radarr/delete_command_handler_tests.rs @@ -355,7 +355,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::DeleteMovie(Some(expected_delete_movie_params)).into(), + RadarrEvent::DeleteMovie(expected_delete_movie_params).into(), )) .times(1) .returning(|_| { diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler.rs b/src/handlers/radarr_handlers/library/delete_movie_handler.rs index 6e78552..e2cf914 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler.rs @@ -2,6 +2,7 @@ use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; use crate::event::Key; use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::models::radarr_models::DeleteMovieParams; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; use crate::network::radarr_network::RadarrEvent; @@ -16,6 +17,25 @@ pub(super) struct DeleteMovieHandler<'a, 'b> { _context: Option, } +impl<'a, 'b> DeleteMovieHandler<'a, 'b> { + fn build_delete_movie_params(&mut self) -> DeleteMovieParams { + let id = self.app.data.radarr_data.movies.current_selection().id; + let delete_movie_files = self.app.data.radarr_data.delete_movie_files; + let add_list_exclusion = self.app.data.radarr_data.add_list_exclusion; + self + .app + .data + .radarr_data + .reset_delete_movie_preferences(); + + DeleteMovieParams { + id, + delete_movie_files, + add_list_exclusion, + } + } +} + impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<'a, 'b> { fn accepts(active_block: ActiveRadarrBlock) -> bool { DELETE_MOVIE_BLOCKS.contains(&active_block) @@ -72,7 +92,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<' match self.app.data.radarr_data.selected_block.get_active_block() { ActiveRadarrBlock::DeleteMovieConfirmPrompt => { if self.app.data.radarr_data.prompt_confirm { - self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(None)); + self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(self.build_delete_movie_params())); self.app.should_refresh = true; } else { self.app.data.radarr_data.reset_delete_movie_preferences(); @@ -108,7 +128,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<' && self.key == DEFAULT_KEYBINDINGS.confirm.key { self.app.data.radarr_data.prompt_confirm = true; - self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(None)); + self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(self.build_delete_movie_params())); self.app.should_refresh = true; self.app.pop_navigation_stack(); diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs index 214aa46..0e065f3 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs @@ -1,12 +1,15 @@ #[cfg(test)] mod tests { + use pretty_assertions::assert_eq; use strum::IntoEnumIterator; use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler; + use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; use crate::handlers::KeyEventHandler; + use crate::models::radarr_models::DeleteMovieParams; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; mod test_handle_scroll_up_and_down { @@ -119,8 +122,14 @@ mod tests { #[test] fn test_delete_movie_confirm_prompt_prompt_confirmation_submit() { let mut app = App::default(); + let expected_delete_movie_params = DeleteMovieParams { + id: 1, + delete_movie_files: true, + add_list_exclusion: true, + }; app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()); + app.data.radarr_data.movies.set_items(vec![movie()]); app.data.radarr_data.prompt_confirm = true; app.data.radarr_data.delete_movie_files = true; app.data.radarr_data.add_list_exclusion = true; @@ -142,12 +151,12 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::DeleteMovie(None)) + Some(RadarrEvent::DeleteMovie(expected_delete_movie_params)) ); assert!(app.should_refresh); assert!(app.data.radarr_data.prompt_confirm); - assert!(app.data.radarr_data.delete_movie_files); - assert!(app.data.radarr_data.add_list_exclusion); + assert!(!app.data.radarr_data.delete_movie_files); + assert!(!app.data.radarr_data.add_list_exclusion); } #[test] @@ -212,6 +221,7 @@ mod tests { mod test_handle_esc { use super::*; + use pretty_assertions::assert_eq; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -248,14 +258,21 @@ mod tests { }, network::radarr_network::RadarrEvent, }; + use pretty_assertions::assert_eq; use super::*; #[test] fn test_delete_movie_confirm_prompt_prompt_confirm() { let mut app = App::default(); + let expected_delete_movie_params = DeleteMovieParams { + id: 1, + delete_movie_files: true, + add_list_exclusion: true, + }; app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()); + app.data.radarr_data.movies.set_items(vec![movie()]); app.data.radarr_data.delete_movie_files = true; app.data.radarr_data.add_list_exclusion = true; app.data.radarr_data.selected_block = BlockSelectionState::new(DELETE_MOVIE_SELECTION_BLOCKS); @@ -276,12 +293,12 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::DeleteMovie(None)) + Some(RadarrEvent::DeleteMovie(expected_delete_movie_params)) ); assert!(app.should_refresh); assert!(app.data.radarr_data.prompt_confirm); - assert!(app.data.radarr_data.delete_movie_files); - assert!(app.data.radarr_data.add_list_exclusion); + assert!(!app.data.radarr_data.delete_movie_files); + assert!(!app.data.radarr_data.add_list_exclusion); } } @@ -296,6 +313,30 @@ mod tests { }); } + #[test] + fn test_build_delete_movie_params() { + let mut app = App::default(); + app.data.radarr_data.movies.set_items(vec![movie()]); + app.data.radarr_data.delete_movie_files = true; + app.data.radarr_data.add_list_exclusion = true; + let expected_delete_movie_params = DeleteMovieParams { + id: 1, + delete_movie_files: true, + add_list_exclusion: true, + }; + + let delete_movie_params = DeleteMovieHandler::with( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveRadarrBlock::DeleteMoviePrompt, + None, + ).build_delete_movie_params(); + + assert_eq!(delete_movie_params, expected_delete_movie_params); + assert!(!app.data.radarr_data.delete_movie_files); + assert!(!app.data.radarr_data.add_list_exclusion); + } + #[test] fn test_delete_movie_handler_not_ready_when_loading() { let mut app = App::default(); diff --git a/src/models/radarr_models.rs b/src/models/radarr_models.rs index e25d8ab..29157a0 100644 --- a/src/models/radarr_models.rs +++ b/src/models/radarr_models.rs @@ -137,7 +137,7 @@ pub enum CreditType { Crew, } -#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] +#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq, Default)] #[serde(rename_all = "lowercase")] pub struct DeleteMovieParams { pub id: i64, diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 8e40d66..81b5608 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -42,7 +42,7 @@ pub enum RadarrEvent { DeleteBlocklistItem(i64), DeleteDownload(i64), DeleteIndexer(i64), - DeleteMovie(Option), + DeleteMovie(DeleteMovieParams), DeleteRootFolder(Option), DeleteTag(i64), DownloadRelease(Option), @@ -445,32 +445,19 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn delete_movie(&mut self, delete_movie_params: Option) -> Result<()> { - let event = RadarrEvent::DeleteMovie(None); - let (movie_id, delete_files, add_import_exclusion) = if let Some(params) = delete_movie_params { - ( - params.id, - params.delete_movie_files, - params.add_list_exclusion, - ) - } else { - let (movie_id, _) = self.extract_movie_id(None).await; - let delete_files = self.app.lock().await.data.radarr_data.delete_movie_files; - let add_import_exclusion = self.app.lock().await.data.radarr_data.add_list_exclusion; - - (movie_id, delete_files, add_import_exclusion) - }; - - info!("Deleting Radarr movie with ID: {movie_id} with deleteFiles={delete_files} and addImportExclusion={add_import_exclusion}"); + async fn delete_movie(&mut self, delete_movie_params: DeleteMovieParams) -> Result<()> { + let event = RadarrEvent::DeleteMovie(delete_movie_params.clone()); + let DeleteMovieParams { id, delete_movie_files, add_list_exclusion } = delete_movie_params; + info!("Deleting Radarr movie with ID: {id} with deleteFiles={delete_movie_files} and addImportExclusion={add_list_exclusion}"); let request_props = self .request_props_from( event, RequestMethod::Delete, None::<()>, - Some(format!("/{movie_id}")), + Some(format!("/{id}")), Some(format!( - "deleteFiles={delete_files}&addImportExclusion={add_import_exclusion}" + "deleteFiles={delete_movie_files}&addImportExclusion={add_list_exclusion}" )), ) .await; @@ -479,14 +466,6 @@ impl<'a, 'b> Network<'a, 'b> { .handle_request::<(), ()>(request_props, |_, _| ()) .await; - self - .app - .lock() - .await - .data - .radarr_data - .reset_delete_movie_preferences(); - resp } diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 61a0282..40dc436 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -121,7 +121,7 @@ mod test { RadarrEvent::EditMovie(None), RadarrEvent::GetMovies, RadarrEvent::GetMovieDetails(None), - RadarrEvent::DeleteMovie(None) + RadarrEvent::DeleteMovie(DeleteMovieParams::default()) )] event: RadarrEvent, ) { @@ -3090,61 +3090,29 @@ mod test { #[tokio::test] async fn test_handle_delete_movie_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteMovie(None), - Some("/1"), - Some("deleteFiles=true&addImportExclusion=true"), - ) - .await; - { - let mut app = app_arc.lock().await; - app.data.radarr_data.movies.set_items(vec![movie()]); - app.data.radarr_data.delete_movie_files = true; - app.data.radarr_data.add_list_exclusion = true; - } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - assert!(network - .handle_radarr_event(RadarrEvent::DeleteMovie(None)) - .await - .is_ok()); - - async_server.assert_async().await; - assert!(!app_arc.lock().await.data.radarr_data.delete_movie_files); - assert!(!app_arc.lock().await.data.radarr_data.add_list_exclusion); - } - - #[tokio::test] - async fn test_handle_delete_movie_event_use_provided_params() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteMovie(None), - Some("/1"), - Some("deleteFiles=true&addImportExclusion=true"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); let delete_movie_params = DeleteMovieParams { id: 1, delete_movie_files: true, add_list_exclusion: true, }; + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Delete, + None, + None, + None, + RadarrEvent::DeleteMovie(delete_movie_params.clone()), + Some("/1"), + Some("deleteFiles=true&addImportExclusion=true"), + ) + .await; + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_radarr_event(RadarrEvent::DeleteMovie(Some(delete_movie_params))) + .handle_radarr_event(RadarrEvent::DeleteMovie(delete_movie_params)) .await .is_ok()); async_server.assert_async().await; - assert!(!app_arc.lock().await.data.radarr_data.delete_movie_files); - assert!(!app_arc.lock().await.data.radarr_data.add_list_exclusion); } #[tokio::test]