diff --git a/src/app/radarr.rs b/src/app/radarr.rs index 5caf7ad..4575bf9 100644 --- a/src/app/radarr.rs +++ b/src/app/radarr.rs @@ -395,54 +395,20 @@ impl App { } #[cfg(test)] -mod radarr_data_tests { - use pretty_assertions::assert_eq; +#[macro_use] +pub mod radarr_test_utils { + use crate::app::radarr::RadarrData; + use crate::models::radarr_models::{ + AddMovieSearchResult, Collection, CollectionMovie, Credit, MinimumAvailability, Monitor, Movie, + MovieHistoryItem, Release, + }; + use crate::models::ScrollableText; - use super::*; - - #[test] - fn test_reset_movie_collection_table() { - let mut radarr_data = RadarrData::default(); - radarr_data - .collection_movies - .set_items(vec![CollectionMovie::default()]); - - radarr_data.reset_movie_collection_table(); - - assert!(radarr_data.collection_movies.items.is_empty()); - } - - #[test] - fn test_reset_search() { + pub fn create_test_radarr_data() -> RadarrData { let mut radarr_data = RadarrData { is_searching: true, search: "test search".to_owned(), filter: "test filter".to_owned(), - ..RadarrData::default() - }; - radarr_data - .filtered_movies - .set_items(vec![Movie::default()]); - radarr_data - .filtered_collections - .set_items(vec![Collection::default()]); - radarr_data - .add_searched_movies - .set_items(vec![AddMovieSearchResult::default()]); - - radarr_data.reset_search(); - - assert!(!radarr_data.is_searching); - assert!(radarr_data.search.is_empty()); - assert!(radarr_data.filter.is_empty()); - assert!(radarr_data.filtered_movies.items.is_empty()); - assert!(radarr_data.filtered_collections.items.is_empty()); - assert!(radarr_data.add_searched_movies.items.is_empty()); - } - - #[test] - fn test_reset_movie_info_tabs() { - let mut radarr_data = RadarrData { file_details: "test file details".to_owned(), audio_details: "test audio details".to_owned(), video_details: "test video details".to_owned(), @@ -458,23 +424,6 @@ mod radarr_data_tests { .movie_releases .set_items(vec![Release::default()]); radarr_data.movie_info_tabs.index = 1; - - radarr_data.reset_movie_info_tabs(); - - assert!(radarr_data.file_details.is_empty()); - assert!(radarr_data.audio_details.is_empty()); - assert!(radarr_data.video_details.is_empty()); - assert!(radarr_data.movie_details.get_text().is_empty()); - assert!(radarr_data.movie_history.items.is_empty()); - assert!(radarr_data.movie_cast.items.is_empty()); - assert!(radarr_data.movie_crew.items.is_empty()); - assert!(radarr_data.movie_releases.items.is_empty()); - assert_eq!(radarr_data.movie_info_tabs.index, 0); - } - - #[test] - fn test_reset_add_movie_selections() { - let mut radarr_data = RadarrData::default(); radarr_data .add_movie_monitor_list .set_items(vec![Monitor::default()]); @@ -484,15 +433,109 @@ mod radarr_data_tests { radarr_data .add_movie_quality_profile_list .set_items(vec![String::default()]); + radarr_data + .filtered_movies + .set_items(vec![Movie::default()]); + radarr_data + .filtered_collections + .set_items(vec![Collection::default()]); + radarr_data + .add_searched_movies + .set_items(vec![AddMovieSearchResult::default()]); + radarr_data + .collection_movies + .set_items(vec![CollectionMovie::default()]); + + radarr_data + } + + #[macro_export] + macro_rules! assert_movie_collection_table_reset { + ($radarr_data:expr) => { + assert!($radarr_data.collection_movies.items.is_empty()); + }; + } + + #[macro_export] + macro_rules! assert_search_reset { + ($radarr_data:expr) => { + assert!(!$radarr_data.is_searching); + assert!($radarr_data.search.is_empty()); + assert!($radarr_data.filter.is_empty()); + assert!($radarr_data.filtered_movies.items.is_empty()); + assert!($radarr_data.filtered_collections.items.is_empty()); + assert!($radarr_data.add_searched_movies.items.is_empty()); + }; + } + + #[macro_export] + macro_rules! assert_movie_info_tabs_reset { + ($radarr_data:expr) => { + assert!($radarr_data.file_details.is_empty()); + assert!($radarr_data.audio_details.is_empty()); + assert!($radarr_data.video_details.is_empty()); + assert!($radarr_data.movie_details.get_text().is_empty()); + assert!($radarr_data.movie_history.items.is_empty()); + assert!($radarr_data.movie_cast.items.is_empty()); + assert!($radarr_data.movie_crew.items.is_empty()); + assert!($radarr_data.movie_releases.items.is_empty()); + assert_eq!($radarr_data.movie_info_tabs.index, 0); + }; + } + + #[macro_export] + macro_rules! assert_add_movie_selections_reset { + ($radarr_data:expr) => { + assert!($radarr_data.add_movie_monitor_list.items.is_empty()); + assert!($radarr_data + .add_movie_minimum_availability_list + .items + .is_empty()); + assert!($radarr_data.add_movie_quality_profile_list.items.is_empty()); + }; + } +} + +#[cfg(test)] +mod radarr_data_tests { + use pretty_assertions::assert_eq; + + use crate::app::radarr::radarr_test_utils::create_test_radarr_data; + + #[test] + fn test_reset_movie_collection_table() { + let mut radarr_data = create_test_radarr_data(); + + radarr_data.reset_movie_collection_table(); + + assert_movie_collection_table_reset!(radarr_data); + } + + #[test] + fn test_reset_search() { + let mut radarr_data = create_test_radarr_data(); + + radarr_data.reset_search(); + + assert_search_reset!(radarr_data); + } + + #[test] + fn test_reset_movie_info_tabs() { + let mut radarr_data = create_test_radarr_data(); + + radarr_data.reset_movie_info_tabs(); + + assert_movie_info_tabs_reset!(radarr_data); + } + + #[test] + fn test_reset_add_movie_selections() { + let mut radarr_data = create_test_radarr_data(); radarr_data.reset_add_movie_selections(); - assert!(radarr_data.add_movie_monitor_list.items.is_empty()); - assert!(radarr_data - .add_movie_minimum_availability_list - .items - .is_empty()); - assert!(radarr_data.add_movie_quality_profile_list.items.is_empty()); + assert_add_movie_selections_reset!(radarr_data); } } diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 5bb1983..353967e 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -109,6 +109,18 @@ mod test_utils { }, ] }; + ($name:ident, $title_ident:ident, $field:ident) => { + vec![ + $name { + $field: $title_ident::from("Test 1".to_owned()), + ..$name::default() + }, + $name { + $field: $title_ident::from("Test 2".to_owned()), + ..$name::default() + }, + ] + }; } #[macro_export] @@ -145,6 +157,22 @@ mod test_utils { }, ] }; + ($name:ident, $title_ident:ident, $field:ident) => { + vec![ + $name { + $field: $title_ident::from("Test 1".to_owned()), + ..$name::default() + }, + $name { + $field: $title_ident::from("Test 2".to_owned()), + ..$name::default() + }, + $name { + $field: $title_ident::from("Test 3".to_owned()), + ..$name::default() + }, + ] + }; } #[macro_export] diff --git a/src/handlers/radarr_handlers/add_movie_handler.rs b/src/handlers/radarr_handlers/add_movie_handler.rs index 7cb5dba..3639a37 100644 --- a/src/handlers/radarr_handlers/add_movie_handler.rs +++ b/src/handlers/radarr_handlers/add_movie_handler.rs @@ -551,9 +551,10 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::app::radarr::RadarrData; - use crate::models::radarr_models::{Collection, Movie}; - use crate::simple_stateful_iterable_vec; + use crate::app::radarr::radarr_test_utils::create_test_radarr_data; + use crate::{ + assert_add_movie_selections_reset, assert_search_reset, simple_stateful_iterable_vec, + }; use super::*; @@ -561,23 +562,8 @@ mod tests { #[test] fn test_add_movie_search_input_esc() { - let mut radarr_data = RadarrData { - is_searching: true, - search: "test search".to_owned(), - filter: "test filter".to_owned(), - ..RadarrData::default() - }; - radarr_data - .filtered_movies - .set_items(vec![Movie::default()]); - radarr_data - .filtered_collections - .set_items(vec![Collection::default()]); - radarr_data - .add_searched_movies - .set_items(vec![AddMovieSearchResult::default()]); let mut app = App::default(); - app.data.radarr_data = radarr_data; + app.data.radarr_data = create_test_radarr_data(); app.should_ignore_quit_key = true; app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into()); @@ -585,12 +571,7 @@ mod tests { assert!(!app.should_ignore_quit_key); assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into()); - assert!(!app.data.radarr_data.is_searching); - assert!(app.data.radarr_data.search.is_empty()); - assert!(app.data.radarr_data.filter.is_empty()); - assert!(app.data.radarr_data.filtered_movies.items.is_empty()); - assert!(app.data.radarr_data.filtered_collections.items.is_empty()); - assert!(app.data.radarr_data.add_searched_movies.items.is_empty()); + assert_search_reset!(app.data.radarr_data); } #[test] @@ -624,19 +605,8 @@ mod tests { #[test] fn test_add_movie_prompt_esc() { - let mut radarr_data = RadarrData::default(); - radarr_data - .add_movie_monitor_list - .set_items(vec![Monitor::default()]); - radarr_data - .add_movie_minimum_availability_list - .set_items(vec![MinimumAvailability::default()]); - radarr_data - .add_movie_quality_profile_list - .set_items(vec![String::default()]); - radarr_data.prompt_confirm = true; let mut app = App::default(); - app.data.radarr_data = radarr_data; + app.data.radarr_data = create_test_radarr_data(); app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchResults.into()); app.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into()); @@ -647,19 +617,7 @@ mod tests { app.get_current_route(), &ActiveRadarrBlock::AddMovieSearchResults.into() ); - assert!(app.data.radarr_data.add_movie_monitor_list.items.is_empty()); - assert!(app - .data - .radarr_data - .add_movie_minimum_availability_list - .items - .is_empty()); - assert!(app - .data - .radarr_data - .add_movie_quality_profile_list - .items - .is_empty()); + assert_add_movie_selections_reset!(app.data.radarr_data); } #[rstest] diff --git a/src/handlers/radarr_handlers/mod.rs b/src/handlers/radarr_handlers/mod.rs index a572348..9c38a8a 100644 --- a/src/handlers/radarr_handlers/mod.rs +++ b/src/handlers/radarr_handlers/mod.rs @@ -914,8 +914,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::app::radarr::RadarrData; - use crate::models::radarr_models::AddMovieSearchResult; + use crate::app::radarr::radarr_test_utils::create_test_radarr_data; + use crate::assert_search_reset; use super::*; @@ -934,33 +934,13 @@ mod tests { app.should_ignore_quit_key = true; app.push_navigation_stack(base_block.clone().into()); app.push_navigation_stack(search_block.clone().into()); - let mut radarr_data = RadarrData { - is_searching: true, - search: "test search".to_owned(), - filter: "test filter".to_owned(), - ..RadarrData::default() - }; - radarr_data - .filtered_movies - .set_items(vec![Movie::default()]); - radarr_data - .filtered_collections - .set_items(vec![Collection::default()]); - radarr_data - .add_searched_movies - .set_items(vec![AddMovieSearchResult::default()]); - app.data.radarr_data = radarr_data; + app.data.radarr_data = create_test_radarr_data(); RadarrHandler::with(&ESC_KEY, &mut app, &search_block).handle(); assert_eq!(app.get_current_route(), &base_block.into()); assert!(!app.should_ignore_quit_key); - assert!(!app.data.radarr_data.is_searching); - assert!(app.data.radarr_data.search.is_empty()); - assert!(app.data.radarr_data.filter.is_empty()); - assert!(app.data.radarr_data.filtered_movies.items.is_empty()); - assert!(app.data.radarr_data.filtered_collections.items.is_empty()); - assert!(app.data.radarr_data.add_searched_movies.items.is_empty()); + assert_search_reset!(app.data.radarr_data); } #[rstest] @@ -996,22 +976,7 @@ mod tests { app.error = "test error".to_owned().into(); app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); - let mut radarr_data = RadarrData { - is_searching: true, - search: "test search".to_owned(), - filter: "test filter".to_owned(), - ..RadarrData::default() - }; - radarr_data - .filtered_movies - .set_items(vec![Movie::default()]); - radarr_data - .filtered_collections - .set_items(vec![Collection::default()]); - radarr_data - .add_searched_movies - .set_items(vec![AddMovieSearchResult::default()]); - app.data.radarr_data = radarr_data; + app.data.radarr_data = create_test_radarr_data(); RadarrHandler::with(&ESC_KEY, &mut app, &ActiveRadarrBlock::Downloads).handle(); @@ -1020,12 +985,7 @@ mod tests { &ActiveRadarrBlock::Downloads.into() ); assert!(app.error.text.is_empty()); - assert!(!app.data.radarr_data.is_searching); - assert!(app.data.radarr_data.search.is_empty()); - assert!(app.data.radarr_data.filter.is_empty()); - assert!(app.data.radarr_data.filtered_movies.items.is_empty()); - assert!(app.data.radarr_data.filtered_collections.items.is_empty()); - assert!(app.data.radarr_data.add_searched_movies.items.is_empty()); + assert_search_reset!(app.data.radarr_data); } } @@ -1332,4 +1292,22 @@ mod tests { ) { test_handler_delegation!(ActiveRadarrBlock::Collections, active_radarr_block); } + + #[rstest] + fn test_delegate_movie_details_blocks_to_movie_details_handler( + #[values( + ActiveRadarrBlock::MovieDetails, + ActiveRadarrBlock::MovieHistory, + ActiveRadarrBlock::FileInfo, + ActiveRadarrBlock::Cast, + ActiveRadarrBlock::Crew, + ActiveRadarrBlock::AutomaticallySearchMoviePrompt, + ActiveRadarrBlock::RefreshAndScanPrompt, + ActiveRadarrBlock::ManualSearch, + ActiveRadarrBlock::ManualSearchConfirmPrompt + )] + active_radarr_block: ActiveRadarrBlock, + ) { + test_handler_delegation!(ActiveRadarrBlock::Movies, active_radarr_block); + } } diff --git a/src/handlers/radarr_handlers/movie_details_handler.rs b/src/handlers/radarr_handlers/movie_details_handler.rs index 885186f..6f0eec2 100644 --- a/src/handlers/radarr_handlers/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/movie_details_handler.rs @@ -197,3 +197,422 @@ impl<'a> KeyEventHandler<'a, ActiveRadarrBlock> for MovieDetailsHandler<'a> { } } } + +#[cfg(test)] +mod tests { + use pretty_assertions::assert_str_eq; + + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::radarr::ActiveRadarrBlock; + use crate::app::App; + use crate::event::Key; + use crate::handlers::radarr_handlers::movie_details_handler::MovieDetailsHandler; + use crate::handlers::KeyEventHandler; + use crate::models::radarr_models::{Credit, MovieHistoryItem, Release}; + use crate::models::{HorizontallyScrollableText, ScrollableText}; + + mod test_handle_scroll_up_and_down { + use pretty_assertions::assert_eq; + use rstest::rstest; + + use crate::{simple_stateful_iterable_vec, test_iterable_scroll}; + + use super::*; + + #[test] + fn test_movie_details_scroll() { + let mut app = App::default(); + app.data.radarr_data.movie_details = ScrollableText::with_string("Test 1\nTest 2".to_owned()); + + MovieDetailsHandler::with( + &DEFAULT_KEYBINDINGS.up.key, + &mut app, + &ActiveRadarrBlock::MovieDetails, + ) + .handle(); + + assert_eq!(app.data.radarr_data.movie_details.offset, 0); + + MovieDetailsHandler::with( + &DEFAULT_KEYBINDINGS.down.key, + &mut app, + &ActiveRadarrBlock::MovieDetails, + ) + .handle(); + + assert_eq!(app.data.radarr_data.movie_details.offset, 1); + } + + test_iterable_scroll!( + test_movie_history_scroll, + MovieDetailsHandler, + movie_history, + simple_stateful_iterable_vec!(MovieHistoryItem, HorizontallyScrollableText, source_title), + ActiveRadarrBlock::MovieHistory, + source_title, + stationary_style + ); + + test_iterable_scroll!( + test_cast_scroll, + MovieDetailsHandler, + movie_cast, + simple_stateful_iterable_vec!(Credit, String, person_name), + ActiveRadarrBlock::Cast, + person_name, + to_owned + ); + + test_iterable_scroll!( + test_crew_scroll, + MovieDetailsHandler, + movie_crew, + simple_stateful_iterable_vec!(Credit, String, person_name), + ActiveRadarrBlock::Crew, + person_name, + to_owned + ); + + test_iterable_scroll!( + test_manual_search_scroll, + MovieDetailsHandler, + movie_releases, + simple_stateful_iterable_vec!(Release, HorizontallyScrollableText), + ActiveRadarrBlock::ManualSearch, + title, + stationary_style + ); + } + + mod test_handle_home_end { + use crate::{extended_stateful_iterable_vec, test_iterable_home_and_end}; + + use super::*; + + #[test] + fn test_movie_details_home_end() { + let mut app = App::default(); + app.data.radarr_data.movie_details = ScrollableText::with_string("Test 1\nTest 2".to_owned()); + + MovieDetailsHandler::with( + &DEFAULT_KEYBINDINGS.end.key, + &mut app, + &ActiveRadarrBlock::MovieDetails, + ) + .handle(); + + assert_eq!(app.data.radarr_data.movie_details.offset, 1); + + MovieDetailsHandler::with( + &DEFAULT_KEYBINDINGS.home.key, + &mut app, + &ActiveRadarrBlock::MovieDetails, + ) + .handle(); + + assert_eq!(app.data.radarr_data.movie_details.offset, 0); + } + + test_iterable_home_and_end!( + test_movie_history_home_end, + MovieDetailsHandler, + movie_history, + extended_stateful_iterable_vec!(MovieHistoryItem, HorizontallyScrollableText, source_title), + ActiveRadarrBlock::MovieHistory, + source_title, + stationary_style + ); + + test_iterable_home_and_end!( + test_cast_home_end, + MovieDetailsHandler, + movie_cast, + extended_stateful_iterable_vec!(Credit, String, person_name), + ActiveRadarrBlock::Cast, + person_name, + to_owned + ); + + test_iterable_home_and_end!( + test_crew_home_end, + MovieDetailsHandler, + movie_crew, + extended_stateful_iterable_vec!(Credit, String, person_name), + ActiveRadarrBlock::Crew, + person_name, + to_owned + ); + + test_iterable_home_and_end!( + test_manual_search_home_end, + MovieDetailsHandler, + movie_releases, + extended_stateful_iterable_vec!(Release, HorizontallyScrollableText), + ActiveRadarrBlock::ManualSearch, + title, + stationary_style + ); + } + + mod test_handle_left_right_action { + use pretty_assertions::assert_eq; + use rstest::rstest; + + use super::*; + + #[rstest] + fn test_left_right_prompt_toggle( + #[values( + ActiveRadarrBlock::AutomaticallySearchMoviePrompt, + ActiveRadarrBlock::RefreshAndScanPrompt, + ActiveRadarrBlock::ManualSearchConfirmPrompt + )] + active_radarr_block: ActiveRadarrBlock, + #[values(Key::Left, Key::Right)] key: Key, + ) { + let mut app = App::default(); + + MovieDetailsHandler::with(&key, &mut app, &active_radarr_block).handle(); + + assert!(app.data.radarr_data.prompt_confirm); + + MovieDetailsHandler::with(&key, &mut app, &active_radarr_block).handle(); + + assert!(!app.data.radarr_data.prompt_confirm); + } + + #[rstest] + #[case(ActiveRadarrBlock::MovieDetails, ActiveRadarrBlock::MovieHistory)] + #[case(ActiveRadarrBlock::MovieHistory, ActiveRadarrBlock::FileInfo)] + #[case(ActiveRadarrBlock::FileInfo, ActiveRadarrBlock::Cast)] + #[case(ActiveRadarrBlock::Cast, ActiveRadarrBlock::Crew)] + #[case(ActiveRadarrBlock::Crew, ActiveRadarrBlock::ManualSearch)] + #[case(ActiveRadarrBlock::ManualSearch, ActiveRadarrBlock::MovieDetails)] + fn test_movie_info_tabs_left_right_action( + #[case] left_block: ActiveRadarrBlock, + #[case] right_block: ActiveRadarrBlock, + ) { + let mut app = App::default(); + app.push_navigation_stack(right_block.clone().into()); + app.data.radarr_data.movie_info_tabs.index = app + .data + .radarr_data + .movie_info_tabs + .tabs + .iter() + .position(|tab_route| tab_route.route == right_block.clone().into()) + .unwrap_or_default(); + + MovieDetailsHandler::with(&DEFAULT_KEYBINDINGS.left.key, &mut app, &right_block).handle(); + + assert_eq!( + app.get_current_route(), + app.data.radarr_data.movie_info_tabs.get_active_route() + ); + assert_eq!(app.get_current_route(), &left_block.clone().into()); + + MovieDetailsHandler::with(&DEFAULT_KEYBINDINGS.right.key, &mut app, &left_block).handle(); + + assert_eq!( + app.get_current_route(), + app.data.radarr_data.movie_info_tabs.get_active_route() + ); + assert_eq!(app.get_current_route(), &right_block.into()); + } + } + + mod test_handle_submit { + use pretty_assertions::assert_eq; + use rstest::rstest; + + use crate::network::radarr_network::RadarrEvent; + + use super::*; + + const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; + + #[test] + fn test_manual_search_submit() { + let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::ManualSearch.into()); + + MovieDetailsHandler::with(&SUBMIT_KEY, &mut app, &ActiveRadarrBlock::ManualSearch).handle(); + + assert_eq!( + app.get_current_route(), + &ActiveRadarrBlock::ManualSearchConfirmPrompt.into() + ); + } + + #[rstest] + #[case( + ActiveRadarrBlock::AutomaticallySearchMoviePrompt, + RadarrEvent::TriggerAutomaticSearch + )] + #[case(ActiveRadarrBlock::RefreshAndScanPrompt, RadarrEvent::RefreshAndScan)] + #[case( + ActiveRadarrBlock::ManualSearchConfirmPrompt, + RadarrEvent::DownloadRelease + )] + fn test_movie_info_prompt_confirm_submit( + #[case] prompt_block: ActiveRadarrBlock, + #[case] expected_action: RadarrEvent, + ) { + let mut app = App::default(); + app.data.radarr_data.prompt_confirm = true; + app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); + app.push_navigation_stack(prompt_block.clone().into()); + + MovieDetailsHandler::with(&SUBMIT_KEY, &mut app, &prompt_block).handle(); + + assert!(app.data.radarr_data.prompt_confirm); + assert_eq!( + app.get_current_route(), + &ActiveRadarrBlock::MovieDetails.into() + ); + assert_eq!( + app.data.radarr_data.prompt_confirm_action, + Some(expected_action) + ); + } + + #[rstest] + fn test_movie_info_prompt_decline_submit( + #[values( + ActiveRadarrBlock::AutomaticallySearchMoviePrompt, + ActiveRadarrBlock::RefreshAndScanPrompt, + ActiveRadarrBlock::ManualSearchConfirmPrompt + )] + prompt_block: ActiveRadarrBlock, + ) { + let mut app = App::default(); + app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); + app.push_navigation_stack(prompt_block.clone().into()); + + MovieDetailsHandler::with(&SUBMIT_KEY, &mut app, &prompt_block).handle(); + + assert!(!app.data.radarr_data.prompt_confirm); + assert_eq!( + app.get_current_route(), + &ActiveRadarrBlock::MovieDetails.into() + ); + assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + } + } + + mod test_handle_esc { + use pretty_assertions::assert_eq; + use rstest::rstest; + + use crate::app::radarr::radarr_test_utils::create_test_radarr_data; + use crate::assert_movie_info_tabs_reset; + + use super::*; + + const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; + + #[rstest] + fn test_movie_info_tabs_esc( + #[values( + ActiveRadarrBlock::MovieDetails, + ActiveRadarrBlock::MovieHistory, + ActiveRadarrBlock::FileInfo, + ActiveRadarrBlock::Cast, + ActiveRadarrBlock::Crew, + ActiveRadarrBlock::ManualSearch + )] + active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::default(); + app.data.radarr_data = create_test_radarr_data(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.push_navigation_stack(active_radarr_block.clone().into()); + + MovieDetailsHandler::with(&ESC_KEY, &mut app, &active_radarr_block).handle(); + + assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into()); + assert_movie_info_tabs_reset!(app.data.radarr_data); + } + + #[rstest] + fn test_movie_info_prompts_esc( + #[values( + ActiveRadarrBlock::AutomaticallySearchMoviePrompt, + ActiveRadarrBlock::RefreshAndScanPrompt, + ActiveRadarrBlock::ManualSearchConfirmPrompt + )] + prompt_block: ActiveRadarrBlock, + ) { + let mut app = App::default(); + app.data.radarr_data.prompt_confirm = true; + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.push_navigation_stack(prompt_block.clone().into()); + + MovieDetailsHandler::with(&ESC_KEY, &mut app, &prompt_block).handle(); + + assert!(!app.data.radarr_data.prompt_confirm); + assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into()); + } + } + + mod test_handle_key_char { + use pretty_assertions::assert_eq; + use rstest::rstest; + + use super::*; + + #[rstest] + fn test_search_key( + #[values( + ActiveRadarrBlock::MovieDetails, + ActiveRadarrBlock::MovieHistory, + ActiveRadarrBlock::FileInfo, + ActiveRadarrBlock::Cast, + ActiveRadarrBlock::Crew, + ActiveRadarrBlock::ManualSearch + )] + active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::default(); + + MovieDetailsHandler::with( + &DEFAULT_KEYBINDINGS.search.key, + &mut app, + &active_radarr_block, + ) + .handle(); + + assert_eq!( + app.get_current_route(), + &ActiveRadarrBlock::AutomaticallySearchMoviePrompt.into() + ); + } + + #[rstest] + fn test_refresh_key( + #[values( + ActiveRadarrBlock::MovieDetails, + ActiveRadarrBlock::MovieHistory, + ActiveRadarrBlock::FileInfo, + ActiveRadarrBlock::Cast, + ActiveRadarrBlock::Crew, + ActiveRadarrBlock::ManualSearch + )] + active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::default(); + + MovieDetailsHandler::with( + &DEFAULT_KEYBINDINGS.refresh.key, + &mut app, + &active_radarr_block, + ) + .handle(); + + assert_eq!( + app.get_current_route(), + &ActiveRadarrBlock::RefreshAndScanPrompt.into() + ); + } + } +}