From fedb78fb888495152080f73ea74ca380e100bbb4 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 17 Dec 2024 22:42:37 -0700 Subject: [PATCH] fix(sonarr): Pass the root folder ID alongside all DeleteRootFolder events when publishing to the networking channel --- src/cli/sonarr/delete_command_handler.rs | 2 +- .../sonarr/delete_command_handler_tests.rs | 2 +- .../sonarr_handlers/root_folders/mod.rs | 14 ++++++-- .../root_folders_handler_tests.rs | 29 ++++++++++++--- src/network/sonarr_network.rs | 24 +++---------- src/network/sonarr_network_tests.rs | 35 ++----------------- 6 files changed, 47 insertions(+), 59 deletions(-) diff --git a/src/cli/sonarr/delete_command_handler.rs b/src/cli/sonarr/delete_command_handler.rs index fb09fed..84f0198 100644 --- a/src/cli/sonarr/delete_command_handler.rs +++ b/src/cli/sonarr/delete_command_handler.rs @@ -122,7 +122,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrDeleteCommand> for SonarrDeleteComm SonarrDeleteCommand::RootFolder { root_folder_id } => { let resp = self .network - .handle_network_event(SonarrEvent::DeleteRootFolder(Some(root_folder_id)).into()) + .handle_network_event(SonarrEvent::DeleteRootFolder(root_folder_id).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/sonarr/delete_command_handler_tests.rs b/src/cli/sonarr/delete_command_handler_tests.rs index 783f80f..531a3c3 100644 --- a/src/cli/sonarr/delete_command_handler_tests.rs +++ b/src/cli/sonarr/delete_command_handler_tests.rs @@ -410,7 +410,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - SonarrEvent::DeleteRootFolder(Some(expected_root_folder_id)).into(), + SonarrEvent::DeleteRootFolder(expected_root_folder_id).into(), )) .times(1) .returning(|_| { diff --git a/src/handlers/sonarr_handlers/root_folders/mod.rs b/src/handlers/sonarr_handlers/root_folders/mod.rs index 3fa21dd..fc1069a 100644 --- a/src/handlers/sonarr_handlers/root_folders/mod.rs +++ b/src/handlers/sonarr_handlers/root_folders/mod.rs @@ -42,6 +42,16 @@ impl<'a, 'b> RootFoldersHandler<'a, 'b> { self.app.data.sonarr_data.edit_root_folder = None; AddRootFolderBody { path: root_folder } } + + fn extract_root_folder_id(&self) -> i64 { + self + .app + .data + .sonarr_data + .root_folders + .current_selection() + .id + } } impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for RootFoldersHandler<'a, 'b> { @@ -138,7 +148,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for RootFoldersHandler<' ActiveSonarrBlock::DeleteRootFolderPrompt => { if self.app.data.sonarr_data.prompt_confirm { self.app.data.sonarr_data.prompt_confirm_action = - Some(SonarrEvent::DeleteRootFolder(None)); + Some(SonarrEvent::DeleteRootFolder(self.extract_root_folder_id())); } self.app.pop_navigation_stack(); @@ -208,7 +218,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for RootFoldersHandler<' if key == DEFAULT_KEYBINDINGS.confirm.key { self.app.data.sonarr_data.prompt_confirm = true; self.app.data.sonarr_data.prompt_confirm_action = - Some(SonarrEvent::DeleteRootFolder(None)); + Some(SonarrEvent::DeleteRootFolder(self.extract_root_folder_id())); self.app.pop_navigation_stack(); } diff --git a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs index 8abd0d4..018378b 100644 --- a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs @@ -7,6 +7,7 @@ mod tests { use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::root_folders::RootFoldersHandler; + use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::root_folder; use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; @@ -326,7 +327,7 @@ mod tests { .data .sonarr_data .root_folders - .set_items(vec![RootFolder::default()]); + .set_items(vec![root_folder()]); app.data.sonarr_data.prompt_confirm = true; app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); app.push_navigation_stack(ActiveSonarrBlock::DeleteRootFolderPrompt.into()); @@ -342,7 +343,7 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_eq!( app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DeleteRootFolder(None)) + Some(SonarrEvent::DeleteRootFolder(1)) ); assert_eq!( app.get_current_route(), @@ -619,7 +620,7 @@ mod tests { .data .sonarr_data .root_folders - .set_items(vec![RootFolder::default()]); + .set_items(vec![root_folder()]); app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); app.push_navigation_stack(ActiveSonarrBlock::DeleteRootFolderPrompt.into()); @@ -634,7 +635,7 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_eq!( app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DeleteRootFolder(None)) + Some(SonarrEvent::DeleteRootFolder(1)) ); assert_eq!( app.get_current_route(), @@ -654,6 +655,26 @@ mod tests { }) } + #[test] + fn test_extract_root_folder_id() { + let mut app = App::default(); + app + .data + .sonarr_data + .root_folders + .set_items(vec![root_folder()]); + + let root_folder_id = RootFoldersHandler::with( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveSonarrBlock::DeleteRootFolderPrompt, + None, + ) + .extract_root_folder_id(); + + assert_eq!(root_folder_id, 1); + } + #[test] fn test_build_add_root_folder_body() { let mut app = App::default(); diff --git a/src/network/sonarr_network.rs b/src/network/sonarr_network.rs index 6728dbf..229f15b 100644 --- a/src/network/sonarr_network.rs +++ b/src/network/sonarr_network.rs @@ -46,7 +46,7 @@ pub enum SonarrEvent { DeleteDownload(i64), DeleteEpisodeFile(i64), DeleteIndexer(i64), - DeleteRootFolder(Option), + DeleteRootFolder(i64), DeleteSeries(Option), DeleteTag(i64), DownloadRelease(SonarrReleaseDownloadBody), @@ -535,30 +535,16 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn delete_sonarr_root_folder(&mut self, root_folder_id: Option) -> Result<()> { - let event = SonarrEvent::DeleteRootFolder(None); - let id = if let Some(rf_id) = root_folder_id { - rf_id - } else { - self - .app - .lock() - .await - .data - .sonarr_data - .root_folders - .current_selection() - .id - }; - - info!("Deleting Sonarr root folder for folder with id: {id}"); + async fn delete_sonarr_root_folder(&mut self, root_folder_id: i64) -> Result<()> { + let event = SonarrEvent::DeleteRootFolder(root_folder_id); + info!("Deleting Sonarr root folder for folder with id: {root_folder_id}"); let request_props = self .request_props_from( event, RequestMethod::Delete, None::<()>, - Some(format!("/{id}")), + Some(format!("/{root_folder_id}")), None, ) .await; diff --git a/src/network/sonarr_network_tests.rs b/src/network/sonarr_network_tests.rs index 8a0decc..5ea38e5 100644 --- a/src/network/sonarr_network_tests.rs +++ b/src/network/sonarr_network_tests.rs @@ -249,7 +249,7 @@ mod test { fn test_resource_root_folder( #[values( SonarrEvent::GetRootFolders, - SonarrEvent::DeleteRootFolder(None), + SonarrEvent::DeleteRootFolder(0), SonarrEvent::AddRootFolder(AddRootFolderBody::default()) )] event: SonarrEvent, @@ -648,36 +648,7 @@ mod test { None, None, None, - SonarrEvent::DeleteRootFolder(None), - Some("/1"), - None, - ) - .await; - app_arc - .lock() - .await - .data - .sonarr_data - .root_folders - .set_items(vec![root_folder()]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteRootFolder(None)) - .await - .is_ok()); - - async_server.assert_async().await; - } - - #[tokio::test] - async fn test_handle_delete_sonarr_root_folder_event_uses_provided_id() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteRootFolder(None), + SonarrEvent::DeleteRootFolder(1), Some("/1"), None, ) @@ -685,7 +656,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_sonarr_event(SonarrEvent::DeleteRootFolder(Some(1))) + .handle_sonarr_event(SonarrEvent::DeleteRootFolder(1)) .await .is_ok());