diff --git a/src/cli/radarr/mod.rs b/src/cli/radarr/mod.rs index 6789380..2c26ed6 100644 --- a/src/cli/radarr/mod.rs +++ b/src/cli/radarr/mod.rs @@ -209,7 +209,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrCommand> for RadarrCliHandler<'a, ' }; let resp = self .network - .handle_network_event(RadarrEvent::DownloadRelease(Some(params)).into()) + .handle_network_event(RadarrEvent::DownloadRelease(params).into()) .await?; serde_json::to_string_pretty(&resp)? } diff --git a/src/cli/radarr/radarr_command_tests.rs b/src/cli/radarr/radarr_command_tests.rs index 7faffa2..25edbae 100644 --- a/src/cli/radarr/radarr_command_tests.rs +++ b/src/cli/radarr/radarr_command_tests.rs @@ -313,7 +313,7 @@ mod tests { mock_network .expect_handle_network_event() .with(eq::( - RadarrEvent::DownloadRelease(Some(expected_release_download_body)).into(), + RadarrEvent::DownloadRelease(expected_release_download_body).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 a8d61ac..b0c3e77 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler.rs @@ -6,7 +6,7 @@ use crate::event::Key; use crate::handle_table_events; use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; -use crate::models::radarr_models::{Credit, MovieHistoryItem, RadarrRelease}; +use crate::models::radarr_models::{Credit, MovieHistoryItem, RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS, }; @@ -79,6 +79,32 @@ impl<'a, 'b> MovieDetailsHandler<'a, 'b> { .movie_crew, Credit ); + + fn build_radarr_release_download_body(&self) -> RadarrReleaseDownloadBody { + let movie_id = self.app.data.radarr_data.movies.current_selection().id; + let (guid, indexer_id) = { + let RadarrRelease { + guid, + indexer_id, + .. + } = self.app + .data + .radarr_data + .movie_details_modal + .as_ref() + .unwrap() + .movie_releases + .current_selection(); + + (guid.clone(), *indexer_id) + }; + + RadarrReleaseDownloadBody { + guid, + indexer_id, + movie_id, + } + } } impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> { @@ -260,7 +286,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< ActiveRadarrBlock::ManualSearchConfirmPrompt => { if self.app.data.radarr_data.prompt_confirm { self.app.data.radarr_data.prompt_confirm_action = - Some(RadarrEvent::DownloadRelease(None)); + Some(RadarrEvent::DownloadRelease(self.build_radarr_release_download_body())); } self.app.pop_navigation_stack(); @@ -345,7 +371,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< } ActiveRadarrBlock::ManualSearchConfirmPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => { self.app.data.radarr_data.prompt_confirm = true; - self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DownloadRelease(None)); + self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DownloadRelease(self.build_radarr_release_download_body())); 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 4f7e0ab..d870d28 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -2,7 +2,7 @@ mod tests { use std::cmp::Ordering; - use pretty_assertions::assert_str_eq; + use pretty_assertions::{assert_eq, assert_str_eq}; use rstest::rstest; use serde_json::Number; use strum::IntoEnumIterator; @@ -13,9 +13,10 @@ mod tests { use crate::handlers::radarr_handlers::library::movie_details_handler::{ releases_sorting_options, MovieDetailsHandler, }; + use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{movie, release}; use crate::handlers::KeyEventHandler; - use crate::models::radarr_models::RadarrRelease; use crate::models::radarr_models::{Credit, MovieHistoryItem}; + use crate::models::radarr_models::{RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; @@ -130,6 +131,7 @@ mod tests { mod test_handle_home_end { use crate::models::servarr_data::radarr::modals::MovieDetailsModal; + use pretty_assertions::assert_eq; use super::*; @@ -367,17 +369,30 @@ mod tests { )] #[case( ActiveRadarrBlock::ManualSearchConfirmPrompt, - RadarrEvent::DownloadRelease(None) + RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody { + guid: "1234".to_owned(), + indexer_id: 2, + movie_id: 1, + }) )] fn test_movie_info_prompt_confirm_submit( #[case] prompt_block: ActiveRadarrBlock, #[case] expected_action: RadarrEvent, ) { let mut app = App::default(); - app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal { + let mut movie_details_modal = MovieDetailsModal { movie_details: ScrollableText::with_string("test".to_owned()), ..MovieDetailsModal::default() - }); + }; + movie_details_modal + .movie_releases + .set_items(vec![release()]); + app.data.radarr_data.movie_details_modal = Some(movie_details_modal); + app + .data + .radarr_data + .movies + .set_items(vec![movie()]); app.data.radarr_data.prompt_confirm = true; app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); app.push_navigation_stack(prompt_block.into()); @@ -779,17 +794,31 @@ mod tests { )] #[case( ActiveRadarrBlock::ManualSearchConfirmPrompt, - RadarrEvent::DownloadRelease(None) + RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody { + guid: "1234".to_owned(), + indexer_id: 2, + movie_id: 1, + }) )] fn test_movie_info_prompt_confirm( #[case] prompt_block: ActiveRadarrBlock, #[case] expected_action: RadarrEvent, ) { let mut app = App::default(); - app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal { + let mut movie_details_modal = MovieDetailsModal { movie_details: ScrollableText::with_string("test".to_owned()), ..MovieDetailsModal::default() - }); + }; + movie_details_modal + .movie_releases + .set_items(vec![release()]); + app.data.radarr_data.movie_details_modal = Some(movie_details_modal); + app + .data + .radarr_data + .movies + .set_items(vec![movie()]); + app.data.radarr_data.prompt_confirm = true; app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); app.push_navigation_stack(prompt_block.into()); @@ -813,6 +842,35 @@ mod tests { } } + #[test] + fn test_build_radarr_release_download_body() { + let mut app = App::default(); + let mut movie_details_modal = MovieDetailsModal::default(); + movie_details_modal + .movie_releases + .set_items(vec![release()]); + app.data.radarr_data.movie_details_modal = Some(movie_details_modal); + app + .data + .radarr_data + .movies + .set_items(vec![movie()]); + let expected_body = RadarrReleaseDownloadBody { + guid: "1234".to_owned(), + indexer_id: 2, + movie_id: 1, + }; + + let body = MovieDetailsHandler::with( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveRadarrBlock::ManualSearchConfirmPrompt, + None, + ).build_radarr_release_download_body(); + + assert_eq!(body, expected_body); + } + #[test] fn test_releases_sorting_options_source() { let expected_cmp_fn: fn(&RadarrRelease, &RadarrRelease) -> Ordering = diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 8f58b09..3ad9925 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -45,7 +45,7 @@ pub enum RadarrEvent { DeleteMovie(DeleteMovieParams), DeleteRootFolder(i64), DeleteTag(i64), - DownloadRelease(Option), + DownloadRelease(RadarrReleaseDownloadBody), EditAllIndexerSettings(Option), EditCollection(Option), EditIndexer(Option), @@ -490,44 +490,13 @@ impl<'a, 'b> Network<'a, 'b> { async fn download_radarr_release( &mut self, - params: Option, + params: RadarrReleaseDownloadBody, ) -> Result { - let event = RadarrEvent::DownloadRelease(None); - let body = if let Some(release_download_body) = params { - info!("Downloading Radarr release with params: {release_download_body:?}"); - release_download_body - } else { - let (movie_id, _) = self.extract_movie_id(None).await; - let (guid, title, indexer_id) = { - let app = self.app.lock().await; - let RadarrRelease { - guid, - title, - indexer_id, - .. - } = app - .data - .radarr_data - .movie_details_modal - .as_ref() - .unwrap() - .movie_releases - .current_selection(); - - (guid.clone(), title.clone(), *indexer_id) - }; - - info!("Downloading release: {title}"); - - RadarrReleaseDownloadBody { - guid, - indexer_id, - movie_id, - } - }; + let event = RadarrEvent::DownloadRelease(params.clone()); + info!("Downloading Radarr release with params: {params:?}"); let request_props = self - .request_props_from(event, RequestMethod::Post, Some(body), None, None) + .request_props_from(event, RequestMethod::Post, Some(params), None, None) .await; self diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 777c0e3..e3f746a 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -179,7 +179,7 @@ mod test { #[rstest] fn test_resource_release( - #[values(RadarrEvent::GetReleases(None), RadarrEvent::DownloadRelease(None))] + #[values(RadarrEvent::GetReleases(None), RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody::default()))] event: RadarrEvent, ) { assert_str_eq!(event.resource(), "/release"); @@ -4425,67 +4425,29 @@ mod test { #[tokio::test] async fn test_handle_download_radarr_release_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "guid": "1234", - "indexerId": 2, - "movieId": 1 - })), - Some(json!({})), - None, - RadarrEvent::DownloadRelease(None), - None, - None, - ) - .await; - let mut movie_details_modal = MovieDetailsModal::default(); - movie_details_modal - .movie_releases - .set_items(vec![release()]); - app_arc.lock().await.data.radarr_data.movie_details_modal = Some(movie_details_modal); - 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::DownloadRelease(None)) - .await - .is_ok()); - - async_server.assert_async().await; - } - - #[tokio::test] - async fn test_handle_download_radarr_release_event_uses_provided_params() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "guid": "1234", - "indexerId": 2, - "movieId": 1 - })), - Some(json!({})), - None, - RadarrEvent::DownloadRelease(None), - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - let params = RadarrReleaseDownloadBody { + let expected_body = RadarrReleaseDownloadBody { guid: "1234".to_owned(), indexer_id: 2, movie_id: 1, }; + let (async_server, app_arc, _server) = mock_servarr_api( + RequestMethod::Post, + Some(json!({ + "guid": "1234", + "indexerId": 2, + "movieId": 1 + })), + Some(json!({})), + None, + RadarrEvent::DownloadRelease(expected_body.clone()), + None, + None, + ) + .await; + let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); assert!(network - .handle_radarr_event(RadarrEvent::DownloadRelease(Some(params))) + .handle_radarr_event(RadarrEvent::DownloadRelease(expected_body)) .await .is_ok());