From 43410fac60ac864cc3e209321a79cdbe50eba852 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 17 Dec 2024 21:34:14 -0700 Subject: [PATCH] fix(radarr): Pass the movie ID alongside all UpdateAndScan events published to the networking channel --- .cargo-husky/hooks/pre-commit | 3 + .cargo-husky/hooks/pre-push | 3 + src/cli/radarr/radarr_command_tests.rs | 2 +- src/cli/radarr/refresh_command_handler.rs | 2 +- .../radarr/refresh_command_handler_tests.rs | 2 +- .../library/movie_details_handler.rs | 6 +- .../library/movie_details_handler_tests.rs | 10 +- .../radarr_handler_test_utils.rs | 65 +------------ src/network/radarr_network.rs | 28 +----- src/network/radarr_network_tests.rs | 97 +------------------ 10 files changed, 26 insertions(+), 192 deletions(-) diff --git a/.cargo-husky/hooks/pre-commit b/.cargo-husky/hooks/pre-commit index 103fa60..91a6fe1 100755 --- a/.cargo-husky/hooks/pre-commit +++ b/.cargo-husky/hooks/pre-commit @@ -4,6 +4,9 @@ set -e echo "Running pre-push hook:" +echo "Executing: cargo fmt" +cargo fmt + echo "Executing: make lint" make lint diff --git a/.cargo-husky/hooks/pre-push b/.cargo-husky/hooks/pre-push index 103fa60..1160efc 100755 --- a/.cargo-husky/hooks/pre-push +++ b/.cargo-husky/hooks/pre-push @@ -4,6 +4,9 @@ set -e echo "Running pre-push hook:" +echo "Executing: cargo fmt --check" +cargo fmt --check + echo "Executing: make lint" make lint diff --git a/src/cli/radarr/radarr_command_tests.rs b/src/cli/radarr/radarr_command_tests.rs index e49a52a..11a41b6 100644 --- a/src/cli/radarr/radarr_command_tests.rs +++ b/src/cli/radarr/radarr_command_tests.rs @@ -680,7 +680,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::UpdateAndScan(Some(expected_movie_id)).into(), + RadarrEvent::UpdateAndScan(expected_movie_id).into(), )) .times(1) .returning(|_| { diff --git a/src/cli/radarr/refresh_command_handler.rs b/src/cli/radarr/refresh_command_handler.rs index f329249..d871be4 100644 --- a/src/cli/radarr/refresh_command_handler.rs +++ b/src/cli/radarr/refresh_command_handler.rs @@ -88,7 +88,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrRefreshCommand> RadarrRefreshCommand::Movie { movie_id } => { let resp = self .network - .handle_network_event(RadarrEvent::UpdateAndScan(Some(movie_id)).into()) + .handle_network_event(RadarrEvent::UpdateAndScan(movie_id).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/radarr/refresh_command_handler_tests.rs b/src/cli/radarr/refresh_command_handler_tests.rs index 3c43830..25fe01c 100644 --- a/src/cli/radarr/refresh_command_handler_tests.rs +++ b/src/cli/radarr/refresh_command_handler_tests.rs @@ -112,7 +112,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::UpdateAndScan(Some(expected_movie_id)).into(), + RadarrEvent::UpdateAndScan(expected_movie_id).into(), )) .times(1) .returning(|_| { diff --git a/src/handlers/radarr_handlers/library/movie_details_handler.rs b/src/handlers/radarr_handlers/library/movie_details_handler.rs index f9c7218..a379952 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler.rs @@ -278,7 +278,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< } ActiveRadarrBlock::UpdateAndScanPrompt => { if self.app.data.radarr_data.prompt_confirm { - self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None)); + self.app.data.radarr_data.prompt_confirm_action = + Some(RadarrEvent::UpdateAndScan(self.extract_movie_id())); } self.app.pop_navigation_stack(); @@ -371,7 +372,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< } ActiveRadarrBlock::UpdateAndScanPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => { self.app.data.radarr_data.prompt_confirm = true; - self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None)); + self.app.data.radarr_data.prompt_confirm_action = + Some(RadarrEvent::UpdateAndScan(self.extract_movie_id())); self.app.pop_navigation_stack(); } diff --git a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs index 152bd9b..66f321d 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -363,10 +363,7 @@ mod tests { ActiveRadarrBlock::AutomaticallySearchMoviePrompt, RadarrEvent::TriggerAutomaticSearch(1) )] - #[case( - ActiveRadarrBlock::UpdateAndScanPrompt, - RadarrEvent::UpdateAndScan(None) - )] + #[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan(1))] #[case( ActiveRadarrBlock::ManualSearchConfirmPrompt, RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody { @@ -784,10 +781,7 @@ mod tests { ActiveRadarrBlock::AutomaticallySearchMoviePrompt, RadarrEvent::TriggerAutomaticSearch(1) )] - #[case( - ActiveRadarrBlock::UpdateAndScanPrompt, - RadarrEvent::UpdateAndScan(None) - )] + #[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan(1))] #[case( ActiveRadarrBlock::ManualSearchConfirmPrompt, RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody { diff --git a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs index d9d3cfc..5c18dee 100644 --- a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs +++ b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs @@ -2,10 +2,9 @@ #[macro_use] pub(in crate::handlers::radarr_handlers) mod utils { use crate::models::radarr_models::{ - AddMovieBody, AddMovieOptions, AddMovieSearchResult, BlocklistItem, BlocklistItemMovie, - Collection, CollectionMovie, Credit, CreditType, DownloadRecord, DownloadsResponse, - IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, MovieFile, - MovieHistoryItem, RadarrRelease, Rating, RatingsList, + AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie, + DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, + MovieFile, RadarrRelease, Rating, RatingsList, }; use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, @@ -305,28 +304,6 @@ pub(in crate::handlers::radarr_handlers) mod utils { } } - pub fn blocklist_item() -> BlocklistItem { - BlocklistItem { - id: 1, - movie_id: 1, - source_title: "z movie".to_owned(), - languages: vec![language()], - quality: quality_wrapper(), - custom_formats: Some(vec![language()]), - date: DateTime::from(DateTime::parse_from_rfc3339("2024-02-10T07:28:45Z").unwrap()), - protocol: "usenet".to_owned(), - indexer: "DrunkenSlug (Prowlarr)".to_owned(), - message: "test message".to_owned(), - movie: blocklist_item_movie(), - } - } - - pub fn blocklist_item_movie() -> BlocklistItemMovie { - BlocklistItemMovie { - title: "Test".into(), - } - } - pub fn collection() -> Collection { Collection { id: 123, @@ -422,16 +399,6 @@ pub(in crate::handlers::radarr_handlers) mod utils { } } - pub fn movie_history_item() -> MovieHistoryItem { - MovieHistoryItem { - source_title: HorizontallyScrollableText::from("Test"), - quality: quality_wrapper(), - languages: vec![language()], - date: DateTime::from(DateTime::parse_from_rfc3339("2022-12-30T07:37:56Z").unwrap()), - event_type: "grabbed".to_owned(), - } - } - pub fn download_record() -> DownloadRecord { DownloadRecord { title: "Test Download Title".to_owned(), @@ -446,12 +413,6 @@ pub(in crate::handlers::radarr_handlers) mod utils { } } - pub fn downloads_response() -> DownloadsResponse { - DownloadsResponse { - records: vec![download_record()], - } - } - pub fn root_folder() -> RootFolder { RootFolder { id: 1, @@ -462,26 +423,6 @@ pub(in crate::handlers::radarr_handlers) mod utils { } } - pub fn cast_credit() -> Credit { - Credit { - person_name: "Madison Clarke".to_owned(), - character: Some("Johnny Blaze".to_owned()), - department: None, - job: None, - credit_type: CreditType::Cast, - } - } - - pub fn crew_credit() -> Credit { - Credit { - person_name: "Alex Clarke".to_owned(), - character: None, - department: Some("Music".to_owned()), - job: Some("Composition".to_owned()), - credit_type: CreditType::Crew, - } - } - pub fn indexer() -> Indexer { Indexer { enable_rss: true, diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index f109672..3d5cd3d 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -75,7 +75,7 @@ pub enum RadarrEvent { TestAllIndexers, TriggerAutomaticSearch(i64), UpdateAllMovies, - UpdateAndScan(Option), + UpdateAndScan(i64), UpdateCollections, UpdateDownloads, } @@ -1778,13 +1778,12 @@ impl<'a, 'b> Network<'a, 'b> { .await } - async fn update_and_scan_movie(&mut self, movie_id: Option) -> Result { - let (id, _) = self.extract_movie_id(movie_id).await; - let event = RadarrEvent::UpdateAndScan(None); - info!("Updating and scanning movie with ID: {id}"); + async fn update_and_scan_movie(&mut self, movie_id: i64) -> Result { + let event = RadarrEvent::UpdateAndScan(movie_id); + info!("Updating and scanning movie with ID: {movie_id}"); let body = MovieCommandBody { name: "RefreshMovie".to_owned(), - movie_ids: vec![id], + movie_ids: vec![movie_id], }; let request_props = self @@ -1857,23 +1856,6 @@ impl<'a, 'b> Network<'a, 'b> { }) .collect() } - - async fn extract_movie_id(&mut self, movie_id: Option) -> (i64, String) { - let movie_id = if let Some(id) = movie_id { - id - } else { - self - .app - .lock() - .await - .data - .radarr_data - .movies - .current_selection() - .id - }; - (movie_id, format!("movieId={movie_id}")) - } } fn get_movie_status(has_file: bool, downloads_vec: &[DownloadRecord], movie_id: i64) -> String { diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 31c281b..ed1b898 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -216,7 +216,7 @@ mod test { RadarrEvent::StartTask(RadarrTaskName::default()), RadarrEvent::GetQueuedEvents, RadarrEvent::TriggerAutomaticSearch(0), - RadarrEvent::UpdateAndScan(None), + RadarrEvent::UpdateAndScan(0), RadarrEvent::UpdateAllMovies, RadarrEvent::UpdateDownloads, RadarrEvent::UpdateCollections @@ -988,39 +988,7 @@ mod test { })), Some(json!({})), None, - RadarrEvent::UpdateAndScan(None), - None, - None, - ) - .await; - app_arc - .lock() - .await - .data - .radarr_data - .movies - .set_items(vec![movie()]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - assert!(network - .handle_radarr_event(RadarrEvent::UpdateAndScan(None)) - .await - .is_ok()); - - async_server.assert_async().await; - } - - #[tokio::test] - async fn test_handle_update_and_scan_movie_event_uses_provied_movie_id() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "name": "RefreshMovie", - "movieIds": [ 1 ] - })), - Some(json!({})), - None, - RadarrEvent::UpdateAndScan(None), + RadarrEvent::UpdateAndScan(1), None, None, ) @@ -1028,7 +996,7 @@ mod test { let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_radarr_event(RadarrEvent::UpdateAndScan(Some(1))) + .handle_radarr_event(RadarrEvent::UpdateAndScan(1)) .await .is_ok()); @@ -3954,65 +3922,6 @@ mod test { ); } - #[tokio::test] - async fn test_extract_movie_id() { - let app_arc = Arc::new(Mutex::new(App::default())); - app_arc - .lock() - .await - .data - .radarr_data - .movies - .set_items(vec![Movie { - id: 1, - ..Movie::default() - }]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - let (id, movie_id_param) = network.extract_movie_id(None).await; - - assert_eq!(id, 1); - assert_str_eq!(movie_id_param, "movieId=1"); - } - - #[tokio::test] - async fn test_extract_movie_id_uses_provided_id() { - let app_arc = Arc::new(Mutex::new(App::default())); - app_arc - .lock() - .await - .data - .radarr_data - .movies - .set_items(vec![Movie { - id: 1, - ..Movie::default() - }]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - let (id, movie_id_param) = network.extract_movie_id(Some(2)).await; - - assert_eq!(id, 2); - assert_str_eq!(movie_id_param, "movieId=2"); - } - - #[tokio::test] - async fn test_extract_movie_id_filtered_movies() { - let app_arc = Arc::new(Mutex::new(App::default())); - let mut filtered_movies = StatefulTable::default(); - filtered_movies.set_filtered_items(vec![Movie { - id: 1, - ..Movie::default() - }]); - app_arc.lock().await.data.radarr_data.movies = filtered_movies; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - let (id, movie_id_param) = network.extract_movie_id(None).await; - - assert_eq!(id, 1); - assert_str_eq!(movie_id_param, "movieId=1"); - } - #[test] fn test_get_movie_status_downloaded() { assert_str_eq!(get_movie_status(true, &[], 0), "Downloaded");