From ef5e70225542f5bb7a072d98467392f7b027b9e7 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Sun, 13 Jul 2025 15:04:39 -0600 Subject: [PATCH] feat: Fixed the Radarr downloads tab to display more than 10 downloads at a time and added a new --count flag to the CLI for specifying the number of downloads to return --- src/app/app_tests.rs | 2 +- src/app/radarr/mod.rs | 6 +-- src/app/radarr/radarr_tests.rs | 16 +++---- src/cli/radarr/list_command_handler.rs | 9 ++-- src/cli/radarr/list_command_handler_tests.rs | 49 +++++++++++++++++++- src/cli/sonarr/list_command_handler_tests.rs | 2 +- src/network/radarr_network.rs | 21 ++++++--- src/network/radarr_network_tests.rs | 8 ++-- 8 files changed, 85 insertions(+), 28 deletions(-) diff --git a/src/app/app_tests.rs b/src/app/app_tests.rs index f24d356..7547e5b 100644 --- a/src/app/app_tests.rs +++ b/src/app/app_tests.rs @@ -284,7 +284,7 @@ mod tests { ); assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert_eq!( sync_network_rx.recv().await.unwrap(), diff --git a/src/app/radarr/mod.rs b/src/app/radarr/mod.rs index 6ecba83..b749d03 100644 --- a/src/app/radarr/mod.rs +++ b/src/app/radarr/mod.rs @@ -40,7 +40,7 @@ impl App<'_> { } ActiveRadarrBlock::Downloads => { self - .dispatch_network_event(RadarrEvent::GetDownloads.into()) + .dispatch_network_event(RadarrEvent::GetDownloads(500).into()) .await; } ActiveRadarrBlock::RootFolders => { @@ -59,7 +59,7 @@ impl App<'_> { .dispatch_network_event(RadarrEvent::GetMovies.into()) .await; self - .dispatch_network_event(RadarrEvent::GetDownloads.into()) + .dispatch_network_event(RadarrEvent::GetDownloads(500).into()) .await; } ActiveRadarrBlock::Indexers => { @@ -201,7 +201,7 @@ impl App<'_> { .dispatch_network_event(RadarrEvent::GetRootFolders.into()) .await; self - .dispatch_network_event(RadarrEvent::GetDownloads.into()) + .dispatch_network_event(RadarrEvent::GetDownloads(500).into()) .await; self .dispatch_network_event(RadarrEvent::GetDiskSpace.into()) diff --git a/src/app/radarr/radarr_tests.rs b/src/app/radarr/radarr_tests.rs index c37b819..9218162 100644 --- a/src/app/radarr/radarr_tests.rs +++ b/src/app/radarr/radarr_tests.rs @@ -140,7 +140,7 @@ mod tests { assert!(app.is_loading); assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.tick_count, 0); @@ -186,7 +186,7 @@ mod tests { ); assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.tick_count, 0); @@ -591,7 +591,7 @@ mod tests { ); assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert_eq!( sync_network_rx.recv().await.unwrap(), @@ -625,7 +625,7 @@ mod tests { ); assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert_eq!( sync_network_rx.recv().await.unwrap(), @@ -650,7 +650,7 @@ mod tests { assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert!(!app.data.radarr_data.prompt_confirm); } @@ -675,7 +675,7 @@ mod tests { assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert!(app.should_refresh); assert!(!app.data.radarr_data.prompt_confirm); @@ -692,7 +692,7 @@ mod tests { assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert!(app.is_loading); assert!(app.should_refresh); @@ -722,7 +722,7 @@ mod tests { ); assert_eq!( sync_network_rx.recv().await.unwrap(), - RadarrEvent::GetDownloads.into() + RadarrEvent::GetDownloads(500).into() ); assert!(app.is_loading); } diff --git a/src/cli/radarr/list_command_handler.rs b/src/cli/radarr/list_command_handler.rs index 57ae9f5..3fd1575 100644 --- a/src/cli/radarr/list_command_handler.rs +++ b/src/cli/radarr/list_command_handler.rs @@ -23,7 +23,10 @@ pub enum RadarrListCommand { #[command(about = "List all Radarr collections")] Collections, #[command(about = "List all active downloads in Radarr")] - Downloads, + Downloads { + #[arg(long, help = "How many downloads to fetch", default_value_t = 500)] + count: u64, + }, #[command(about = "List disk space details for all provisioned root folders in Radarr")] DiskSpace, #[command(about = "List all Radarr indexers")] @@ -104,10 +107,10 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrListCommand> for RadarrListCommandH .await?; serde_json::to_string_pretty(&resp)? } - RadarrListCommand::Downloads => { + RadarrListCommand::Downloads { count } => { let resp = self .network - .handle_network_event(RadarrEvent::GetDownloads.into()) + .handle_network_event(RadarrEvent::GetDownloads(count).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/radarr/list_command_handler_tests.rs b/src/cli/radarr/list_command_handler_tests.rs index 781ccf4..fb7e2d6 100644 --- a/src/cli/radarr/list_command_handler_tests.rs +++ b/src/cli/radarr/list_command_handler_tests.rs @@ -29,7 +29,6 @@ mod tests { #[values( "blocklist", "collections", - "downloads", "disk-space", "indexers", "movies", @@ -59,6 +58,15 @@ mod tests { ); } + #[test] + fn test_list_downloads_count_flag_requires_arguments() { + let result = + Cli::command().try_get_matches_from(["managarr", "radarr", "list", "downloads", "--count"]); + + assert!(result.is_err()); + assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); + } + #[test] fn test_list_logs_events_flag_requires_arguments() { let result = @@ -87,6 +95,18 @@ mod tests { } } + #[test] + fn test_list_downloads_default_values() { + let expected_args = RadarrListCommand::Downloads { count: 500 }; + let result = Cli::try_parse_from(["managarr", "radarr", "list", "downloads"]); + + assert!(result.is_ok()); + + if let Some(Command::Radarr(RadarrCommand::List(refresh_command))) = result.unwrap().command { + assert_eq!(refresh_command, expected_args); + } + } + #[test] fn test_list_logs_default_values() { let expected_args = RadarrListCommand::Logs { @@ -122,7 +142,6 @@ mod tests { #[rstest] #[case(RadarrListCommand::Blocklist, RadarrEvent::GetBlocklist)] #[case(RadarrListCommand::Collections, RadarrEvent::GetCollections)] - #[case(RadarrListCommand::Downloads, RadarrEvent::GetDownloads)] #[case(RadarrListCommand::DiskSpace, RadarrEvent::GetDiskSpace)] #[case(RadarrListCommand::Indexers, RadarrEvent::GetIndexers)] #[case(RadarrListCommand::Movies, RadarrEvent::GetMovies)] @@ -182,6 +201,32 @@ mod tests { assert!(result.is_ok()); } + #[tokio::test] + async fn test_handle_list_downloads_command() { + let expected_count = 1000; + let mut mock_network = MockNetworkTrait::new(); + mock_network + .expect_handle_network_event() + .with(eq::( + RadarrEvent::GetDownloads(expected_count).into(), + )) + .times(1) + .returning(|_| { + Ok(Serdeable::Radarr(RadarrSerdeable::Value( + json!({"testResponse": "response"}), + ))) + }); + let app_arc = Arc::new(Mutex::new(App::test_default())); + let list_downloads_command = RadarrListCommand::Downloads { count: 1000 }; + + let result = + RadarrListCommandHandler::with(&app_arc, list_downloads_command, &mut mock_network) + .handle() + .await; + + assert!(result.is_ok()); + } + #[tokio::test] async fn test_handle_list_logs_command() { let expected_events = 1000; diff --git a/src/cli/sonarr/list_command_handler_tests.rs b/src/cli/sonarr/list_command_handler_tests.rs index f2b015b..94c755c 100644 --- a/src/cli/sonarr/list_command_handler_tests.rs +++ b/src/cli/sonarr/list_command_handler_tests.rs @@ -102,7 +102,7 @@ mod tests { } #[test] - fn test_list_downloads_events_flag_requires_arguments() { + fn test_list_downloads_count_flag_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "downloads", "--count"]); diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 98fb9de..d36e777 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -49,7 +49,7 @@ pub enum RadarrEvent { EditMovie(EditMovieParams), GetBlocklist, GetCollections, - GetDownloads, + GetDownloads(u64), GetHostConfig, GetIndexers, GetAllIndexerSettings, @@ -87,7 +87,7 @@ impl NetworkResource for RadarrEvent { RadarrEvent::DeleteBlocklistItem(_) => "/blocklist", RadarrEvent::GetBlocklist => "/blocklist?page=1&pageSize=10000", RadarrEvent::GetCollections | RadarrEvent::EditCollection(_) => "/collection", - RadarrEvent::GetDownloads | RadarrEvent::DeleteDownload(_) => "/queue", + RadarrEvent::GetDownloads(_) | RadarrEvent::DeleteDownload(_) => "/queue", RadarrEvent::GetHostConfig | RadarrEvent::GetSecurityConfig => "/config/host", RadarrEvent::GetIndexers | RadarrEvent::EditIndexer(_) | RadarrEvent::DeleteIndexer(_) => { "/indexer" @@ -196,7 +196,10 @@ impl Network<'_, '_> { .map(RadarrSerdeable::from), RadarrEvent::GetBlocklist => self.get_radarr_blocklist().await.map(RadarrSerdeable::from), RadarrEvent::GetCollections => self.get_collections().await.map(RadarrSerdeable::from), - RadarrEvent::GetDownloads => self.get_radarr_downloads().await.map(RadarrSerdeable::from), + RadarrEvent::GetDownloads(count) => self + .get_radarr_downloads(count) + .await + .map(RadarrSerdeable::from), RadarrEvent::GetHostConfig => self .get_radarr_host_config() .await @@ -1036,12 +1039,18 @@ impl Network<'_, '_> { .await } - async fn get_radarr_downloads(&mut self) -> Result { + async fn get_radarr_downloads(&mut self, count: u64) -> Result { info!("Fetching Radarr downloads"); - let event = RadarrEvent::GetDownloads; + let event = RadarrEvent::GetDownloads(count); let request_props = self - .request_props_from(event, RequestMethod::Get, None::<()>, None, None) + .request_props_from( + event, + RequestMethod::Get, + None::<()>, + None, + Some(format!("pageSize={count}")), + ) .await; self diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 13d71ba..daebd4d 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -198,7 +198,7 @@ mod test { #[rstest] fn test_resource_queue( - #[values(RadarrEvent::GetDownloads, RadarrEvent::DeleteDownload(0))] event: RadarrEvent, + #[values(RadarrEvent::GetDownloads(0), RadarrEvent::DeleteDownload(0))] event: RadarrEvent, ) { assert_str_eq!(event.resource(), "/queue"); } @@ -1859,15 +1859,15 @@ mod test { None, Some(downloads_response_json), None, - RadarrEvent::GetDownloads, - None, + RadarrEvent::GetDownloads(500), None, + Some("pageSize=500"), ) .await; let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); if let RadarrSerdeable::DownloadsResponse(downloads) = network - .handle_radarr_event(RadarrEvent::GetDownloads) + .handle_radarr_event(RadarrEvent::GetDownloads(500)) .await .unwrap() {