diff --git a/src/app/lidarr/lidarr_context_clues.rs b/src/app/lidarr/lidarr_context_clues.rs index b2bb8d7..7fdc69e 100644 --- a/src/app/lidarr/lidarr_context_clues.rs +++ b/src/app/lidarr/lidarr_context_clues.rs @@ -5,7 +5,8 @@ use crate::app::context_clues::{ use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::models::Route; use crate::models::servarr_data::lidarr::lidarr_data::{ - ADD_ARTIST_BLOCKS, ARTIST_DETAILS_BLOCKS, ActiveLidarrBlock, EDIT_ARTIST_BLOCKS, + ADD_ARTIST_BLOCKS, ADD_ROOT_FOLDER_BLOCKS, ARTIST_DETAILS_BLOCKS, ActiveLidarrBlock, + EDIT_ARTIST_BLOCKS, }; #[cfg(test)] @@ -73,7 +74,9 @@ impl ContextClueProvider for LidarrContextClueProvider { ActiveLidarrBlock::AddArtistSearchInput | ActiveLidarrBlock::AddArtistEmptySearchResults => { Some(&BARE_POPUP_CONTEXT_CLUES) } - _ if EDIT_ARTIST_BLOCKS.contains(&active_lidarr_block) => { + _ if EDIT_ARTIST_BLOCKS.contains(&active_lidarr_block) + || ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) => + { Some(&CONFIRMATION_PROMPT_CONTEXT_CLUES) } ActiveLidarrBlock::AddArtistPrompt diff --git a/src/app/lidarr/lidarr_context_clues_tests.rs b/src/app/lidarr/lidarr_context_clues_tests.rs index 9a3e501..e0250f4 100644 --- a/src/app/lidarr/lidarr_context_clues_tests.rs +++ b/src/app/lidarr/lidarr_context_clues_tests.rs @@ -10,7 +10,7 @@ mod tests { LidarrContextClueProvider, }; use crate::models::servarr_data::lidarr::lidarr_data::{ - ActiveLidarrBlock, EDIT_ARTIST_BLOCKS, LidarrData, + ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, EDIT_ARTIST_BLOCKS, LidarrData, }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use rstest::rstest; @@ -218,7 +218,10 @@ mod tests { #[test] fn test_lidarr_context_clue_provider_confirmation_prompt_popup_clues_edit_indexer_blocks() { - for active_lidarr_block in EDIT_ARTIST_BLOCKS { + let mut blocks = EDIT_ARTIST_BLOCKS.to_vec(); + blocks.extend(ADD_ROOT_FOLDER_BLOCKS); + + for active_lidarr_block in blocks { let mut app = App::test_default(); app.push_navigation_stack(active_lidarr_block.into()); diff --git a/src/cli/lidarr/add_command_handler.rs b/src/cli/lidarr/add_command_handler.rs index 889aeb4..b52d13f 100644 --- a/src/cli/lidarr/add_command_handler.rs +++ b/src/cli/lidarr/add_command_handler.rs @@ -5,11 +5,12 @@ use clap::{ArgAction, Subcommand, arg}; use tokio::sync::Mutex; use super::LidarrCommand; -use crate::models::servarr_models::AddRootFolderBody; use crate::{ app::App, cli::{CliCommandHandler, Command}, - models::lidarr_models::{AddArtistBody, AddArtistOptions, MonitorType, NewItemMonitorType}, + models::lidarr_models::{ + AddArtistBody, AddArtistOptions, AddLidarrRootFolderBody, MonitorType, NewItemMonitorType, + }, network::{NetworkTrait, lidarr_network::LidarrEvent}, }; @@ -78,8 +79,43 @@ pub enum LidarrAddCommand { }, #[command(about = "Add a new root folder")] RootFolder { + #[arg(long, help = "The name of the root folder", required = true)] + name: String, #[arg(long, help = "The path of the new root folder", required = true)] root_folder_path: String, + #[arg( + long, + help = "The ID of the default quality profile for artists in this root folder", + required = true + )] + quality_profile_id: i64, + #[arg( + long, + help = "The ID of the default metadata profile for artists in this root folder", + required = true + )] + metadata_profile_id: i64, + #[arg( + long, + help = "The default monitor option for artists in this root folder", + value_enum, + default_value_t = MonitorType::default() + )] + monitor: MonitorType, + #[arg( + long, + help = "The default monitor new items option for artists in this root folder", + value_enum, + default_value_t = NewItemMonitorType::default() + )] + monitor_new_items: NewItemMonitorType, + #[arg( + long, + help = "Default tag IDs for artists in this root folder", + value_parser, + action = ArgAction::Append + )] + tag: Vec, }, #[command(about = "Add new tag")] Tag { @@ -148,9 +184,24 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, LidarrAddCommand> for LidarrAddCommandHan .await?; serde_json::to_string_pretty(&resp)? } - LidarrAddCommand::RootFolder { root_folder_path } => { - let add_root_folder_body = AddRootFolderBody { + LidarrAddCommand::RootFolder { + name, + root_folder_path, + quality_profile_id, + metadata_profile_id, + monitor, + monitor_new_items, + tag: tags, + } => { + let add_root_folder_body = AddLidarrRootFolderBody { + name, path: root_folder_path, + default_quality_profile_id: quality_profile_id, + default_metadata_profile_id: metadata_profile_id, + default_monitor_option: monitor, + default_new_item_monitor_option: monitor_new_items, + default_tags: tags, + tag_input_string: None, }; let resp = self .network diff --git a/src/cli/lidarr/add_command_handler_tests.rs b/src/cli/lidarr/add_command_handler_tests.rs index 7659cfa..b96d257 100644 --- a/src/cli/lidarr/add_command_handler_tests.rs +++ b/src/cli/lidarr/add_command_handler_tests.rs @@ -42,7 +42,13 @@ mod tests { #[test] fn test_add_root_folder_success() { let expected_args = LidarrAddCommand::RootFolder { + name: "Music".to_owned(), root_folder_path: "/nfs/test".to_owned(), + quality_profile_id: 1, + metadata_profile_id: 1, + monitor: MonitorType::All, + monitor_new_items: NewItemMonitorType::All, + tag: vec![], }; let result = Cli::try_parse_from([ @@ -50,8 +56,14 @@ mod tests { "lidarr", "add", "root-folder", + "--name", + "Music", "--root-folder-path", "/nfs/test", + "--quality-profile-id", + "1", + "--metadata-profile-id", + "1", ]); assert_ok!(&result); @@ -416,9 +428,9 @@ mod tests { use crate::cli::lidarr::add_command_handler::{LidarrAddCommand, LidarrAddCommandHandler}; use crate::models::Serdeable; use crate::models::lidarr_models::{ - AddArtistBody, AddArtistOptions, LidarrSerdeable, MonitorType, NewItemMonitorType, + AddArtistBody, AddArtistOptions, AddLidarrRootFolderBody, LidarrSerdeable, MonitorType, + NewItemMonitorType, }; - use crate::models::servarr_models::AddRootFolderBody; use crate::network::lidarr_network::LidarrEvent; use crate::{ app::App, @@ -428,8 +440,15 @@ mod tests { #[tokio::test] async fn test_handle_add_root_folder_command() { let expected_root_folder_path = "/nfs/test".to_owned(); - let expected_add_root_folder_body = AddRootFolderBody { + let expected_add_root_folder_body = AddLidarrRootFolderBody { + name: "Music".to_owned(), path: expected_root_folder_path.clone(), + default_quality_profile_id: 1, + default_metadata_profile_id: 1, + default_monitor_option: MonitorType::All, + default_new_item_monitor_option: NewItemMonitorType::All, + default_tags: vec![1, 2], + tag_input_string: None, }; let mut mock_network = MockNetworkTrait::new(); mock_network @@ -445,7 +464,13 @@ mod tests { }); let app_arc = Arc::new(Mutex::new(App::test_default())); let add_root_folder_command = LidarrAddCommand::RootFolder { + name: "Music".to_owned(), root_folder_path: expected_root_folder_path, + quality_profile_id: 1, + metadata_profile_id: 1, + monitor: MonitorType::All, + monitor_new_items: NewItemMonitorType::All, + tag: vec![1, 2], }; let result = diff --git a/src/handlers/lidarr_handlers/root_folders/add_root_folder_handler.rs b/src/handlers/lidarr_handlers/root_folders/add_root_folder_handler.rs new file mode 100644 index 0000000..b6d1bf7 --- /dev/null +++ b/src/handlers/lidarr_handlers/root_folders/add_root_folder_handler.rs @@ -0,0 +1,533 @@ +use crate::app::App; +use crate::event::Key; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::models::lidarr_models::AddLidarrRootFolderBody; +use crate::models::servarr_data::lidarr::lidarr_data::{ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock}; +use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; +use crate::models::{Route, Scrollable}; +use crate::network::lidarr_network::LidarrEvent; +use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; + +#[cfg(test)] +#[path = "add_root_folder_handler_tests.rs"] +mod add_root_folder_handler_tests; + +pub(super) struct AddRootFolderHandler<'a, 'b> { + key: Key, + app: &'a mut App<'b>, + active_lidarr_block: ActiveLidarrBlock, + context: Option, +} + +impl AddRootFolderHandler<'_, '_> { + fn build_add_root_folder_body(&mut self) -> AddLidarrRootFolderBody { + let add_root_folder_modal = self + .app + .data + .lidarr_data + .add_root_folder_modal + .take() + .expect("AddRootFolderModal is None"); + + let tags = add_root_folder_modal.tags.text.clone(); + + let AddRootFolderModal { + name, + path, + monitor_list, + monitor_new_items_list, + quality_profile_list, + metadata_profile_list, + .. + } = add_root_folder_modal; + + let quality_profile = quality_profile_list.current_selection(); + let quality_profile_id = *self + .app + .data + .lidarr_data + .quality_profile_map + .iter() + .filter(|(_, value)| *value == quality_profile) + .map(|(key, _)| key) + .next() + .unwrap(); + + let metadata_profile = metadata_profile_list.current_selection(); + let metadata_profile_id = *self + .app + .data + .lidarr_data + .metadata_profile_map + .iter() + .filter(|(_, value)| *value == metadata_profile) + .map(|(key, _)| key) + .next() + .unwrap(); + + AddLidarrRootFolderBody { + name: name.text, + path: path.text, + default_quality_profile_id: quality_profile_id, + default_metadata_profile_id: metadata_profile_id, + default_monitor_option: *monitor_list.current_selection(), + default_new_item_monitor_option: *monitor_new_items_list.current_selection(), + default_tags: Vec::new(), + tag_input_string: Some(tags), + } + } +} + +impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for AddRootFolderHandler<'a, 'b> { + fn accepts(active_block: ActiveLidarrBlock) -> bool { + ADD_ROOT_FOLDER_BLOCKS.contains(&active_block) + } + + fn ignore_special_keys(&self) -> bool { + self.app.ignore_special_keys_for_textbox_input + } + + fn new( + key: Key, + app: &'a mut App<'b>, + active_block: ActiveLidarrBlock, + context: Option, + ) -> AddRootFolderHandler<'a, 'b> { + AddRootFolderHandler { + key, + app, + active_lidarr_block: active_block, + context, + } + } + + fn get_key(&self) -> Key { + self.key + } + + fn is_ready(&self) -> bool { + !self.app.is_loading && self.app.data.lidarr_data.add_root_folder_modal.is_some() + } + + fn handle_scroll_up(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderSelectMonitor => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_list + .scroll_up(), + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_new_items_list + .scroll_up(), + ActiveLidarrBlock::AddRootFolderSelectQualityProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .quality_profile_list + .scroll_up(), + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .metadata_profile_list + .scroll_up(), + ActiveLidarrBlock::AddRootFolderPrompt => self.app.data.lidarr_data.selected_block.up(), + _ => (), + } + } + + fn handle_scroll_down(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderSelectMonitor => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_list + .scroll_down(), + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_new_items_list + .scroll_down(), + ActiveLidarrBlock::AddRootFolderSelectQualityProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .quality_profile_list + .scroll_down(), + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .metadata_profile_list + .scroll_down(), + ActiveLidarrBlock::AddRootFolderPrompt => self.app.data.lidarr_data.selected_block.down(), + _ => (), + } + } + + fn handle_home(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderSelectMonitor => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_list + .scroll_to_top(), + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_new_items_list + .scroll_to_top(), + ActiveLidarrBlock::AddRootFolderSelectQualityProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .quality_profile_list + .scroll_to_top(), + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .metadata_profile_list + .scroll_to_top(), + ActiveLidarrBlock::AddRootFolderNameInput => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .name + .scroll_home(), + ActiveLidarrBlock::AddRootFolderPathInput => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .path + .scroll_home(), + ActiveLidarrBlock::AddRootFolderTagsInput => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .tags + .scroll_home(), + _ => (), + } + } + + fn handle_end(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderSelectMonitor => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_list + .scroll_to_bottom(), + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_new_items_list + .scroll_to_bottom(), + ActiveLidarrBlock::AddRootFolderSelectQualityProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .quality_profile_list + .scroll_to_bottom(), + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .metadata_profile_list + .scroll_to_bottom(), + ActiveLidarrBlock::AddRootFolderNameInput => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .name + .reset_offset(), + ActiveLidarrBlock::AddRootFolderPathInput => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .path + .reset_offset(), + ActiveLidarrBlock::AddRootFolderTagsInput => self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .tags + .reset_offset(), + _ => (), + } + } + + fn handle_delete(&mut self) {} + + fn handle_left_right_action(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderPrompt => handle_prompt_toggle(self.app, self.key), + ActiveLidarrBlock::AddRootFolderNameInput => { + handle_text_box_left_right_keys!( + self, + self.key, + self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .name + ) + } + ActiveLidarrBlock::AddRootFolderPathInput => { + handle_text_box_left_right_keys!( + self, + self.key, + self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .path + ) + } + ActiveLidarrBlock::AddRootFolderTagsInput => { + handle_text_box_left_right_keys!( + self, + self.key, + self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .tags + ) + } + _ => (), + } + } + + fn handle_submit(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderPrompt => { + match self.app.data.lidarr_data.selected_block.get_active_block() { + ActiveLidarrBlock::AddRootFolderConfirmPrompt => { + if self.app.data.lidarr_data.prompt_confirm { + self.app.data.lidarr_data.prompt_confirm_action = Some(LidarrEvent::AddRootFolder( + self.build_add_root_folder_body(), + )); + self.app.should_refresh = true; + } + + self.app.pop_navigation_stack(); + } + ActiveLidarrBlock::AddRootFolderSelectMonitor + | ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems + | ActiveLidarrBlock::AddRootFolderSelectQualityProfile + | ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => { + self.app.push_navigation_stack( + ( + self.app.data.lidarr_data.selected_block.get_active_block(), + self.context, + ) + .into(), + ) + } + ActiveLidarrBlock::AddRootFolderNameInput + | ActiveLidarrBlock::AddRootFolderPathInput + | ActiveLidarrBlock::AddRootFolderTagsInput => { + self.app.push_navigation_stack( + ( + self.app.data.lidarr_data.selected_block.get_active_block(), + self.context, + ) + .into(), + ); + self.app.ignore_special_keys_for_textbox_input = true; + } + _ => (), + } + } + ActiveLidarrBlock::AddRootFolderSelectMonitor + | ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems + | ActiveLidarrBlock::AddRootFolderSelectQualityProfile + | ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => self.app.pop_navigation_stack(), + ActiveLidarrBlock::AddRootFolderNameInput + | ActiveLidarrBlock::AddRootFolderPathInput + | ActiveLidarrBlock::AddRootFolderTagsInput => { + self.app.pop_navigation_stack(); + self.app.ignore_special_keys_for_textbox_input = false; + } + _ => (), + } + } + + fn handle_esc(&mut self) { + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderNameInput + | ActiveLidarrBlock::AddRootFolderPathInput + | ActiveLidarrBlock::AddRootFolderTagsInput => { + self.app.pop_navigation_stack(); + self.app.ignore_special_keys_for_textbox_input = false; + } + ActiveLidarrBlock::AddRootFolderPrompt => { + self.app.pop_navigation_stack(); + self.app.data.lidarr_data.add_root_folder_modal = None; + self.app.data.lidarr_data.prompt_confirm = false; + } + ActiveLidarrBlock::AddRootFolderSelectMonitor + | ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems + | ActiveLidarrBlock::AddRootFolderSelectQualityProfile + | ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => self.app.pop_navigation_stack(), + _ => (), + } + } + + fn handle_char_key_event(&mut self) { + let key = self.key; + match self.active_lidarr_block { + ActiveLidarrBlock::AddRootFolderNameInput => { + handle_text_box_keys!( + self, + key, + self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .name + ) + } + ActiveLidarrBlock::AddRootFolderPathInput => { + handle_text_box_keys!( + self, + key, + self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .path + ) + } + ActiveLidarrBlock::AddRootFolderTagsInput => { + handle_text_box_keys!( + self, + key, + self + .app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .tags + ) + } + ActiveLidarrBlock::AddRootFolderPrompt => { + if self.app.data.lidarr_data.selected_block.get_active_block() + == ActiveLidarrBlock::AddRootFolderConfirmPrompt + && matches_key!(confirm, key) + { + self.app.data.lidarr_data.prompt_confirm = true; + self.app.data.lidarr_data.prompt_confirm_action = Some(LidarrEvent::AddRootFolder( + self.build_add_root_folder_body(), + )); + self.app.should_refresh = true; + + self.app.pop_navigation_stack(); + } + } + _ => (), + } + } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> Route { + self.app.get_current_route() + } +} diff --git a/src/handlers/lidarr_handlers/root_folders/add_root_folder_handler_tests.rs b/src/handlers/lidarr_handlers/root_folders/add_root_folder_handler_tests.rs new file mode 100644 index 0000000..004706d --- /dev/null +++ b/src/handlers/lidarr_handlers/root_folders/add_root_folder_handler_tests.rs @@ -0,0 +1,1707 @@ +#[cfg(test)] +mod tests { + use bimap::BiMap; + use pretty_assertions::{assert_eq, assert_str_eq}; + use rstest::rstest; + use strum::IntoEnumIterator; + + use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_modal_absent; + use crate::assert_navigation_pushed; + use crate::event::Key; + use crate::handlers::KeyEventHandler; + use crate::handlers::lidarr_handlers::root_folders::add_root_folder_handler::AddRootFolderHandler; + use crate::models::lidarr_models::{AddLidarrRootFolderBody, MonitorType, NewItemMonitorType}; + use crate::models::servarr_data::lidarr::lidarr_data::{ + ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, + }; + use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; + use crate::network::lidarr_network::LidarrEvent; + + mod test_handle_scroll_up_and_down { + use pretty_assertions::assert_eq; + use rstest::rstest; + use strum::IntoEnumIterator; + + use crate::models::BlockSelectionState; + use crate::models::servarr_data::lidarr::lidarr_data::ADD_ROOT_FOLDER_SELECTION_BLOCKS; + + use super::*; + + #[rstest] + fn test_add_root_folder_select_monitor_scroll( + #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, + ) { + let monitor_type_vec = Vec::from_iter(MonitorType::iter()); + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_list + .set_items(monitor_type_vec.clone()); + + if key == Key::Up { + for i in (0..monitor_type_vec.len()).rev() { + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitor, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_list + .current_selection(), + &monitor_type_vec[i] + ); + } + } else { + for i in 0..monitor_type_vec.len() { + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitor, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_list + .current_selection(), + &monitor_type_vec[(i + 1) % monitor_type_vec.len()] + ); + } + } + } + + #[rstest] + fn test_add_root_folder_select_monitor_new_items_scroll( + #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, + ) { + let monitor_type_vec = Vec::from_iter(NewItemMonitorType::iter()); + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_new_items_list + .set_items(monitor_type_vec.clone()); + + if key == Key::Up { + for i in (0..monitor_type_vec.len()).rev() { + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_new_items_list + .current_selection(), + &monitor_type_vec[i] + ); + } + } else { + for i in 0..monitor_type_vec.len() { + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_new_items_list + .current_selection(), + &monitor_type_vec[(i + 1) % monitor_type_vec.len()] + ); + } + } + } + + #[rstest] + fn test_add_root_folder_select_quality_profile_scroll( + #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, + ) { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .quality_profile_list + .set_items(vec!["Test 1".to_owned(), "Test 2".to_owned()]); + + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .quality_profile_list + .current_selection(), + "Test 2" + ); + + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .quality_profile_list + .current_selection(), + "Test 1" + ); + } + + #[rstest] + fn test_add_root_folder_select_metadata_profile_scroll( + #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, + ) { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .metadata_profile_list + .set_items(vec!["Test 1".to_owned(), "Test 2".to_owned()]); + + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .metadata_profile_list + .current_selection(), + "Test 2" + ); + + AddRootFolderHandler::new( + key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .metadata_profile_list + .current_selection(), + "Test 1" + ); + } + + #[rstest] + fn test_add_root_folder_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app.data.lidarr_data.selected_block.down(); + + AddRootFolderHandler::new(key, &mut app, ActiveLidarrBlock::AddRootFolderPrompt, None) + .handle(); + + if key == Key::Up { + assert_eq!( + app.data.lidarr_data.selected_block.get_active_block(), + ActiveLidarrBlock::AddRootFolderNameInput + ); + } else { + assert_eq!( + app.data.lidarr_data.selected_block.get_active_block(), + ActiveLidarrBlock::AddRootFolderSelectMonitor + ); + } + } + + #[rstest] + fn test_add_root_folder_prompt_scroll_no_op_when_not_ready( + #[values(Key::Up, Key::Down)] key: Key, + ) { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.is_loading = true; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app.data.lidarr_data.selected_block.down(); + + AddRootFolderHandler::new(key, &mut app, ActiveLidarrBlock::AddRootFolderPrompt, None) + .handle(); + + assert_eq!( + app.data.lidarr_data.selected_block.get_active_block(), + ActiveLidarrBlock::AddRootFolderPathInput + ); + } + } + + mod test_handle_home_end { + use pretty_assertions::assert_eq; + use std::sync::atomic::Ordering; + + use strum::IntoEnumIterator; + + use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; + + use super::*; + + #[test] + fn test_add_root_folder_select_monitor_home_end() { + let monitor_type_vec = Vec::from_iter(MonitorType::iter()); + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_list + .set_items(monitor_type_vec.clone()); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitor, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_list + .current_selection(), + &monitor_type_vec[monitor_type_vec.len() - 1] + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitor, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_list + .current_selection(), + &monitor_type_vec[0] + ); + } + + #[test] + fn test_add_root_folder_select_monitor_new_items_home_end() { + let monitor_type_vec = Vec::from_iter(NewItemMonitorType::iter()); + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .monitor_new_items_list + .set_items(monitor_type_vec.clone()); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_new_items_list + .current_selection(), + &monitor_type_vec[monitor_type_vec.len() - 1] + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .monitor_new_items_list + .current_selection(), + &monitor_type_vec[0] + ); + } + + #[test] + fn test_add_root_folder_select_quality_profile_home_end() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .quality_profile_list + .set_items(vec![ + "Test 1".to_owned(), + "Test 2".to_owned(), + "Test 3".to_owned(), + ]); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .quality_profile_list + .current_selection(), + "Test 3" + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .quality_profile_list + .current_selection(), + "Test 1" + ); + } + + #[test] + fn test_add_root_folder_select_metadata_profile_home_end() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .metadata_profile_list + .set_items(vec![ + "Test 1".to_owned(), + "Test 2".to_owned(), + "Test 3".to_owned(), + ]); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .metadata_profile_list + .current_selection(), + "Test 3" + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .metadata_profile_list + .current_selection(), + "Test 1" + ); + } + + #[test] + fn test_add_root_folder_name_input_home_end_keys() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + name: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .offset + .load(Ordering::SeqCst), + 4 + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .offset + .load(Ordering::SeqCst), + 0 + ); + } + + #[test] + fn test_add_root_folder_path_input_home_end_keys() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + path: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .offset + .load(Ordering::SeqCst), + 4 + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .offset + .load(Ordering::SeqCst), + 0 + ); + } + + #[test] + fn test_add_root_folder_tags_input_home_end_keys() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + tags: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .tags + .offset + .load(Ordering::SeqCst), + 4 + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .tags + .offset + .load(Ordering::SeqCst), + 0 + ); + } + } + + mod test_handle_left_right_action { + use pretty_assertions::assert_eq; + use std::sync::atomic::Ordering; + + use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; + use rstest::rstest; + + use super::*; + + #[rstest] + fn test_left_right_prompt_toggle(#[values(Key::Left, Key::Right)] key: Key) { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + + AddRootFolderHandler::new(key, &mut app, ActiveLidarrBlock::AddRootFolderPrompt, None) + .handle(); + + assert!(app.data.lidarr_data.prompt_confirm); + + AddRootFolderHandler::new(key, &mut app, ActiveLidarrBlock::AddRootFolderPrompt, None) + .handle(); + + assert!(!app.data.lidarr_data.prompt_confirm); + } + + #[test] + fn test_add_root_folder_name_input_left_right_keys() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + name: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.left.key, + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .offset + .load(Ordering::SeqCst), + 1 + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.right.key, + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .offset + .load(Ordering::SeqCst), + 0 + ); + } + + #[test] + fn test_add_root_folder_path_input_left_right_keys() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + path: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.left.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .offset + .load(Ordering::SeqCst), + 1 + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.right.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .offset + .load(Ordering::SeqCst), + 0 + ); + } + + #[test] + fn test_add_root_folder_tags_input_left_right_keys() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + tags: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.left.key, + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .tags + .offset + .load(Ordering::SeqCst), + 1 + ); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.right.key, + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .tags + .offset + .load(Ordering::SeqCst), + 0 + ); + } + } + + mod test_handle_submit { + use crate::assert_navigation_popped; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::lidarr::lidarr_data::ADD_ROOT_FOLDER_SELECTION_BLOCKS; + use pretty_assertions::assert_eq; + use rstest::rstest; + + use super::*; + + const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; + + #[test] + fn test_add_root_folder_name_input_submit() { + let mut app = App::test_default(); + app.ignore_special_keys_for_textbox_input = true; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + name: "Test Name".into(), + ..AddRootFolderModal::default() + }); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderNameInput.into()); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert!(!app.ignore_special_keys_for_textbox_input); + assert!( + !app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .text + .is_empty() + ); + assert_navigation_popped!(app, ActiveLidarrBlock::AddRootFolderPrompt.into()); + } + + #[test] + fn test_add_root_folder_path_input_submit() { + let mut app = App::test_default(); + app.ignore_special_keys_for_textbox_input = true; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + path: "Test Path".into(), + ..AddRootFolderModal::default() + }); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPathInput.into()); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert!(!app.ignore_special_keys_for_textbox_input); + assert!( + !app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); + assert_navigation_popped!(app, ActiveLidarrBlock::AddRootFolderPrompt.into()); + } + + #[test] + fn test_add_root_folder_tags_input_submit() { + let mut app = App::test_default(); + app.ignore_special_keys_for_textbox_input = true; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + tags: "Test Tags".into(), + ..AddRootFolderModal::default() + }); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderTagsInput.into()); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert!(!app.ignore_special_keys_for_textbox_input); + assert!( + !app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty() + ); + assert_navigation_popped!(app, ActiveLidarrBlock::AddRootFolderPrompt.into()); + } + + #[test] + fn test_add_root_folder_prompt_prompt_decline_submit() { + let mut app = App::test_default(); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app + .data + .lidarr_data + .selected_block + .set_index(0, ADD_ROOT_FOLDER_SELECTION_BLOCKS.len() - 1); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ) + .handle(); + + assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); + assert_none!(app.data.lidarr_data.prompt_confirm_action); + } + + #[test] + fn test_add_root_folder_confirm_prompt_prompt_confirmation_submit() { + let mut app = App::test_default(); + let mut add_root_folder = AddRootFolderModal { + name: "Test Name".to_owned().into(), + path: "/nfs/Test Path".to_owned().into(), + tags: "usenet, testing".to_owned().into(), + ..AddRootFolderModal::default() + }; + add_root_folder + .quality_profile_list + .set_items(vec!["Lossless".to_owned(), "FLAC".to_owned()]); + add_root_folder + .metadata_profile_list + .set_items(vec!["Standard".to_owned(), "Full".to_owned()]); + add_root_folder + .monitor_list + .set_items(Vec::from_iter(MonitorType::iter())); + add_root_folder + .monitor_new_items_list + .set_items(Vec::from_iter(NewItemMonitorType::iter())); + app.data.lidarr_data.add_root_folder_modal = Some(add_root_folder); + app.data.lidarr_data.quality_profile_map = + BiMap::from_iter([(1111, "Lossless".to_owned()), (2222, "FLAC".to_owned())]); + app.data.lidarr_data.metadata_profile_map = + BiMap::from_iter([(1111, "Standard".to_owned()), (2222, "Full".to_owned())]); + let expected_add_root_folder_body = AddLidarrRootFolderBody { + name: "Test Name".to_owned(), + path: "/nfs/Test Path".to_owned(), + default_quality_profile_id: 1111, + default_metadata_profile_id: 1111, + default_monitor_option: MonitorType::All, + default_new_item_monitor_option: NewItemMonitorType::All, + default_tags: Vec::new(), + tag_input_string: Some("usenet, testing".to_owned()), + }; + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.data.lidarr_data.prompt_confirm = true; + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app + .data + .lidarr_data + .selected_block + .set_index(0, ADD_ROOT_FOLDER_SELECTION_BLOCKS.len() - 1); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ) + .handle(); + + assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); + assert_eq!( + app.data.lidarr_data.prompt_confirm_action, + Some(LidarrEvent::AddRootFolder(expected_add_root_folder_body)) + ); + assert_modal_absent!(app.data.lidarr_data.add_root_folder_modal); + assert!(app.should_refresh); + } + + #[test] + fn test_add_root_folder_confirm_prompt_prompt_confirmation_submit_no_op_when_not_ready() { + let mut app = App::test_default(); + app.is_loading = true; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.data.lidarr_data.prompt_confirm = true; + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ) + .handle(); + + assert_eq!( + app.get_current_route(), + ActiveLidarrBlock::AddRootFolderPrompt.into() + ); + assert_none!(app.data.lidarr_data.prompt_confirm_action); + assert!(!app.should_refresh); + } + + #[rstest] + #[case(ActiveLidarrBlock::AddRootFolderNameInput, 0)] + #[case(ActiveLidarrBlock::AddRootFolderPathInput, 1)] + #[case(ActiveLidarrBlock::AddRootFolderSelectMonitor, 2)] + #[case(ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, 3)] + #[case(ActiveLidarrBlock::AddRootFolderSelectQualityProfile, 4)] + #[case(ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, 5)] + #[case(ActiveLidarrBlock::AddRootFolderTagsInput, 6)] + fn test_add_root_folder_prompt_selected_block_submit( + #[case] selected_block: ActiveLidarrBlock, + #[case] y_index: usize, + ) { + let mut app = App::test_default(); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack( + ( + ActiveLidarrBlock::AddRootFolderPrompt, + Some(ActiveLidarrBlock::RootFolders), + ) + .into(), + ); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app.data.lidarr_data.selected_block.set_index(0, y_index); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + Some(ActiveLidarrBlock::RootFolders), + ) + .handle(); + + assert_navigation_pushed!( + app, + (selected_block, Some(ActiveLidarrBlock::RootFolders)).into() + ); + assert_none!(app.data.lidarr_data.prompt_confirm_action); + + if selected_block == ActiveLidarrBlock::AddRootFolderNameInput + || selected_block == ActiveLidarrBlock::AddRootFolderPathInput + || selected_block == ActiveLidarrBlock::AddRootFolderTagsInput + { + assert!(app.ignore_special_keys_for_textbox_input); + } + } + + #[rstest] + fn test_add_root_folder_prompt_selected_block_submit_no_op_when_not_ready( + #[values(0, 1, 2, 3, 4, 5, 6)] y_index: usize, + ) { + let mut app = App::test_default(); + app.is_loading = true; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack( + ( + ActiveLidarrBlock::AddRootFolderPrompt, + Some(ActiveLidarrBlock::RootFolders), + ) + .into(), + ); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app.data.lidarr_data.selected_block.set_index(0, y_index); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + Some(ActiveLidarrBlock::RootFolders), + ) + .handle(); + + assert_eq!( + app.get_current_route(), + ( + ActiveLidarrBlock::AddRootFolderPrompt, + Some(ActiveLidarrBlock::RootFolders), + ) + .into() + ); + assert_none!(app.data.lidarr_data.prompt_confirm_action); + assert!(!app.ignore_special_keys_for_textbox_input); + } + + #[rstest] + fn test_add_root_folder_prompt_selecting_preferences_blocks_submit( + #[values( + ActiveLidarrBlock::AddRootFolderSelectMonitor, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, + ActiveLidarrBlock::AddRootFolderNameInput, + ActiveLidarrBlock::AddRootFolderPathInput, + ActiveLidarrBlock::AddRootFolderTagsInput + )] + active_lidarr_block: ActiveLidarrBlock, + ) { + let mut app = App::test_default(); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.push_navigation_stack(active_lidarr_block.into()); + + AddRootFolderHandler::new( + SUBMIT_KEY, + &mut app, + active_lidarr_block, + Some(ActiveLidarrBlock::RootFolders), + ) + .handle(); + + assert_navigation_popped!(app, ActiveLidarrBlock::AddRootFolderPrompt.into()); + + if active_lidarr_block == ActiveLidarrBlock::AddRootFolderNameInput + || active_lidarr_block == ActiveLidarrBlock::AddRootFolderPathInput + || active_lidarr_block == ActiveLidarrBlock::AddRootFolderTagsInput + { + assert!(!app.ignore_special_keys_for_textbox_input); + } + } + } + + mod test_handle_esc { + use crate::assert_navigation_popped; + use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; + use rstest::rstest; + + use super::*; + + const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; + + #[rstest] + fn test_add_root_folder_input_esc( + #[values( + ActiveLidarrBlock::AddRootFolderTagsInput, + ActiveLidarrBlock::AddRootFolderPathInput, + ActiveLidarrBlock::AddRootFolderNameInput + )] + active_lidarr_block: ActiveLidarrBlock, + ) { + let mut app = App::test_default(); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.ignore_special_keys_for_textbox_input = true; + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.push_navigation_stack(active_lidarr_block.into()); + + AddRootFolderHandler::new(ESC_KEY, &mut app, active_lidarr_block, None).handle(); + + assert!(!app.ignore_special_keys_for_textbox_input); + assert_navigation_popped!(app, ActiveLidarrBlock::AddRootFolderPrompt.into()); + } + + #[test] + fn test_add_root_folder_prompt_esc() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + + AddRootFolderHandler::new( + ESC_KEY, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ) + .handle(); + + assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); + + assert_modal_absent!(app.data.lidarr_data.add_root_folder_modal); + assert!(!app.data.lidarr_data.prompt_confirm); + } + + #[rstest] + fn test_add_root_folder_esc( + #[values( + ActiveLidarrBlock::AddRootFolderSelectMonitor, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile + )] + active_lidarr_block: ActiveLidarrBlock, + #[values(true, false)] is_ready: bool, + ) { + let mut app = App::test_default(); + app.is_loading = is_ready; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(active_lidarr_block.into()); + + AddRootFolderHandler::new(ESC_KEY, &mut app, active_lidarr_block, None).handle(); + + assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); + } + } + + mod test_handle_key_char { + use super::*; + use crate::{ + assert_navigation_popped, + models::{ + BlockSelectionState, + servarr_data::lidarr::{ + lidarr_data::ADD_ROOT_FOLDER_SELECTION_BLOCKS, modals::AddRootFolderModal, + }, + }, + }; + use pretty_assertions::assert_eq; + + #[test] + fn test_add_root_folder_name_input_backspace() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + name: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.backspace.key, + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .text, + "Tes" + ); + } + + #[test] + fn test_add_root_folder_path_input_backspace() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + path: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.backspace.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .text, + "Tes" + ); + } + + #[test] + fn test_add_root_folder_tags_input_backspace() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal { + tags: "Test".into(), + ..AddRootFolderModal::default() + }); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.backspace.key, + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .tags + .text, + "Tes" + ); + } + + #[test] + fn test_add_root_folder_name_input_char_key() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + + AddRootFolderHandler::new( + Key::Char('a'), + &mut app, + ActiveLidarrBlock::AddRootFolderNameInput, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .name + .text, + "a" + ); + } + + #[test] + fn test_add_root_folder_path_input_char_key() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + + AddRootFolderHandler::new( + Key::Char('a'), + &mut app, + ActiveLidarrBlock::AddRootFolderPathInput, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .path + .text, + "a" + ); + } + + #[test] + fn test_add_root_folder_tags_input_char_key() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + + AddRootFolderHandler::new( + Key::Char('a'), + &mut app, + ActiveLidarrBlock::AddRootFolderTagsInput, + None, + ) + .handle(); + + assert_str_eq!( + app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .unwrap() + .tags + .text, + "a" + ); + } + + #[test] + fn test_add_root_folder_confirm_prompt_prompt_confirm() { + let mut app = App::test_default(); + let mut add_root_folder = AddRootFolderModal { + name: "Test Name".to_owned().into(), + path: "/nfs/Test Path".to_owned().into(), + tags: "usenet, testing".to_owned().into(), + ..AddRootFolderModal::default() + }; + add_root_folder + .quality_profile_list + .set_items(vec!["Lossless".to_owned(), "FLAC".to_owned()]); + add_root_folder + .metadata_profile_list + .set_items(vec!["Standard".to_owned(), "Full".to_owned()]); + add_root_folder + .monitor_list + .set_items(Vec::from_iter(MonitorType::iter())); + add_root_folder + .monitor_new_items_list + .set_items(Vec::from_iter(NewItemMonitorType::iter())); + app.data.lidarr_data.add_root_folder_modal = Some(add_root_folder); + app.data.lidarr_data.quality_profile_map = + BiMap::from_iter([(1111, "Lossless".to_owned()), (2222, "FLAC".to_owned())]); + app.data.lidarr_data.metadata_profile_map = + BiMap::from_iter([(1111, "Standard".to_owned()), (2222, "Full".to_owned())]); + let expected_add_root_folder_body = AddLidarrRootFolderBody { + name: "Test Name".to_owned(), + path: "/nfs/Test Path".to_owned(), + default_quality_profile_id: 1111, + default_metadata_profile_id: 1111, + default_monitor_option: MonitorType::All, + default_new_item_monitor_option: NewItemMonitorType::All, + default_tags: Vec::new(), + tag_input_string: Some("usenet, testing".to_owned()), + }; + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app + .data + .lidarr_data + .selected_block + .set_index(0, ADD_ROOT_FOLDER_SELECTION_BLOCKS.len() - 1); + + AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.confirm.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ) + .handle(); + + assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); + assert_eq!( + app.data.lidarr_data.prompt_confirm_action, + Some(LidarrEvent::AddRootFolder(expected_add_root_folder_body)) + ); + assert_modal_absent!(app.data.lidarr_data.add_root_folder_modal); + assert!(app.should_refresh); + } + } + + #[test] + fn test_add_root_folder_handler_accepts() { + ActiveLidarrBlock::iter().for_each(|active_lidarr_block| { + if ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) { + assert!(AddRootFolderHandler::accepts(active_lidarr_block)); + } else { + assert!(!AddRootFolderHandler::accepts(active_lidarr_block)); + } + }); + } + + #[rstest] + fn test_add_root_folder_handler_ignore_special_keys( + #[values(true, false)] ignore_special_keys_for_textbox_input: bool, + ) { + let mut app = App::test_default(); + app.ignore_special_keys_for_textbox_input = ignore_special_keys_for_textbox_input; + let handler = AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveLidarrBlock::default(), + None, + ); + + assert_eq!( + handler.ignore_special_keys(), + ignore_special_keys_for_textbox_input + ); + } + + #[test] + fn test_build_add_root_folder_body() { + let mut app = App::test_default(); + let mut add_root_folder = AddRootFolderModal { + name: "Test Name".to_owned().into(), + path: "/nfs/Test Path".to_owned().into(), + tags: "usenet, testing".to_owned().into(), + ..AddRootFolderModal::default() + }; + add_root_folder + .quality_profile_list + .set_items(vec!["Lossless".to_owned(), "FLAC".to_owned()]); + add_root_folder + .metadata_profile_list + .set_items(vec!["Standard".to_owned(), "Full".to_owned()]); + add_root_folder + .monitor_list + .set_items(Vec::from_iter(MonitorType::iter())); + add_root_folder + .monitor_new_items_list + .set_items(Vec::from_iter(NewItemMonitorType::iter())); + app.data.lidarr_data.add_root_folder_modal = Some(add_root_folder); + app.data.lidarr_data.quality_profile_map = + BiMap::from_iter([(1111, "Lossless".to_owned()), (2222, "FLAC".to_owned())]); + app.data.lidarr_data.metadata_profile_map = + BiMap::from_iter([(1111, "Standard".to_owned()), (2222, "Full".to_owned())]); + let expected_add_root_folder_body = AddLidarrRootFolderBody { + name: "Test Name".to_owned(), + path: "/nfs/Test Path".to_owned(), + default_quality_profile_id: 1111, + default_metadata_profile_id: 1111, + default_monitor_option: MonitorType::All, + default_new_item_monitor_option: NewItemMonitorType::All, + default_tags: Vec::new(), + tag_input_string: Some("usenet, testing".to_owned()), + }; + + let add_root_folder_body = AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ) + .build_add_root_folder_body(); + + assert_eq!(add_root_folder_body, expected_add_root_folder_body); + assert_modal_absent!(app.data.lidarr_data.add_root_folder_modal); + } + + #[test] + fn test_add_root_folder_handler_is_not_ready_when_loading() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.is_loading = true; + + let handler = AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ); + + assert!(!handler.is_ready()); + } + + #[test] + fn test_add_root_folder_handler_is_not_ready_when_add_root_folder_modal_is_none() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.is_loading = false; + + let handler = AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ); + + assert!(!handler.is_ready()); + } + + #[test] + fn test_add_root_folder_handler_is_ready_when_add_root_folder_modal_is_some() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); + app.is_loading = false; + app.data.lidarr_data.add_root_folder_modal = Some(AddRootFolderModal::default()); + + let handler = AddRootFolderHandler::new( + DEFAULT_KEYBINDINGS.esc.key, + &mut app, + ActiveLidarrBlock::AddRootFolderPrompt, + None, + ); + + assert!(handler.is_ready()); + } +} diff --git a/src/handlers/lidarr_handlers/root_folders/mod.rs b/src/handlers/lidarr_handlers/root_folders/mod.rs index 716076c..858717b 100644 --- a/src/handlers/lidarr_handlers/root_folders/mod.rs +++ b/src/handlers/lidarr_handlers/root_folders/mod.rs @@ -1,13 +1,19 @@ +use add_root_folder_handler::AddRootFolderHandler; + use crate::app::App; use crate::event::Key; use crate::handlers::lidarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; -use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS}; -use crate::models::servarr_models::AddRootFolderBody; -use crate::models::{HorizontallyScrollableText, Route}; +use crate::matches_key; +use crate::models::servarr_data::lidarr::lidarr_data::{ + ADD_ROOT_FOLDER_BLOCKS, ADD_ROOT_FOLDER_SELECTION_BLOCKS, ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS, +}; +use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; +use crate::models::{BlockSelectionState, Route}; use crate::network::lidarr_network::LidarrEvent; -use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; + +mod add_root_folder_handler; #[cfg(test)] #[path = "root_folders_handler_tests.rs"] @@ -17,22 +23,10 @@ pub(super) struct RootFoldersHandler<'a, 'b> { key: Key, app: &'a mut App<'b>, active_lidarr_block: ActiveLidarrBlock, - _context: Option, + context: Option, } impl RootFoldersHandler<'_, '_> { - fn build_add_root_folder_body(&mut self) -> AddRootFolderBody { - let root_folder = self - .app - .data - .lidarr_data - .edit_root_folder - .take() - .expect("EditRootFolder is None") - .text; - AddRootFolderBody { path: root_folder } - } - fn extract_root_folder_id(&self) -> i64 { self .app @@ -49,6 +43,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for RootFoldersHandler<' let root_folders_table_handling_config = TableHandlingConfig::new(ActiveLidarrBlock::RootFolders.into()); + if AddRootFolderHandler::accepts(self.active_lidarr_block) { + return AddRootFolderHandler::new(self.key, self.app, self.active_lidarr_block, self.context) + .handle(); + } + if !handle_table( self, |app| &mut app.data.lidarr_data.root_folders, @@ -59,20 +58,20 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for RootFoldersHandler<' } fn accepts(active_block: ActiveLidarrBlock) -> bool { - ROOT_FOLDERS_BLOCKS.contains(&active_block) + ROOT_FOLDERS_BLOCKS.contains(&active_block) || ADD_ROOT_FOLDER_BLOCKS.contains(&active_block) } fn new( key: Key, app: &'a mut App<'b>, active_block: ActiveLidarrBlock, - _context: Option, + context: Option, ) -> RootFoldersHandler<'a, 'b> { RootFoldersHandler { key, app, active_lidarr_block: active_block, - _context, + context, } } @@ -92,31 +91,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for RootFoldersHandler<' fn handle_scroll_down(&mut self) {} - fn handle_home(&mut self) { - if self.active_lidarr_block == ActiveLidarrBlock::AddRootFolderPrompt { - self - .app - .data - .lidarr_data - .edit_root_folder - .as_mut() - .unwrap() - .scroll_home() - } - } + fn handle_home(&mut self) {} - fn handle_end(&mut self) { - if self.active_lidarr_block == ActiveLidarrBlock::AddRootFolderPrompt { - self - .app - .data - .lidarr_data - .edit_root_folder - .as_mut() - .unwrap() - .reset_offset() - } - } + fn handle_end(&mut self) {} fn handle_delete(&mut self) { if self.active_lidarr_block == ActiveLidarrBlock::RootFolders { @@ -130,57 +107,23 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for RootFoldersHandler<' match self.active_lidarr_block { ActiveLidarrBlock::RootFolders => handle_change_tab_left_right_keys(self.app, self.key), ActiveLidarrBlock::DeleteRootFolderPrompt => handle_prompt_toggle(self.app, self.key), - ActiveLidarrBlock::AddRootFolderPrompt => { - handle_text_box_left_right_keys!( - self, - self.key, - self.app.data.lidarr_data.edit_root_folder.as_mut().unwrap() - ) - } _ => (), } } fn handle_submit(&mut self) { - match self.active_lidarr_block { - ActiveLidarrBlock::DeleteRootFolderPrompt => { - if self.app.data.lidarr_data.prompt_confirm { - self.app.data.lidarr_data.prompt_confirm_action = - Some(LidarrEvent::DeleteRootFolder(self.extract_root_folder_id())); - } + if self.active_lidarr_block == ActiveLidarrBlock::DeleteRootFolderPrompt { + if self.app.data.lidarr_data.prompt_confirm { + self.app.data.lidarr_data.prompt_confirm_action = + Some(LidarrEvent::DeleteRootFolder(self.extract_root_folder_id())); + } - self.app.pop_navigation_stack(); - } - _ if self.active_lidarr_block == ActiveLidarrBlock::AddRootFolderPrompt - && !self - .app - .data - .lidarr_data - .edit_root_folder - .as_ref() - .unwrap() - .text - .is_empty() => - { - self.app.data.lidarr_data.prompt_confirm_action = Some(LidarrEvent::AddRootFolder( - self.build_add_root_folder_body(), - )); - self.app.data.lidarr_data.prompt_confirm = true; - self.app.ignore_special_keys_for_textbox_input = false; - self.app.pop_navigation_stack(); - } - _ => (), + self.app.pop_navigation_stack(); } } fn handle_esc(&mut self) { match self.active_lidarr_block { - ActiveLidarrBlock::AddRootFolderPrompt => { - self.app.pop_navigation_stack(); - self.app.data.lidarr_data.edit_root_folder = None; - self.app.data.lidarr_data.prompt_confirm = false; - self.app.ignore_special_keys_for_textbox_input = false; - } ActiveLidarrBlock::DeleteRootFolderPrompt => { self.app.pop_navigation_stack(); self.app.data.lidarr_data.prompt_confirm = false; @@ -197,21 +140,16 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveLidarrBlock> for RootFoldersHandler<' self.app.should_refresh = true; } _ if matches_key!(add, key) => { + self.app.data.lidarr_data.add_root_folder_modal = + Some(AddRootFolderModal::from(&self.app.data.lidarr_data)); + self.app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); self .app .push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); - self.app.data.lidarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); - self.app.ignore_special_keys_for_textbox_input = true; } _ => (), }, - ActiveLidarrBlock::AddRootFolderPrompt => { - handle_text_box_keys!( - self, - key, - self.app.data.lidarr_data.edit_root_folder.as_mut().unwrap() - ) - } ActiveLidarrBlock::DeleteRootFolderPrompt => { if matches_key!(confirm, key) { self.app.data.lidarr_data.prompt_confirm = true; diff --git a/src/handlers/lidarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/lidarr_handlers/root_folders/root_folders_handler_tests.rs index 2a562db..13e5a2e 100644 --- a/src/handlers/lidarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/lidarr_handlers/root_folders/root_folders_handler_tests.rs @@ -6,78 +6,17 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::assert_modal_absent; use crate::assert_modal_present; use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::lidarr_handlers::root_folders::RootFoldersHandler; - use crate::models::HorizontallyScrollableText; - use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS}; - use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; + use crate::models::servarr_data::lidarr::lidarr_data::{ + ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS, + }; + use crate::models::servarr_models::RootFolder; use crate::network::lidarr_network::lidarr_network_test_utils::test_utils::root_folder; - mod test_handle_home_end { - use crate::models::servarr_models::RootFolder; - use pretty_assertions::assert_eq; - use std::sync::atomic::Ordering; - - use super::*; - - #[test] - fn test_add_root_folder_prompt_home_end_keys() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); - app - .data - .lidarr_data - .root_folders - .set_items(vec![RootFolder::default()]); - app.data.lidarr_data.edit_root_folder = Some("Test".into()); - - RootFoldersHandler::new( - DEFAULT_KEYBINDINGS.home.key, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_eq!( - app - .data - .lidarr_data - .edit_root_folder - .as_ref() - .unwrap() - .offset - .load(Ordering::SeqCst), - 4 - ); - - RootFoldersHandler::new( - DEFAULT_KEYBINDINGS.end.key, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_eq!( - app - .data - .lidarr_data - .edit_root_folder - .as_ref() - .unwrap() - .offset - .load(Ordering::SeqCst), - 0 - ); - } - } - mod test_handle_delete { use pretty_assertions::assert_eq; @@ -121,8 +60,6 @@ mod tests { } mod test_handle_left_right_action { - use std::sync::atomic::Ordering; - use pretty_assertions::assert_eq; use rstest::rstest; @@ -200,127 +137,17 @@ mod tests { assert!(!app.data.lidarr_data.prompt_confirm); } - - #[test] - fn test_add_root_folder_prompt_left_right_keys() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app.data.lidarr_data.edit_root_folder = Some("Test".into()); - - RootFoldersHandler::new( - DEFAULT_KEYBINDINGS.left.key, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_eq!( - app - .data - .lidarr_data - .edit_root_folder - .as_ref() - .unwrap() - .offset - .load(Ordering::SeqCst), - 1 - ); - - RootFoldersHandler::new( - DEFAULT_KEYBINDINGS.right.key, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_eq!( - app - .data - .lidarr_data - .edit_root_folder - .as_ref() - .unwrap() - .offset - .load(Ordering::SeqCst), - 0 - ); - } } mod test_handle_submit { - use pretty_assertions::assert_eq; - use crate::network::lidarr_network::LidarrEvent; use super::*; + use crate::assert_navigation_popped; use crate::network::lidarr_network::lidarr_network_test_utils::test_utils::root_folder; - use crate::{assert_modal_absent, assert_navigation_popped}; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; - #[test] - fn test_add_root_folder_prompt_confirm_submit() { - let mut app = App::test_default(); - let expected_add_root_folder_body = AddRootFolderBody { - path: "Test".to_owned(), - }; - app - .data - .lidarr_data - .root_folders - .set_items(vec![RootFolder::default()]); - app.data.lidarr_data.edit_root_folder = Some("Test".into()); - app.data.lidarr_data.prompt_confirm = true; - app.ignore_special_keys_for_textbox_input = true; - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); - - RootFoldersHandler::new( - SUBMIT_KEY, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert!(app.data.lidarr_data.prompt_confirm); - assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.data.lidarr_data.prompt_confirm_action, - Some(LidarrEvent::AddRootFolder(expected_add_root_folder_body)) - ); - assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); - assert_modal_absent!(app.data.lidarr_data.edit_root_folder); - } - - #[test] - fn test_add_root_folder_prompt_confirm_submit_noop_on_empty_folder() { - let mut app = App::test_default(); - app.data.lidarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); - app.data.lidarr_data.prompt_confirm = false; - app.ignore_special_keys_for_textbox_input = true; - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); - - RootFoldersHandler::new( - SUBMIT_KEY, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert!(!app.data.lidarr_data.prompt_confirm); - assert!(app.ignore_special_keys_for_textbox_input); - assert_modal_absent!(app.data.lidarr_data.prompt_confirm_action); - assert_eq!( - app.get_current_route(), - ActiveLidarrBlock::AddRootFolderPrompt.into() - ); - } - #[test] fn test_delete_root_folder_prompt_confirm_submit() { let mut app = App::test_default(); @@ -400,29 +227,6 @@ mod tests { assert!(!app.data.lidarr_data.prompt_confirm); } - #[test] - fn test_add_root_folder_prompt_esc() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); - app.data.lidarr_data.edit_root_folder = Some("/nfs/test".into()); - app.ignore_special_keys_for_textbox_input = true; - - RootFoldersHandler::new( - ESC_KEY, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_navigation_popped!(app, ActiveLidarrBlock::RootFolders.into()); - - assert_modal_absent!(app.data.lidarr_data.edit_root_folder); - assert!(!app.data.lidarr_data.prompt_confirm); - assert!(!app.ignore_special_keys_for_textbox_input); - } - #[rstest] fn test_default_esc(#[values(true, false)] is_ready: bool) { let mut app = App::test_default(); @@ -443,7 +247,7 @@ mod tests { use crate::assert_navigation_popped; use crate::network::lidarr_network::LidarrEvent; use crate::network::lidarr_network::lidarr_network_test_utils::test_utils::root_folder; - use pretty_assertions::{assert_eq, assert_str_eq}; + use pretty_assertions::assert_eq; #[test] fn test_root_folder_add() { @@ -464,8 +268,7 @@ mod tests { .handle(); assert_navigation_pushed!(app, ActiveLidarrBlock::AddRootFolderPrompt.into()); - assert!(app.ignore_special_keys_for_textbox_input); - assert_modal_present!(app.data.lidarr_data.edit_root_folder); + assert_modal_present!(app.data.lidarr_data.add_root_folder_modal); } #[test] @@ -491,8 +294,7 @@ mod tests { app.get_current_route(), ActiveLidarrBlock::RootFolders.into() ); - assert!(!app.ignore_special_keys_for_textbox_input); - assert_modal_absent!(app.data.lidarr_data.edit_root_folder); + assert_none!(app.data.lidarr_data.add_root_folder_modal); } #[test] @@ -543,56 +345,6 @@ mod tests { assert!(!app.should_refresh); } - #[test] - fn test_add_root_folder_prompt_backspace_key() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app - .data - .lidarr_data - .root_folders - .set_items(vec![RootFolder::default()]); - app.data.lidarr_data.edit_root_folder = Some("/nfs/test".into()); - - RootFoldersHandler::new( - DEFAULT_KEYBINDINGS.backspace.key, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_str_eq!( - app.data.lidarr_data.edit_root_folder.as_ref().unwrap().text, - "/nfs/tes" - ); - } - - #[test] - fn test_add_root_folder_prompt_char_key() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveLidarrBlock::RootFolders.into()); - app - .data - .lidarr_data - .root_folders - .set_items(vec![RootFolder::default()]); - app.data.lidarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); - - RootFoldersHandler::new( - Key::Char('a'), - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .handle(); - - assert_str_eq!( - app.data.lidarr_data.edit_root_folder.as_ref().unwrap().text, - "a" - ); - } - #[test] fn test_delete_root_folder_prompt_confirm() { let mut app = App::test_default(); @@ -624,7 +376,9 @@ mod tests { #[test] fn test_root_folders_handler_accepts() { ActiveLidarrBlock::iter().for_each(|active_lidarr_block| { - if ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block) { + if ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block) + || ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) + { assert!(RootFoldersHandler::accepts(active_lidarr_block)); } else { assert!(!RootFoldersHandler::accepts(active_lidarr_block)); @@ -671,26 +425,6 @@ mod tests { assert_eq!(root_folder_id, 1); } - #[test] - fn test_build_add_root_folder_body() { - let mut app = App::test_default(); - app.data.lidarr_data.edit_root_folder = Some("/nfs/test".into()); - let expected_add_root_folder_body = AddRootFolderBody { - path: "/nfs/test".to_owned(), - }; - - let root_folder = RootFoldersHandler::new( - DEFAULT_KEYBINDINGS.esc.key, - &mut app, - ActiveLidarrBlock::AddRootFolderPrompt, - None, - ) - .build_add_root_folder_body(); - - assert_eq!(root_folder, expected_add_root_folder_body); - assert_modal_absent!(app.data.lidarr_data.edit_root_folder); - } - #[test] fn test_root_folders_handler_not_ready_when_loading() { let mut app = App::test_default(); diff --git a/src/models/lidarr_models.rs b/src/models/lidarr_models.rs index 58455cd..e528170 100644 --- a/src/models/lidarr_models.rs +++ b/src/models/lidarr_models.rs @@ -301,6 +301,20 @@ pub struct EditArtistParams { pub clear_tags: bool, } +#[derive(Default, Clone, Serialize, Debug, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct AddLidarrRootFolderBody { + pub name: String, + pub path: String, + pub default_quality_profile_id: i64, + pub default_metadata_profile_id: i64, + pub default_monitor_option: MonitorType, + pub default_new_item_monitor_option: NewItemMonitorType, + pub default_tags: Vec, + #[serde(skip_serializing, skip_deserializing)] + pub tag_input_string: Option, +} + #[derive(Derivative, Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct Album { diff --git a/src/models/servarr_data/lidarr/lidarr_data.rs b/src/models/servarr_data/lidarr/lidarr_data.rs index c96eff6..470acae 100644 --- a/src/models/servarr_data/lidarr/lidarr_data.rs +++ b/src/models/servarr_data/lidarr/lidarr_data.rs @@ -1,6 +1,6 @@ use serde_json::Number; -use super::modals::{AddArtistModal, EditArtistModal}; +use super::modals::{AddArtistModal, AddRootFolderModal, EditArtistModal}; use crate::app::context_clues::{ DOWNLOADS_CONTEXT_CLUES, HISTORY_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, }; @@ -39,6 +39,7 @@ pub struct LidarrData<'a> { pub add_artist_modal: Option, pub add_artist_search: Option, pub add_import_list_exclusion: bool, + pub add_root_folder_modal: Option, pub add_searched_artists: Option>, pub albums: StatefulTable, pub artist_info_tabs: TabState, @@ -47,7 +48,6 @@ pub struct LidarrData<'a> { pub disk_space_vec: Vec, pub downloads: StatefulTable, pub edit_artist_modal: Option, - pub edit_root_folder: Option, pub history: StatefulTable, pub main_tabs: TabState, pub metadata_profile_map: BiMap, @@ -110,6 +110,7 @@ impl<'a> Default for LidarrData<'a> { add_artist_modal: None, add_artist_search: None, add_import_list_exclusion: false, + add_root_folder_modal: None, add_searched_artists: None, albums: StatefulTable::default(), artists: StatefulTable::default(), @@ -117,7 +118,6 @@ impl<'a> Default for LidarrData<'a> { disk_space_vec: Vec::new(), downloads: StatefulTable::default(), edit_artist_modal: None, - edit_root_folder: None, history: StatefulTable::default(), metadata_profile_map: BiMap::new(), prompt_confirm: false, @@ -202,13 +202,32 @@ impl LidarrData<'_> { .metadata_profile_list .set_items(vec![metadata_profile().name]); + let mut add_root_folder_modal = AddRootFolderModal { + name: "Test Root Folder".into(), + path: "/nfs/music".into(), + tags: "test".into(), + ..AddRootFolderModal::default() + }; + add_root_folder_modal + .monitor_list + .set_items(Vec::from_iter(MonitorType::iter())); + add_root_folder_modal + .monitor_new_items_list + .set_items(Vec::from_iter(NewItemMonitorType::iter())); + add_root_folder_modal + .quality_profile_list + .set_items(vec![quality_profile().name]); + add_root_folder_modal + .metadata_profile_list + .set_items(vec![metadata_profile().name]); + let mut lidarr_data = LidarrData { delete_files: true, disk_space_vec: vec![diskspace()], quality_profile_map: quality_profile_map(), metadata_profile_map: metadata_profile_map(), edit_artist_modal: Some(edit_artist_modal), - edit_root_folder: Some("/nfs".into()), + add_root_folder_modal: Some(add_root_folder_modal), add_artist_modal: Some(add_artist_modal), tags_map: tags_map(), ..LidarrData::default() @@ -261,6 +280,14 @@ pub enum ActiveLidarrBlock { AddArtistSelectRootFolder, AddArtistTagsInput, AddRootFolderPrompt, + AddRootFolderConfirmPrompt, + AddRootFolderNameInput, + AddRootFolderPathInput, + AddRootFolderSelectMonitor, + AddRootFolderSelectMonitorNewItems, + AddRootFolderSelectQualityProfile, + AddRootFolderSelectMetadataProfile, + AddRootFolderTagsInput, AutomaticallySearchArtistPrompt, DeleteAlbumPrompt, DeleteAlbumConfirmPrompt, @@ -406,12 +433,34 @@ pub const EDIT_ARTIST_SELECTION_BLOCKS: &[&[ActiveLidarrBlock]] = &[ &[ActiveLidarrBlock::EditArtistConfirmPrompt], ]; -pub const ROOT_FOLDERS_BLOCKS: [ActiveLidarrBlock; 3] = [ +pub const ROOT_FOLDERS_BLOCKS: [ActiveLidarrBlock; 2] = [ ActiveLidarrBlock::RootFolders, - ActiveLidarrBlock::AddRootFolderPrompt, ActiveLidarrBlock::DeleteRootFolderPrompt, ]; +pub static ADD_ROOT_FOLDER_BLOCKS: [ActiveLidarrBlock; 9] = [ + ActiveLidarrBlock::AddRootFolderPrompt, + ActiveLidarrBlock::AddRootFolderConfirmPrompt, + ActiveLidarrBlock::AddRootFolderNameInput, + ActiveLidarrBlock::AddRootFolderPathInput, + ActiveLidarrBlock::AddRootFolderSelectMonitor, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile, + ActiveLidarrBlock::AddRootFolderTagsInput, +]; + +pub const ADD_ROOT_FOLDER_SELECTION_BLOCKS: &[&[ActiveLidarrBlock]] = &[ + &[ActiveLidarrBlock::AddRootFolderNameInput], + &[ActiveLidarrBlock::AddRootFolderPathInput], + &[ActiveLidarrBlock::AddRootFolderSelectMonitor], + &[ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems], + &[ActiveLidarrBlock::AddRootFolderSelectQualityProfile], + &[ActiveLidarrBlock::AddRootFolderSelectMetadataProfile], + &[ActiveLidarrBlock::AddRootFolderTagsInput], + &[ActiveLidarrBlock::AddRootFolderConfirmPrompt], +]; + impl From for Route { fn from(active_lidarr_block: ActiveLidarrBlock) -> Route { Route::Lidarr(active_lidarr_block, None) diff --git a/src/models/servarr_data/lidarr/lidarr_data_tests.rs b/src/models/servarr_data/lidarr/lidarr_data_tests.rs index ddcba92..a508753 100644 --- a/src/models/servarr_data/lidarr/lidarr_data_tests.rs +++ b/src/models/servarr_data/lidarr/lidarr_data_tests.rs @@ -138,7 +138,7 @@ mod tests { assert_is_empty!(lidarr_data.disk_space_vec); assert_is_empty!(lidarr_data.downloads); assert_none!(lidarr_data.edit_artist_modal); - assert_none!(lidarr_data.edit_root_folder); + assert_none!(lidarr_data.add_root_folder_modal); assert_is_empty!(lidarr_data.history); assert_is_empty!(lidarr_data.metadata_profile_map); assert!(!lidarr_data.prompt_confirm); @@ -409,9 +409,27 @@ mod tests { #[test] fn test_root_folders_blocks_contents() { - assert_eq!(ROOT_FOLDERS_BLOCKS.len(), 3); + assert_eq!(ROOT_FOLDERS_BLOCKS.len(), 2); assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveLidarrBlock::RootFolders)); - assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderPrompt)); assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveLidarrBlock::DeleteRootFolderPrompt)); } + + #[test] + fn test_add_root_folder_blocks_contents() { + use crate::models::servarr_data::lidarr::lidarr_data::ADD_ROOT_FOLDER_BLOCKS; + assert_eq!(ADD_ROOT_FOLDER_BLOCKS.len(), 9); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderPrompt)); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderConfirmPrompt)); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderNameInput)); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderPathInput)); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderSelectMonitor)); + assert!( + ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems) + ); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderSelectQualityProfile)); + assert!( + ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderSelectMetadataProfile) + ); + assert!(ADD_ROOT_FOLDER_BLOCKS.contains(&ActiveLidarrBlock::AddRootFolderTagsInput)); + } } diff --git a/src/models/servarr_data/lidarr/modals.rs b/src/models/servarr_data/lidarr/modals.rs index 6374dc8..aa7fef3 100644 --- a/src/models/servarr_data/lidarr/modals.rs +++ b/src/models/servarr_data/lidarr/modals.rs @@ -113,3 +113,35 @@ impl From<&LidarrData<'_>> for EditArtistModal { edit_artist_modal } } + +#[derive(Default)] +#[cfg_attr(test, derive(Debug))] +pub struct AddRootFolderModal { + pub name: HorizontallyScrollableText, + pub path: HorizontallyScrollableText, + pub monitor_list: StatefulList, + pub monitor_new_items_list: StatefulList, + pub quality_profile_list: StatefulList, + pub metadata_profile_list: StatefulList, + pub tags: HorizontallyScrollableText, +} + +impl From<&LidarrData<'_>> for AddRootFolderModal { + fn from(lidarr_data: &LidarrData<'_>) -> AddRootFolderModal { + let mut add_root_folder_modal = AddRootFolderModal::default(); + add_root_folder_modal + .monitor_list + .set_items(Vec::from_iter(MonitorType::iter())); + add_root_folder_modal + .monitor_new_items_list + .set_items(Vec::from_iter(NewItemMonitorType::iter())); + add_root_folder_modal + .quality_profile_list + .set_items(lidarr_data.sorted_quality_profile_names()); + add_root_folder_modal + .metadata_profile_list + .set_items(lidarr_data.sorted_metadata_profile_names()); + + add_root_folder_modal + } +} diff --git a/src/network/lidarr_network/mod.rs b/src/network/lidarr_network/mod.rs index 985344d..c32befa 100644 --- a/src/network/lidarr_network/mod.rs +++ b/src/network/lidarr_network/mod.rs @@ -3,9 +3,10 @@ use log::info; use super::{NetworkEvent, NetworkResource}; use crate::models::lidarr_models::{ - AddArtistBody, DeleteParams, EditArtistParams, LidarrSerdeable, MetadataProfile, + AddArtistBody, AddLidarrRootFolderBody, DeleteParams, EditArtistParams, LidarrSerdeable, + MetadataProfile, }; -use crate::models::servarr_models::{AddRootFolderBody, QualityProfile, Tag}; +use crate::models::servarr_models::{QualityProfile, Tag}; use crate::network::{Network, RequestMethod}; mod downloads; @@ -25,7 +26,7 @@ pub mod lidarr_network_test_utils; #[derive(Debug, Eq, PartialEq, Clone)] pub enum LidarrEvent { AddArtist(AddArtistBody), - AddRootFolder(AddRootFolderBody), + AddRootFolder(AddLidarrRootFolderBody), AddTag(String), DeleteAlbum(DeleteParams), DeleteArtist(DeleteParams), diff --git a/src/network/lidarr_network/root_folders/lidarr_root_folders_network_tests.rs b/src/network/lidarr_network/root_folders/lidarr_root_folders_network_tests.rs index 5fae7a9..9a1b95a 100644 --- a/src/network/lidarr_network/root_folders/lidarr_root_folders_network_tests.rs +++ b/src/network/lidarr_network/root_folders/lidarr_root_folders_network_tests.rs @@ -1,21 +1,80 @@ #[cfg(test)] mod tests { - use crate::models::lidarr_models::LidarrSerdeable; - use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; + use crate::models::lidarr_models::{ + AddLidarrRootFolderBody, LidarrSerdeable, MonitorType, NewItemMonitorType, + }; + use crate::models::servarr_models::RootFolder; use crate::network::lidarr_network::LidarrEvent; use crate::network::lidarr_network::lidarr_network_test_utils::test_utils::root_folder; use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use bimap::BiMap; use pretty_assertions::assert_eq; use serde_json::json; #[tokio::test] async fn test_handle_add_lidarr_root_folder_event() { - let expected_add_root_folder_body = AddRootFolderBody { + let expected_add_root_folder_body = AddLidarrRootFolderBody { + name: "Music".to_owned(), path: "/nfs/test".to_owned(), + default_quality_profile_id: 1, + default_metadata_profile_id: 1, + default_monitor_option: MonitorType::All, + default_new_item_monitor_option: NewItemMonitorType::All, + default_tags: vec![], + tag_input_string: Some("usenet, testing".to_owned()), }; let (mock, app, _server) = MockServarrApi::post() .with_request_body(json!({ - "path": "/nfs/test" + "name": "Music", + "path": "/nfs/test", + "defaultQualityProfileId": 1, + "defaultMetadataProfileId": 1, + "defaultMonitorOption": "all", + "defaultNewItemMonitorOption": "all", + "defaultTags": [1, 2] + })) + .returns(json!({})) + .build_for(LidarrEvent::AddRootFolder( + expected_add_root_folder_body.clone(), + )) + .await; + app.lock().await.data.lidarr_data.tags_map = + BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); + app.lock().await.server_tabs.set_index(2); + let mut network = test_network(&app); + + assert_ok!( + network + .handle_lidarr_event(LidarrEvent::AddRootFolder(expected_add_root_folder_body)) + .await + ); + + mock.assert_async().await; + assert_none!(app.lock().await.data.lidarr_data.add_root_folder_modal); + } + + #[tokio::test] + async fn test_handle_add_lidarr_root_folder_event_does_not_overwrite_default_tags_vec_when_tag_input_string_is_none() + { + let expected_add_root_folder_body = AddLidarrRootFolderBody { + name: "Music".to_owned(), + path: "/nfs/test".to_owned(), + default_quality_profile_id: 1, + default_metadata_profile_id: 1, + default_monitor_option: MonitorType::All, + default_new_item_monitor_option: NewItemMonitorType::All, + default_tags: vec![1, 2], + tag_input_string: None, + }; + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ + "name": "Music", + "path": "/nfs/test", + "defaultQualityProfileId": 1, + "defaultMetadataProfileId": 1, + "defaultMonitorOption": "all", + "defaultNewItemMonitorOption": "all", + "defaultTags": [1, 2] })) .returns(json!({})) .build_for(LidarrEvent::AddRootFolder( @@ -25,15 +84,14 @@ mod tests { app.lock().await.server_tabs.set_index(2); let mut network = test_network(&app); - assert!( + assert_ok!( network .handle_lidarr_event(LidarrEvent::AddRootFolder(expected_add_root_folder_body)) .await - .is_ok() ); mock.assert_async().await; - assert!(app.lock().await.data.lidarr_data.edit_root_folder.is_none()); + assert_none!(app.lock().await.data.lidarr_data.add_root_folder_modal); } #[tokio::test] diff --git a/src/network/lidarr_network/root_folders/mod.rs b/src/network/lidarr_network/root_folders/mod.rs index 4c7d08a..1415980 100644 --- a/src/network/lidarr_network/root_folders/mod.rs +++ b/src/network/lidarr_network/root_folders/mod.rs @@ -1,4 +1,5 @@ -use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; +use crate::models::lidarr_models::AddLidarrRootFolderBody; +use crate::models::servarr_models::RootFolder; use crate::network::lidarr_network::LidarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; @@ -12,10 +13,14 @@ mod lidarr_root_folders_network_tests; impl Network<'_, '_> { pub(in crate::network::lidarr_network) async fn add_lidarr_root_folder( &mut self, - add_root_folder_body: AddRootFolderBody, + mut add_root_folder_body: AddLidarrRootFolderBody, ) -> Result { info!("Adding new root folder to Lidarr"); - let event = LidarrEvent::AddRootFolder(AddRootFolderBody::default()); + if let Some(tag_input_str) = add_root_folder_body.tag_input_string.as_ref() { + let tag_ids_vec = self.extract_and_add_lidarr_tag_ids_vec(tag_input_str).await; + add_root_folder_body.default_tags = tag_ids_vec; + } + let event = LidarrEvent::AddRootFolder(AddLidarrRootFolderBody::default()); debug!("Add root folder body: {add_root_folder_body:?}"); @@ -30,7 +35,7 @@ impl Network<'_, '_> { .await; self - .handle_request::(request_props, |_, _| ()) + .handle_request::(request_props, |_, _| ()) .await } diff --git a/src/ui/lidarr_ui/root_folders/add_root_folder_ui.rs b/src/ui/lidarr_ui/root_folders/add_root_folder_ui.rs new file mode 100644 index 0000000..120f0f2 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/add_root_folder_ui.rs @@ -0,0 +1,245 @@ +use std::sync::atomic::Ordering; + +use ratatui::Frame; +use ratatui::layout::{Constraint, Rect}; +use ratatui::prelude::Layout; +use ratatui::widgets::ListItem; + +use crate::app::App; +use crate::models::Route; +use crate::models::servarr_data::lidarr::lidarr_data::{ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock}; +use crate::models::servarr_data::lidarr::modals::AddRootFolderModal; +use crate::render_selectable_input_box; + +use crate::ui::utils::title_block_centered; +use crate::ui::widgets::button::Button; +use crate::ui::widgets::input_box::InputBox; +use crate::ui::widgets::popup::{Popup, Size}; +use crate::ui::widgets::selectable_list::SelectableList; +use crate::ui::{DrawUi, draw_popup}; + +#[cfg(test)] +#[path = "add_root_folder_ui_tests.rs"] +mod add_root_folder_ui_tests; + +pub(super) struct AddRootFolderUi; + +impl DrawUi for AddRootFolderUi { + fn accepts(route: Route) -> bool { + let Route::Lidarr(active_lidarr_block, _) = route else { + return false; + }; + ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) + } + + fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { + if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() { + let draw_add_root_folder_prompt = + |f: &mut Frame<'_>, app: &mut App<'_>, prompt_area: Rect| { + draw_add_root_folder_confirmation_prompt(f, app, prompt_area); + + match active_lidarr_block { + ActiveLidarrBlock::AddRootFolderSelectMonitor => { + draw_add_root_folder_select_monitor_popup(f, app); + } + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems => { + draw_add_root_folder_select_monitor_new_items_popup(f, app); + } + ActiveLidarrBlock::AddRootFolderSelectQualityProfile => { + draw_add_root_folder_select_quality_profile_popup(f, app); + } + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile => { + draw_add_root_folder_select_metadata_profile_popup(f, app); + } + _ => (), + } + }; + + draw_popup(f, app, draw_add_root_folder_prompt, Size::Long); + } + } +} + +fn draw_add_root_folder_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { + let title = "Add Root Folder"; + f.render_widget(title_block_centered(title), area); + + let yes_no_value = app.data.lidarr_data.prompt_confirm; + let selected_block = app.data.lidarr_data.selected_block.get_active_block(); + let highlight_yes_no = selected_block == ActiveLidarrBlock::AddRootFolderConfirmPrompt; + let AddRootFolderModal { + name, + path, + monitor_list, + monitor_new_items_list, + quality_profile_list, + metadata_profile_list, + tags, + } = app + .data + .lidarr_data + .add_root_folder_modal + .as_ref() + .expect("add_root_folder_modal must exist in this context"); + let selected_monitor = monitor_list.current_selection(); + let selected_monitor_new_items = monitor_new_items_list.current_selection(); + let selected_quality_profile = quality_profile_list.current_selection(); + let selected_metadata_profile = metadata_profile_list.current_selection(); + + let [ + _, + name_area, + path_area, + monitor_area, + monitor_new_items_area, + quality_profile_area, + metadata_profile_area, + tags_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Fill(1), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Fill(1), + Constraint::Length(3), + ]) + .margin(1) + .areas(area); + let [save_area, cancel_area] = + Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)]) + .areas(buttons_area); + + let monitor_drop_down_button = Button::default() + .title(selected_monitor.to_display_str()) + .label("Monitor") + .icon("โ–ผ") + .selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectMonitor); + let monitor_new_items_drop_down_button = Button::default() + .title(selected_monitor_new_items.to_display_str()) + .label("Monitor New Albums") + .icon("โ–ผ") + .selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems); + let quality_profile_drop_down_button = Button::default() + .title(selected_quality_profile) + .label("Quality Profile") + .icon("โ–ผ") + .selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectQualityProfile); + let metadata_profile_drop_down_button = Button::default() + .title(selected_metadata_profile) + .label("Metadata Profile") + .icon("โ–ผ") + .selected(selected_block == ActiveLidarrBlock::AddRootFolderSelectMetadataProfile); + + if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() { + let name_input_box = InputBox::new(&name.text) + .offset(name.offset.load(Ordering::SeqCst)) + .label("Name") + .highlighted(selected_block == ActiveLidarrBlock::AddRootFolderNameInput) + .selected(active_lidarr_block == ActiveLidarrBlock::AddRootFolderNameInput); + let path_input_box = InputBox::new(&path.text) + .offset(path.offset.load(Ordering::SeqCst)) + .label("Path") + .highlighted(selected_block == ActiveLidarrBlock::AddRootFolderPathInput) + .selected(active_lidarr_block == ActiveLidarrBlock::AddRootFolderPathInput); + let tags_input_box = InputBox::new(&tags.text) + .offset(tags.offset.load(Ordering::SeqCst)) + .label("Tags") + .highlighted(selected_block == ActiveLidarrBlock::AddRootFolderTagsInput) + .selected(active_lidarr_block == ActiveLidarrBlock::AddRootFolderTagsInput); + + match active_lidarr_block { + ActiveLidarrBlock::AddRootFolderNameInput => name_input_box.show_cursor(f, name_area), + ActiveLidarrBlock::AddRootFolderPathInput => path_input_box.show_cursor(f, path_area), + ActiveLidarrBlock::AddRootFolderTagsInput => tags_input_box.show_cursor(f, tags_area), + _ => (), + } + + render_selectable_input_box!(name_input_box, f, name_area); + render_selectable_input_box!(path_input_box, f, path_area); + render_selectable_input_box!(tags_input_box, f, tags_area); + } + + let save_button = Button::default() + .title("Save") + .selected(yes_no_value && highlight_yes_no); + let cancel_button = Button::default() + .title("Cancel") + .selected(!yes_no_value && highlight_yes_no); + + f.render_widget(monitor_drop_down_button, monitor_area); + f.render_widget(monitor_new_items_drop_down_button, monitor_new_items_area); + f.render_widget(quality_profile_drop_down_button, quality_profile_area); + f.render_widget(metadata_profile_drop_down_button, metadata_profile_area); + f.render_widget(save_button, save_area); + f.render_widget(cancel_button, cancel_area); +} + +fn draw_add_root_folder_select_monitor_popup(f: &mut Frame<'_>, app: &mut App<'_>) { + let monitor_list = SelectableList::new( + &mut app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .expect("add_root_folder_modal must exist in this context") + .monitor_list, + |monitor_type| ListItem::new(monitor_type.to_display_str().to_owned()), + ); + let popup = Popup::new(monitor_list).size(Size::Dropdown); + + f.render_widget(popup, f.area()); +} + +fn draw_add_root_folder_select_monitor_new_items_popup(f: &mut Frame<'_>, app: &mut App<'_>) { + let monitor_new_items_list = SelectableList::new( + &mut app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .expect("add_root_folder_modal must exist in this context") + .monitor_new_items_list, + |monitor_type| ListItem::new(monitor_type.to_display_str().to_owned()), + ); + let popup = Popup::new(monitor_new_items_list).size(Size::Dropdown); + + f.render_widget(popup, f.area()); +} + +fn draw_add_root_folder_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut App<'_>) { + let quality_profile_list = SelectableList::new( + &mut app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .expect("add_root_folder_modal must exist in this context") + .quality_profile_list, + |quality_profile| ListItem::new(quality_profile.clone()), + ); + let popup = Popup::new(quality_profile_list).size(Size::Dropdown); + + f.render_widget(popup, f.area()); +} + +fn draw_add_root_folder_select_metadata_profile_popup(f: &mut Frame<'_>, app: &mut App<'_>) { + let metadata_profile_list = SelectableList::new( + &mut app + .data + .lidarr_data + .add_root_folder_modal + .as_mut() + .expect("add_root_folder_modal must exist in this context") + .metadata_profile_list, + |metadata_profile| ListItem::new(metadata_profile.clone()), + ); + let popup = Popup::new(metadata_profile_list).size(Size::Dropdown); + + f.render_widget(popup, f.area()); +} diff --git a/src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs b/src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs new file mode 100644 index 0000000..14b3a29 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs @@ -0,0 +1,51 @@ +#[cfg(test)] +mod tests { + use strum::IntoEnumIterator; + + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::lidarr::lidarr_data::{ + ADD_ROOT_FOLDER_BLOCKS, ADD_ROOT_FOLDER_SELECTION_BLOCKS, ActiveLidarrBlock, + }; + use crate::ui::DrawUi; + use crate::ui::lidarr_ui::root_folders::add_root_folder_ui::AddRootFolderUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + + #[test] + fn test_add_root_folder_ui_accepts() { + ActiveLidarrBlock::iter().for_each(|active_lidarr_block| { + if ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) { + assert!(AddRootFolderUi::accepts(active_lidarr_block.into())); + } else { + assert!(!AddRootFolderUi::accepts(active_lidarr_block.into())); + } + }); + } + + mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; + + use super::*; + + #[rstest] + #[case(ActiveLidarrBlock::AddRootFolderPrompt)] + #[case(ActiveLidarrBlock::AddRootFolderConfirmPrompt)] + #[case(ActiveLidarrBlock::AddRootFolderSelectMonitor)] + #[case(ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems)] + #[case(ActiveLidarrBlock::AddRootFolderSelectQualityProfile)] + #[case(ActiveLidarrBlock::AddRootFolderSelectMetadataProfile)] + fn test_add_root_folder_ui_renders(#[case] active_lidarr_block: ActiveLidarrBlock) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_lidarr_block.into()); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + AddRootFolderUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("add_root_folder_{active_lidarr_block}"), output); + } + } +} diff --git a/src/ui/lidarr_ui/root_folders/mod.rs b/src/ui/lidarr_ui/root_folders/mod.rs index 518d14a..ac2afa1 100644 --- a/src/ui/lidarr_ui/root_folders/mod.rs +++ b/src/ui/lidarr_ui/root_folders/mod.rs @@ -1,19 +1,24 @@ +use add_root_folder_ui::AddRootFolderUi; use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; use crate::app::App; use crate::models::Route; -use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS}; +use crate::models::servarr_data::lidarr::lidarr_data::{ + ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS, +}; use crate::models::servarr_models::RootFolder; +use crate::ui::DrawUi; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::layout_block_top_border; use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::{DrawUi, draw_input_box_popup, draw_popup}; use crate::utils::convert_to_gb; +mod add_root_folder_ui; + #[cfg(test)] #[path = "root_folders_ui_tests.rs"] mod root_folders_ui_tests; @@ -23,7 +28,8 @@ pub(super) struct RootFoldersUi; impl DrawUi for RootFoldersUi { fn accepts(route: Route) -> bool { if let Route::Lidarr(active_lidarr_block, _) = route { - return ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block); + return ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block) + || ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block); } false @@ -33,26 +39,22 @@ impl DrawUi for RootFoldersUi { if let Route::Lidarr(active_lidarr_block, _) = app.get_current_route() { draw_root_folders(f, app, area); - match active_lidarr_block { - ActiveLidarrBlock::AddRootFolderPrompt => { - draw_popup(f, app, draw_add_root_folder_prompt_box, Size::InputBox) - } - ActiveLidarrBlock::DeleteRootFolderPrompt => { - let prompt = format!( - "Do you really want to delete this root folder: \n{}?", - app.data.lidarr_data.root_folders.current_selection().path - ); - let confirmation_prompt = ConfirmationPrompt::new() - .title("Delete Root Folder") - .prompt(&prompt) - .yes_no_value(app.data.lidarr_data.prompt_confirm); + if ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) { + AddRootFolderUi::draw(f, app, area); + } else if active_lidarr_block == ActiveLidarrBlock::DeleteRootFolderPrompt { + let prompt = format!( + "Do you really want to delete this root folder: \n{}?", + app.data.lidarr_data.root_folders.current_selection().path + ); + let confirmation_prompt = ConfirmationPrompt::new() + .title("Delete Root Folder") + .prompt(&prompt) + .yes_no_value(app.data.lidarr_data.prompt_confirm); - f.render_widget( - Popup::new(confirmation_prompt).size(Size::MediumPrompt), - f.area(), - ); - } - _ => (), + f.render_widget( + Popup::new(confirmation_prompt).size(Size::MediumPrompt), + f.area(), + ); } } } @@ -98,12 +100,3 @@ fn draw_root_folders(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { f.render_widget(root_folders_table, area); } - -fn draw_add_root_folder_prompt_box(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { - draw_input_box_popup( - f, - area, - "Add Root Folder", - app.data.lidarr_data.edit_root_folder.as_ref().unwrap(), - ); -} diff --git a/src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs index 6d5d1ac..0122c56 100644 --- a/src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs @@ -3,7 +3,9 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS}; + use crate::models::servarr_data::lidarr::lidarr_data::{ + ADD_ROOT_FOLDER_BLOCKS, ActiveLidarrBlock, ROOT_FOLDERS_BLOCKS, + }; use crate::ui::DrawUi; use crate::ui::lidarr_ui::root_folders::RootFoldersUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -11,7 +13,9 @@ mod tests { #[test] fn test_root_folders_ui_accepts() { ActiveLidarrBlock::iter().for_each(|active_lidarr_block| { - if ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block) { + if ROOT_FOLDERS_BLOCKS.contains(&active_lidarr_block) + || ADD_ROOT_FOLDER_BLOCKS.contains(&active_lidarr_block) + { assert!(RootFoldersUi::accepts(active_lidarr_block.into())); } else { assert!(!RootFoldersUi::accepts(active_lidarr_block.into())); @@ -20,11 +24,12 @@ mod tests { } mod snapshot_tests { + use super::*; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::lidarr::lidarr_data::ADD_ROOT_FOLDER_SELECTION_BLOCKS; use crate::ui::ui_test_utils::test_utils::TerminalSize; use rstest::rstest; - use super::*; - #[test] fn test_root_folders_ui_renders_loading() { let mut app = App::test_default(); @@ -54,7 +59,6 @@ mod tests { fn test_root_folders_ui_renders_root_folders_tab( #[values( ActiveLidarrBlock::RootFolders, - ActiveLidarrBlock::AddRootFolderPrompt, ActiveLidarrBlock::DeleteRootFolderPrompt )] active_lidarr_block: ActiveLidarrBlock, @@ -68,5 +72,30 @@ mod tests { insta::assert_snapshot!(active_lidarr_block.to_string(), output); } + + #[rstest] + fn test_root_folders_ui_renders_add_root_folders_popup_over_root_folders_table( + #[values( + ActiveLidarrBlock::AddRootFolderPrompt, + ActiveLidarrBlock::AddRootFolderConfirmPrompt, + ActiveLidarrBlock::AddRootFolderSelectMonitor, + ActiveLidarrBlock::AddRootFolderSelectMonitorNewItems, + ActiveLidarrBlock::AddRootFolderSelectQualityProfile, + ActiveLidarrBlock::AddRootFolderSelectMetadataProfile + )] + active_lidarr_block: ActiveLidarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.data.lidarr_data.selected_block = + BlockSelectionState::new(ADD_ROOT_FOLDER_SELECTION_BLOCKS); + app.push_navigation_stack(ActiveLidarrBlock::AddRootFolderPrompt.into()); + app.push_navigation_stack(active_lidarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(active_lidarr_block.to_string(), output); + } } } diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderConfirmPrompt.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderConfirmPrompt.snap new file mode 100644 index 0000000..5e77e26 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderConfirmPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs +expression: output +--- + + + + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor New Albums: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Quality Profile: โ”‚Lossless โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadata Profile: โ”‚Standard โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Tags: โ”‚test โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderPrompt.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderPrompt.snap new file mode 100644 index 0000000..5e77e26 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs +expression: output +--- + + + + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor New Albums: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Quality Profile: โ”‚Lossless โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadata Profile: โ”‚Standard โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Tags: โ”‚test โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMetadataProfile.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMetadataProfile.snap new file mode 100644 index 0000000..6e742d5 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMetadataProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs +expression: output +--- + + + + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚Standard โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMonitor.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMonitor.snap new file mode 100644 index 0000000..5248c8f --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMonitor.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs +expression: output +--- + + + + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚All Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚Future Albums โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚Missing Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚Existing Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚First Album โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚Latest Album โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚None โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚Unknown โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMonitorNewItems.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMonitorNewItems.snap new file mode 100644 index 0000000..81c9f69 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectMonitorNewItems.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs +expression: output +--- + + + + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚All Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚No New Albums โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚New Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectQualityProfile.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectQualityProfile.snap new file mode 100644 index 0000000..5e30a57 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__add_root_folder_ui__add_root_folder_ui_tests__tests__snapshot_tests__add_root_folder_AddRootFolderSelectQualityProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/add_root_folder_ui_tests.rs +expression: output +--- + + + + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚Lossless โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderConfirmPrompt.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderConfirmPrompt.snap new file mode 100644 index 0000000..ecf8a92 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderConfirmPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor New Albums: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Quality Profile: โ”‚Lossless โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadata Profile: โ”‚Standard โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Tags: โ”‚test โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap index 043bf8a..ecf8a92 100644 --- a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap @@ -8,24 +8,41 @@ expression: output - - - - - - - - - - - - - - - - - - โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ - โ”‚/nfs โ”‚ - โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ - cancel + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitor New Albums: โ”‚All Albums โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Quality Profile: โ”‚Lossless โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadata Profile: โ”‚Standard โ–ผ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Tags: โ”‚test โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMetadataProfile.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMetadataProfile.snap new file mode 100644 index 0000000..988c072 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMetadataProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚Standard โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMonitor.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMonitor.snap new file mode 100644 index 0000000..6d4fcb6 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMonitor.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚All Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚Future Albums โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚Missing Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚Existing Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚First Album โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚Latest Album โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚None โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚Unknown โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMonitorNewItems.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMonitorNewItems.snap new file mode 100644 index 0000000..61962f6 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectMonitorNewItems.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚All Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚No New Albums โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚New Albums โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ diff --git a/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectQualityProfile.snap b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectQualityProfile.snap new file mode 100644 index 0000000..45b3258 --- /dev/null +++ b/src/ui/lidarr_ui/root_folders/snapshots/managarr__ui__lidarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderSelectQualityProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/lidarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Add Root Folder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Name: โ”‚Test Root Folder โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Path: โ”‚/nfs/music โ”‚ โ”‚ + โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚Lossless โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Monitorโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Qualโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ Metadโ”‚ โ”‚ โ–ผ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ โ”‚ + โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚ โ”‚ + โ”‚โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎโ”‚ + โ”‚โ”‚ Save โ”‚โ”‚ Cancel โ”‚โ”‚ + โ”‚โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏโ”‚ + โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ