From eefe6392df29ccb6e1d217972d4fcfbe119b35e9 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Fri, 22 Nov 2024 15:25:33 -0700 Subject: [PATCH] feat(cli): Support for adding a root folder to Sonarr --- src/cli/sonarr/add_command_handler.rs | 12 ++++ src/cli/sonarr/add_command_handler_tests.rs | 62 +++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/src/cli/sonarr/add_command_handler.rs b/src/cli/sonarr/add_command_handler.rs index 2b0d44c..3cb3978 100644 --- a/src/cli/sonarr/add_command_handler.rs +++ b/src/cli/sonarr/add_command_handler.rs @@ -18,6 +18,11 @@ mod add_command_handler_tests; #[derive(Debug, Clone, PartialEq, Eq, Subcommand)] pub enum SonarrAddCommand { + #[command(about = "Add a new root folder")] + RootFolder { + #[arg(long, help = "The path of the new root folder", required = true)] + root_folder_path: String, + }, #[command(about = "Add new tag")] Tag { #[arg(long, help = "The name of the tag to be added", required = true)] @@ -52,6 +57,13 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, SonarrAddCommand> for SonarrAddCommandHan async fn handle(self) -> Result { let result = match self.command { + SonarrAddCommand::RootFolder { root_folder_path } => { + let resp = self + .network + .handle_network_event(SonarrEvent::AddRootFolder(Some(root_folder_path)).into()) + .await?; + serde_json::to_string_pretty(&resp)? + } SonarrAddCommand::Tag { name } => { let resp = self .network diff --git a/src/cli/sonarr/add_command_handler_tests.rs b/src/cli/sonarr/add_command_handler_tests.rs index a50781e..25c244c 100644 --- a/src/cli/sonarr/add_command_handler_tests.rs +++ b/src/cli/sonarr/add_command_handler_tests.rs @@ -25,6 +25,40 @@ mod tests { use super::*; use pretty_assertions::assert_eq; + #[test] + fn test_add_root_folder_requires_arguments() { + let result = + Cli::command().try_get_matches_from(["managarr", "sonarr", "add", "root-folder"]); + + assert!(result.is_err()); + assert_eq!( + result.unwrap_err().kind(), + ErrorKind::MissingRequiredArgument + ); + } + + #[test] + fn test_add_root_folder_success() { + let expected_args = SonarrAddCommand::RootFolder { + root_folder_path: "/nfs/test".to_owned(), + }; + + let result = Cli::try_parse_from([ + "managarr", + "sonarr", + "add", + "root-folder", + "--root-folder-path", + "/nfs/test", + ]); + + assert!(result.is_ok()); + + if let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command { + assert_eq!(add_command, expected_args); + } + } + #[test] fn test_add_tag_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "add", "tag"]); @@ -68,6 +102,34 @@ mod tests { use serde_json::json; use tokio::sync::Mutex; + #[tokio::test] + async fn test_handle_add_root_folder_command() { + let expected_root_folder_path = "/nfs/test".to_owned(); + let mut mock_network = MockNetworkTrait::new(); + mock_network + .expect_handle_network_event() + .with(eq::( + SonarrEvent::AddRootFolder(Some(expected_root_folder_path.clone())).into(), + )) + .times(1) + .returning(|_| { + Ok(Serdeable::Sonarr(SonarrSerdeable::Value( + json!({"testResponse": "response"}), + ))) + }); + let app_arc = Arc::new(Mutex::new(App::default())); + let add_root_folder_command = SonarrAddCommand::RootFolder { + root_folder_path: expected_root_folder_path, + }; + + let result = + SonarrAddCommandHandler::with(&app_arc, add_root_folder_command, &mut mock_network) + .handle() + .await; + + assert!(result.is_ok()); + } + #[tokio::test] async fn test_handle_add_tag_command() { let expected_tag_name = "test".to_owned();