Cleaned up the block selection logic to use the new BlockSelectionState struct

This commit is contained in:
2023-08-08 10:50:06 -06:00
parent 2561e7e9b2
commit 4fb83c114a
23 changed files with 840 additions and 882 deletions
+15 -15
View File
@@ -14,7 +14,7 @@ pub(crate) mod radarr;
const DEFAULT_ROUTE: Route = Route::Radarr(ActiveRadarrBlock::Movies, None);
pub struct App {
pub struct App<'a> {
navigation_stack: Vec<Route>,
network_tx: Option<Sender<NetworkEvent>>,
pub server_tabs: TabState,
@@ -31,10 +31,10 @@ pub struct App {
pub should_refresh: bool,
pub should_ignore_quit_key: bool,
pub config: AppConfig,
pub data: Data,
pub data: Data<'a>,
}
impl App {
impl<'a> App<'a> {
pub fn new(network_tx: Sender<NetworkEvent>, config: AppConfig) -> Self {
App {
network_tx: Some(network_tx),
@@ -106,12 +106,12 @@ impl App {
self.push_navigation_stack(route);
}
pub fn get_current_route(&self) -> &Route {
pub fn get_current_route(&'a self) -> &'a Route {
self.navigation_stack.last().unwrap_or(&DEFAULT_ROUTE)
}
}
impl Default for App {
impl<'a> Default for App<'a> {
fn default() -> Self {
App {
navigation_stack: vec![DEFAULT_ROUTE],
@@ -120,15 +120,15 @@ impl Default for App {
response: String::default(),
server_tabs: TabState::new(vec![
TabRoute {
title: "Radarr".to_owned(),
title: "Radarr",
route: ActiveRadarrBlock::Movies.into(),
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ".to_owned(),
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ",
contextual_help: None,
},
TabRoute {
title: "Sonarr".to_owned(),
title: "Sonarr",
route: Route::Sonarr,
help: "<tab> change servarr | <q> quit ".to_owned(),
help: "<tab> change servarr | <q> quit ",
contextual_help: None,
},
]),
@@ -149,8 +149,8 @@ impl Default for App {
}
#[derive(Default)]
pub struct Data {
pub radarr_data: RadarrData,
pub struct Data<'a> {
pub radarr_data: RadarrData<'a>,
}
#[derive(Debug, Deserialize, Serialize, Default)]
@@ -200,15 +200,15 @@ mod tests {
app.server_tabs.tabs,
vec![
TabRoute {
title: "Radarr".to_owned(),
title: "Radarr",
route: ActiveRadarrBlock::Movies.into(),
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ".to_owned(),
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ",
contextual_help: None,
},
TabRoute {
title: "Sonarr".to_owned(),
title: "Sonarr",
route: Route::Sonarr,
help: "<tab> change servarr | <q> quit ".to_owned(),
help: "<tab> change servarr | <q> quit ",
contextual_help: None,
}
]
+165 -404
View File
@@ -8,11 +8,12 @@ use crate::models::radarr_models::{
MinimumAvailability, Monitor, Movie, MovieHistoryItem, Release, ReleaseField, RootFolder,
};
use crate::models::{
HorizontallyScrollableText, ScrollableText, StatefulList, StatefulTable, TabRoute, TabState,
BlockSelectionState, HorizontallyScrollableText, ScrollableText, StatefulList, StatefulTable,
TabRoute, TabState,
};
use crate::network::radarr_network::RadarrEvent;
pub struct RadarrData {
pub struct RadarrData<'a> {
pub root_folders: StatefulTable<RootFolder>,
pub disk_space_vec: Vec<DiskSpace>,
pub version: String,
@@ -24,7 +25,7 @@ pub struct RadarrData {
pub minimum_availability_list: StatefulList<MinimumAvailability>,
pub quality_profile_list: StatefulList<String>,
pub root_folder_list: StatefulList<RootFolder>,
pub selected_block: ActiveRadarrBlock,
pub selected_block: BlockSelectionState<'a, ActiveRadarrBlock>,
pub downloads: StatefulTable<DownloadRecord>,
pub quality_profile_map: BiMap<u64, String>,
pub tags_map: BiMap<u64, String>,
@@ -57,7 +58,7 @@ pub struct RadarrData {
pub is_filtering: bool,
}
impl RadarrData {
impl<'a> RadarrData<'a> {
pub fn reset_movie_collection_table(&mut self) {
self.collection_movies = StatefulTable::default();
}
@@ -226,8 +227,8 @@ impl RadarrData {
}
}
impl Default for RadarrData {
fn default() -> RadarrData {
impl<'a> Default for RadarrData<'a> {
fn default() -> RadarrData<'a> {
RadarrData {
root_folders: StatefulTable::default(),
disk_space_vec: Vec::new(),
@@ -239,7 +240,7 @@ impl Default for RadarrData {
minimum_availability_list: StatefulList::default(),
quality_profile_list: StatefulList::default(),
root_folder_list: StatefulList::default(),
selected_block: ActiveRadarrBlock::AddMovieSelectRootFolder,
selected_block: BlockSelectionState::default(),
filtered_movies: StatefulTable::default(),
downloads: StatefulTable::default(),
quality_profile_map: BiMap::default(),
@@ -271,75 +272,79 @@ impl Default for RadarrData {
add_list_exclusion: false,
main_tabs: TabState::new(vec![
TabRoute {
title: "Library".to_owned(),
title: "Library",
route: ActiveRadarrBlock::Movies.into(),
help: String::default(),
contextual_help: Some("<a> add | <e> edit | <del> delete | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"
.to_owned()),
help: "",
contextual_help: Some("<a> add | <e> edit | <del> delete | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"),
},
TabRoute {
title: "Downloads".to_owned(),
title: "Downloads",
route: ActiveRadarrBlock::Downloads.into(),
help: String::default(),
contextual_help: Some("<r> refresh | <del> delete".to_owned()),
help: "",
contextual_help: Some("<r> refresh | <del> delete"),
},
TabRoute {
title: "Collections".to_owned(),
title: "Collections",
route: ActiveRadarrBlock::Collections.into(),
help: String::default(),
contextual_help: Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"
.to_owned()),
help: "",
contextual_help: Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"),
},
TabRoute {
title: "Root Folders".to_owned(),
title: "Root Folders",
route: ActiveRadarrBlock::RootFolders.into(),
help: String::default(),
contextual_help: Some("<a> add | <del> delete | <r> refresh".to_owned()),
help: "",
contextual_help: Some("<a> add | <del> delete | <r> refresh"),
},
TabRoute {
title: "System",
route: ActiveRadarrBlock::System.into(),
help: "",
contextual_help: Some("<enter> select menu item | <esc> go back to menu selection")
}
]),
movie_info_tabs: TabState::new(vec![
TabRoute {
title: "Details".to_owned(),
title: "Details",
route: ActiveRadarrBlock::MovieDetails.into(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close".to_owned(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
contextual_help: None
},
TabRoute {
title: "History".to_owned(),
title: "History",
route: ActiveRadarrBlock::MovieHistory.into(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close".to_owned(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
contextual_help: None
},
TabRoute {
title: "File".to_owned(),
title: "File",
route: ActiveRadarrBlock::FileInfo.into(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close".to_owned(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
contextual_help: None,
},
TabRoute {
title: "Cast".to_owned(),
title: "Cast",
route: ActiveRadarrBlock::Cast.into(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close".to_owned(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
contextual_help: None,
},
TabRoute {
title: "Crew".to_owned(),
title: "Crew",
route: ActiveRadarrBlock::Crew.into(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close".to_owned(),
help: "<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close",
contextual_help: None,
},
TabRoute {
title: "Manual Search".to_owned(),
title: "Manual Search",
route: ActiveRadarrBlock::ManualSearch.into(),
help: "<r> refresh | <u> update | <e> edit | <o> sort | <s> auto search | <esc> close".to_owned(),
contextual_help: Some("<enter> details".to_owned())
help: "<r> refresh | <u> update | <e> edit | <o> sort | <s> auto search | <esc> close",
contextual_help: Some("<enter> details")
}
]),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default)]
pub enum ActiveRadarrBlock {
AddMovieAlreadyInLibrary,
AddMovieSearchInput,
@@ -387,8 +392,10 @@ pub enum ActiveRadarrBlock {
ManualSearchConfirmPrompt,
MovieDetails,
MovieHistory,
#[default]
Movies,
RootFolders,
System,
UpdateAndScanPrompt,
UpdateAllCollectionsPrompt,
UpdateAllMoviesPrompt,
@@ -410,6 +417,14 @@ pub const ADD_MOVIE_BLOCKS: [ActiveRadarrBlock; 10] = [
ActiveRadarrBlock::AddMovieAlreadyInLibrary,
ActiveRadarrBlock::AddMovieTagsInput,
];
pub const ADD_MOVIE_SELECTION_BLOCKS: [ActiveRadarrBlock; 6] = [
ActiveRadarrBlock::AddMovieSelectRootFolder,
ActiveRadarrBlock::AddMovieSelectMonitor,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
ActiveRadarrBlock::AddMovieSelectQualityProfile,
ActiveRadarrBlock::AddMovieTagsInput,
ActiveRadarrBlock::AddMovieConfirmPrompt,
];
pub const EDIT_COLLECTION_BLOCKS: [ActiveRadarrBlock; 7] = [
ActiveRadarrBlock::EditCollectionPrompt,
ActiveRadarrBlock::EditCollectionConfirmPrompt,
@@ -419,6 +434,14 @@ pub const EDIT_COLLECTION_BLOCKS: [ActiveRadarrBlock; 7] = [
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
ActiveRadarrBlock::EditCollectionToggleMonitored,
];
pub const EDIT_COLLECTION_SELECTION_BLOCKS: [ActiveRadarrBlock; 6] = [
ActiveRadarrBlock::EditCollectionToggleMonitored,
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability,
ActiveRadarrBlock::EditCollectionSelectQualityProfile,
ActiveRadarrBlock::EditCollectionRootFolderPathInput,
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
ActiveRadarrBlock::EditCollectionConfirmPrompt,
];
pub const EDIT_MOVIE_BLOCKS: [ActiveRadarrBlock; 7] = [
ActiveRadarrBlock::EditMoviePrompt,
ActiveRadarrBlock::EditMovieConfirmPrompt,
@@ -428,6 +451,14 @@ pub const EDIT_MOVIE_BLOCKS: [ActiveRadarrBlock; 7] = [
ActiveRadarrBlock::EditMovieTagsInput,
ActiveRadarrBlock::EditMovieToggleMonitored,
];
pub const EDIT_MOVIE_SELECTION_BLOCKS: [ActiveRadarrBlock; 6] = [
ActiveRadarrBlock::EditMovieToggleMonitored,
ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
ActiveRadarrBlock::EditMovieSelectQualityProfile,
ActiveRadarrBlock::EditMoviePathInput,
ActiveRadarrBlock::EditMovieTagsInput,
ActiveRadarrBlock::EditMovieConfirmPrompt,
];
pub const MOVIE_DETAILS_BLOCKS: [ActiveRadarrBlock; 10] = [
ActiveRadarrBlock::MovieDetails,
ActiveRadarrBlock::MovieHistory,
@@ -458,141 +489,11 @@ pub const DELETE_MOVIE_BLOCKS: [ActiveRadarrBlock; 4] = [
ActiveRadarrBlock::DeleteMovieToggleDeleteFile,
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion,
];
impl ActiveRadarrBlock {
pub fn next_add_movie_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::AddMovieSelectRootFolder => ActiveRadarrBlock::AddMovieSelectMonitor,
ActiveRadarrBlock::AddMovieSelectMonitor => {
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
}
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => {
ActiveRadarrBlock::AddMovieSelectQualityProfile
}
ActiveRadarrBlock::AddMovieSelectQualityProfile => ActiveRadarrBlock::AddMovieTagsInput,
ActiveRadarrBlock::AddMovieTagsInput => ActiveRadarrBlock::AddMovieConfirmPrompt,
_ => ActiveRadarrBlock::AddMovieSelectRootFolder,
}
}
pub fn next_edit_movie_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::EditMovieToggleMonitored => {
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
}
ActiveRadarrBlock::EditMovieSelectMinimumAvailability => {
ActiveRadarrBlock::EditMovieSelectQualityProfile
}
ActiveRadarrBlock::EditMovieSelectQualityProfile => ActiveRadarrBlock::EditMoviePathInput,
ActiveRadarrBlock::EditMoviePathInput => ActiveRadarrBlock::EditMovieTagsInput,
ActiveRadarrBlock::EditMovieTagsInput => ActiveRadarrBlock::EditMovieConfirmPrompt,
_ => ActiveRadarrBlock::EditMovieToggleMonitored,
}
}
pub fn next_edit_collection_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::EditCollectionToggleMonitored => {
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
}
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability => {
ActiveRadarrBlock::EditCollectionSelectQualityProfile
}
ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
ActiveRadarrBlock::EditCollectionRootFolderPathInput
}
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
}
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd => {
ActiveRadarrBlock::EditCollectionConfirmPrompt
}
_ => ActiveRadarrBlock::EditCollectionToggleMonitored,
}
}
pub fn next_delete_movie_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::DeleteMovieToggleDeleteFile => {
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion
}
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion => {
ActiveRadarrBlock::DeleteMovieConfirmPrompt
}
ActiveRadarrBlock::DeleteMovieConfirmPrompt => ActiveRadarrBlock::DeleteMovieToggleDeleteFile,
_ => ActiveRadarrBlock::DeleteMovieToggleDeleteFile,
}
}
pub fn previous_add_movie_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::AddMovieSelectRootFolder => ActiveRadarrBlock::AddMovieConfirmPrompt,
ActiveRadarrBlock::AddMovieSelectMonitor => ActiveRadarrBlock::AddMovieSelectRootFolder,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => {
ActiveRadarrBlock::AddMovieSelectMonitor
}
ActiveRadarrBlock::AddMovieSelectQualityProfile => {
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
}
ActiveRadarrBlock::AddMovieTagsInput => ActiveRadarrBlock::AddMovieSelectQualityProfile,
ActiveRadarrBlock::AddMovieConfirmPrompt => ActiveRadarrBlock::AddMovieTagsInput,
_ => ActiveRadarrBlock::AddMovieSelectRootFolder,
}
}
pub fn previous_edit_movie_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::EditMovieToggleMonitored => ActiveRadarrBlock::EditMovieConfirmPrompt,
ActiveRadarrBlock::EditMovieSelectMinimumAvailability => {
ActiveRadarrBlock::EditMovieToggleMonitored
}
ActiveRadarrBlock::EditMovieSelectQualityProfile => {
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
}
ActiveRadarrBlock::EditMoviePathInput => ActiveRadarrBlock::EditMovieSelectQualityProfile,
ActiveRadarrBlock::EditMovieTagsInput => ActiveRadarrBlock::EditMoviePathInput,
ActiveRadarrBlock::EditMovieConfirmPrompt => ActiveRadarrBlock::EditMovieTagsInput,
_ => ActiveRadarrBlock::EditMovieToggleMonitored,
}
}
pub fn previous_edit_collection_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::EditCollectionToggleMonitored => {
ActiveRadarrBlock::EditCollectionConfirmPrompt
}
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability => {
ActiveRadarrBlock::EditCollectionToggleMonitored
}
ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
}
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
ActiveRadarrBlock::EditCollectionSelectQualityProfile
}
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd => {
ActiveRadarrBlock::EditCollectionRootFolderPathInput
}
ActiveRadarrBlock::EditCollectionConfirmPrompt => {
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
}
_ => ActiveRadarrBlock::EditCollectionToggleMonitored,
}
}
pub fn previous_delete_movie_prompt_block(&self) -> Self {
match self {
ActiveRadarrBlock::DeleteMovieToggleDeleteFile => ActiveRadarrBlock::DeleteMovieConfirmPrompt,
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion => {
ActiveRadarrBlock::DeleteMovieToggleDeleteFile
}
ActiveRadarrBlock::DeleteMovieConfirmPrompt => {
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion
}
_ => ActiveRadarrBlock::DeleteMovieToggleDeleteFile,
}
}
}
pub const DELETE_MOVIE_SELECTION_BLOCKS: [ActiveRadarrBlock; 3] = [
ActiveRadarrBlock::DeleteMovieToggleDeleteFile,
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion,
ActiveRadarrBlock::DeleteMovieConfirmPrompt,
];
impl From<ActiveRadarrBlock> for Route {
fn from(active_radarr_block: ActiveRadarrBlock) -> Route {
@@ -606,7 +507,7 @@ impl From<(ActiveRadarrBlock, Option<ActiveRadarrBlock>)> for Route {
}
}
impl App {
impl<'a> App<'a> {
pub(super) async fn dispatch_by_radarr_block(&mut self, active_radarr_block: &ActiveRadarrBlock) {
match active_radarr_block {
ActiveRadarrBlock::Collections => {
@@ -773,7 +674,7 @@ pub mod radarr_test_utils {
};
use crate::models::ScrollableText;
pub fn create_test_radarr_data() -> RadarrData {
pub fn create_test_radarr_data<'a>() -> RadarrData<'a> {
let mut radarr_data = RadarrData {
is_searching: true,
is_filtering: true,
@@ -905,9 +806,9 @@ mod tests {
use crate::models::radarr_models::{
Collection, MinimumAvailability, Monitor, Movie, RootFolder,
};
use crate::models::HorizontallyScrollableText;
use crate::models::Route;
use crate::models::StatefulTable;
use crate::models::{BlockSelectionState, HorizontallyScrollableText};
#[test]
fn test_from_tuple_to_route_with_context() {
@@ -1149,10 +1050,7 @@ mod tests {
assert!(radarr_data.minimum_availability_list.items.is_empty());
assert!(radarr_data.quality_profile_list.items.is_empty());
assert!(radarr_data.root_folder_list.items.is_empty());
assert_eq!(
radarr_data.selected_block,
ActiveRadarrBlock::AddMovieSelectRootFolder
);
assert_eq!(radarr_data.selected_block, BlockSelectionState::default());
assert!(radarr_data.filtered_movies.items.is_empty());
assert!(radarr_data.downloads.items.is_empty());
assert!(radarr_data.quality_profile_map.is_empty());
@@ -1183,7 +1081,7 @@ mod tests {
assert!(!radarr_data.delete_movie_files);
assert!(!radarr_data.add_list_exclusion);
assert_eq!(radarr_data.main_tabs.tabs.len(), 4);
assert_eq!(radarr_data.main_tabs.tabs.len(), 5);
assert_str_eq!(radarr_data.main_tabs.tabs[0].title, "Library");
assert_eq!(
@@ -1192,7 +1090,7 @@ mod tests {
);
assert!(radarr_data.main_tabs.tabs[0].help.is_empty());
assert_eq!(radarr_data.main_tabs.tabs[0].contextual_help,
Some("<a> add | <e> edit | <del> delete | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter".to_owned()));
Some("<a> add | <e> edit | <del> delete | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"));
assert_str_eq!(radarr_data.main_tabs.tabs[1].title, "Downloads");
assert_eq!(
@@ -1202,7 +1100,7 @@ mod tests {
assert!(radarr_data.main_tabs.tabs[1].help.is_empty());
assert_eq!(
radarr_data.main_tabs.tabs[1].contextual_help,
Some("<r> refresh | <del> delete".to_owned())
Some("<r> refresh | <del> delete")
);
assert_str_eq!(radarr_data.main_tabs.tabs[2].title, "Collections");
@@ -1212,7 +1110,7 @@ mod tests {
);
assert!(radarr_data.main_tabs.tabs[2].help.is_empty());
assert_eq!(radarr_data.main_tabs.tabs[2].contextual_help,
Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter".to_owned()));
Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"));
assert_str_eq!(radarr_data.main_tabs.tabs[3].title, "Root Folders");
assert_eq!(
@@ -1222,7 +1120,18 @@ mod tests {
assert!(radarr_data.main_tabs.tabs[3].help.is_empty());
assert_eq!(
radarr_data.main_tabs.tabs[3].contextual_help,
Some("<a> add | <del> delete | <r> refresh".to_owned())
Some("<a> add | <del> delete | <r> refresh")
);
assert_str_eq!(radarr_data.main_tabs.tabs[4].title, "System");
assert_eq!(
radarr_data.main_tabs.tabs[4].route,
ActiveRadarrBlock::System.into()
);
assert!(radarr_data.main_tabs.tabs[4].help.is_empty());
assert_eq!(
radarr_data.main_tabs.tabs[4].contextual_help,
Some("<enter> select menu item | <esc> go back to menu selection")
);
assert_eq!(radarr_data.movie_info_tabs.tabs.len(), 6);
@@ -1303,7 +1212,7 @@ mod tests {
);
assert_eq!(
radarr_data.movie_info_tabs.tabs[5].contextual_help,
Some("<enter> details".to_owned())
Some("<enter> details")
);
}
}
@@ -1311,264 +1220,116 @@ mod tests {
mod active_radarr_block_tests {
use pretty_assertions::assert_eq;
use crate::app::radarr::ActiveRadarrBlock;
use crate::app::radarr::{
ActiveRadarrBlock, ADD_MOVIE_SELECTION_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS,
EDIT_COLLECTION_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS,
};
#[test]
fn test_next_add_movie_prompt_block() {
let active_block = ActiveRadarrBlock::AddMovieSelectRootFolder.next_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieSelectMonitor);
let active_block = active_block.next_add_movie_prompt_block();
fn test_add_movie_prompt_block_order() {
let mut add_movie_block_iter = ADD_MOVIE_SELECTION_BLOCKS.iter();
assert_eq!(
active_block,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
add_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::AddMovieSelectRootFolder
);
let active_block = active_block.next_add_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::AddMovieSelectQualityProfile
add_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::AddMovieSelectMonitor
);
let active_block = active_block.next_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieTagsInput);
let active_block = active_block.next_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieConfirmPrompt);
let active_block = active_block.next_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieSelectRootFolder);
}
#[test]
fn test_next_edit_movie_prompt_block() {
let active_block = ActiveRadarrBlock::EditMovieToggleMonitored.next_edit_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
add_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::AddMovieSelectMinimumAvailability
);
let active_block = active_block.next_edit_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditMovieSelectQualityProfile
add_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::AddMovieSelectQualityProfile
);
let active_block = active_block.next_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMoviePathInput);
let active_block = active_block.next_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMovieTagsInput);
let active_block = active_block.next_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMovieConfirmPrompt);
let active_block = active_block.next_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMovieToggleMonitored);
}
#[test]
fn test_next_edit_collection_prompt_block() {
let active_block =
ActiveRadarrBlock::EditCollectionToggleMonitored.next_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
add_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::AddMovieTagsInput
);
let active_block = active_block.next_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionSelectQualityProfile
);
let active_block = active_block.next_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionRootFolderPathInput
);
let active_block = active_block.next_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
);
let active_block = active_block.next_edit_collection_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditCollectionConfirmPrompt);
let active_block = active_block.next_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionToggleMonitored
add_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::AddMovieConfirmPrompt
);
}
#[test]
fn test_next_delete_movie_prompt_block() {
let active_block =
ActiveRadarrBlock::DeleteMovieToggleDeleteFile.next_delete_movie_prompt_block();
fn test_edit_movie_prompt_block_order() {
let mut edit_movie_block_iter = EDIT_MOVIE_SELECTION_BLOCKS.iter();
assert_eq!(
active_block,
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion
edit_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditMovieToggleMonitored
);
let active_block = active_block.next_delete_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::DeleteMovieConfirmPrompt);
let active_block = active_block.next_delete_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::DeleteMovieToggleDeleteFile);
}
#[test]
fn test_previous_add_movie_prompt_block() {
let active_block =
ActiveRadarrBlock::AddMovieSelectRootFolder.previous_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieConfirmPrompt);
let active_block = active_block.previous_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieTagsInput);
let active_block = active_block.previous_add_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::AddMovieSelectQualityProfile
edit_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditMovieSelectMinimumAvailability
);
let active_block = active_block.previous_add_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
edit_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditMovieSelectQualityProfile
);
let active_block = active_block.previous_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieSelectMonitor);
let active_block = active_block.previous_add_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::AddMovieSelectRootFolder);
}
#[test]
fn test_previous_edit_movie_prompt_block() {
let active_block =
ActiveRadarrBlock::EditMovieToggleMonitored.previous_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMovieConfirmPrompt);
let active_block = active_block.previous_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMovieTagsInput);
let active_block = active_block.previous_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMoviePathInput);
let active_block = active_block.previous_edit_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditMovieSelectQualityProfile
edit_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditMoviePathInput
);
let active_block = active_block.previous_edit_movie_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
edit_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditMovieTagsInput
);
let active_block = active_block.previous_edit_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditMovieToggleMonitored);
}
#[test]
fn test_previous_edit_collection_prompt_block() {
let active_block =
ActiveRadarrBlock::EditCollectionToggleMonitored.previous_edit_collection_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::EditCollectionConfirmPrompt);
let active_block = active_block.previous_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
);
let active_block = active_block.previous_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionRootFolderPathInput
);
let active_block = active_block.previous_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionSelectQualityProfile
);
let active_block = active_block.previous_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
);
let active_block = active_block.previous_edit_collection_prompt_block();
assert_eq!(
active_block,
ActiveRadarrBlock::EditCollectionToggleMonitored
edit_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditMovieConfirmPrompt
);
}
#[test]
fn test_previous_delete_movie_prompt_block() {
let active_block =
ActiveRadarrBlock::DeleteMovieToggleDeleteFile.previous_delete_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::DeleteMovieConfirmPrompt);
let active_block = active_block.previous_delete_movie_prompt_block();
fn test_edit_collection_prompt_block_order() {
let mut edit_collection_block_iter = EDIT_COLLECTION_SELECTION_BLOCKS.iter();
assert_eq!(
active_block,
ActiveRadarrBlock::DeleteMovieToggleAddListExclusion
edit_collection_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditCollectionToggleMonitored
);
assert_eq!(
edit_collection_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
);
assert_eq!(
edit_collection_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditCollectionSelectQualityProfile
);
assert_eq!(
edit_collection_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditCollectionRootFolderPathInput
);
assert_eq!(
edit_collection_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
);
assert_eq!(
edit_collection_block_iter.next().unwrap(),
&ActiveRadarrBlock::EditCollectionConfirmPrompt
);
}
let active_block = active_block.previous_delete_movie_prompt_block();
assert_eq!(active_block, ActiveRadarrBlock::DeleteMovieToggleDeleteFile);
#[test]
fn test_delete_movie_prompt_block_order() {
let mut delete_movie_block_iter = DELETE_MOVIE_SELECTION_BLOCKS.iter();
assert_eq!(
delete_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::DeleteMovieToggleDeleteFile
);
assert_eq!(
delete_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::DeleteMovieToggleAddListExclusion
);
assert_eq!(
delete_movie_block_iter.next().unwrap(),
&ActiveRadarrBlock::DeleteMovieConfirmPrompt
);
}
}
@@ -2120,7 +1881,7 @@ mod tests {
assert!(!app.data.radarr_data.collection_movies.items.is_empty());
}
fn construct_app_unit() -> (App, mpsc::Receiver<NetworkEvent>) {
fn construct_app_unit<'a>() -> (App<'a>, mpsc::Receiver<NetworkEvent>) {
let (sync_network_tx, sync_network_rx) = mpsc::channel::<NetworkEvent>(500);
let mut app = App {
network_tx: Some(sync_network_tx),