From f8792ea012fd1c355bd20ff4dbe7d7f00a981c5a Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 17 Dec 2024 16:10:11 -0700 Subject: [PATCH] fix(radarr): Build and pass the edit indexer settings body with the EditAllIndexerSettings event when publishing to the networking channel --- src/cli/radarr/edit_command_handler.rs | 2 +- src/cli/radarr/edit_command_handler_tests.rs | 6 +- src/cli/radarr/radarr_command_tests.rs | 2 +- .../indexers/edit_indexer_settings_handler.rs | 18 ++++-- .../edit_indexer_settings_handler_tests.rs | 32 ++++++++--- src/network/radarr_network.rs | 27 ++------- src/network/radarr_network_tests.rs | 55 ++----------------- 7 files changed, 53 insertions(+), 89 deletions(-) diff --git a/src/cli/radarr/edit_command_handler.rs b/src/cli/radarr/edit_command_handler.rs index 0d206d8..3205804 100644 --- a/src/cli/radarr/edit_command_handler.rs +++ b/src/cli/radarr/edit_command_handler.rs @@ -390,7 +390,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrEditCommand> for RadarrEditCommandH }; self .network - .handle_network_event(RadarrEvent::EditAllIndexerSettings(Some(params)).into()) + .handle_network_event(RadarrEvent::EditAllIndexerSettings(params).into()) .await?; "All indexer settings updated".to_owned() } else { diff --git a/src/cli/radarr/edit_command_handler_tests.rs b/src/cli/radarr/edit_command_handler_tests.rs index 5fc2a2a..26672e0 100644 --- a/src/cli/radarr/edit_command_handler_tests.rs +++ b/src/cli/radarr/edit_command_handler_tests.rs @@ -857,7 +857,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::EditAllIndexerSettings(Some(expected_edit_all_indexer_settings)).into(), + RadarrEvent::EditAllIndexerSettings(expected_edit_all_indexer_settings).into(), )) .times(1) .returning(|_| { @@ -928,7 +928,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::EditAllIndexerSettings(Some(expected_edit_all_indexer_settings)).into(), + RadarrEvent::EditAllIndexerSettings(expected_edit_all_indexer_settings).into(), )) .times(1) .returning(|_| { @@ -1000,7 +1000,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::EditAllIndexerSettings(Some(expected_edit_all_indexer_settings)).into(), + RadarrEvent::EditAllIndexerSettings(expected_edit_all_indexer_settings).into(), )) .times(1) .returning(|_| { diff --git a/src/cli/radarr/radarr_command_tests.rs b/src/cli/radarr/radarr_command_tests.rs index 25edbae..67b5eb8 100644 --- a/src/cli/radarr/radarr_command_tests.rs +++ b/src/cli/radarr/radarr_command_tests.rs @@ -584,7 +584,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::EditAllIndexerSettings(Some(expected_edit_all_indexer_settings)).into(), + RadarrEvent::EditAllIndexerSettings(expected_edit_all_indexer_settings).into(), )) .times(1) .returning(|_| { diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs index 046e7b5..266f6e1 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_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::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, }; @@ -19,6 +20,14 @@ pub(super) struct IndexerSettingsHandler<'a, 'b> { _context: Option, } +impl<'a, 'b> IndexerSettingsHandler<'a, 'b> { + fn build_edit_indexer_settings_body(&mut self) -> IndexerSettings { + let indexer_settings = self.app.data.radarr_data.indexer_settings.clone().unwrap(); + self.app.data.radarr_data.indexer_settings = None; + indexer_settings + } +} + impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexerSettingsHandler<'a, 'b> { fn accepts(active_block: ActiveRadarrBlock) -> bool { INDEXER_SETTINGS_BLOCKS.contains(&active_block) @@ -166,12 +175,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexerSettingsHandl ActiveRadarrBlock::AllIndexerSettingsPrompt => { match self.app.data.radarr_data.selected_block.get_active_block() { ActiveRadarrBlock::IndexerSettingsConfirmPrompt => { - let radarr_data = &mut self.app.data.radarr_data; - if radarr_data.prompt_confirm { - radarr_data.prompt_confirm_action = Some(RadarrEvent::EditAllIndexerSettings(None)); + if self.app.data.radarr_data.prompt_confirm { + self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditAllIndexerSettings(self.build_edit_indexer_settings_body())); self.app.should_refresh = true; } else { - radarr_data.indexer_settings = None; + self.app.data.radarr_data.indexer_settings = None; } self.app.pop_navigation_stack(); @@ -259,7 +267,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexerSettingsHandl { self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm_action = - Some(RadarrEvent::EditAllIndexerSettings(None)); + Some(RadarrEvent::EditAllIndexerSettings(self.build_edit_indexer_settings_body())); self.app.should_refresh = true; self.app.pop_navigation_stack(); diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 8d3bddf..dee28d8 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -1,11 +1,13 @@ #[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::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; + use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer_settings; use crate::handlers::KeyEventHandler; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ @@ -472,7 +474,7 @@ mod tests { .radarr_data .selected_block .set_index(0, INDEXER_SETTINGS_SELECTION_BLOCKS.len() - 1); - app.data.radarr_data.indexer_settings = Some(IndexerSettings::default()); + app.data.radarr_data.indexer_settings = Some(indexer_settings()); app.data.radarr_data.prompt_confirm = true; IndexerSettingsHandler::with( @@ -486,9 +488,9 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::EditAllIndexerSettings(None)) + Some(RadarrEvent::EditAllIndexerSettings(indexer_settings())) ); - assert!(app.data.radarr_data.indexer_settings.is_some()); + assert!(app.data.radarr_data.indexer_settings.is_none()); assert!(app.should_refresh); } @@ -858,7 +860,7 @@ mod tests { } mod test_handle_key_char { - use pretty_assertions::assert_str_eq; + use pretty_assertions::{assert_eq, assert_str_eq}; use crate::{ models::{ @@ -937,7 +939,7 @@ mod tests { .radarr_data .selected_block .set_index(0, INDEXER_SETTINGS_SELECTION_BLOCKS.len() - 1); - app.data.radarr_data.indexer_settings = Some(IndexerSettings::default()); + app.data.radarr_data.indexer_settings = Some(indexer_settings()); IndexerSettingsHandler::with( DEFAULT_KEYBINDINGS.confirm.key, @@ -950,9 +952,9 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::EditAllIndexerSettings(None)) + Some(RadarrEvent::EditAllIndexerSettings(indexer_settings())) ); - assert!(app.data.radarr_data.indexer_settings.is_some()); + assert!(app.data.radarr_data.indexer_settings.is_none()); assert!(app.should_refresh); } } @@ -968,6 +970,22 @@ mod tests { }) } + #[test] + fn test_build_edit_indexer_settings_body() { + let mut app = App::default(); + app.data.radarr_data.indexer_settings = Some(indexer_settings()); + + let body = IndexerSettingsHandler::with( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveRadarrBlock::AllIndexerSettingsPrompt, + None, + ).build_edit_indexer_settings_body(); + + assert_eq!(body, indexer_settings()); + assert!(app.data.radarr_data.indexer_settings.is_none()); + } + #[test] fn test_edit_indexer_settings_handler_not_ready_when_loading() { let mut app = App::default(); diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 3ad9925..0322886 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -46,7 +46,7 @@ pub enum RadarrEvent { DeleteRootFolder(i64), DeleteTag(i64), DownloadRelease(RadarrReleaseDownloadBody), - EditAllIndexerSettings(Option), + EditAllIndexerSettings(IndexerSettings), EditCollection(Option), EditIndexer(Option), EditMovie(Option), @@ -506,38 +506,21 @@ impl<'a, 'b> Network<'a, 'b> { async fn edit_all_radarr_indexer_settings( &mut self, - params: Option, + params: IndexerSettings, ) -> Result { info!("Updating Radarr indexer settings"); - let event = RadarrEvent::EditAllIndexerSettings(None); + let event = RadarrEvent::EditAllIndexerSettings(params.clone()); - let body = if let Some(indexer_settings) = params { - indexer_settings - } else { - self - .app - .lock() - .await - .data - .radarr_data - .indexer_settings - .as_ref() - .unwrap() - .clone() - }; - - debug!("Indexer settings body: {body:?}"); + debug!("Indexer settings body: {params:?}"); let request_props = self - .request_props_from(event, RequestMethod::Put, Some(body), None, None) + .request_props_from(event, RequestMethod::Put, Some(params), None, None) .await; let resp = self .handle_request::(request_props, |_, _| {}) .await; - self.app.lock().await.data.radarr_data.indexer_settings = None; - resp } diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index e3f746a..547cb0a 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -15,8 +15,8 @@ mod test { use crate::app::ServarrConfig; use crate::models::radarr_models::{ - AddMovieOptions, BlocklistItem, BlocklistItemMovie, CollectionMovie, MediaInfo, - MinimumAvailability, MovieCollection, MovieFile, Rating, RatingsList, + AddMovieOptions, BlocklistItem, BlocklistItemMovie, CollectionMovie, IndexerSettings, + MediaInfo, MinimumAvailability, MovieCollection, MovieFile, Rating, RatingsList }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_models::{ @@ -146,7 +146,7 @@ mod test { fn test_resource_all_indexer_settings( #[values( RadarrEvent::GetAllIndexerSettings, - RadarrEvent::EditAllIndexerSettings(None) + RadarrEvent::EditAllIndexerSettings(IndexerSettings::default()) )] event: RadarrEvent, ) { @@ -3341,60 +3341,15 @@ mod test { Some(indexer_settings_json), None, None, - RadarrEvent::EditAllIndexerSettings(None), + RadarrEvent::EditAllIndexerSettings(indexer_settings()), None, None, ) .await; - - app_arc.lock().await.data.radarr_data.indexer_settings = Some(indexer_settings()); let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_radarr_event(RadarrEvent::EditAllIndexerSettings(None)) - .await - .is_ok()); - - async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .indexer_settings - .is_none()); - } - - #[tokio::test] - async fn test_handle_edit_all_radarr_indexer_settings_event_uses_provided_settings() { - let indexer_settings_json = json!({ - "minimumAge": 0, - "maximumSize": 0, - "retention": 0, - "rssSyncInterval": 60, - "preferIndexerFlags": false, - "availabilityDelay": 0, - "allowHardcodedSubs": true, - "whitelistedHardcodedSubs": "", - "id": 1 - }); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Put, - Some(indexer_settings_json), - None, - None, - RadarrEvent::EditAllIndexerSettings(None), - None, - None, - ) - .await; - - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - assert!(network - .handle_radarr_event(RadarrEvent::EditAllIndexerSettings( - Some(indexer_settings()) - )) + .handle_radarr_event(RadarrEvent::EditAllIndexerSettings(indexer_settings())) .await .is_ok());