From dd339d168553d336d4319acc888c992893073b4f Mon Sep 17 00:00:00 2001 From: Dark-Alex-17 Date: Tue, 8 Aug 2023 10:50:07 -0600 Subject: [PATCH] Refactored the key_mappings into files for context_clues for better naming conventions, and added unit tests for the clues and the contents of the ActiveRadarrBlock arrays that are used for chain-of-responsibility delegation in the handlers and UI components. --- src/app/app_tests.rs | 6 +- src/app/context_clues.rs | 23 ++ src/app/context_clues_tests.rs | 47 +++ src/app/key_binding.rs | 20 +- src/app/key_binding_tests.rs | 48 ++- src/app/mod.rs | 8 +- src/app/radarr/mod.rs | 43 +-- ...ey_mappings.rs => radarr_context_clues.rs} | 31 +- src/app/radarr/radarr_context_clues_tests.rs | 342 ++++++++++++++++++ src/app/radarr/radarr_tests.rs | 228 ++++++++++-- .../collections/collection_details_ui.rs | 8 +- src/ui/radarr_ui/library/add_movie_ui.rs | 10 +- src/ui/radarr_ui/system/system_details_ui.rs | 10 +- 13 files changed, 710 insertions(+), 114 deletions(-) create mode 100644 src/app/context_clues.rs create mode 100644 src/app/context_clues_tests.rs rename src/app/radarr/{radarr_key_mappings.rs => radarr_context_clues.rs} (76%) create mode 100644 src/app/radarr/radarr_context_clues_tests.rs diff --git a/src/app/app_tests.rs b/src/app/app_tests.rs index e93ca6e..54fbc88 100644 --- a/src/app/app_tests.rs +++ b/src/app/app_tests.rs @@ -4,7 +4,7 @@ mod tests { use pretty_assertions::{assert_eq, assert_str_eq}; use tokio::sync::mpsc; - use crate::app::key_binding::{build_keymapping_string, SERVARR_KEYMAPPINGS}; + use crate::app::context_clues::{build_context_clue_string, SERVARR_CONTEXT_CLUES}; use crate::app::radarr::{ActiveRadarrBlock, RadarrData}; use crate::app::{App, Data, RadarrConfig, DEFAULT_ROUTE}; use crate::models::{HorizontallyScrollableText, Route, TabRoute}; @@ -29,14 +29,14 @@ mod tests { route: ActiveRadarrBlock::Movies.into(), help: format!( "<↑↓> scroll | ←→ change tab | {} ", - build_keymapping_string(&SERVARR_KEYMAPPINGS) + build_context_clue_string(&SERVARR_CONTEXT_CLUES) ), contextual_help: None, }, TabRoute { title: "Sonarr", route: Route::Sonarr, - help: format!("{} ", build_keymapping_string(&SERVARR_KEYMAPPINGS)), + help: format!("{} ", build_context_clue_string(&SERVARR_CONTEXT_CLUES)), contextual_help: None, }, ] diff --git a/src/app/context_clues.rs b/src/app/context_clues.rs new file mode 100644 index 0000000..1bd8182 --- /dev/null +++ b/src/app/context_clues.rs @@ -0,0 +1,23 @@ +use crate::app::key_binding::{KeyBinding, DEFAULT_KEYBINDINGS}; + +#[cfg(test)] +#[path = "context_clues_tests.rs"] +mod context_clues_tests; + +pub(in crate::app) type ContextClue = (KeyBinding, &'static str); + +pub fn build_context_clue_string(context_clues: &[(KeyBinding, &str)]) -> String { + context_clues + .iter() + .map(|(key_binding, desc)| format!("{} {}", key_binding.key, desc)) + .collect::>() + .join(" | ") +} + +pub static SERVARR_CONTEXT_CLUES: [ContextClue; 2] = [ + (DEFAULT_KEYBINDINGS.tab, "change servarr"), + (DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc), +]; + +pub static BARE_POPUP_CONTEXT_CLUES: [ContextClue; 1] = + [(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc)]; diff --git a/src/app/context_clues_tests.rs b/src/app/context_clues_tests.rs new file mode 100644 index 0000000..58699ec --- /dev/null +++ b/src/app/context_clues_tests.rs @@ -0,0 +1,47 @@ +#[cfg(test)] +mod test { + use pretty_assertions::{assert_eq, assert_str_eq}; + + use crate::app::context_clues::{BARE_POPUP_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES}; + use crate::app::{context_clues::build_context_clue_string, key_binding::DEFAULT_KEYBINDINGS}; + + #[test] + fn test_build_context_clue_string() { + let test_context_clues_array = [ + (DEFAULT_KEYBINDINGS.add, "add"), + (DEFAULT_KEYBINDINGS.delete, "delete"), + ]; + + assert_str_eq!( + build_context_clue_string(&test_context_clues_array), + " add | delete" + ); + } + + #[test] + fn test_servarr_context_clues() { + let mut servarr_context_clues_iter = SERVARR_CONTEXT_CLUES.iter(); + + let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.tab); + assert_str_eq!(*description, "change servarr"); + + let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.quit); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.quit.desc); + assert_eq!(servarr_context_clues_iter.next(), None); + } + + #[test] + fn test_bare_popup_context_clues() { + let mut bare_popup_context_clues_iter = BARE_POPUP_CONTEXT_CLUES.iter(); + + let (key_binding, description) = bare_popup_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_eq!(bare_popup_context_clues_iter.next(), None); + } +} diff --git a/src/app/key_binding.rs b/src/app/key_binding.rs index 09dce37..d662a26 100644 --- a/src/app/key_binding.rs +++ b/src/app/key_binding.rs @@ -1,15 +1,5 @@ use crate::event::Key; -pub(in crate::app) type KeyMapping = (KeyBinding, &'static str); - -pub fn build_keymapping_string(key_mappings: &[(KeyBinding, &str)]) -> String { - key_mappings - .iter() - .map(|(key_binding, desc)| format!("{} {}", key_binding.key, desc)) - .collect::>() - .join(" | ") -} - macro_rules! generate_keybindings { ($($field:ident),+) => { pub struct KeyBindings { @@ -45,7 +35,7 @@ generate_keybindings! { esc } -#[derive(Clone, Copy)] +#[derive(Clone, Copy, Eq, PartialEq, Debug)] pub struct KeyBinding { pub key: Key, pub desc: &'static str, @@ -149,11 +139,3 @@ pub const DEFAULT_KEYBINDINGS: KeyBindings = KeyBindings { desc: "close", }, }; - -pub static SERVARR_KEYMAPPINGS: [KeyMapping; 2] = [ - (DEFAULT_KEYBINDINGS.tab, "change servarr"), - (DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc), -]; - -pub static BARE_POPUP_KEY_MAPPINGS: [KeyMapping; 1] = - [(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc)]; diff --git a/src/app/key_binding_tests.rs b/src/app/key_binding_tests.rs index e2c604e..bcb8d6c 100644 --- a/src/app/key_binding_tests.rs +++ b/src/app/key_binding_tests.rs @@ -1,18 +1,42 @@ #[cfg(test)] mod test { - use crate::app::key_binding::{build_keymapping_string, DEFAULT_KEYBINDINGS}; - use pretty_assertions::assert_str_eq; + use pretty_assertions::{assert_eq, assert_str_eq}; + use rstest::rstest; - #[test] - fn test_build_keymapping_string() { - let test_keys_array = [ - (DEFAULT_KEYBINDINGS.add, "add"), - (DEFAULT_KEYBINDINGS.delete, "delete"), - ]; + use crate::app::key_binding::{KeyBinding, DEFAULT_KEYBINDINGS}; + use crate::event::Key; - assert_str_eq!( - build_keymapping_string(&test_keys_array), - " add | delete" - ); + #[rstest] + #[case(DEFAULT_KEYBINDINGS.add, Key::Char('a'), "add")] + #[case(DEFAULT_KEYBINDINGS.up, Key::Up, "up")] + #[case(DEFAULT_KEYBINDINGS.down, Key::Down, "down")] + #[case(DEFAULT_KEYBINDINGS.left, Key::Left, "left")] + #[case(DEFAULT_KEYBINDINGS.right, Key::Right, "right")] + #[case(DEFAULT_KEYBINDINGS.backspace, Key::Backspace, "backspace")] + #[case(DEFAULT_KEYBINDINGS.search, Key::Char('s'), "search")] + #[case(DEFAULT_KEYBINDINGS.settings, Key::Char('s'), "settings")] + #[case(DEFAULT_KEYBINDINGS.filter, Key::Char('f'), "filter")] + #[case(DEFAULT_KEYBINDINGS.sort, Key::Char('o'), "sort")] + #[case(DEFAULT_KEYBINDINGS.edit, Key::Char('e'), "edit")] + #[case(DEFAULT_KEYBINDINGS.events, Key::Char('e'), "events")] + #[case(DEFAULT_KEYBINDINGS.logs, Key::Char('l'), "logs")] + #[case(DEFAULT_KEYBINDINGS.tasks, Key::Char('t'), "tasks")] + #[case(DEFAULT_KEYBINDINGS.restrictions, Key::Char('R'), "restrictions")] + #[case(DEFAULT_KEYBINDINGS.refresh, Key::Ctrl('r'), "refresh")] + #[case(DEFAULT_KEYBINDINGS.update, Key::Char('u'), "update")] + #[case(DEFAULT_KEYBINDINGS.home, Key::Home, "home")] + #[case(DEFAULT_KEYBINDINGS.end, Key::End, "end")] + #[case(DEFAULT_KEYBINDINGS.tab, Key::Tab, "tab")] + #[case(DEFAULT_KEYBINDINGS.delete, Key::Delete, "delete")] + #[case(DEFAULT_KEYBINDINGS.submit, Key::Enter, "submit")] + #[case(DEFAULT_KEYBINDINGS.quit, Key::Char('q'), "quit")] + #[case(DEFAULT_KEYBINDINGS.esc, Key::Esc, "close")] + fn test_default_key_bindings_and_descriptions( + #[case] key_binding: KeyBinding, + #[case] expected_key: Key, + #[case] expected_desc: &str, + ) { + assert_eq!(key_binding.key, expected_key); + assert_str_eq!(key_binding.desc, expected_desc); } } diff --git a/src/app/mod.rs b/src/app/mod.rs index a30fe56..f92ab43 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -5,15 +5,15 @@ use tokio::sync::mpsc::Sender; use tokio::time::Instant; use tokio_util::sync::CancellationToken; +use crate::app::context_clues::{build_context_clue_string, SERVARR_CONTEXT_CLUES}; use crate::app::radarr::{ActiveRadarrBlock, RadarrData}; use crate::models::{HorizontallyScrollableText, Route, TabRoute, TabState}; use crate::network::NetworkEvent; -use self::key_binding::{build_keymapping_string, SERVARR_KEYMAPPINGS}; - #[cfg(test)] #[path = "app_tests.rs"] mod app_tests; +pub mod context_clues; pub mod key_binding; mod key_binding_tests; pub mod radarr; @@ -142,14 +142,14 @@ impl<'a> Default for App<'a> { route: ActiveRadarrBlock::Movies.into(), help: format!( "<↑↓> scroll | ←→ change tab | {} ", - build_keymapping_string(&SERVARR_KEYMAPPINGS) + build_context_clue_string(&SERVARR_CONTEXT_CLUES) ), contextual_help: None, }, TabRoute { title: "Sonarr", route: Route::Sonarr, - help: format!("{} ", build_keymapping_string(&SERVARR_KEYMAPPINGS)), + help: format!("{} ", build_context_clue_string(&SERVARR_CONTEXT_CLUES)), contextual_help: None, }, ]), diff --git a/src/app/radarr/mod.rs b/src/app/radarr/mod.rs index cccdd76..7f41f77 100644 --- a/src/app/radarr/mod.rs +++ b/src/app/radarr/mod.rs @@ -15,15 +15,16 @@ use crate::models::{ }; use crate::network::radarr_network::RadarrEvent; -use self::radarr_key_mappings::{ - COLLECTIONS_KEY_MAPPINGS, DOWNLOADS_KEY_MAPPINGS, INDEXERS_KEY_MAPPINGS, LIBRARY_KEY_MAPPINGS, - MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS, MANUAL_MOVIE_SEARCH_KEY_MAPPINGS, - MOVIE_DETAILS_KEY_MAPPINGS, ROOT_FOLDERS_KEY_MAPPINGS, SYSTEM_KEY_MAPPINGS, +use super::context_clues::build_context_clue_string; + +use self::radarr_context_clues::{ + COLLECTIONS_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES, + MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, + SYSTEM_CONTEXT_CLUES, }; -use super::key_binding::build_keymapping_string; - -pub mod radarr_key_mappings; +pub mod radarr_context_clues; #[cfg(test)] #[path = "radarr_tests.rs"] @@ -313,76 +314,76 @@ impl<'a> Default for RadarrData<'a> { title: "Library", route: ActiveRadarrBlock::Movies.into(), help: String::new(), - contextual_help: Some(build_keymapping_string(&LIBRARY_KEY_MAPPINGS)), + contextual_help: Some(build_context_clue_string(&LIBRARY_CONTEXT_CLUES)), }, TabRoute { title: "Downloads", route: ActiveRadarrBlock::Downloads.into(), help: String::new(), - contextual_help: Some(build_keymapping_string(&DOWNLOADS_KEY_MAPPINGS)), + contextual_help: Some(build_context_clue_string(&DOWNLOADS_CONTEXT_CLUES)), }, TabRoute { title: "Collections", route: ActiveRadarrBlock::Collections.into(), help: String::new(), - contextual_help: Some(build_keymapping_string(&COLLECTIONS_KEY_MAPPINGS)), + contextual_help: Some(build_context_clue_string(&COLLECTIONS_CONTEXT_CLUES)), }, TabRoute { title: "Root Folders", route: ActiveRadarrBlock::RootFolders.into(), help: String::new(), - contextual_help: Some(build_keymapping_string(&ROOT_FOLDERS_KEY_MAPPINGS)), + contextual_help: Some(build_context_clue_string(&ROOT_FOLDERS_CONTEXT_CLUES)), }, TabRoute { title: "Indexers", route: ActiveRadarrBlock::Indexers.into(), help: String::new(), - contextual_help: Some(build_keymapping_string(&INDEXERS_KEY_MAPPINGS)), + contextual_help: Some(build_context_clue_string(&INDEXERS_CONTEXT_CLUES)), }, TabRoute { title: "System", route: ActiveRadarrBlock::System.into(), help: String::new(), - contextual_help: Some(build_keymapping_string(&SYSTEM_KEY_MAPPINGS)), + contextual_help: Some(build_context_clue_string(&SYSTEM_CONTEXT_CLUES)), }, ]), movie_info_tabs: TabState::new(vec![ TabRoute { title: "Details", route: ActiveRadarrBlock::MovieDetails.into(), - help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS), + help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "History", route: ActiveRadarrBlock::MovieHistory.into(), - help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS), + help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "File", route: ActiveRadarrBlock::FileInfo.into(), - help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS), + help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "Cast", route: ActiveRadarrBlock::Cast.into(), - help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS), + help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "Crew", route: ActiveRadarrBlock::Crew.into(), - help: build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS), + help: build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES), contextual_help: None, }, TabRoute { title: "Manual Search", route: ActiveRadarrBlock::ManualSearch.into(), - help: build_keymapping_string(&MANUAL_MOVIE_SEARCH_KEY_MAPPINGS), - contextual_help: Some(build_keymapping_string( - &MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS, + help: build_context_clue_string(&MANUAL_MOVIE_SEARCH_CONTEXT_CLUES), + contextual_help: Some(build_context_clue_string( + &MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES, )), }, ]), diff --git a/src/app/radarr/radarr_key_mappings.rs b/src/app/radarr/radarr_context_clues.rs similarity index 76% rename from src/app/radarr/radarr_key_mappings.rs rename to src/app/radarr/radarr_context_clues.rs index 2f98835..bbd5a36 100644 --- a/src/app/radarr/radarr_key_mappings.rs +++ b/src/app/radarr/radarr_context_clues.rs @@ -1,6 +1,11 @@ -use crate::app::key_binding::{KeyMapping, DEFAULT_KEYBINDINGS}; +use crate::app::context_clues::ContextClue; +use crate::app::key_binding::DEFAULT_KEYBINDINGS; -pub static LIBRARY_KEY_MAPPINGS: [KeyMapping; 9] = [ +#[cfg(test)] +#[path = "radarr_context_clues_tests.rs"] +mod radarr_context_clues_tests; + +pub static LIBRARY_CONTEXT_CLUES: [ContextClue; 9] = [ (DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc), (DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc), (DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc), @@ -15,7 +20,7 @@ pub static LIBRARY_KEY_MAPPINGS: [KeyMapping; 9] = [ (DEFAULT_KEYBINDINGS.esc, "cancel filter"), ]; -pub static DOWNLOADS_KEY_MAPPINGS: [KeyMapping; 2] = [ +pub static DOWNLOADS_CONTEXT_CLUES: [ContextClue; 2] = [ ( DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc, @@ -23,7 +28,7 @@ pub static DOWNLOADS_KEY_MAPPINGS: [KeyMapping; 2] = [ (DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc), ]; -pub static COLLECTIONS_KEY_MAPPINGS: [KeyMapping; 7] = [ +pub static COLLECTIONS_CONTEXT_CLUES: [ContextClue; 7] = [ (DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc), (DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc), (DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc), @@ -36,7 +41,7 @@ pub static COLLECTIONS_KEY_MAPPINGS: [KeyMapping; 7] = [ (DEFAULT_KEYBINDINGS.esc, "cancel filter"), ]; -pub static ROOT_FOLDERS_KEY_MAPPINGS: [KeyMapping; 3] = [ +pub static ROOT_FOLDERS_CONTEXT_CLUES: [ContextClue; 3] = [ (DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc), (DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc), ( @@ -45,7 +50,7 @@ pub static ROOT_FOLDERS_KEY_MAPPINGS: [KeyMapping; 3] = [ ), ]; -pub static INDEXERS_KEY_MAPPINGS: [KeyMapping; 6] = [ +pub static INDEXERS_CONTEXT_CLUES: [ContextClue; 6] = [ (DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc), (DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc), ( @@ -63,7 +68,7 @@ pub static INDEXERS_KEY_MAPPINGS: [KeyMapping; 6] = [ ), ]; -pub static SYSTEM_KEY_MAPPINGS: [KeyMapping; 5] = [ +pub static SYSTEM_CONTEXT_CLUES: [ContextClue; 5] = [ (DEFAULT_KEYBINDINGS.tasks, "open tasks"), (DEFAULT_KEYBINDINGS.events, "open events"), (DEFAULT_KEYBINDINGS.logs, "open logs"), @@ -74,7 +79,7 @@ pub static SYSTEM_KEY_MAPPINGS: [KeyMapping; 5] = [ ), ]; -pub static MOVIE_DETAILS_KEY_MAPPINGS: [KeyMapping; 5] = [ +pub static MOVIE_DETAILS_CONTEXT_CLUES: [ContextClue; 5] = [ ( DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc, @@ -85,7 +90,7 @@ pub static MOVIE_DETAILS_KEY_MAPPINGS: [KeyMapping; 5] = [ (DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc), ]; -pub static MANUAL_MOVIE_SEARCH_KEY_MAPPINGS: [KeyMapping; 6] = [ +pub static MANUAL_MOVIE_SEARCH_CONTEXT_CLUES: [ContextClue; 6] = [ ( DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc, @@ -97,20 +102,20 @@ pub static MANUAL_MOVIE_SEARCH_KEY_MAPPINGS: [KeyMapping; 6] = [ (DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc), ]; -pub static MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS: [KeyMapping; 1] = +pub static MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES: [ContextClue; 1] = [(DEFAULT_KEYBINDINGS.submit, "details")]; -pub static ADD_MOVIE_SEARCH_RESULTS_KEY_MAPPINGS: [KeyMapping; 2] = [ +pub static ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES: [ContextClue; 2] = [ (DEFAULT_KEYBINDINGS.submit, "details"), (DEFAULT_KEYBINDINGS.esc, "edit search"), ]; -pub static SYSTEM_TASKS_KEY_MAPPINGS: [KeyMapping; 2] = [ +pub static SYSTEM_TASKS_CONTEXT_CLUES: [ContextClue; 2] = [ (DEFAULT_KEYBINDINGS.submit, "start task"), (DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc), ]; -pub static COLLECTION_DETAILS_KEY_MAPPINGS: [KeyMapping; 2] = [ +pub static COLLECTION_DETAILS_CONTEXT_CLUES: [ContextClue; 2] = [ (DEFAULT_KEYBINDINGS.submit, "show overview/add movie"), (DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc), ]; diff --git a/src/app/radarr/radarr_context_clues_tests.rs b/src/app/radarr/radarr_context_clues_tests.rs new file mode 100644 index 0000000..349432d --- /dev/null +++ b/src/app/radarr/radarr_context_clues_tests.rs @@ -0,0 +1,342 @@ +#[cfg(test)] +mod tests { + use pretty_assertions::{assert_eq, assert_str_eq}; + + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::radarr::radarr_context_clues::{ + ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTIONS_CONTEXT_CLUES, + COLLECTION_DETAILS_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES, + MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, + SYSTEM_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, + }; + + #[test] + fn test_library_context_clues() { + let mut library_context_clues_iter = LIBRARY_CONTEXT_CLUES.iter(); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.add); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.add.desc); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); + assert_str_eq!(*description, "update all"); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); + assert_str_eq!(*description, "details"); + + let (key_binding, description) = library_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, "cancel filter"); + assert_eq!(library_context_clues_iter.next(), None); + } + + #[test] + fn test_downloads_context_clues() { + let mut downloads_context_clues_iter = DOWNLOADS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = downloads_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + + let (key_binding, description) = downloads_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); + assert_eq!(downloads_context_clues_iter.next(), None); + } + + #[test] + fn test_collections_context_clues() { + let mut collections_context_clues = COLLECTIONS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); + assert_str_eq!(*description, "update all"); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); + assert_str_eq!(*description, "details"); + + let (key_binding, description) = collections_context_clues.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, "cancel filter"); + assert_eq!(collections_context_clues.next(), None); + } + + #[test] + fn test_root_folders_context_clues() { + let mut root_folders_context_clues_iter = ROOT_FOLDERS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = root_folders_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.add); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.add.desc); + + let (key_binding, description) = root_folders_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); + + let (key_binding, description) = root_folders_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + assert_eq!(root_folders_context_clues_iter.next(), None); + } + + #[test] + fn test_indexers_context_clues() { + let mut indexers_context_clues_iter = INDEXERS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.add); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.add.desc); + + let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); + + let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.settings); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.settings.desc); + + let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.restrictions); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.restrictions.desc); + + let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); + + let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + assert_eq!(indexers_context_clues_iter.next(), None); + } + + #[test] + fn test_system_context_clues() { + let mut system_context_clues_iter = SYSTEM_CONTEXT_CLUES.iter(); + + let (key_binding, description) = system_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.tasks); + assert_str_eq!(*description, "open tasks"); + + let (key_binding, description) = system_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.events); + assert_str_eq!(*description, "open events"); + + let (key_binding, description) = system_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.logs); + assert_str_eq!(*description, "open logs"); + + let (key_binding, description) = system_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); + assert_str_eq!(*description, "open updates"); + + let (key_binding, description) = system_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + assert_eq!(system_context_clues_iter.next(), None); + } + + #[test] + fn test_movie_details_context_clues() { + let mut movie_details_context_clues_iter = MOVIE_DETAILS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + + let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.update.desc); + + let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); + + let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); + assert_str_eq!(*description, "auto search"); + + let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_eq!(movie_details_context_clues_iter.next(), None); + } + + #[test] + fn test_manual_movie_search_context_clues() { + let mut manual_movie_search_context_clues_iter = MANUAL_MOVIE_SEARCH_CONTEXT_CLUES.iter(); + + let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); + + let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.update.desc); + + let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); + + let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); + + let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); + assert_str_eq!(*description, "auto search"); + + let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_eq!(manual_movie_search_context_clues_iter.next(), None); + } + + #[test] + fn test_manual_movie_search_contextual_context_clues() { + let mut manual_movie_search_contextual_context_clues_iter = + MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES.iter(); + + let (key_binding, description) = manual_movie_search_contextual_context_clues_iter + .next() + .unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); + assert_str_eq!(*description, "details"); + assert_eq!( + manual_movie_search_contextual_context_clues_iter.next(), + None + ); + } + + #[test] + fn test_add_movie_search_results_context_clues() { + let mut add_movie_search_results_context_clues_iter = + ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = add_movie_search_results_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); + assert_str_eq!(*description, "details"); + + let (key_binding, description) = add_movie_search_results_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, "edit search"); + assert_eq!(add_movie_search_results_context_clues_iter.next(), None); + } + + #[test] + fn test_system_tasks_context_clues() { + let mut system_tasks_context_clues_iter = SYSTEM_TASKS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = system_tasks_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); + assert_str_eq!(*description, "start task"); + + let (key_binding, description) = system_tasks_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_eq!(system_tasks_context_clues_iter.next(), None); + } + + #[test] + fn test_collection_details_context_clues() { + let mut collection_details_context_clues_iter = COLLECTION_DETAILS_CONTEXT_CLUES.iter(); + + let (key_binding, description) = collection_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); + assert_str_eq!(*description, "show overview/add movie"); + + let (key_binding, description) = collection_details_context_clues_iter.next().unwrap(); + + assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); + assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_eq!(collection_details_context_clues_iter.next(), None); + } +} diff --git a/src/app/radarr/radarr_tests.rs b/src/app/radarr/radarr_tests.rs index cf77dbd..c8caba4 100644 --- a/src/app/radarr/radarr_tests.rs +++ b/src/app/radarr/radarr_tests.rs @@ -8,12 +8,12 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::app::key_binding::build_keymapping_string; - use crate::app::radarr::radarr_key_mappings::{ - COLLECTIONS_KEY_MAPPINGS, DOWNLOADS_KEY_MAPPINGS, INDEXERS_KEY_MAPPINGS, - LIBRARY_KEY_MAPPINGS, MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS, - MANUAL_MOVIE_SEARCH_KEY_MAPPINGS, MOVIE_DETAILS_KEY_MAPPINGS, ROOT_FOLDERS_KEY_MAPPINGS, - SYSTEM_KEY_MAPPINGS, + use crate::app::context_clues::build_context_clue_string; + use crate::app::radarr::radarr_context_clues::{ + COLLECTIONS_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES, + MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, + SYSTEM_CONTEXT_CLUES, }; use crate::app::radarr::radarr_test_utils::utils::create_test_radarr_data; use crate::app::radarr::{ActiveRadarrBlock, RadarrData}; @@ -325,7 +325,7 @@ mod tests { assert!(radarr_data.main_tabs.tabs[0].help.is_empty()); assert_eq!( radarr_data.main_tabs.tabs[0].contextual_help, - Some(build_keymapping_string(&LIBRARY_KEY_MAPPINGS)) + Some(build_context_clue_string(&LIBRARY_CONTEXT_CLUES)) ); assert_str_eq!(radarr_data.main_tabs.tabs[1].title, "Downloads"); @@ -336,7 +336,7 @@ mod tests { assert!(radarr_data.main_tabs.tabs[1].help.is_empty()); assert_eq!( radarr_data.main_tabs.tabs[1].contextual_help, - Some(build_keymapping_string(&DOWNLOADS_KEY_MAPPINGS)) + Some(build_context_clue_string(&DOWNLOADS_CONTEXT_CLUES)) ); assert_str_eq!(radarr_data.main_tabs.tabs[2].title, "Collections"); @@ -347,7 +347,7 @@ mod tests { assert!(radarr_data.main_tabs.tabs[2].help.is_empty()); assert_eq!( radarr_data.main_tabs.tabs[2].contextual_help, - Some(build_keymapping_string(&COLLECTIONS_KEY_MAPPINGS)) + Some(build_context_clue_string(&COLLECTIONS_CONTEXT_CLUES)) ); assert_str_eq!(radarr_data.main_tabs.tabs[3].title, "Root Folders"); @@ -358,7 +358,7 @@ mod tests { assert!(radarr_data.main_tabs.tabs[3].help.is_empty()); assert_eq!( radarr_data.main_tabs.tabs[3].contextual_help, - Some(build_keymapping_string(&ROOT_FOLDERS_KEY_MAPPINGS)) + Some(build_context_clue_string(&ROOT_FOLDERS_CONTEXT_CLUES)) ); assert_str_eq!(radarr_data.main_tabs.tabs[4].title, "Indexers"); @@ -369,7 +369,7 @@ mod tests { assert!(radarr_data.main_tabs.tabs[4].help.is_empty()); assert_eq!( radarr_data.main_tabs.tabs[4].contextual_help, - Some(build_keymapping_string(&INDEXERS_KEY_MAPPINGS)) + Some(build_context_clue_string(&INDEXERS_CONTEXT_CLUES)) ); assert_str_eq!(radarr_data.main_tabs.tabs[5].title, "System"); @@ -380,7 +380,7 @@ mod tests { assert!(radarr_data.main_tabs.tabs[5].help.is_empty()); assert_eq!( radarr_data.main_tabs.tabs[5].contextual_help, - Some(build_keymapping_string(&SYSTEM_KEY_MAPPINGS)) + Some(build_context_clue_string(&SYSTEM_CONTEXT_CLUES)) ); assert_eq!(radarr_data.movie_info_tabs.tabs.len(), 6); @@ -392,7 +392,7 @@ mod tests { ); assert_str_eq!( radarr_data.movie_info_tabs.tabs[0].help, - build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS) + build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES) ); assert!(radarr_data.movie_info_tabs.tabs[0] .contextual_help @@ -405,7 +405,7 @@ mod tests { ); assert_str_eq!( radarr_data.movie_info_tabs.tabs[1].help, - build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS) + build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES) ); assert!(radarr_data.movie_info_tabs.tabs[1] .contextual_help @@ -418,7 +418,7 @@ mod tests { ); assert_str_eq!( radarr_data.movie_info_tabs.tabs[2].help, - build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS) + build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES) ); assert!(radarr_data.movie_info_tabs.tabs[2] .contextual_help @@ -431,7 +431,7 @@ mod tests { ); assert_str_eq!( radarr_data.movie_info_tabs.tabs[3].help, - build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS) + build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES) ); assert!(radarr_data.movie_info_tabs.tabs[3] .contextual_help @@ -444,7 +444,7 @@ mod tests { ); assert_str_eq!( radarr_data.movie_info_tabs.tabs[4].help, - build_keymapping_string(&MOVIE_DETAILS_KEY_MAPPINGS) + build_context_clue_string(&MOVIE_DETAILS_CONTEXT_CLUES) ); assert!(radarr_data.movie_info_tabs.tabs[4] .contextual_help @@ -457,12 +457,12 @@ mod tests { ); assert_str_eq!( radarr_data.movie_info_tabs.tabs[5].help, - build_keymapping_string(&MANUAL_MOVIE_SEARCH_KEY_MAPPINGS) + build_context_clue_string(&MANUAL_MOVIE_SEARCH_CONTEXT_CLUES) ); assert_eq!( radarr_data.movie_info_tabs.tabs[5].contextual_help, - Some(build_keymapping_string( - &MANUAL_MOVIE_SEARCH_CONTEXTUAL_KEY_MAPPINGS + Some(build_context_clue_string( + &MANUAL_MOVIE_SEARCH_CONTEXTUAL_CONTEXT_CLUES )) ); } @@ -472,13 +472,180 @@ mod tests { use pretty_assertions::assert_eq; use crate::app::radarr::{ - ActiveRadarrBlock, ADD_MOVIE_SELECTION_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS, - EDIT_COLLECTION_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, - INDEXER_SETTINGS_SELECTION_BLOCKS, + ActiveRadarrBlock, ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, COLLECTIONS_BLOCKS, + COLLECTION_DETAILS_BLOCKS, DELETE_MOVIE_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS, + DOWNLOADS_BLOCKS, EDIT_COLLECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, + EDIT_MOVIE_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, FILTER_BLOCKS, INDEXERS_BLOCKS, + INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, + MOVIE_DETAILS_BLOCKS, ROOT_FOLDERS_BLOCKS, SEARCH_BLOCKS, SYSTEM_DETAILS_BLOCKS, }; #[test] - fn test_add_movie_prompt_block_order() { + fn test_library_blocks_contents() { + assert_eq!(LIBRARY_BLOCKS.len(), 4); + assert!(LIBRARY_BLOCKS.contains(&ActiveRadarrBlock::Movies)); + assert!(LIBRARY_BLOCKS.contains(&ActiveRadarrBlock::SearchMovie)); + assert!(LIBRARY_BLOCKS.contains(&ActiveRadarrBlock::FilterMovies)); + assert!(LIBRARY_BLOCKS.contains(&ActiveRadarrBlock::UpdateAllMoviesPrompt)); + } + + #[test] + fn test_collections_blocks_contents() { + assert_eq!(COLLECTIONS_BLOCKS.len(), 4); + assert!(COLLECTIONS_BLOCKS.contains(&ActiveRadarrBlock::Collections)); + assert!(COLLECTIONS_BLOCKS.contains(&ActiveRadarrBlock::SearchCollection)); + assert!(COLLECTIONS_BLOCKS.contains(&ActiveRadarrBlock::FilterCollections)); + assert!(COLLECTIONS_BLOCKS.contains(&ActiveRadarrBlock::UpdateAllCollectionsPrompt)); + } + + #[test] + fn test_indexers_blocks_contents() { + assert_eq!(INDEXERS_BLOCKS.len(), 4); + assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::AddIndexer)); + assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::EditIndexer)); + assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::DeleteIndexerPrompt)); + assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::Indexers)); + } + + #[test] + fn test_root_folders_blocks_contents() { + assert_eq!(ROOT_FOLDERS_BLOCKS.len(), 3); + assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveRadarrBlock::RootFolders)); + assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveRadarrBlock::AddRootFolderPrompt)); + assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveRadarrBlock::DeleteRootFolderPrompt)); + } + + #[test] + fn test_add_movie_blocks_contents() { + assert_eq!(ADD_MOVIE_BLOCKS.len(), 10); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieSearchInput)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieSearchResults)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieEmptySearchResults)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMoviePrompt)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieSelectMinimumAvailability)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieSelectMonitor)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieSelectQualityProfile)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieSelectRootFolder)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieAlreadyInLibrary)); + assert!(ADD_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::AddMovieTagsInput)); + } + + #[test] + fn test_edit_collection_blocks_contents() { + assert_eq!(EDIT_COLLECTION_BLOCKS.len(), 7); + assert!(EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionPrompt)); + assert!(EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionConfirmPrompt)); + assert!( + EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionRootFolderPathInput) + ); + assert!(EDIT_COLLECTION_BLOCKS + .contains(&ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)); + assert!( + EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionSelectQualityProfile) + ); + assert!(EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)); + assert!(EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionToggleMonitored)); + } + + #[test] + fn test_edit_movie_blocks_contents() { + assert_eq!(EDIT_MOVIE_BLOCKS.len(), 7); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMoviePrompt)); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMovieConfirmPrompt)); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMoviePathInput)); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMovieSelectMinimumAvailability)); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMovieSelectQualityProfile)); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMovieTagsInput)); + assert!(EDIT_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::EditMovieToggleMonitored)); + } + + #[test] + fn test_downloads_blocks_contents() { + assert_eq!(DOWNLOADS_BLOCKS.len(), 3); + assert!(DOWNLOADS_BLOCKS.contains(&ActiveRadarrBlock::Downloads)); + assert!(DOWNLOADS_BLOCKS.contains(&ActiveRadarrBlock::DeleteDownloadPrompt)); + assert!(DOWNLOADS_BLOCKS.contains(&ActiveRadarrBlock::UpdateDownloadsPrompt)); + } + + #[test] + fn test_movie_details_blocks_contents() { + assert_eq!(MOVIE_DETAILS_BLOCKS.len(), 10); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::MovieDetails)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::MovieHistory)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::FileInfo)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::Cast)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::Crew)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::AutomaticallySearchMoviePrompt)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::UpdateAndScanPrompt)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::ManualSearch)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::ManualSearchSortPrompt)); + assert!(MOVIE_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::ManualSearchConfirmPrompt)); + } + + #[test] + fn test_collection_details_blocks_contents() { + assert_eq!(COLLECTION_DETAILS_BLOCKS.len(), 2); + assert!(COLLECTION_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::CollectionDetails)); + assert!(COLLECTION_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::ViewMovieOverview)); + } + + #[test] + fn test_search_blocks_contents() { + assert_eq!(SEARCH_BLOCKS.len(), 2); + assert!(SEARCH_BLOCKS.contains(&ActiveRadarrBlock::SearchMovie)); + assert!(SEARCH_BLOCKS.contains(&ActiveRadarrBlock::SearchCollection)); + } + + #[test] + fn test_filter_blocks_contents() { + assert_eq!(FILTER_BLOCKS.len(), 2); + assert!(FILTER_BLOCKS.contains(&ActiveRadarrBlock::FilterMovies)); + assert!(FILTER_BLOCKS.contains(&ActiveRadarrBlock::FilterCollections)); + } + + #[test] + fn test_delete_movie_blocks_contents() { + assert_eq!(DELETE_MOVIE_BLOCKS.len(), 4); + assert!(DELETE_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::DeleteMoviePrompt)); + assert!(DELETE_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::DeleteMovieConfirmPrompt)); + assert!(DELETE_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::DeleteMovieToggleDeleteFile)); + assert!(DELETE_MOVIE_BLOCKS.contains(&ActiveRadarrBlock::DeleteMovieToggleAddListExclusion)); + } + + #[test] + fn test_indexer_settings_blocks_contents() { + assert_eq!(INDEXER_SETTINGS_BLOCKS.len(), 10); + assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsPrompt)); + assert!( + INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput) + ); + assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsConfirmPrompt)); + assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsMaximumSizeInput)); + assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsMinimumAgeInput)); + assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsRetentionInput)); + assert!( + INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput) + ); + assert!(INDEXER_SETTINGS_BLOCKS + .contains(&ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs)); + assert!(INDEXER_SETTINGS_BLOCKS + .contains(&ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags)); + assert!(INDEXER_SETTINGS_BLOCKS + .contains(&ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput)); + } + + #[test] + fn test_system_details_blocks_contents() { + assert_eq!(SYSTEM_DETAILS_BLOCKS.len(), 5); + assert!(SYSTEM_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::SystemLogs)); + assert!(SYSTEM_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::SystemQueuedEvents)); + assert!(SYSTEM_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::SystemTasks)); + assert!(SYSTEM_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::SystemTaskStartConfirmPrompt)); + assert!(SYSTEM_DETAILS_BLOCKS.contains(&ActiveRadarrBlock::SystemUpdates)); + } + + #[test] + fn test_add_movie_selection_blocks_ordering() { let mut add_movie_block_iter = ADD_MOVIE_SELECTION_BLOCKS.iter(); assert_eq!( @@ -505,10 +672,11 @@ mod tests { add_movie_block_iter.next().unwrap(), &ActiveRadarrBlock::AddMovieConfirmPrompt ); + assert_eq!(add_movie_block_iter.next(), None); } #[test] - fn test_edit_movie_prompt_block_order() { + fn test_edit_movie_selection_blocks_ordering() { let mut edit_movie_block_iter = EDIT_MOVIE_SELECTION_BLOCKS.iter(); assert_eq!( @@ -535,10 +703,11 @@ mod tests { edit_movie_block_iter.next().unwrap(), &ActiveRadarrBlock::EditMovieConfirmPrompt ); + assert_eq!(edit_movie_block_iter.next(), None); } #[test] - fn test_edit_collection_prompt_block_order() { + fn test_edit_collection_selection_blocks_ordering() { let mut edit_collection_block_iter = EDIT_COLLECTION_SELECTION_BLOCKS.iter(); assert_eq!( @@ -565,10 +734,11 @@ mod tests { edit_collection_block_iter.next().unwrap(), &ActiveRadarrBlock::EditCollectionConfirmPrompt ); + assert_eq!(edit_collection_block_iter.next(), None); } #[test] - fn test_delete_movie_prompt_block_order() { + fn test_delete_movie_selection_blocks_ordering() { let mut delete_movie_block_iter = DELETE_MOVIE_SELECTION_BLOCKS.iter(); assert_eq!( @@ -583,10 +753,11 @@ mod tests { delete_movie_block_iter.next().unwrap(), &ActiveRadarrBlock::DeleteMovieConfirmPrompt ); + assert_eq!(delete_movie_block_iter.next(), None); } #[test] - fn test_indexer_settings_prompt_block_order() { + fn test_indexer_settings_selection_blocks_ordering() { let mut indexer_settings_block_iter = INDEXER_SETTINGS_SELECTION_BLOCKS.iter(); assert_eq!( @@ -625,6 +796,7 @@ mod tests { indexer_settings_block_iter.next().unwrap(), &ActiveRadarrBlock::IndexerSettingsConfirmPrompt ); + assert_eq!(indexer_settings_block_iter.next(), None); } } diff --git a/src/ui/radarr_ui/collections/collection_details_ui.rs b/src/ui/radarr_ui/collections/collection_details_ui.rs index 9ef7681..6521681 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui.rs @@ -4,8 +4,8 @@ use tui::text::Text; use tui::widgets::{Cell, Paragraph, Row, Wrap}; use tui::Frame; -use crate::app::key_binding::{build_keymapping_string, BARE_POPUP_KEY_MAPPINGS}; -use crate::app::radarr::radarr_key_mappings::COLLECTION_DETAILS_KEY_MAPPINGS; +use crate::app::context_clues::{build_context_clue_string, BARE_POPUP_CONTEXT_CLUES}; +use crate::app::radarr::radarr_context_clues::COLLECTION_DETAILS_CONTEXT_CLUES; use crate::app::radarr::{ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS}; use crate::app::App; use crate::models::radarr_models::CollectionMovie; @@ -106,7 +106,7 @@ pub fn draw_collection_details( }; let mut help_text = Text::from(format!( "<↑↓> scroll table | {}", - build_keymapping_string(&COLLECTION_DETAILS_KEY_MAPPINGS) + build_context_clue_string(&COLLECTION_DETAILS_CONTEXT_CLUES) )); help_text.patch_style(style_help()); let monitored = if collection_selection.monitored { @@ -261,7 +261,7 @@ fn draw_movie_overview(f: &mut Frame<'_, B>, app: &mut App<'_>, cont .overview, ); overview.patch_style(style_default()); - let mut help_text = Text::from(build_keymapping_string(&BARE_POPUP_KEY_MAPPINGS)); + let mut help_text = Text::from(build_context_clue_string(&BARE_POPUP_CONTEXT_CLUES)); help_text.patch_style(style_help()); let paragraph = Paragraph::new(overview) diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index b03e747..e971853 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -4,8 +4,8 @@ use tui::text::Text; use tui::widgets::{Cell, ListItem, Paragraph, Row}; use tui::Frame; -use crate::app::key_binding::{build_keymapping_string, BARE_POPUP_KEY_MAPPINGS}; -use crate::app::radarr::radarr_key_mappings::ADD_MOVIE_SEARCH_RESULTS_KEY_MAPPINGS; +use crate::app::context_clues::{build_context_clue_string, BARE_POPUP_CONTEXT_CLUES}; +use crate::app::radarr::radarr_context_clues::ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES; use crate::app::radarr::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; use crate::models::radarr_models::AddMovieSearchResult; use crate::models::Route; @@ -144,7 +144,7 @@ fn draw_add_movie_search(f: &mut Frame<'_, B>, app: &mut App<'_>, ar ); f.render_widget(layout_block(), chunks[1]); - let mut help_text = Text::from(build_keymapping_string(&BARE_POPUP_KEY_MAPPINGS)); + let mut help_text = Text::from(build_context_clue_string(&BARE_POPUP_CONTEXT_CLUES)); help_text.patch_style(style_help()); let help_paragraph = Paragraph::new(help_text) .block(borderless_block()) @@ -163,8 +163,8 @@ fn draw_add_movie_search(f: &mut Frame<'_, B>, app: &mut App<'_>, ar | ActiveRadarrBlock::AddMovieSelectRootFolder | ActiveRadarrBlock::AddMovieAlreadyInLibrary | ActiveRadarrBlock::AddMovieTagsInput => { - let mut help_text = Text::from(build_keymapping_string( - &ADD_MOVIE_SEARCH_RESULTS_KEY_MAPPINGS, + let mut help_text = Text::from(build_context_clue_string( + &ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, )); help_text.patch_style(style_help()); let help_paragraph = Paragraph::new(help_text) diff --git a/src/ui/radarr_ui/system/system_details_ui.rs b/src/ui/radarr_ui/system/system_details_ui.rs index 364f89f..978648b 100644 --- a/src/ui/radarr_ui/system/system_details_ui.rs +++ b/src/ui/radarr_ui/system/system_details_ui.rs @@ -4,8 +4,8 @@ use tui::text::{Span, Text}; use tui::widgets::{Cell, ListItem, Paragraph, Row}; use tui::Frame; -use crate::app::key_binding::{build_keymapping_string, BARE_POPUP_KEY_MAPPINGS}; -use crate::app::radarr::radarr_key_mappings::SYSTEM_TASKS_KEY_MAPPINGS; +use crate::app::context_clues::{build_context_clue_string, BARE_POPUP_CONTEXT_CLUES}; +use crate::app::radarr::radarr_context_clues::SYSTEM_TASKS_CONTEXT_CLUES; use crate::app::radarr::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS}; use crate::app::App; use crate::models::Route; @@ -88,7 +88,7 @@ fn draw_logs_popup(f: &mut Frame<'_, B>, app: &mut App<'_>, area: Re is_popup: true, help: Some(format!( "<↑↓←→> scroll | {}", - build_keymapping_string(&BARE_POPUP_KEY_MAPPINGS) + build_context_clue_string(&BARE_POPUP_CONTEXT_CLUES) )), }, ); @@ -101,7 +101,7 @@ fn draw_tasks_popup(f: &mut Frame<'_, B>, app: &mut App<'_>, area: R let context_area = draw_help_and_get_content_rect( f, area, - Some(build_keymapping_string(&SYSTEM_TASKS_KEY_MAPPINGS)), + Some(build_context_clue_string(&SYSTEM_TASKS_CONTEXT_CLUES)), ); draw_table( @@ -163,7 +163,7 @@ fn draw_updates_popup(f: &mut Frame<'_, B>, app: &mut App<'_>, area: area, Some(format!( "<↑↓> scroll | {}", - build_keymapping_string(&BARE_POPUP_KEY_MAPPINGS) + build_context_clue_string(&BARE_POPUP_CONTEXT_CLUES) )), ); let updates = app.data.radarr_data.updates.get_text();