From ad58912bafd6dc80d0e3c822f0c880fd15766f15 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 3 Dec 2025 14:49:27 -0700 Subject: [PATCH 01/28] test: Updated Rust edition to 2024 and refactored network module tests to be more idiomatic --- Cargo.toml | 2 +- src/app/app_tests.rs | 8 +- src/app/context_clues.rs | 4 +- src/app/context_clues_tests.rs | 12 +- src/app/key_binding_tests.rs | 2 +- src/app/mod.rs | 22 +- src/app/radarr/radarr_context_clues.rs | 8 +- src/app/radarr/radarr_context_clues_tests.rs | 12 +- src/app/radarr/radarr_tests.rs | 4 +- src/app/sonarr/mod.rs | 19 +- src/app/sonarr/sonarr_context_clues.rs | 8 +- src/app/sonarr/sonarr_context_clues_tests.rs | 8 +- src/app/sonarr/sonarr_tests.rs | 2 +- src/cli/cli_tests.rs | 8 +- src/cli/mod.rs | 2 +- src/cli/radarr/add_command_handler.rs | 4 +- src/cli/radarr/add_command_handler_tests.rs | 12 +- src/cli/radarr/delete_command_handler.rs | 2 +- .../radarr/delete_command_handler_tests.rs | 16 +- src/cli/radarr/edit_command_handler.rs | 6 +- src/cli/radarr/edit_command_handler_tests.rs | 20 +- src/cli/radarr/get_command_handler.rs | 4 +- src/cli/radarr/get_command_handler_tests.rs | 14 +- src/cli/radarr/list_command_handler.rs | 4 +- src/cli/radarr/list_command_handler_tests.rs | 12 +- src/cli/radarr/mod.rs | 2 +- src/cli/radarr/radarr_command_tests.rs | 22 +- src/cli/radarr/refresh_command_handler.rs | 2 +- .../radarr/refresh_command_handler_tests.rs | 12 +- src/cli/sonarr/add_command_handler.rs | 2 +- src/cli/sonarr/add_command_handler_tests.rs | 16 +- src/cli/sonarr/delete_command_handler.rs | 2 +- .../sonarr/delete_command_handler_tests.rs | 16 +- src/cli/sonarr/download_command_handler.rs | 2 +- .../sonarr/download_command_handler_tests.rs | 14 +- src/cli/sonarr/edit_command_handler.rs | 6 +- src/cli/sonarr/edit_command_handler_tests.rs | 12 +- src/cli/sonarr/get_command_handler.rs | 2 +- src/cli/sonarr/get_command_handler_tests.rs | 14 +- src/cli/sonarr/list_command_handler.rs | 2 +- src/cli/sonarr/list_command_handler_tests.rs | 14 +- .../sonarr/manual_search_command_handler.rs | 2 +- .../manual_search_command_handler_tests.rs | 14 +- src/cli/sonarr/mod.rs | 2 +- src/cli/sonarr/refresh_command_handler.rs | 2 +- .../sonarr/refresh_command_handler_tests.rs | 14 +- src/cli/sonarr/sonarr_command_tests.rs | 26 +- ...rigger_automatic_search_command_handler.rs | 2 +- ..._automatic_search_command_handler_tests.rs | 18 +- src/event/input_event.rs | 16 +- src/handlers/handlers_tests.rs | 22 +- src/handlers/keybinding_handler.rs | 2 +- src/handlers/keybinding_handler_tests.rs | 2 +- src/handlers/mod.rs | 4 +- .../blocklist/blocklist_handler_tests.rs | 4 +- src/handlers/radarr_handlers/blocklist/mod.rs | 2 +- .../collections/collection_details_handler.rs | 6 +- .../collection_details_handler_tests.rs | 68 +- .../collections/collections_handler_tests.rs | 12 +- .../collections/edit_collection_handler.rs | 4 +- .../edit_collection_handler_tests.rs | 28 +- .../radarr_handlers/collections/mod.rs | 4 +- .../downloads/downloads_handler_tests.rs | 4 +- src/handlers/radarr_handlers/downloads/mod.rs | 2 +- .../indexers/edit_indexer_handler.rs | 2 +- .../indexers/edit_indexer_handler_tests.rs | 220 ++--- .../indexers/edit_indexer_settings_handler.rs | 2 +- .../edit_indexer_settings_handler_tests.rs | 36 +- .../indexers/indexers_handler_tests.rs | 8 +- src/handlers/radarr_handlers/indexers/mod.rs | 6 +- .../indexers/test_all_indexers_handler.rs | 2 +- .../test_all_indexers_handler_tests.rs | 4 +- .../library/add_movie_handler.rs | 6 +- .../library/add_movie_handler_tests.rs | 74 +- .../library/delete_movie_handler.rs | 2 +- .../library/delete_movie_handler_tests.rs | 10 +- .../library/edit_movie_handler.rs | 4 +- .../library/edit_movie_handler_tests.rs | 48 +- .../library/library_handler_tests.rs | 10 +- src/handlers/radarr_handlers/library/mod.rs | 2 +- .../library/movie_details_handler.rs | 2 +- .../library/movie_details_handler_tests.rs | 8 +- src/handlers/radarr_handlers/mod.rs | 4 +- .../radarr_handler_test_utils.rs | 4 +- .../radarr_handlers/radarr_handler_tests.rs | 4 +- .../radarr_handlers/root_folders/mod.rs | 4 +- .../root_folders_handler_tests.rs | 6 +- src/handlers/radarr_handlers/system/mod.rs | 4 +- .../system/system_details_handler.rs | 4 +- .../system/system_details_handler_tests.rs | 4 +- .../system/system_handler_tests.rs | 4 +- .../blocklist/blocklist_handler_tests.rs | 4 +- src/handlers/sonarr_handlers/blocklist/mod.rs | 2 +- .../downloads/downloads_handler_tests.rs | 4 +- src/handlers/sonarr_handlers/downloads/mod.rs | 2 +- .../history/history_handler_tests.rs | 4 +- src/handlers/sonarr_handlers/history/mod.rs | 6 +- .../indexers/edit_indexer_handler.rs | 2 +- .../indexers/edit_indexer_handler_tests.rs | 220 ++--- .../indexers/edit_indexer_settings_handler.rs | 2 +- .../edit_indexer_settings_handler_tests.rs | 12 +- .../indexers/indexers_handler_tests.rs | 8 +- src/handlers/sonarr_handlers/indexers/mod.rs | 6 +- .../indexers/test_all_indexers_handler.rs | 2 +- .../test_all_indexers_handler_tests.rs | 4 +- .../library/add_series_handler.rs | 6 +- .../library/add_series_handler_tests.rs | 74 +- .../library/delete_series_handler.rs | 2 +- .../library/delete_series_handler_tests.rs | 10 +- .../library/edit_series_handler.rs | 4 +- .../library/edit_series_handler_tests.rs | 48 +- .../library/episode_details_handler.rs | 2 +- .../library/episode_details_handler_tests.rs | 22 +- .../library/library_handler_tests.rs | 10 +- src/handlers/sonarr_handlers/library/mod.rs | 4 +- .../library/season_details_handler.rs | 6 +- .../library/season_details_handler_tests.rs | 68 +- .../library/series_details_handler.rs | 4 +- .../library/series_details_handler_tests.rs | 60 +- .../sonarr_handlers/root_folders/mod.rs | 4 +- .../root_folders_handler_tests.rs | 6 +- .../sonarr_handler_test_utils.rs | 4 +- .../sonarr_handlers/sonarr_handler_tests.rs | 6 +- src/handlers/sonarr_handlers/system/mod.rs | 4 +- .../system/system_details_handler.rs | 4 +- .../system/system_details_handler_tests.rs | 4 +- .../system/system_handler_tests.rs | 4 +- src/handlers/table_handler.rs | 2 +- src/handlers/table_handler_tests.rs | 6 +- src/main.rs | 18 +- src/models/mod.rs | 4 +- src/models/model_tests.rs | 6 +- src/models/radarr_models.rs | 2 +- src/models/radarr_models_tests.rs | 2 +- .../servarr_data/radarr/modals_tests.rs | 2 +- .../servarr_data/radarr/radarr_data_tests.rs | 84 +- src/models/servarr_data/servarr_data_tests.rs | 2 +- src/models/servarr_data/sonarr/modals.rs | 2 +- .../servarr_data/sonarr/modals_tests.rs | 56 +- src/models/servarr_data/sonarr/sonarr_data.rs | 2 +- .../servarr_data/sonarr/sonarr_data_tests.rs | 40 +- .../servarr_data/sonarr/sonarr_test_utils.rs | 2 +- src/models/sonarr_models.rs | 2 +- src/models/sonarr_models_tests.rs | 2 +- src/models/stateful_list_tests.rs | 2 +- src/models/stateful_table.rs | 2 +- src/models/stateful_tree_tests.rs | 2 +- src/network/mod.rs | 4 +- src/network/network_tests.rs | 316 ++++--- src/network/radarr_network/blocklist/mod.rs | 4 +- .../radarr_blocklist_network_tests.rs | 136 ++- src/network/radarr_network/collections/mod.rs | 4 +- .../radarr_collections_network_tests.rs | 189 ++-- .../radarr_downloads_network_tests.rs | 87 +- src/network/radarr_network/indexers/mod.rs | 2 +- .../indexers/radarr_indexers_network_tests.rs | 385 ++++----- src/network/radarr_network/library/mod.rs | 6 +- .../library/radarr_library_network_tests.rs | 812 ++++++++---------- src/network/radarr_network/mod.rs | 2 +- .../radarr_network_test_utils.rs | 18 +- .../radarr_network/radarr_network_tests.rs | 247 +++--- .../radarr_root_folders_network_tests.rs | 86 +- .../system/radarr_system_network_tests.rs | 204 ++--- src/network/sonarr_network/blocklist/mod.rs | 4 +- .../sonarr_blocklist_network_tests.rs | 133 ++- .../sonarr_downloads_network_tests.rs | 95 +- src/network/sonarr_network/history/mod.rs | 2 +- .../history/sonarr_history_network_tests.rs | 104 +-- src/network/sonarr_network/indexers/mod.rs | 2 +- .../indexers/sonarr_indexers_network_tests.rs | 399 ++++----- .../episodes/sonarr_episodes_network_tests.rs | 590 ++++++------- .../sonarr_network/library/seasons/mod.rs | 2 +- .../seasons/sonarr_seasons_network_tests.rs | 228 +++-- .../sonarr_network/library/series/mod.rs | 8 +- .../series/sonarr_series_network_tests.rs | 664 ++++++-------- .../library/sonarr_library_network_tests.rs | 36 +- src/network/sonarr_network/mod.rs | 2 +- .../sonarr_root_folders_network_tests.rs | 102 +-- .../sonarr_network_test_utils.rs | 11 +- .../sonarr_network/sonarr_network_tests.rs | 278 +++--- .../system/sonarr_system_network_tests.rs | 253 +++--- src/ui/mod.rs | 2 +- .../radarr_ui/blocklist/blocklist_ui_tests.rs | 2 +- src/ui/radarr_ui/blocklist/mod.rs | 6 +- .../collections/collection_details_ui.rs | 6 +- .../collection_details_ui_tests.rs | 2 +- .../collections/collections_ui_tests.rs | 4 +- .../collections/edit_collection_ui.rs | 48 +- .../collections/edit_collection_ui_tests.rs | 2 +- src/ui/radarr_ui/collections/mod.rs | 6 +- .../radarr_ui/downloads/downloads_ui_tests.rs | 2 +- src/ui/radarr_ui/downloads/mod.rs | 4 +- src/ui/radarr_ui/indexers/edit_indexer_ui.rs | 29 +- .../indexers/edit_indexer_ui_tests.rs | 2 +- .../radarr_ui/indexers/indexer_settings_ui.rs | 33 +- .../indexers/indexer_settings_ui_tests.rs | 2 +- .../radarr_ui/indexers/indexers_ui_tests.rs | 4 +- src/ui/radarr_ui/indexers/mod.rs | 6 +- .../indexers/test_all_indexers_ui.rs | 6 +- .../indexers/test_all_indexers_ui_tests.rs | 2 +- src/ui/radarr_ui/library/add_movie_ui.rs | 44 +- .../radarr_ui/library/add_movie_ui_tests.rs | 4 +- src/ui/radarr_ui/library/delete_movie_ui.rs | 6 +- .../library/delete_movie_ui_tests.rs | 2 +- src/ui/radarr_ui/library/edit_movie_ui.rs | 48 +- .../radarr_ui/library/edit_movie_ui_tests.rs | 2 +- src/ui/radarr_ui/library/library_ui_tests.rs | 4 +- src/ui/radarr_ui/library/mod.rs | 6 +- src/ui/radarr_ui/library/movie_details_ui.rs | 32 +- .../library/movie_details_ui_tests.rs | 4 +- src/ui/radarr_ui/mod.rs | 6 +- src/ui/radarr_ui/root_folders/mod.rs | 6 +- .../root_folders/root_folders_ui_tests.rs | 2 +- src/ui/radarr_ui/system/mod.rs | 4 +- src/ui/radarr_ui/system/system_details_ui.rs | 8 +- .../system/system_details_ui_tests.rs | 2 +- src/ui/radarr_ui/system/system_ui_tests.rs | 2 +- .../sonarr_ui/blocklist/blocklist_ui_tests.rs | 2 +- src/ui/sonarr_ui/blocklist/mod.rs | 6 +- .../sonarr_ui/downloads/downloads_ui_tests.rs | 2 +- src/ui/sonarr_ui/downloads/mod.rs | 4 +- src/ui/sonarr_ui/history/history_ui_tests.rs | 2 +- src/ui/sonarr_ui/history/mod.rs | 6 +- src/ui/sonarr_ui/indexers/edit_indexer_ui.rs | 29 +- .../indexers/edit_indexer_ui_tests.rs | 2 +- .../sonarr_ui/indexers/indexer_settings_ui.rs | 37 +- .../indexers/indexer_settings_ui_tests.rs | 2 +- .../sonarr_ui/indexers/indexers_ui_tests.rs | 4 +- src/ui/sonarr_ui/indexers/mod.rs | 6 +- .../indexers/test_all_indexers_ui.rs | 6 +- .../indexers/test_all_indexers_ui_tests.rs | 2 +- src/ui/sonarr_ui/library/add_series_ui.rs | 52 +- .../sonarr_ui/library/add_series_ui_tests.rs | 4 +- src/ui/sonarr_ui/library/delete_series_ui.rs | 6 +- .../library/delete_series_ui_tests.rs | 2 +- src/ui/sonarr_ui/library/edit_series_ui.rs | 54 +- .../sonarr_ui/library/edit_series_ui_tests.rs | 2 +- .../sonarr_ui/library/episode_details_ui.rs | 168 ++-- .../library/episode_details_ui_tests.rs | 2 +- src/ui/sonarr_ui/library/library_ui_tests.rs | 8 +- src/ui/sonarr_ui/library/mod.rs | 6 +- src/ui/sonarr_ui/library/season_details_ui.rs | 178 ++-- .../library/season_details_ui_tests.rs | 2 +- src/ui/sonarr_ui/library/series_details_ui.rs | 9 +- .../library/series_details_ui_tests.rs | 2 +- src/ui/sonarr_ui/mod.rs | 7 +- src/ui/sonarr_ui/root_folders/mod.rs | 6 +- .../root_folders/root_folders_ui_tests.rs | 2 +- src/ui/sonarr_ui/sonarr_ui_tests.rs | 2 +- src/ui/sonarr_ui/system/mod.rs | 4 +- src/ui/sonarr_ui/system/system_details_ui.rs | 8 +- .../system/system_details_ui_tests.rs | 2 +- src/ui/sonarr_ui/system/system_ui_tests.rs | 2 +- src/ui/utils.rs | 2 +- src/ui/widgets/input_box.rs | 2 +- src/ui/widgets/managarr_table.rs | 23 +- src/utils.rs | 10 +- 257 files changed, 4033 insertions(+), 4380 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f1bcd08..65a5932 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ documentation = "https://github.com/Dark-Alex-17/managarr" repository = "https://github.com/Dark-Alex-17/managarr" homepage = "https://github.com/Dark-Alex-17/managarr" readme = "README.md" -edition = "2021" +edition = "2024" license = "MIT" rust-version = "1.89.0" exclude = [".github", "CONTRIBUTING.md", "*.log", "tags"] diff --git a/src/app/app_tests.rs b/src/app/app_tests.rs index bda0636..96a8e52 100644 --- a/src/app/app_tests.rs +++ b/src/app/app_tests.rs @@ -7,12 +7,12 @@ mod tests { use serial_test::serial; use tokio::sync::mpsc; - use crate::app::{interpolate_env_vars, App, AppConfig, Data, ServarrConfig}; + use crate::app::{App, AppConfig, Data, ServarrConfig, interpolate_env_vars}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData}; use crate::models::{HorizontallyScrollableText, TabRoute}; - use crate::network::radarr_network::RadarrEvent; use crate::network::NetworkEvent; + use crate::network::radarr_network::RadarrEvent; use tokio_util::sync::CancellationToken; #[test] @@ -597,7 +597,9 @@ mod tests { let ssl_cert_path = "/some/path".to_owned(); let mut custom_headers = HeaderMap::new(); custom_headers.insert("X-Custom-Header", "value".parse().unwrap()); - let expected_str = format!("ServarrConfig {{ name: Some(\"{name}\"), host: Some(\"{host}\"), port: Some({port}), uri: Some(\"{uri}\"), weight: Some({weight}), api_token: Some(\"***********\"), api_token_file: Some(\"{api_token_file}\"), ssl_cert_path: Some(\"{ssl_cert_path}\"), custom_headers: Some({{\"x-custom-header\": \"value\"}}) }}"); + let expected_str = format!( + "ServarrConfig {{ name: Some(\"{name}\"), host: Some(\"{host}\"), port: Some({port}), uri: Some(\"{uri}\"), weight: Some({weight}), api_token: Some(\"***********\"), api_token_file: Some(\"{api_token_file}\"), ssl_cert_path: Some(\"{ssl_cert_path}\"), custom_headers: Some({{\"x-custom-header\": \"value\"}}) }}" + ); let servarr_config = ServarrConfig { name: Some(name), host: Some(host), diff --git a/src/app/context_clues.rs b/src/app/context_clues.rs index b4a03ab..f58f901 100644 --- a/src/app/context_clues.rs +++ b/src/app/context_clues.rs @@ -1,7 +1,7 @@ -use crate::app::key_binding::{KeyBinding, DEFAULT_KEYBINDINGS}; +use crate::app::App; +use crate::app::key_binding::{DEFAULT_KEYBINDINGS, KeyBinding}; use crate::app::radarr::radarr_context_clues::RadarrContextClueProvider; use crate::app::sonarr::sonarr_context_clues::SonarrContextClueProvider; -use crate::app::App; use crate::models::Route; #[cfg(test)] diff --git a/src/app/context_clues_tests.rs b/src/app/context_clues_tests.rs index d5be326..e55b9f0 100644 --- a/src/app/context_clues_tests.rs +++ b/src/app/context_clues_tests.rs @@ -3,15 +3,15 @@ mod test { use pretty_assertions::{assert_eq, assert_str_eq}; use crate::app::context_clues::{ - ContextClueProvider, ServarrContextClueProvider, BARE_POPUP_CONTEXT_CLUES, - BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, - INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES, - SYSTEM_CONTEXT_CLUES, + BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + ROOT_FOLDERS_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, + ServarrContextClueProvider, }; - use crate::app::{key_binding::DEFAULT_KEYBINDINGS, App}; + use crate::app::{App, key_binding::DEFAULT_KEYBINDINGS}; + use crate::models::servarr_data::ActiveKeybindingBlock; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - use crate::models::servarr_data::ActiveKeybindingBlock; #[test] fn test_servarr_context_clues() { diff --git a/src/app/key_binding_tests.rs b/src/app/key_binding_tests.rs index a5357f3..7db6501 100644 --- a/src/app/key_binding_tests.rs +++ b/src/app/key_binding_tests.rs @@ -3,7 +3,7 @@ mod test { use pretty_assertions::{assert_eq, assert_str_eq}; use rstest::rstest; - use crate::app::key_binding::{KeyBinding, DEFAULT_KEYBINDINGS}; + use crate::app::key_binding::{DEFAULT_KEYBINDINGS, KeyBinding}; use crate::event::Key; use crate::matches_key; diff --git a/src/app/mod.rs b/src/app/mod.rs index 7ff3a48..5d8153e 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,4 +1,4 @@ -use anyhow::{anyhow, Error, Result}; +use anyhow::{Error, Result, anyhow}; use colored::Colorize; use itertools::Itertools; use log::{debug, error}; @@ -132,12 +132,12 @@ impl App<'_> { self.is_loading = true; } - if let Some(network_tx) = &self.network_tx { - if let Err(e) = network_tx.send(action).await { - self.is_loading = false; - error!("Failed to send event. {e:?}"); - self.handle_error(anyhow!(e)); - } + if let Some(network_tx) = &self.network_tx + && let Err(e) = network_tx.send(action).await + { + self.is_loading = false; + error!("Failed to send event. {e:?}"); + self.handle_error(anyhow!(e)); } } @@ -479,10 +479,10 @@ fn interpolate_env_vars(s: &str) -> String { var_regex .replace_all(s, |caps: ®ex::Captures<'_>| { - if let Some(mat) = caps.get(1) { - if let Ok(value) = std::env::var(mat.as_str()) { - return scrubbing_regex.replace_all(&value, "").to_string(); - } + if let Some(mat) = caps.get(1) + && let Ok(value) = std::env::var(mat.as_str()) + { + return scrubbing_regex.replace_all(&value, "").to_string(); } scrubbing_regex.replace_all(&result, "").to_string() diff --git a/src/app/radarr/radarr_context_clues.rs b/src/app/radarr/radarr_context_clues.rs index 68d2823..04f17aa 100644 --- a/src/app/radarr/radarr_context_clues.rs +++ b/src/app/radarr/radarr_context_clues.rs @@ -1,13 +1,13 @@ +use crate::app::App; use crate::app::context_clues::{ - ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + BARE_POPUP_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, ContextClue, ContextClueProvider, }; use crate::app::key_binding::DEFAULT_KEYBINDINGS; -use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_BLOCKS, EDIT_COLLECTION_BLOCKS, EDIT_INDEXER_BLOCKS, + ADD_MOVIE_BLOCKS, ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS, EDIT_INDEXER_BLOCKS, EDIT_MOVIE_BLOCKS, INDEXER_SETTINGS_BLOCKS, MOVIE_DETAILS_BLOCKS, }; -use crate::models::Route; #[cfg(test)] #[path = "radarr_context_clues_tests.rs"] diff --git a/src/app/radarr/radarr_context_clues_tests.rs b/src/app/radarr/radarr_context_clues_tests.rs index b98c5b5..3cc4769 100644 --- a/src/app/radarr/radarr_context_clues_tests.rs +++ b/src/app/radarr/radarr_context_clues_tests.rs @@ -1,17 +1,17 @@ #[cfg(test)] mod tests { + use crate::app::App; use crate::app::context_clues::{ - ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, - CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + ContextClue, ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, }; use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::radarr::radarr_context_clues::{ - RadarrContextClueProvider, ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTIONS_CONTEXT_CLUES, - COLLECTION_DETAILS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, - MOVIE_DETAILS_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, + ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTION_DETAILS_CONTEXT_CLUES, + COLLECTIONS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, + MOVIE_DETAILS_CONTEXT_CLUES, RadarrContextClueProvider, SYSTEM_TASKS_CONTEXT_CLUES, }; - use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/app/radarr/radarr_tests.rs b/src/app/radarr/radarr_tests.rs index 9218162..e4d1f9b 100644 --- a/src/app/radarr/radarr_tests.rs +++ b/src/app/radarr/radarr_tests.rs @@ -3,15 +3,15 @@ mod tests { use pretty_assertions::assert_eq; use tokio::sync::mpsc; - use crate::app::radarr::ActiveRadarrBlock; use crate::app::App; + use crate::app::radarr::ActiveRadarrBlock; use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, Collection, CollectionMovie, Credit, Movie, RadarrRelease, }; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_models::Indexer; - use crate::network::radarr_network::RadarrEvent; use crate::network::NetworkEvent; + use crate::network::radarr_network::RadarrEvent; #[tokio::test] async fn test_dispatch_by_blocklist_block() { diff --git a/src/app/sonarr/mod.rs b/src/app/sonarr/mod.rs index 620784d..44ee45f 100644 --- a/src/app/sonarr/mod.rs +++ b/src/app/sonarr/mod.rs @@ -94,16 +94,15 @@ impl App<'_> { .await; } ActiveSonarrBlock::ManualEpisodeSearch => { - if let Some(season_details_modal) = self.data.sonarr_data.season_details_modal.as_ref() { - if let Some(episode_details_modal) = season_details_modal.episode_details_modal.as_ref() { - if episode_details_modal.episode_releases.is_empty() { - self - .dispatch_network_event( - SonarrEvent::GetEpisodeReleases(self.extract_episode_id().await).into(), - ) - .await; - } - } + if let Some(season_details_modal) = self.data.sonarr_data.season_details_modal.as_ref() + && let Some(episode_details_modal) = season_details_modal.episode_details_modal.as_ref() + && episode_details_modal.episode_releases.is_empty() + { + self + .dispatch_network_event( + SonarrEvent::GetEpisodeReleases(self.extract_episode_id().await).into(), + ) + .await; } } ActiveSonarrBlock::Downloads => { diff --git a/src/app/sonarr/sonarr_context_clues.rs b/src/app/sonarr/sonarr_context_clues.rs index 28b642a..2a58a81 100644 --- a/src/app/sonarr/sonarr_context_clues.rs +++ b/src/app/sonarr/sonarr_context_clues.rs @@ -1,12 +1,12 @@ use crate::app::context_clues::{ - ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + BARE_POPUP_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, ContextClueProvider, }; -use crate::app::{context_clues::ContextClue, key_binding::DEFAULT_KEYBINDINGS, App}; +use crate::app::{App, context_clues::ContextClue, key_binding::DEFAULT_KEYBINDINGS}; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, ADD_SERIES_BLOCKS, EDIT_INDEXER_BLOCKS, EDIT_SERIES_BLOCKS, + ADD_SERIES_BLOCKS, ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, INDEXER_SETTINGS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; -use crate::models::Route; #[cfg(test)] #[path = "sonarr_context_clues_tests.rs"] diff --git a/src/app/sonarr/sonarr_context_clues_tests.rs b/src/app/sonarr/sonarr_context_clues_tests.rs index 2560111..2dac148 100644 --- a/src/app/sonarr/sonarr_context_clues_tests.rs +++ b/src/app/sonarr/sonarr_context_clues_tests.rs @@ -1,14 +1,15 @@ #[cfg(test)] mod tests { use crate::app::context_clues::{ - ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, - CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + ContextClue, ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, }; use crate::app::sonarr::sonarr_context_clues::{ - SonarrContextClueProvider, SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES, + SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES, SonarrContextClueProvider, }; use crate::app::{ + App, key_binding::DEFAULT_KEYBINDINGS, sonarr::sonarr_context_clues::{ ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES, @@ -17,7 +18,6 @@ mod tests { SEASON_HISTORY_CONTEXT_CLUES, SERIES_CONTEXT_CLUES, SERIES_DETAILS_CONTEXT_CLUES, SERIES_HISTORY_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, }, - App, }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; diff --git a/src/app/sonarr/sonarr_tests.rs b/src/app/sonarr/sonarr_tests.rs index 904379f..bbf008e 100644 --- a/src/app/sonarr/sonarr_tests.rs +++ b/src/app/sonarr/sonarr_tests.rs @@ -16,7 +16,7 @@ mod tests { }, sonarr_models::{Season, Series, SonarrRelease}, }, - network::{sonarr_network::SonarrEvent, NetworkEvent}, + network::{NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/cli/cli_tests.rs b/src/cli/cli_tests.rs index 0109905..0db1fd3 100644 --- a/src/cli/cli_tests.rs +++ b/src/cli/cli_tests.rs @@ -2,16 +2,18 @@ mod tests { use std::sync::Arc; - use clap::{error::ErrorKind, CommandFactory}; + use clap::{CommandFactory, error::ErrorKind}; use mockall::predicate::eq; use rstest::rstest; use serde_json::json; use tokio::sync::Mutex; use crate::{ + Cli, app::App, cli::{handle_command, mutex_flags_or_option, radarr::RadarrCommand, sonarr::SonarrCommand}, models::{ + Serdeable, radarr_models::{ BlocklistItem as RadarrBlocklistItem, BlocklistResponse as RadarrBlocklistResponse, RadarrSerdeable, @@ -20,12 +22,10 @@ mod tests { BlocklistItem as SonarrBlocklistItem, BlocklistResponse as SonarrBlocklistResponse, SonarrSerdeable, }, - Serdeable, }, network::{ - radarr_network::RadarrEvent, sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent, + MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent, sonarr_network::SonarrEvent, }, - Cli, }; use pretty_assertions::assert_eq; diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 5eb9c37..8d0c6d2 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use anyhow::Result; -use clap::{command, Subcommand}; +use clap::{Subcommand, command}; use clap_complete::Shell; use radarr::{RadarrCliHandler, RadarrCommand}; use sonarr::{SonarrCliHandler, SonarrCommand}; diff --git a/src/cli/radarr/add_command_handler.rs b/src/cli/radarr/add_command_handler.rs index 73cd851..f0e73bf 100644 --- a/src/cli/radarr/add_command_handler.rs +++ b/src/cli/radarr/add_command_handler.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use anyhow::Result; -use clap::{arg, command, ArgAction, Subcommand}; +use clap::{ArgAction, Subcommand, arg, command}; use tokio::sync::Mutex; use super::RadarrCommand; @@ -10,7 +10,7 @@ use crate::{ app::App, cli::{CliCommandHandler, Command}, models::radarr_models::{AddMovieBody, AddMovieOptions, MinimumAvailability, MovieMonitor}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; #[cfg(test)] diff --git a/src/cli/radarr/add_command_handler_tests.rs b/src/cli/radarr/add_command_handler_tests.rs index 3309a11..b465a79 100644 --- a/src/cli/radarr/add_command_handler_tests.rs +++ b/src/cli/radarr/add_command_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use clap::{error::ErrorKind, CommandFactory, Parser}; + use clap::{CommandFactory, Parser, error::ErrorKind}; use crate::{ + Cli, cli::{ - radarr::{add_command_handler::RadarrAddCommand, RadarrCommand}, Command, + radarr::{RadarrCommand, add_command_handler::RadarrAddCommand}, }, models::radarr_models::{MinimumAvailability, MovieMonitor}, - Cli, }; use pretty_assertions::assert_eq; @@ -357,12 +357,12 @@ mod tests { use crate::{ app::App, - cli::{radarr::add_command_handler::RadarrAddCommandHandler, CliCommandHandler}, + cli::{CliCommandHandler, radarr::add_command_handler::RadarrAddCommandHandler}, models::{ - radarr_models::{AddMovieBody, AddMovieOptions, RadarrSerdeable}, Serdeable, + radarr_models::{AddMovieBody, AddMovieOptions, RadarrSerdeable}, }, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; use super::*; diff --git a/src/cli/radarr/delete_command_handler.rs b/src/cli/radarr/delete_command_handler.rs index 9fdb83c..ba9e878 100644 --- a/src/cli/radarr/delete_command_handler.rs +++ b/src/cli/radarr/delete_command_handler.rs @@ -8,7 +8,7 @@ use crate::{ app::App, cli::{CliCommandHandler, Command}, models::radarr_models::DeleteMovieParams, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; diff --git a/src/cli/radarr/delete_command_handler_tests.rs b/src/cli/radarr/delete_command_handler_tests.rs index 3c47b50..0b6a144 100644 --- a/src/cli/radarr/delete_command_handler_tests.rs +++ b/src/cli/radarr/delete_command_handler_tests.rs @@ -1,13 +1,13 @@ #[cfg(test)] mod tests { use crate::{ - cli::{ - radarr::{delete_command_handler::RadarrDeleteCommand, RadarrCommand}, - Command, - }, Cli, + cli::{ + Command, + radarr::{RadarrCommand, delete_command_handler::RadarrDeleteCommand}, + }, }; - use clap::{error::ErrorKind, CommandFactory, Parser}; + use clap::{CommandFactory, Parser, error::ErrorKind}; use pretty_assertions::assert_eq; #[test] @@ -251,14 +251,14 @@ mod tests { use crate::{ app::App, cli::{ - radarr::delete_command_handler::{RadarrDeleteCommand, RadarrDeleteCommandHandler}, CliCommandHandler, + radarr::delete_command_handler::{RadarrDeleteCommand, RadarrDeleteCommandHandler}, }, models::{ - radarr_models::{DeleteMovieParams, RadarrSerdeable}, Serdeable, + radarr_models::{DeleteMovieParams, RadarrSerdeable}, }, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; #[tokio::test] diff --git a/src/cli/radarr/edit_command_handler.rs b/src/cli/radarr/edit_command_handler.rs index f786697..e2383f2 100644 --- a/src/cli/radarr/edit_command_handler.rs +++ b/src/cli/radarr/edit_command_handler.rs @@ -6,15 +6,15 @@ use tokio::sync::Mutex; use crate::{ app::App, - cli::{mutex_flags_or_default, mutex_flags_or_option, CliCommandHandler, Command}, + cli::{CliCommandHandler, Command, mutex_flags_or_default, mutex_flags_or_option}, models::{ + Serdeable, radarr_models::{ EditCollectionParams, EditMovieParams, IndexerSettings, MinimumAvailability, RadarrSerdeable, }, servarr_models::EditIndexerParams, - Serdeable, }, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; diff --git a/src/cli/radarr/edit_command_handler_tests.rs b/src/cli/radarr/edit_command_handler_tests.rs index f811691..ed10b95 100644 --- a/src/cli/radarr/edit_command_handler_tests.rs +++ b/src/cli/radarr/edit_command_handler_tests.rs @@ -1,13 +1,13 @@ #[cfg(test)] mod tests { use crate::{ - cli::{ - radarr::{edit_command_handler::RadarrEditCommand, RadarrCommand}, - Command, - }, Cli, + cli::{ + Command, + radarr::{RadarrCommand, edit_command_handler::RadarrEditCommand}, + }, }; - use clap::{error::ErrorKind, CommandFactory, Parser}; + use clap::{CommandFactory, Parser, error::ErrorKind}; use pretty_assertions::assert_eq; #[test] @@ -805,18 +805,18 @@ mod tests { use crate::{ app::App, cli::{ - radarr::edit_command_handler::{RadarrEditCommand, RadarrEditCommandHandler}, CliCommandHandler, + radarr::edit_command_handler::{RadarrEditCommand, RadarrEditCommandHandler}, }, models::{ + Serdeable, radarr_models::{ EditCollectionParams, EditMovieParams, IndexerSettings, MinimumAvailability, RadarrSerdeable, }, servarr_models::EditIndexerParams, - Serdeable, }, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; #[tokio::test] @@ -962,8 +962,8 @@ mod tests { } #[tokio::test] - async fn test_handle_edit_all_indexer_settings_command_unprovided_values_default_to_previous_values( - ) { + async fn test_handle_edit_all_indexer_settings_command_unprovided_values_default_to_previous_values() + { let expected_edit_all_indexer_settings = IndexerSettings { allow_hardcoded_subs: true, availability_delay: 2, diff --git a/src/cli/radarr/get_command_handler.rs b/src/cli/radarr/get_command_handler.rs index 08016ea..7233146 100644 --- a/src/cli/radarr/get_command_handler.rs +++ b/src/cli/radarr/get_command_handler.rs @@ -1,13 +1,13 @@ use std::sync::Arc; use anyhow::Result; -use clap::{command, Subcommand}; +use clap::{Subcommand, command}; use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; diff --git a/src/cli/radarr/get_command_handler_tests.rs b/src/cli/radarr/get_command_handler_tests.rs index 6a3fec5..4492cc4 100644 --- a/src/cli/radarr/get_command_handler_tests.rs +++ b/src/cli/radarr/get_command_handler_tests.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests { - use clap::error::ErrorKind; use clap::CommandFactory; + use clap::error::ErrorKind; - use crate::cli::radarr::get_command_handler::RadarrGetCommand; - use crate::cli::radarr::RadarrCommand; - use crate::cli::Command; use crate::Cli; + use crate::cli::Command; + use crate::cli::radarr::RadarrCommand; + use crate::cli::radarr::get_command_handler::RadarrGetCommand; use pretty_assertions::assert_eq; #[test] @@ -117,11 +117,11 @@ mod tests { use crate::{ app::App, cli::{ - radarr::get_command_handler::{RadarrGetCommand, RadarrGetCommandHandler}, CliCommandHandler, + radarr::get_command_handler::{RadarrGetCommand, RadarrGetCommandHandler}, }, - models::{radarr_models::RadarrSerdeable, Serdeable}, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + models::{Serdeable, radarr_models::RadarrSerdeable}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; #[tokio::test] diff --git a/src/cli/radarr/list_command_handler.rs b/src/cli/radarr/list_command_handler.rs index 3fd1575..4e613c9 100644 --- a/src/cli/radarr/list_command_handler.rs +++ b/src/cli/radarr/list_command_handler.rs @@ -1,13 +1,13 @@ use std::sync::Arc; use anyhow::Result; -use clap::{command, Subcommand}; +use clap::{Subcommand, command}; use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; diff --git a/src/cli/radarr/list_command_handler_tests.rs b/src/cli/radarr/list_command_handler_tests.rs index fb7e2d6..cc0b093 100644 --- a/src/cli/radarr/list_command_handler_tests.rs +++ b/src/cli/radarr/list_command_handler_tests.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests { - use clap::error::ErrorKind; use clap::CommandFactory; + use clap::error::ErrorKind; - use crate::cli::radarr::list_command_handler::RadarrListCommand; - use crate::cli::radarr::RadarrCommand; - use crate::cli::Command; use crate::Cli; + use crate::cli::Command; + use crate::cli::radarr::RadarrCommand; + use crate::cli::radarr::list_command_handler::RadarrListCommand; use pretty_assertions::assert_eq; #[test] @@ -135,8 +135,8 @@ mod tests { use crate::{ app::App, cli::radarr::list_command_handler::{RadarrListCommand, RadarrListCommandHandler}, - models::{radarr_models::RadarrSerdeable, Serdeable}, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + models::{Serdeable, radarr_models::RadarrSerdeable}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; #[rstest] diff --git a/src/cli/radarr/mod.rs b/src/cli/radarr/mod.rs index 11b4d9e..f13a587 100644 --- a/src/cli/radarr/mod.rs +++ b/src/cli/radarr/mod.rs @@ -13,8 +13,8 @@ use crate::app::App; use crate::cli::CliCommandHandler; use crate::models::radarr_models::{RadarrReleaseDownloadBody, RadarrTaskName}; -use crate::network::radarr_network::RadarrEvent; use crate::network::NetworkTrait; +use crate::network::radarr_network::RadarrEvent; use anyhow::Result; use super::Command; diff --git a/src/cli/radarr/radarr_command_tests.rs b/src/cli/radarr/radarr_command_tests.rs index 90a7efe..ca45835 100644 --- a/src/cli/radarr/radarr_command_tests.rs +++ b/src/cli/radarr/radarr_command_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use clap::error::ErrorKind; use clap::CommandFactory; + use clap::error::ErrorKind; - use crate::cli::radarr::RadarrCommand; - use crate::cli::Command; use crate::Cli; + use crate::cli::Command; + use crate::cli::radarr::RadarrCommand; use pretty_assertions::assert_eq; #[test] @@ -276,22 +276,22 @@ mod tests { use crate::{ app::App, cli::{ - radarr::{ - add_command_handler::RadarrAddCommand, delete_command_handler::RadarrDeleteCommand, - edit_command_handler::RadarrEditCommand, get_command_handler::RadarrGetCommand, - list_command_handler::RadarrListCommand, refresh_command_handler::RadarrRefreshCommand, - RadarrCliHandler, RadarrCommand, - }, CliCommandHandler, + radarr::{ + RadarrCliHandler, RadarrCommand, add_command_handler::RadarrAddCommand, + delete_command_handler::RadarrDeleteCommand, edit_command_handler::RadarrEditCommand, + get_command_handler::RadarrGetCommand, list_command_handler::RadarrListCommand, + refresh_command_handler::RadarrRefreshCommand, + }, }, models::{ + Serdeable, radarr_models::{ BlocklistItem, BlocklistResponse, IndexerSettings, RadarrReleaseDownloadBody, RadarrSerdeable, RadarrTaskName, }, - Serdeable, }, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; #[tokio::test] diff --git a/src/cli/radarr/refresh_command_handler.rs b/src/cli/radarr/refresh_command_handler.rs index d871be4..2ea5c69 100644 --- a/src/cli/radarr/refresh_command_handler.rs +++ b/src/cli/radarr/refresh_command_handler.rs @@ -7,7 +7,7 @@ use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; diff --git a/src/cli/radarr/refresh_command_handler_tests.rs b/src/cli/radarr/refresh_command_handler_tests.rs index b363b2b..b722c32 100644 --- a/src/cli/radarr/refresh_command_handler_tests.rs +++ b/src/cli/radarr/refresh_command_handler_tests.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests { - use clap::error::ErrorKind; use clap::CommandFactory; + use clap::error::ErrorKind; - use crate::cli::radarr::refresh_command_handler::RadarrRefreshCommand; - use crate::cli::radarr::RadarrCommand; - use crate::cli::Command; use crate::Cli; + use crate::cli::Command; + use crate::cli::radarr::RadarrCommand; + use crate::cli::radarr::refresh_command_handler::RadarrRefreshCommand; use pretty_assertions::assert_eq; #[test] @@ -73,8 +73,8 @@ mod tests { use crate::{ app::App, cli::radarr::refresh_command_handler::{RadarrRefreshCommand, RadarrRefreshCommandHandler}, - models::{radarr_models::RadarrSerdeable, Serdeable}, - network::{radarr_network::RadarrEvent, MockNetworkTrait, NetworkEvent}, + models::{Serdeable, radarr_models::RadarrSerdeable}, + network::{MockNetworkTrait, NetworkEvent, radarr_network::RadarrEvent}, }; #[rstest] diff --git a/src/cli/sonarr/add_command_handler.rs b/src/cli/sonarr/add_command_handler.rs index 9bf0dc6..14117e9 100644 --- a/src/cli/sonarr/add_command_handler.rs +++ b/src/cli/sonarr/add_command_handler.rs @@ -10,7 +10,7 @@ use crate::{ app::App, cli::{CliCommandHandler, Command}, models::sonarr_models::{AddSeriesBody, AddSeriesOptions, SeriesMonitor, SeriesType}, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; #[cfg(test)] diff --git a/src/cli/sonarr/add_command_handler_tests.rs b/src/cli/sonarr/add_command_handler_tests.rs index 94d65cd..e96c012 100644 --- a/src/cli/sonarr/add_command_handler_tests.rs +++ b/src/cli/sonarr/add_command_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use clap::{error::ErrorKind, CommandFactory, Parser}; + use clap::{CommandFactory, Parser, error::ErrorKind}; use pretty_assertions::assert_eq; use crate::{ - cli::{ - sonarr::{add_command_handler::SonarrAddCommand, SonarrCommand}, - Command, - }, Cli, + cli::{ + Command, + sonarr::{SonarrCommand, add_command_handler::SonarrAddCommand}, + }, }; #[test] @@ -456,14 +456,14 @@ mod tests { use crate::{ app::App, - cli::{sonarr::add_command_handler::SonarrAddCommandHandler, CliCommandHandler}, + cli::{CliCommandHandler, sonarr::add_command_handler::SonarrAddCommandHandler}, models::{ + Serdeable, sonarr_models::{ AddSeriesBody, AddSeriesOptions, SeriesMonitor, SeriesType, SonarrSerdeable, }, - Serdeable, }, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; use super::*; diff --git a/src/cli/sonarr/delete_command_handler.rs b/src/cli/sonarr/delete_command_handler.rs index a497305..d123e5f 100644 --- a/src/cli/sonarr/delete_command_handler.rs +++ b/src/cli/sonarr/delete_command_handler.rs @@ -8,7 +8,7 @@ use crate::{ app::App, cli::{CliCommandHandler, Command}, models::sonarr_models::DeleteSeriesParams, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/delete_command_handler_tests.rs b/src/cli/sonarr/delete_command_handler_tests.rs index fdae4c4..514df6f 100644 --- a/src/cli/sonarr/delete_command_handler_tests.rs +++ b/src/cli/sonarr/delete_command_handler_tests.rs @@ -1,13 +1,13 @@ #[cfg(test)] mod tests { use crate::{ - cli::{ - sonarr::{delete_command_handler::SonarrDeleteCommand, SonarrCommand}, - Command, - }, Cli, + cli::{ + Command, + sonarr::{SonarrCommand, delete_command_handler::SonarrDeleteCommand}, + }, }; - use clap::{error::ErrorKind, CommandFactory, Parser}; + use clap::{CommandFactory, Parser, error::ErrorKind}; use pretty_assertions::assert_eq; #[test] @@ -284,14 +284,14 @@ mod tests { use crate::{ app::App, cli::{ - sonarr::delete_command_handler::{SonarrDeleteCommand, SonarrDeleteCommandHandler}, CliCommandHandler, + sonarr::delete_command_handler::{SonarrDeleteCommand, SonarrDeleteCommandHandler}, }, models::{ - sonarr_models::{DeleteSeriesParams, SonarrSerdeable}, Serdeable, + sonarr_models::{DeleteSeriesParams, SonarrSerdeable}, }, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/cli/sonarr/download_command_handler.rs b/src/cli/sonarr/download_command_handler.rs index f990ab2..0e860ec 100644 --- a/src/cli/sonarr/download_command_handler.rs +++ b/src/cli/sonarr/download_command_handler.rs @@ -8,7 +8,7 @@ use crate::{ app::App, cli::{CliCommandHandler, Command}, models::sonarr_models::SonarrReleaseDownloadBody, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/download_command_handler_tests.rs b/src/cli/sonarr/download_command_handler_tests.rs index f0a32b0..bb4cbd4 100644 --- a/src/cli/sonarr/download_command_handler_tests.rs +++ b/src/cli/sonarr/download_command_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { use crate::{ - cli::{ - sonarr::{download_command_handler::SonarrDownloadCommand, SonarrCommand}, - Command, - }, Cli, + cli::{ + Command, + sonarr::{SonarrCommand, download_command_handler::SonarrDownloadCommand}, + }, }; use clap::CommandFactory; use pretty_assertions::assert_eq; @@ -303,14 +303,14 @@ mod tests { use crate::{ app::App, cli::{ - sonarr::download_command_handler::{SonarrDownloadCommand, SonarrDownloadCommandHandler}, CliCommandHandler, + sonarr::download_command_handler::{SonarrDownloadCommand, SonarrDownloadCommandHandler}, }, models::{ - sonarr_models::{SonarrReleaseDownloadBody, SonarrSerdeable}, Serdeable, + sonarr_models::{SonarrReleaseDownloadBody, SonarrSerdeable}, }, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/cli/sonarr/edit_command_handler.rs b/src/cli/sonarr/edit_command_handler.rs index 7d06313..6ba16ca 100644 --- a/src/cli/sonarr/edit_command_handler.rs +++ b/src/cli/sonarr/edit_command_handler.rs @@ -6,13 +6,13 @@ use tokio::sync::Mutex; use crate::{ app::App, - cli::{mutex_flags_or_option, CliCommandHandler, Command}, + cli::{CliCommandHandler, Command, mutex_flags_or_option}, models::{ + Serdeable, servarr_models::EditIndexerParams, sonarr_models::{EditSeriesParams, IndexerSettings, SeriesType, SonarrSerdeable}, - Serdeable, }, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/edit_command_handler_tests.rs b/src/cli/sonarr/edit_command_handler_tests.rs index bc6ef89..efa2633 100644 --- a/src/cli/sonarr/edit_command_handler_tests.rs +++ b/src/cli/sonarr/edit_command_handler_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use crate::cli::{ - sonarr::{edit_command_handler::SonarrEditCommand, SonarrCommand}, Command, + sonarr::{SonarrCommand, edit_command_handler::SonarrEditCommand}, }; #[test] @@ -20,10 +20,10 @@ mod tests { } mod cli { - use crate::{models::sonarr_models::SeriesType, Cli}; + use crate::{Cli, models::sonarr_models::SeriesType}; use super::*; - use clap::{error::ErrorKind, CommandFactory, Parser}; + use clap::{CommandFactory, Parser, error::ErrorKind}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -609,15 +609,15 @@ mod tests { use crate::{ app::App, cli::{ - sonarr::edit_command_handler::{SonarrEditCommand, SonarrEditCommandHandler}, CliCommandHandler, + sonarr::edit_command_handler::{SonarrEditCommand, SonarrEditCommandHandler}, }, models::{ + Serdeable, servarr_models::EditIndexerParams, sonarr_models::{EditSeriesParams, IndexerSettings, SeriesType, SonarrSerdeable}, - Serdeable, }, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/cli/sonarr/get_command_handler.rs b/src/cli/sonarr/get_command_handler.rs index c6b9ffe..19fe351 100644 --- a/src/cli/sonarr/get_command_handler.rs +++ b/src/cli/sonarr/get_command_handler.rs @@ -7,7 +7,7 @@ use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/get_command_handler_tests.rs b/src/cli/sonarr/get_command_handler_tests.rs index 202b174..5feae2c 100644 --- a/src/cli/sonarr/get_command_handler_tests.rs +++ b/src/cli/sonarr/get_command_handler_tests.rs @@ -1,10 +1,10 @@ #[cfg(test)] mod tests { - use crate::cli::{ - sonarr::{get_command_handler::SonarrGetCommand, SonarrCommand}, - Command, - }; use crate::Cli; + use crate::cli::{ + Command, + sonarr::{SonarrCommand, get_command_handler::SonarrGetCommand}, + }; use clap::CommandFactory; use pretty_assertions::assert_eq; @@ -118,11 +118,11 @@ mod tests { use crate::{ app::App, cli::{ - sonarr::get_command_handler::{SonarrGetCommand, SonarrGetCommandHandler}, CliCommandHandler, + sonarr::get_command_handler::{SonarrGetCommand, SonarrGetCommandHandler}, }, - models::{sonarr_models::SonarrSerdeable, Serdeable}, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + models::{Serdeable, sonarr_models::SonarrSerdeable}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/cli/sonarr/list_command_handler.rs b/src/cli/sonarr/list_command_handler.rs index 5a9ecda..a2dbfeb 100644 --- a/src/cli/sonarr/list_command_handler.rs +++ b/src/cli/sonarr/list_command_handler.rs @@ -7,7 +7,7 @@ use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/list_command_handler_tests.rs b/src/cli/sonarr/list_command_handler_tests.rs index 94c755c..b0be1a2 100644 --- a/src/cli/sonarr/list_command_handler_tests.rs +++ b/src/cli/sonarr/list_command_handler_tests.rs @@ -1,10 +1,10 @@ #[cfg(test)] mod tests { - use crate::cli::{ - sonarr::{list_command_handler::SonarrListCommand, SonarrCommand}, - Command, - }; use crate::Cli; + use crate::cli::{ + Command, + sonarr::{SonarrCommand, list_command_handler::SonarrListCommand}, + }; use clap::CommandFactory; use pretty_assertions::assert_eq; @@ -19,7 +19,7 @@ mod tests { mod cli { use super::*; - use clap::{error::ErrorKind, Parser}; + use clap::{Parser, error::ErrorKind}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -296,10 +296,10 @@ mod tests { use serde_json::json; use tokio::sync::Mutex; - use crate::cli::sonarr::list_command_handler::{SonarrListCommand, SonarrListCommandHandler}; use crate::cli::CliCommandHandler; - use crate::models::sonarr_models::SonarrSerdeable; + use crate::cli::sonarr::list_command_handler::{SonarrListCommand, SonarrListCommandHandler}; use crate::models::Serdeable; + use crate::models::sonarr_models::SonarrSerdeable; use crate::network::sonarr_network::SonarrEvent; use crate::{ app::App, diff --git a/src/cli/sonarr/manual_search_command_handler.rs b/src/cli/sonarr/manual_search_command_handler.rs index b2972bf..22dafa2 100644 --- a/src/cli/sonarr/manual_search_command_handler.rs +++ b/src/cli/sonarr/manual_search_command_handler.rs @@ -7,7 +7,7 @@ use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/manual_search_command_handler_tests.rs b/src/cli/sonarr/manual_search_command_handler_tests.rs index 453c5fc..0244f11 100644 --- a/src/cli/sonarr/manual_search_command_handler_tests.rs +++ b/src/cli/sonarr/manual_search_command_handler_tests.rs @@ -1,10 +1,10 @@ #[cfg(test)] mod tests { - use crate::cli::{ - sonarr::{manual_search_command_handler::SonarrManualSearchCommand, SonarrCommand}, - Command, - }; use crate::Cli; + use crate::cli::{ + Command, + sonarr::{SonarrCommand, manual_search_command_handler::SonarrManualSearchCommand}, + }; use clap::CommandFactory; use pretty_assertions::assert_eq; @@ -114,13 +114,13 @@ mod tests { use crate::{ app::App, cli::{ + CliCommandHandler, sonarr::manual_search_command_handler::{ SonarrManualSearchCommand, SonarrManualSearchCommandHandler, }, - CliCommandHandler, }, - models::{sonarr_models::SonarrSerdeable, Serdeable}, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + models::{Serdeable, sonarr_models::SonarrSerdeable}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/cli/sonarr/mod.rs b/src/cli/sonarr/mod.rs index ddc9f43..2a3c3c3 100644 --- a/src/cli/sonarr/mod.rs +++ b/src/cli/sonarr/mod.rs @@ -18,7 +18,7 @@ use trigger_automatic_search_command_handler::{ use crate::{ app::App, models::sonarr_models::SonarrTaskName, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::{CliCommandHandler, Command}; diff --git a/src/cli/sonarr/refresh_command_handler.rs b/src/cli/sonarr/refresh_command_handler.rs index 9daa179..c4a3f8d 100644 --- a/src/cli/sonarr/refresh_command_handler.rs +++ b/src/cli/sonarr/refresh_command_handler.rs @@ -6,7 +6,7 @@ use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/refresh_command_handler_tests.rs b/src/cli/sonarr/refresh_command_handler_tests.rs index 01d0c2e..509009d 100644 --- a/src/cli/sonarr/refresh_command_handler_tests.rs +++ b/src/cli/sonarr/refresh_command_handler_tests.rs @@ -2,11 +2,11 @@ mod tests { use pretty_assertions::assert_eq; - use crate::cli::{ - sonarr::{refresh_command_handler::SonarrRefreshCommand, SonarrCommand}, - Command, - }; use crate::Cli; + use crate::cli::{ + Command, + sonarr::{SonarrCommand, refresh_command_handler::SonarrRefreshCommand}, + }; use clap::CommandFactory; #[test] @@ -20,7 +20,7 @@ mod tests { mod cli { use super::*; - use clap::{error::ErrorKind, Parser}; + use clap::{Parser, error::ErrorKind}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -77,11 +77,11 @@ mod tests { use crate::{app::App, cli::sonarr::refresh_command_handler::SonarrRefreshCommandHandler}; use crate::{ - cli::{sonarr::refresh_command_handler::SonarrRefreshCommand, CliCommandHandler}, + cli::{CliCommandHandler, sonarr::refresh_command_handler::SonarrRefreshCommand}, network::sonarr_network::SonarrEvent, }; use crate::{ - models::{sonarr_models::SonarrSerdeable, Serdeable}, + models::{Serdeable, sonarr_models::SonarrSerdeable}, network::{MockNetworkTrait, NetworkEvent}, }; diff --git a/src/cli/sonarr/sonarr_command_tests.rs b/src/cli/sonarr/sonarr_command_tests.rs index 838ef30..28320f5 100644 --- a/src/cli/sonarr/sonarr_command_tests.rs +++ b/src/cli/sonarr/sonarr_command_tests.rs @@ -1,10 +1,10 @@ #[cfg(test)] mod tests { - use crate::cli::{ - sonarr::{list_command_handler::SonarrListCommand, SonarrCommand}, - Command, - }; use crate::Cli; + use crate::cli::{ + Command, + sonarr::{SonarrCommand, list_command_handler::SonarrListCommand}, + }; use clap::CommandFactory; use pretty_assertions::assert_eq; @@ -253,25 +253,25 @@ mod tests { use crate::{ app::App, cli::{ + CliCommandHandler, sonarr::{ - add_command_handler::SonarrAddCommand, delete_command_handler::SonarrDeleteCommand, + SonarrCliHandler, SonarrCommand, add_command_handler::SonarrAddCommand, + delete_command_handler::SonarrDeleteCommand, download_command_handler::SonarrDownloadCommand, edit_command_handler::SonarrEditCommand, get_command_handler::SonarrGetCommand, list_command_handler::SonarrListCommand, manual_search_command_handler::SonarrManualSearchCommand, refresh_command_handler::SonarrRefreshCommand, trigger_automatic_search_command_handler::SonarrTriggerAutomaticSearchCommand, - SonarrCliHandler, SonarrCommand, }, - CliCommandHandler, }, models::{ + Serdeable, sonarr_models::{ BlocklistItem, BlocklistResponse, IndexerSettings, Series, SonarrReleaseDownloadBody, SonarrSerdeable, SonarrTaskName, }, - Serdeable, }, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] @@ -488,8 +488,8 @@ mod tests { } #[tokio::test] - async fn test_sonarr_cli_handler_delegates_manual_search_commands_to_the_manual_search_command_handler( - ) { + async fn test_sonarr_cli_handler_delegates_manual_search_commands_to_the_manual_search_command_handler() + { let expected_episode_id = 1; let mut mock_network = MockNetworkTrait::new(); mock_network @@ -516,8 +516,8 @@ mod tests { } #[tokio::test] - async fn test_sonarr_cli_handler_delegates_trigger_automatic_search_commands_to_the_trigger_automatic_search_command_handler( - ) { + async fn test_sonarr_cli_handler_delegates_trigger_automatic_search_commands_to_the_trigger_automatic_search_command_handler() + { let expected_episode_id = 1; let mut mock_network = MockNetworkTrait::new(); mock_network diff --git a/src/cli/sonarr/trigger_automatic_search_command_handler.rs b/src/cli/sonarr/trigger_automatic_search_command_handler.rs index 27853f3..89bf285 100644 --- a/src/cli/sonarr/trigger_automatic_search_command_handler.rs +++ b/src/cli/sonarr/trigger_automatic_search_command_handler.rs @@ -7,7 +7,7 @@ use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{sonarr_network::SonarrEvent, NetworkTrait}, + network::{NetworkTrait, sonarr_network::SonarrEvent}, }; use super::SonarrCommand; diff --git a/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs b/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs index 4ebeb56..7521d55 100644 --- a/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs +++ b/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs @@ -1,12 +1,12 @@ #[cfg(test)] mod tests { - use crate::cli::{ - sonarr::{ - trigger_automatic_search_command_handler::SonarrTriggerAutomaticSearchCommand, SonarrCommand, - }, - Command, - }; use crate::Cli; + use crate::cli::{ + Command, + sonarr::{ + SonarrCommand, trigger_automatic_search_command_handler::SonarrTriggerAutomaticSearchCommand, + }, + }; use clap::CommandFactory; use pretty_assertions::assert_eq; @@ -150,13 +150,13 @@ mod tests { use crate::{ app::App, cli::{ + CliCommandHandler, sonarr::trigger_automatic_search_command_handler::{ SonarrTriggerAutomaticSearchCommand, SonarrTriggerAutomaticSearchCommandHandler, }, - CliCommandHandler, }, - models::{sonarr_models::SonarrSerdeable, Serdeable}, - network::{sonarr_network::SonarrEvent, MockNetworkTrait, NetworkEvent}, + models::{Serdeable, sonarr_models::SonarrSerdeable}, + network::{MockNetworkTrait, NetworkEvent, sonarr_network::SonarrEvent}, }; #[tokio::test] diff --git a/src/event/input_event.rs b/src/event/input_event.rs index 9626979..cfded37 100644 --- a/src/event/input_event.rs +++ b/src/event/input_event.rs @@ -28,14 +28,14 @@ impl Events { let timeout = tick_rate .checked_sub(last_tick.elapsed()) .unwrap_or_else(|| Duration::from_secs(0)); - if event::poll(timeout).unwrap() { - if let CrosstermEvent::Key(key_event) = event::read().unwrap() { - // Only process the key event if it's a press event - // Source: https://ratatui.rs/faq/ Why am I getting duplicate key events on Windows? - if key_event.kind == KeyEventKind::Press { - let key = Key::from(key_event); - tx.send(InputEvent::KeyEvent(key)).unwrap(); - } + if event::poll(timeout).unwrap() + && let CrosstermEvent::Key(key_event) = event::read().unwrap() + { + // Only process the key event if it's a press event + // Source: https://ratatui.rs/faq/ Why am I getting duplicate key events on Windows? + if key_event.kind == KeyEventKind::Press { + let key = Key::from(key_event); + tx.send(InputEvent::KeyEvent(key)).unwrap(); } } diff --git a/src/handlers/handlers_tests.rs b/src/handlers/handlers_tests.rs index ac81556..e66cf2e 100644 --- a/src/handlers/handlers_tests.rs +++ b/src/handlers/handlers_tests.rs @@ -6,22 +6,22 @@ mod tests { use rstest::rstest; use tokio_util::sync::CancellationToken; + use crate::app::App; use crate::app::context_clues::SERVARR_CONTEXT_CLUES; - use crate::app::key_binding::{KeyBinding, DEFAULT_KEYBINDINGS}; + use crate::app::key_binding::{DEFAULT_KEYBINDINGS, KeyBinding}; use crate::app::radarr::radarr_context_clues::{ LIBRARY_CONTEXT_CLUES, MOVIE_DETAILS_CONTEXT_CLUES, }; - use crate::app::App; use crate::event::Key; use crate::handlers::{handle_clear_errors, handle_prompt_toggle}; use crate::handlers::{handle_events, populate_keymapping_table}; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; - use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - use crate::models::servarr_data::ActiveKeybindingBlock; - use crate::models::servarr_models::KeybindingItem; - use crate::models::stateful_table::StatefulTable; use crate::models::HorizontallyScrollableText; use crate::models::Route; + use crate::models::servarr_data::ActiveKeybindingBlock; + use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; + use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; + use crate::models::servarr_models::KeybindingItem; + use crate::models::stateful_table::StatefulTable; #[test] fn test_handle_clear_errors() { @@ -119,8 +119,8 @@ mod tests { } #[test] - fn test_handle_empties_keybindings_table_on_help_button_press_when_keybindings_table_is_already_populated( - ) { + fn test_handle_empties_keybindings_table_on_help_button_press_when_keybindings_table_is_already_populated() + { let mut app = App::test_default(); let keybinding_items = Vec::from(SERVARR_CONTEXT_CLUES) .iter() @@ -251,8 +251,8 @@ mod tests { } #[test] - fn test_populate_keymapping_table_populates_delegated_servarr_context_provider_options_before_global_options( - ) { + fn test_populate_keymapping_table_populates_delegated_servarr_context_provider_options_before_global_options() + { let mut expected_keybinding_items = MOVIE_DETAILS_CONTEXT_CLUES .iter() .map(|(key, desc)| context_clue_to_keybinding_item(key, desc)) diff --git a/src/handlers/keybinding_handler.rs b/src/handlers/keybinding_handler.rs index b33dfbd..f7fb972 100644 --- a/src/handlers/keybinding_handler.rs +++ b/src/handlers/keybinding_handler.rs @@ -1,8 +1,8 @@ use crate::app::App; use crate::event::Key; use crate::handle_table_events; -use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::KeyEventHandler; +use crate::handlers::table_handler::TableHandlingConfig; use crate::models::servarr_data::ActiveKeybindingBlock; use crate::models::servarr_models::KeybindingItem; diff --git a/src/handlers/keybinding_handler_tests.rs b/src/handlers/keybinding_handler_tests.rs index 5a44ea8..55f8edb 100644 --- a/src/handlers/keybinding_handler_tests.rs +++ b/src/handlers/keybinding_handler_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::KeybindingHandler; diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 619cd72..5393139 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -1,11 +1,11 @@ use radarr_handlers::RadarrHandler; use sonarr_handlers::SonarrHandler; +use crate::app::App; use crate::app::context_clues::{ - ContextClueProvider, ServarrContextClueProvider, SERVARR_CONTEXT_CLUES, + ContextClueProvider, SERVARR_CONTEXT_CLUES, ServarrContextClueProvider, }; use crate::app::key_binding::KeyBinding; -use crate::app::App; use crate::event::Key; use crate::handlers::keybinding_handler::KeybindingHandler; use crate::matches_key; diff --git a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs index bc76578..c847af1 100644 --- a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs @@ -7,11 +7,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::radarr_handlers::blocklist::{blocklist_sorting_options, BlocklistHandler}; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; use crate::models::radarr_models::{BlocklistItem, BlocklistItemMovie}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; diff --git a/src/handlers/radarr_handlers/blocklist/mod.rs b/src/handlers/radarr_handlers/blocklist/mod.rs index 1160781..11ac0e3 100644 --- a/src/handlers/radarr_handlers/blocklist/mod.rs +++ b/src/handlers/radarr_handlers/blocklist/mod.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::models::radarr_models::BlocklistItem; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; use crate::models::stateful_table::SortOption; diff --git a/src/handlers/radarr_handlers/collections/collection_details_handler.rs b/src/handlers/radarr_handlers/collections/collection_details_handler.rs index 70af277..2f8923b 100644 --- a/src/handlers/radarr_handlers/collections/collection_details_handler.rs +++ b/src/handlers/radarr_handlers/collections/collection_details_handler.rs @@ -1,14 +1,14 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::KeyEventHandler; +use crate::handlers::table_handler::TableHandlingConfig; +use crate::models::BlockSelectionState; use crate::models::radarr_models::CollectionMovie; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_SELECTION_BLOCKS, COLLECTION_DETAILS_BLOCKS, + ADD_MOVIE_SELECTION_BLOCKS, ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, }; use crate::models::stateful_table::StatefulTable; -use crate::models::BlockSelectionState; use crate::{handle_table_events, matches_key}; #[cfg(test)] diff --git a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs index 62fec18..5ffc15e 100644 --- a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs @@ -4,11 +4,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; use crate::models::radarr_models::CollectionMovie; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, @@ -18,9 +18,9 @@ mod tests { use bimap::BiMap; use pretty_assertions::assert_eq; + use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -59,37 +59,43 @@ mod tests { ) .into() ); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty()); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty() + ); assert_eq!( app.data.radarr_data.selected_block.get_active_block(), ActiveRadarrBlock::AddMovieSelectRootFolder ); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .minimum_availability_list - .items - .is_empty()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty()); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .minimum_availability_list + .items + .is_empty() + ); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty() + ); assert_str_eq!( app .data @@ -221,7 +227,7 @@ mod tests { use crate::models::radarr_models::{Collection, MinimumAvailability}; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_COLLECTION_SELECTION_BLOCKS, + EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, }; use crate::test_edit_collection_key; diff --git a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs index 6467417..5b0b556 100644 --- a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs @@ -7,16 +7,16 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::radarr_handlers::collections::{ - collections_sorting_options, CollectionsHandler, - }; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::collections::{ + CollectionsHandler, collections_sorting_options, + }; use crate::models::radarr_models::{Collection, CollectionMovie}; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, COLLECTIONS_BLOCKS, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS, + ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS, }; use crate::test_handler_delegation; @@ -258,7 +258,7 @@ mod tests { use crate::models::radarr_models::MinimumAvailability; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_COLLECTION_SELECTION_BLOCKS, + EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; use crate::test_edit_collection_key; diff --git a/src/handlers/radarr_handlers/collections/edit_collection_handler.rs b/src/handlers/radarr_handlers/collections/edit_collection_handler.rs index 77426b9..60adb5f 100644 --- a/src/handlers/radarr_handlers/collections/edit_collection_handler.rs +++ b/src/handlers/radarr_handlers/collections/edit_collection_handler.rs @@ -1,10 +1,10 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::models::Scrollable; use crate::models::radarr_models::EditCollectionParams; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS}; -use crate::models::Scrollable; use crate::network::radarr_network::RadarrEvent; use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; diff --git a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs index 8e9a0d4..1054b95 100644 --- a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs @@ -5,12 +5,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::collections::edit_collection_handler::EditCollectionHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::collection; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Collection, EditCollectionParams, MinimumAvailability}; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ @@ -22,9 +22,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -475,15 +475,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_collection_modal - .as_ref() - .unwrap() - .path - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_collection_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditCollectionPrompt.into() @@ -884,10 +886,10 @@ mod tests { use super::*; use crate::{ models::{ + BlockSelectionState, servarr_data::radarr::{ modals::EditCollectionModal, radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS, }, - BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/collections/mod.rs b/src/handlers/radarr_handlers/collections/mod.rs index 2164080..19067d3 100644 --- a/src/handlers/radarr_handlers/collections/mod.rs +++ b/src/handlers/radarr_handlers/collections/mod.rs @@ -4,13 +4,13 @@ use crate::handlers::radarr_handlers::collections::collection_details_handler::C use crate::handlers::radarr_handlers::collections::edit_collection_handler::EditCollectionHandler; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::models::BlockSelectionState; use crate::models::radarr_models::Collection; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTIONS_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, }; use crate::models::stateful_table::SortOption; -use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use crate::{handle_table_events, matches_key}; diff --git a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs index bbdd673..12ebfb6 100644 --- a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::downloads::DownloadsHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::download_record; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; diff --git a/src/handlers/radarr_handlers/downloads/mod.rs b/src/handlers/radarr_handlers/downloads/mod.rs index 173019f..3ee8869 100644 --- a/src/handlers/radarr_handlers/downloads/mod.rs +++ b/src/handlers/radarr_handlers/downloads/mod.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; use crate::network::radarr_network::RadarrEvent; diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs index d9ba23c..4f684d2 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs @@ -1,6 +1,6 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs index b3107f2..8187ebc 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; @@ -18,9 +18,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -419,11 +419,11 @@ mod tests { use std::sync::atomic::Ordering; use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -852,7 +852,7 @@ mod tests { use crate::app::App; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ - servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; use crate::network::radarr_network::RadarrEvent; @@ -1053,14 +1053,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1074,14 +1076,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); } #[test] @@ -1106,14 +1110,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1127,14 +1133,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); } #[test] @@ -1159,14 +1167,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1180,14 +1190,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); } #[test] @@ -1211,15 +1223,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .name - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .name + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() @@ -1247,15 +1261,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .url - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .url + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() @@ -1283,15 +1299,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .api_key - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .api_key + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() @@ -1319,15 +1337,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .seed_ratio - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .seed_ratio + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() @@ -1355,15 +1375,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .tags + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() @@ -1433,9 +1455,9 @@ mod tests { mod test_handle_key_char { use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs index 4e1eca5..eae3f87 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs @@ -1,6 +1,6 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 25fe87a..67aab53 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer_settings; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, @@ -19,9 +19,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -267,9 +267,9 @@ mod tests { mod test_handle_left_right_action { use std::sync::atomic::Ordering; + use crate::models::BlockSelectionState; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -425,8 +425,8 @@ mod tests { use crate::{ models::{ - radarr_models::IndexerSettings, - servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, radarr_models::IndexerSettings, + servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, network::radarr_network::RadarrEvent, }; @@ -736,15 +736,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .indexer_settings - .as_ref() - .unwrap() - .whitelisted_hardcoded_subs - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .indexer_settings + .as_ref() + .unwrap() + .whitelisted_hardcoded_subs + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::AllIndexerSettingsPrompt.into() @@ -865,8 +867,8 @@ mod tests { use crate::{ models::{ - radarr_models::IndexerSettings, - servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, radarr_models::IndexerSettings, + servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs index e4a26c4..1becb4a 100644 --- a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs @@ -4,14 +4,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::IndexersHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, + ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; use crate::test_handler_delegation; @@ -128,7 +128,7 @@ mod tests { use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, RadarrData, }; use crate::models::servarr_models::{Indexer, IndexerField}; use crate::network::radarr_network::RadarrEvent; diff --git a/src/handlers/radarr_handlers/indexers/mod.rs b/src/handlers/radarr_handlers/indexers/mod.rs index 5770c2a..28fa376 100644 --- a/src/handlers/radarr_handlers/indexers/mod.rs +++ b/src/handlers/radarr_handlers/indexers/mod.rs @@ -5,13 +5,13 @@ use crate::handlers::radarr_handlers::indexers::edit_indexer_handler::EditIndexe use crate::handlers::radarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, - INDEXERS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, + INDEXER_SETTINGS_SELECTION_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; -use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use crate::{handle_table_events, matches_key}; diff --git a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs index 896bd72..c3dd2ba 100644 --- a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs +++ b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs @@ -1,8 +1,8 @@ use crate::app::App; use crate::event::Key; use crate::handle_table_events; -use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::KeyEventHandler; +use crate::handlers::table_handler::TableHandlingConfig; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; diff --git a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs index 7bfc93c..cce0859 100644 --- a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -1,9 +1,9 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::stateful_table::StatefulTable; diff --git a/src/handlers/radarr_handlers/library/add_movie_handler.rs b/src/handlers/radarr_handlers/library/add_movie_handler.rs index 3480bdb..246a993 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler.rs @@ -1,17 +1,17 @@ use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, AddMovieSearchResult, CollectionMovie, }; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, + ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, ActiveRadarrBlock, }; use crate::models::stateful_table::StatefulTable; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::radarr_network::RadarrEvent; use crate::{ - handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, App, Key, + App, Key, handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, }; #[cfg(test)] diff --git a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs index 4449905..7893b19 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs @@ -6,18 +6,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::add_movie_handler::AddMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::add_movie_body; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::collection_movie; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{AddMovieSearchResult, MinimumAvailability, MovieMonitor}; use crate::models::servarr_data::radarr::modals::AddMovieModal; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; + use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; use crate::models::servarr_models::RootFolder; - use crate::models::HorizontallyScrollableText; use bimap::BiMap; mod test_handle_scroll_up_and_down { @@ -25,9 +25,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::simple_stateful_iterable_vec; use super::*; @@ -768,11 +768,11 @@ mod tests { use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{ add_movie_body, add_movie_search_result, collection_movie, }; + use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; use crate::models::stateful_table::StatefulTable; - use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use super::*; @@ -848,33 +848,39 @@ mod tests { ActiveRadarrBlock::AddMovieSelectRootFolder ); assert!(app.data.radarr_data.add_movie_modal.is_some()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .minimum_availability_list - .items - .is_empty()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty()); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty() + ); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .minimum_availability_list + .items + .is_empty() + ); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty() + ); assert_str_eq!( app .data @@ -1334,9 +1340,9 @@ mod tests { add_movie_body, add_movie_search_result, collection_movie, }, models::{ + BlockSelectionState, servarr_data::radarr::{modals::AddMovieModal, radarr_data::ADD_MOVIE_SELECTION_BLOCKS}, stateful_table::StatefulTable, - BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler.rs b/src/handlers/radarr_handlers/library/delete_movie_handler.rs index b10ac3c..6a38063 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler.rs @@ -1,6 +1,6 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::matches_key; use crate::models::radarr_models::DeleteMovieParams; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs index 17b9338..efd500b 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::DeleteMovieParams; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; @@ -17,8 +17,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use super::*; @@ -83,8 +83,8 @@ mod tests { mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use crate::network::radarr_network::RadarrEvent; use super::*; @@ -255,7 +255,7 @@ mod tests { mod test_handle_key_char { use crate::{ models::{ - servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/edit_movie_handler.rs b/src/handlers/radarr_handlers/library/edit_movie_handler.rs index 10c3f14..61739b3 100644 --- a/src/handlers/radarr_handlers/library/edit_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/edit_movie_handler.rs @@ -1,10 +1,10 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::models::Scrollable; use crate::models::radarr_models::EditMovieParams; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS}; -use crate::models::Scrollable; use crate::network::radarr_network::RadarrEvent; use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; diff --git a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs index 9853ee3..4145908 100644 --- a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs @@ -5,12 +5,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::edit_movie_handler::EditMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{EditMovieParams, MinimumAvailability, Movie}; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS}; @@ -20,9 +20,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_MOVIE_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -566,15 +566,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_movie_modal - .as_ref() - .unwrap() - .path - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_movie_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditMoviePrompt.into() @@ -601,15 +603,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_movie_modal - .as_mut() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_movie_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveRadarrBlock::EditMoviePrompt.into() @@ -964,8 +968,8 @@ mod tests { use super::*; use crate::{ models::{ - servarr_data::radarr::{modals::EditMovieModal, radarr_data::EDIT_MOVIE_SELECTION_BLOCKS}, BlockSelectionState, + servarr_data::radarr::{modals::EditMovieModal, radarr_data::EDIT_MOVIE_SELECTION_BLOCKS}, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/library_handler_tests.rs b/src/handlers/radarr_handlers/library/library_handler_tests.rs index f6bb55d..dffb432 100644 --- a/src/handlers/radarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/library_handler_tests.rs @@ -5,15 +5,15 @@ mod tests { use std::cmp::Ordering; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::radarr_handlers::library::{movies_sorting_options, LibraryHandler}; - use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::library::{LibraryHandler, movies_sorting_options}; + use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_BLOCKS, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, + ADD_MOVIE_BLOCKS, ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, MOVIE_DETAILS_BLOCKS, }; use crate::models::servarr_models::Language; @@ -303,7 +303,7 @@ mod tests { use crate::models::radarr_models::MinimumAvailability; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_MOVIE_SELECTION_BLOCKS, + EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; diff --git a/src/handlers/radarr_handlers/library/mod.rs b/src/handlers/radarr_handlers/library/mod.rs index 3c24f90..7648db5 100644 --- a/src/handlers/radarr_handlers/library/mod.rs +++ b/src/handlers/radarr_handlers/library/mod.rs @@ -5,7 +5,7 @@ use crate::handlers::radarr_handlers::library::add_movie_handler::AddMovieHandle use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler; use crate::handlers::radarr_handlers::library::edit_movie_handler::EditMovieHandler; use crate::handlers::radarr_handlers::library::movie_details_handler::MovieDetailsHandler; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::handlers::table_handler::TableHandlingConfig; use crate::models::radarr_models::Movie; diff --git a/src/handlers/radarr_handlers/library/movie_details_handler.rs b/src/handlers/radarr_handlers/library/movie_details_handler.rs index ac08fa1..685a161 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler.rs @@ -3,7 +3,7 @@ use serde_json::Number; use crate::app::App; use crate::event::Key; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::radarr_models::{ Credit, MovieHistoryItem, RadarrRelease, RadarrReleaseDownloadBody, }; diff --git a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs index 2153748..e78c2d3 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -7,14 +7,14 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::movie_details_handler::{ - releases_sorting_options, MovieDetailsHandler, + MovieDetailsHandler, releases_sorting_options, }; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{movie, release}; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Credit, MovieHistoryItem}; use crate::models::radarr_models::{RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; @@ -502,7 +502,7 @@ mod tests { use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_MOVIE_SELECTION_BLOCKS, + EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; use crate::test_edit_movie_key; diff --git a/src/handlers/radarr_handlers/mod.rs b/src/handlers/radarr_handlers/mod.rs index e27237e..79acc5c 100644 --- a/src/handlers/radarr_handlers/mod.rs +++ b/src/handlers/radarr_handlers/mod.rs @@ -1,3 +1,4 @@ +use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::blocklist::BlocklistHandler; use crate::handlers::radarr_handlers::collections::CollectionsHandler; use crate::handlers::radarr_handlers::downloads::DownloadsHandler; @@ -5,9 +6,8 @@ use crate::handlers::radarr_handlers::indexers::IndexersHandler; use crate::handlers::radarr_handlers::library::LibraryHandler; use crate::handlers::radarr_handlers::root_folders::RootFoldersHandler; use crate::handlers::radarr_handlers::system::SystemHandler; -use crate::handlers::KeyEventHandler; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; -use crate::{matches_key, App, Key}; +use crate::{App, Key, matches_key}; mod blocklist; mod collections; diff --git a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs index afd8ff6..fd0dc2e 100644 --- a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs +++ b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs @@ -1,6 +1,7 @@ #[cfg(test)] #[macro_use] pub(in crate::handlers::radarr_handlers) mod utils { + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie, DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, @@ -9,9 +10,8 @@ pub(in crate::handlers::radarr_handlers) mod utils { use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; - use crate::models::HorizontallyScrollableText; use chrono::DateTime; - use serde_json::{json, Number}; + use serde_json::{Number, json}; #[macro_export] macro_rules! test_edit_movie_key { diff --git a/src/handlers/radarr_handlers/radarr_handler_tests.rs b/src/handlers/radarr_handlers/radarr_handler_tests.rs index 9003ded..0de439a 100644 --- a/src/handlers/radarr_handlers/radarr_handler_tests.rs +++ b/src/handlers/radarr_handlers/radarr_handler_tests.rs @@ -4,10 +4,10 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::handlers::radarr_handlers::{handle_change_tab_left_right_keys, RadarrHandler}; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::{RadarrHandler, handle_change_tab_left_right_keys}; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::test_handler_delegation; diff --git a/src/handlers/radarr_handlers/root_folders/mod.rs b/src/handlers/radarr_handlers/root_folders/mod.rs index 88c028b..8ceb0aa 100644 --- a/src/handlers/radarr_handlers/root_folders/mod.rs +++ b/src/handlers/radarr_handlers/root_folders/mod.rs @@ -2,10 +2,10 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; -use crate::models::HorizontallyScrollableText; use crate::network::radarr_network::RadarrEvent; use crate::{ handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, diff --git a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs index 632550a..986577a 100644 --- a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs @@ -4,15 +4,15 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::root_folder; use crate::handlers::radarr_handlers::root_folders::RootFoldersHandler; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; - use crate::models::HorizontallyScrollableText; mod test_handle_home_end { use pretty_assertions::assert_eq; diff --git a/src/handlers/radarr_handlers/system/mod.rs b/src/handlers/radarr_handlers/system/mod.rs index 0a194b5..f225624 100644 --- a/src/handlers/radarr_handlers/system/mod.rs +++ b/src/handlers/radarr_handlers/system/mod.rs @@ -2,10 +2,10 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; -use crate::handlers::{handle_clear_errors, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors}; use crate::matches_key; -use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::Scrollable; +use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; mod system_details_handler; diff --git a/src/handlers/radarr_handlers/system/system_details_handler.rs b/src/handlers/radarr_handlers/system/system_details_handler.rs index 354fd08..77b5082 100644 --- a/src/handlers/radarr_handlers/system/system_details_handler.rs +++ b/src/handlers/radarr_handlers/system/system_details_handler.rs @@ -1,11 +1,11 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::matches_key; +use crate::models::Scrollable; use crate::models::radarr_models::RadarrTaskName; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS}; use crate::models::stateful_list::StatefulList; -use crate::models::Scrollable; use crate::network::radarr_network::RadarrEvent; #[cfg(test)] diff --git a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs index bb9f098..273dde2 100644 --- a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs @@ -4,11 +4,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::models::radarr_models::{RadarrTask, RadarrTaskName}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, diff --git a/src/handlers/radarr_handlers/system/system_handler_tests.rs b/src/handlers/radarr_handlers/system/system_handler_tests.rs index e59148d..87b758c 100644 --- a/src/handlers/radarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_handler_tests.rs @@ -3,11 +3,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::radarr_handlers::system::SystemHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::system::SystemHandler; use crate::models::radarr_models::RadarrTask; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, diff --git a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs index 81d2c5b..15786b5 100644 --- a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs @@ -7,11 +7,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::sonarr_handlers::blocklist::{blocklist_sorting_options, BlocklistHandler}; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::BlocklistItem; diff --git a/src/handlers/sonarr_handlers/blocklist/mod.rs b/src/handlers/sonarr_handlers/blocklist/mod.rs index d891396..dff3205 100644 --- a/src/handlers/sonarr_handlers/blocklist/mod.rs +++ b/src/handlers/sonarr_handlers/blocklist/mod.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; use crate::models::sonarr_models::BlocklistItem; use crate::models::stateful_table::SortOption; diff --git a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs index 441a347..d7e2786 100644 --- a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::downloads::DownloadsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::download_record; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; use crate::models::sonarr_models::DownloadRecord; diff --git a/src/handlers/sonarr_handlers/downloads/mod.rs b/src/handlers/sonarr_handlers/downloads/mod.rs index d6adab0..5229e59 100644 --- a/src/handlers/sonarr_handlers/downloads/mod.rs +++ b/src/handlers/sonarr_handlers/downloads/mod.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; use crate::models::sonarr_models::DownloadRecord; use crate::network::sonarr_network::SonarrEvent; diff --git a/src/handlers/sonarr_handlers/history/history_handler_tests.rs b/src/handlers/sonarr_handlers/history/history_handler_tests.rs index 9b860cc..e4b761c 100644 --- a/src/handlers/sonarr_handlers/history/history_handler_tests.rs +++ b/src/handlers/sonarr_handlers/history/history_handler_tests.rs @@ -7,11 +7,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::sonarr_handlers::history::{history_sorting_options, HistoryHandler}; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::history::{HistoryHandler, history_sorting_options}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::{SonarrHistoryEventType, SonarrHistoryItem}; diff --git a/src/handlers/sonarr_handlers/history/mod.rs b/src/handlers/sonarr_handlers/history/mod.rs index cf422d0..e29a95f 100644 --- a/src/handlers/sonarr_handlers/history/mod.rs +++ b/src/handlers/sonarr_handlers/history/mod.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; use crate::models::servarr_models::Language; use crate::models::sonarr_models::SonarrHistoryItem; @@ -122,8 +122,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for HistoryHandler<'a, ' } } -pub(in crate::handlers::sonarr_handlers) fn history_sorting_options( -) -> Vec> { +pub(in crate::handlers::sonarr_handlers) fn history_sorting_options() +-> Vec> { vec![ SortOption { name: "Source Title", diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs index 68cd44c..551ef61 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs @@ -1,6 +1,6 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs index 87468d0..406acde 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; @@ -18,9 +18,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -419,11 +419,11 @@ mod tests { use std::sync::atomic::Ordering; use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -852,7 +852,7 @@ mod tests { use crate::app::App; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ - servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; use crate::network::sonarr_network::SonarrEvent; @@ -1053,14 +1053,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1074,14 +1076,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); } #[test] @@ -1106,14 +1110,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1127,14 +1133,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); } #[test] @@ -1159,14 +1167,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1180,14 +1190,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); } #[test] @@ -1211,15 +1223,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .name - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .name + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() @@ -1247,15 +1261,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .url - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .url + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() @@ -1283,15 +1299,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .api_key - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .api_key + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() @@ -1319,15 +1337,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .seed_ratio - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .seed_ratio + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() @@ -1355,15 +1375,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .tags + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() @@ -1433,9 +1455,9 @@ mod tests { mod test_handle_key_char { use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs index 039f35f..4b31164 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs @@ -1,6 +1,6 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, }; diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index f49a86a..631b329 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer_settings; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, }; @@ -19,9 +19,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; use crate::models::sonarr_models::IndexerSettings; - use crate::models::BlockSelectionState; use super::*; @@ -238,8 +238,8 @@ mod tests { use crate::{ models::{ - servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, - sonarr_models::IndexerSettings, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, + sonarr_models::IndexerSettings, }, network::sonarr_network::SonarrEvent, }; @@ -471,7 +471,7 @@ mod tests { mod test_handle_key_char { use crate::{ models::{ - servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs index 5d218b3..a7a7a08 100644 --- a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs @@ -4,14 +4,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::IndexersHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, + ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; use crate::test_handler_delegation; @@ -131,7 +131,7 @@ mod tests { mod test_handle_submit { use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ - SonarrData, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, SonarrData, }; use crate::models::servarr_models::{Indexer, IndexerField}; use bimap::BiMap; diff --git a/src/handlers/sonarr_handlers/indexers/mod.rs b/src/handlers/sonarr_handlers/indexers/mod.rs index 2dae7d9..dbb7713 100644 --- a/src/handlers/sonarr_handlers/indexers/mod.rs +++ b/src/handlers/sonarr_handlers/indexers/mod.rs @@ -5,13 +5,13 @@ use crate::handlers::sonarr_handlers::indexers::edit_indexer_handler::EditIndexe use crate::handlers::sonarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, - INDEXERS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, + INDEXER_SETTINGS_SELECTION_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; -use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use crate::{handle_table_events, matches_key}; diff --git a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs index de4bad1..1047772 100644 --- a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs +++ b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs @@ -1,8 +1,8 @@ use crate::app::App; use crate::event::Key; use crate::handle_table_events; -use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::KeyEventHandler; +use crate::handlers::table_handler::TableHandlingConfig; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; diff --git a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs index 0764f16..c1cd446 100644 --- a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -1,9 +1,9 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::stateful_table::StatefulTable; diff --git a/src/handlers/sonarr_handlers/library/add_series_handler.rs b/src/handlers/sonarr_handlers/library/add_series_handler.rs index 304d3a6..233126b 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler.rs @@ -1,15 +1,15 @@ use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, + ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, ActiveSonarrBlock, }; use crate::models::sonarr_models::{AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult}; use crate::models::stateful_table::StatefulTable; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::sonarr_network::SonarrEvent; use crate::{ - handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, App, Key, + App, Key, handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, }; #[cfg(test)] diff --git a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs index db9740b..2e8a3a0 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs @@ -5,29 +5,29 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::add_series_handler::AddSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::add_series_search_result; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS}; + use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock}; use crate::models::servarr_models::RootFolder; use crate::models::sonarr_models::{ AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult, SeriesMonitor, SeriesType, }; use crate::models::stateful_table::StatefulTable; - use crate::models::HorizontallyScrollableText; 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::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::simple_stateful_iterable_vec; use super::*; @@ -898,11 +898,11 @@ mod tests { use pretty_assertions::{assert_eq, assert_str_eq}; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; use crate::models::sonarr_models::Series; use crate::models::stateful_table::StatefulTable; - use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use super::*; @@ -981,33 +981,39 @@ mod tests { ActiveSonarrBlock::AddSeriesSelectRootFolder ); assert!(app.data.sonarr_data.add_series_modal.is_some()); - assert!(!app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty()); - assert!(!app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .series_type_list - .items - .is_empty()); - assert!(!app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty()); + assert!( + !app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty() + ); + assert!( + !app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .series_type_list + .items + .is_empty() + ); + assert!( + !app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty() + ); assert_str_eq!( app .data @@ -1501,8 +1507,8 @@ mod tests { use super::*; use crate::{ models::{ - servarr_data::sonarr::{modals::AddSeriesModal, sonarr_data::ADD_SERIES_SELECTION_BLOCKS}, BlockSelectionState, + servarr_data::sonarr::{modals::AddSeriesModal, sonarr_data::ADD_SERIES_SELECTION_BLOCKS}, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/delete_series_handler.rs b/src/handlers/sonarr_handlers/library/delete_series_handler.rs index c98d262..869a855 100644 --- a/src/handlers/sonarr_handlers/library/delete_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/delete_series_handler.rs @@ -3,7 +3,7 @@ use crate::network::sonarr_network::SonarrEvent; use crate::{ app::App, event::Key, - handlers::{handle_prompt_toggle, KeyEventHandler}, + handlers::{KeyEventHandler, handle_prompt_toggle}, matches_key, models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}, }; diff --git a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs index 4c85ec7..665e285 100644 --- a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::delete_series_handler::DeleteSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; use crate::models::sonarr_models::DeleteSeriesParams; @@ -17,8 +17,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use super::*; @@ -86,8 +86,8 @@ mod tests { mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use crate::network::sonarr_network::SonarrEvent; use super::*; @@ -261,7 +261,7 @@ mod tests { mod test_handle_key_char { use crate::{ models::{ - servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/edit_series_handler.rs b/src/handlers/sonarr_handlers/library/edit_series_handler.rs index fa72b4d..c780e6a 100644 --- a/src/handlers/sonarr_handlers/library/edit_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/edit_series_handler.rs @@ -1,10 +1,10 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::models::Scrollable; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS}; use crate::models::sonarr_models::EditSeriesParams; -use crate::models::Scrollable; use crate::network::sonarr_network::SonarrEvent; use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; diff --git a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs index 7bb05a1..211c2d2 100644 --- a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs @@ -5,12 +5,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::edit_series_handler::EditSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS}; use crate::models::sonarr_models::{EditSeriesParams, Series, SeriesType}; @@ -20,9 +20,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_SERIES_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -696,15 +696,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_series_modal - .as_ref() - .unwrap() - .path - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_series_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditSeriesPrompt.into() @@ -732,15 +734,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_series_modal - .as_mut() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_series_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty() + ); assert_eq!( app.get_current_route(), ActiveSonarrBlock::EditSeriesPrompt.into() @@ -1168,10 +1172,10 @@ mod tests { use super::*; use crate::{ models::{ + BlockSelectionState, servarr_data::sonarr::{ modals::EditSeriesModal, sonarr_data::EDIT_SERIES_SELECTION_BLOCKS, }, - BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler.rs b/src/handlers/sonarr_handlers/library/episode_details_handler.rs index 037c97a..e9b1ad8 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::library::season_details_handler::releases_sorting_options; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS}; use crate::models::sonarr_models::{SonarrHistoryItem, SonarrRelease, SonarrReleaseDownloadBody}; use crate::network::sonarr_network::SonarrEvent; diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs index c8bba29..6303820 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs @@ -1,10 +1,10 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::episode_details_handler::EpisodeDetailsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::episode; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::{ @@ -416,14 +416,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::SeasonDetails.into() ); - assert!(app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_none()); + assert!( + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .is_none() + ); } } diff --git a/src/handlers/sonarr_handlers/library/library_handler_tests.rs b/src/handlers/sonarr_handlers/library/library_handler_tests.rs index d09fd6a..38c4c0f 100644 --- a/src/handlers/sonarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/library_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use std::cmp::Ordering; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::sonarr_handlers::library::{series_sorting_options, LibraryHandler}; - use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::library::{LibraryHandler, series_sorting_options}; + use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, + ADD_SERIES_BLOCKS, ActiveSonarrBlock, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; use crate::models::sonarr_models::{Series, SeriesStatistics, SeriesStatus, SeriesType}; @@ -287,8 +287,8 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::SonarrData; + use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::sonarr_models::SeriesType; use crate::network::sonarr_network::SonarrEvent; diff --git a/src/handlers/sonarr_handlers/library/mod.rs b/src/handlers/sonarr_handlers/library/mod.rs index 5ab3a6f..1131c15 100644 --- a/src/handlers/sonarr_handlers/library/mod.rs +++ b/src/handlers/sonarr_handlers/library/mod.rs @@ -7,16 +7,16 @@ use crate::{ app::App, event::Key, handle_table_events, - handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}, + handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}, matches_key, models::{ + BlockSelectionState, HorizontallyScrollableText, servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, DELETE_SERIES_SELECTION_BLOCKS, EDIT_SERIES_SELECTION_BLOCKS, LIBRARY_BLOCKS, }, sonarr_models::Series, stateful_table::SortOption, - BlockSelectionState, HorizontallyScrollableText, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/season_details_handler.rs b/src/handlers/sonarr_handlers/library/season_details_handler.rs index 51708b2..8cff217 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler.rs @@ -2,7 +2,7 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::history::history_sorting_options; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SEASON_DETAILS_BLOCKS}; use crate::models::servarr_models::Language; use crate::models::sonarr_models::{ @@ -460,8 +460,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler } } -pub(in crate::handlers::sonarr_handlers::library) fn releases_sorting_options( -) -> Vec> { +pub(in crate::handlers::sonarr_handlers::library) fn releases_sorting_options() +-> Vec> { vec![ SortOption { name: "Source", diff --git a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs index da6c073..dd31c7f 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs @@ -1,12 +1,13 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::season_details_handler::{ - releases_sorting_options, SeasonDetailsHandler, + SeasonDetailsHandler, releases_sorting_options, }; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::episode; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::modals::SeasonDetailsModal; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::{ @@ -14,7 +15,6 @@ mod tests { }; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::{SonarrRelease, SonarrReleaseDownloadBody}; - use crate::models::HorizontallyScrollableText; use pretty_assertions::{assert_eq, assert_str_eq}; use rstest::rstest; use serde_json::Number; @@ -485,33 +485,39 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::SeasonHistory.into() ); - assert!(app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .filter - .is_none()); - assert!(app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .filtered_items - .is_none()); - assert!(app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .filtered_state - .is_none()); + assert!( + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .filter + .is_none() + ); + assert!( + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .filtered_items + .is_none() + ); + assert!( + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .filtered_state + .is_none() + ); } #[rstest] diff --git a/src/handlers/sonarr_handlers/library/series_details_handler.rs b/src/handlers/sonarr_handlers/library/series_details_handler.rs index a87a419..ed8ca49 100644 --- a/src/handlers/sonarr_handlers/library/series_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/series_details_handler.rs @@ -2,12 +2,12 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::history::history_sorting_options; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_SERIES_SELECTION_BLOCKS, SERIES_DETAILS_BLOCKS, }; use crate::models::sonarr_models::{Season, SonarrHistoryItem}; -use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use crate::{handle_table_events, matches_key}; diff --git a/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs index 9d1ccda..a6d7289 100644 --- a/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::series_details_handler::SeriesDetailsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::{season, series}; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SERIES_DETAILS_BLOCKS, }; @@ -304,37 +304,43 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::SeriesHistory.into() ); - assert!(app - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .filter - .is_none()); - assert!(app - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .filtered_items - .is_none()); - assert!(app - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .filtered_state - .is_none()); + assert!( + app + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .filter + .is_none() + ); + assert!( + app + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .filtered_items + .is_none() + ); + assert!( + app + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .filtered_state + .is_none() + ); } } mod test_handle_key_char { use super::*; - use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::SonarrData; + use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::sonarr_models::{Series, SeriesType}; use crate::network::sonarr_network::SonarrEvent; use crate::test_edit_series_key; diff --git a/src/handlers/sonarr_handlers/root_folders/mod.rs b/src/handlers/sonarr_handlers/root_folders/mod.rs index 3d27a59..e98af49 100644 --- a/src/handlers/sonarr_handlers/root_folders/mod.rs +++ b/src/handlers/sonarr_handlers/root_folders/mod.rs @@ -2,10 +2,10 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::table_handler::TableHandlingConfig; -use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; -use crate::models::HorizontallyScrollableText; use crate::network::sonarr_network::SonarrEvent; use crate::{ handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, diff --git a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs index aeb3c50..9991131 100644 --- a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs @@ -4,15 +4,15 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::root_folders::RootFoldersHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::root_folder; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; - use crate::models::HorizontallyScrollableText; mod test_handle_home_end { use crate::models::servarr_models::RootFolder; diff --git a/src/handlers/sonarr_handlers/sonarr_handler_test_utils.rs b/src/handlers/sonarr_handlers/sonarr_handler_test_utils.rs index e994020..ceca404 100644 --- a/src/handlers/sonarr_handlers/sonarr_handler_test_utils.rs +++ b/src/handlers/sonarr_handlers/sonarr_handler_test_utils.rs @@ -1,6 +1,7 @@ #[cfg(test)] #[macro_use] pub(in crate::handlers::sonarr_handlers) mod utils { + use crate::models::HorizontallyScrollableText; use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; @@ -9,9 +10,8 @@ pub(in crate::handlers::sonarr_handlers) mod utils { Episode, EpisodeFile, IndexerSettings, MediaInfo, Rating, Season, SeasonStatistics, Series, SeriesStatistics, SeriesStatus, SeriesType, }; - use crate::models::HorizontallyScrollableText; use chrono::DateTime; - use serde_json::{json, Number}; + use serde_json::{Number, json}; #[macro_export] macro_rules! test_edit_series_key { diff --git a/src/handlers/sonarr_handlers/sonarr_handler_tests.rs b/src/handlers/sonarr_handlers/sonarr_handler_tests.rs index 8dd160d..ede3fb9 100644 --- a/src/handlers/sonarr_handlers/sonarr_handler_tests.rs +++ b/src/handlers/sonarr_handlers/sonarr_handler_tests.rs @@ -1,10 +1,10 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; - use crate::handlers::sonarr_handlers::SonarrHandler; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::SonarrHandler; + use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::test_handler_delegation; use pretty_assertions::assert_eq; diff --git a/src/handlers/sonarr_handlers/system/mod.rs b/src/handlers/sonarr_handlers/system/mod.rs index f792f77..ad1bd7a 100644 --- a/src/handlers/sonarr_handlers/system/mod.rs +++ b/src/handlers/sonarr_handlers/system/mod.rs @@ -2,10 +2,10 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; -use crate::handlers::{handle_clear_errors, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_clear_errors}; use crate::matches_key; -use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::Scrollable; +use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; mod system_details_handler; diff --git a/src/handlers/sonarr_handlers/system/system_details_handler.rs b/src/handlers/sonarr_handlers/system/system_details_handler.rs index 7615581..9352088 100644 --- a/src/handlers/sonarr_handlers/system/system_details_handler.rs +++ b/src/handlers/sonarr_handlers/system/system_details_handler.rs @@ -1,11 +1,11 @@ use crate::app::App; use crate::event::Key; -use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; +use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::matches_key; +use crate::models::Scrollable; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS}; use crate::models::sonarr_models::SonarrTaskName; use crate::models::stateful_list::StatefulList; -use crate::models::Scrollable; use crate::network::sonarr_network::SonarrEvent; #[cfg(test)] diff --git a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs index 57118c1..15c0af0 100644 --- a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs @@ -4,11 +4,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; diff --git a/src/handlers/sonarr_handlers/system/system_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_handler_tests.rs index 2678086..a0dd688 100644 --- a/src/handlers/sonarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_handler_tests.rs @@ -3,11 +3,11 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handlers::sonarr_handlers::system::SystemHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::system::SystemHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; diff --git a/src/handlers/table_handler.rs b/src/handlers/table_handler.rs index fc7ae1a..e17fa25 100644 --- a/src/handlers/table_handler.rs +++ b/src/handlers/table_handler.rs @@ -1,5 +1,5 @@ -use crate::models::stateful_table::SortOption; use crate::models::Route; +use crate::models::stateful_table::SortOption; use derive_setters::Setters; use std::cmp::Ordering; use std::fmt::Debug; diff --git a/src/handlers/table_handler_tests.rs b/src/handlers/table_handler_tests.rs index 688bfcd..af61ec2 100644 --- a/src/handlers/table_handler_tests.rs +++ b/src/handlers/table_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; use crate::handle_table_events; - use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::KeyEventHandler; + use crate::handlers::table_handler::TableHandlingConfig; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_models::Language; @@ -839,8 +839,8 @@ mod tests { } mod test_handle_key_char { - use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::HorizontallyScrollableText; + use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use pretty_assertions::{assert_eq, assert_str_eq}; use super::*; diff --git a/src/main.rs b/src/main.rs index 45799a9..bf7c136 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,35 +1,35 @@ use anyhow::Result; -use clap::{crate_authors, crate_description, crate_name, crate_version, CommandFactory, Parser}; +use clap::{CommandFactory, Parser, crate_authors, crate_description, crate_name, crate_version}; use clap_complete::generate; use crossterm::execute; use crossterm::terminal::{ - disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen, + EnterAlternateScreen, LeaveAlternateScreen, disable_raw_mode, enable_raw_mode, }; use log::{debug, error, warn}; use network::NetworkTrait; -use ratatui::backend::CrosstermBackend; use ratatui::Terminal; +use ratatui::backend::CrosstermBackend; use reqwest::Client; use std::panic::PanicHookInfo; use std::path::PathBuf; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::{io, panic, process}; use tokio::select; use tokio::sync::mpsc::Receiver; -use tokio::sync::{mpsc, Mutex}; +use tokio::sync::{Mutex, mpsc}; use tokio_util::sync::CancellationToken; use utils::{ build_network_client, load_config, start_cli_no_spinner, start_cli_with_spinner, tail_logs, }; -use crate::app::{log_and_print_error, App}; +use crate::app::{App, log_and_print_error}; use crate::cli::Command; -use crate::event::input_event::{Events, InputEvent}; use crate::event::Key; +use crate::event::input_event::{Events, InputEvent}; use crate::network::{Network, NetworkEvent}; use crate::ui::theme::{Theme, ThemeDefinitionsWrapper}; -use crate::ui::{ui, THEME}; +use crate::ui::{THEME, ui}; use crate::utils::load_theme_config; mod app; @@ -203,7 +203,7 @@ async fn start_ui( themes_file_arg: &Option, theme_name: String, ) -> Result<()> { - let theme_definitions_wrapper = if let Some(ref theme_file) = themes_file_arg { + let theme_definitions_wrapper = if let Some(theme_file) = themes_file_arg { load_theme_config(theme_file.to_str().expect("Invalid theme file specified"))? } else { confy::load("managarr", "themes").unwrap_or_else(|_| ThemeDefinitionsWrapper::default()) diff --git a/src/models/mod.rs b/src/models/mod.rs index ce52d16..b0a2c33 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,12 +1,12 @@ use std::fmt::{Debug, Display, Formatter}; use std::sync::atomic::{AtomicUsize, Ordering}; -use crate::app::context_clues::ContextClue; use crate::app::ServarrConfig; +use crate::app::context_clues::ContextClue; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use radarr_models::RadarrSerdeable; use regex::Regex; -use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Deserialize, Deserializer, Serialize, Serializer, de}; use serde_json::Number; use servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use sonarr_models::SonarrSerdeable; diff --git a/src/models/model_tests.rs b/src/models/model_tests.rs index 5f3494d..d659d4a 100644 --- a/src/models/model_tests.rs +++ b/src/models/model_tests.rs @@ -3,20 +3,20 @@ mod tests { use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering; + use crate::app::ServarrConfig; use crate::app::context_clues::ContextClue; use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::app::ServarrConfig; use crate::models::from_f64; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::models::{from_i64, strip_non_search_characters}; use crate::models::{ BlockSelectionState, HorizontallyScrollableText, Scrollable, ScrollableText, TabRoute, TabState, }; + use crate::models::{from_i64, strip_non_search_characters}; use pretty_assertions::{assert_eq, assert_str_eq}; + use serde::de::IntoDeserializer; use serde::de::value::Error as ValueError; use serde::de::value::F64Deserializer; use serde::de::value::I64Deserializer; - use serde::de::IntoDeserializer; use serde_json::to_string; const BLOCKS: &[&[i32]] = &[&[11, 12], &[21, 22], &[31, 32]]; diff --git a/src/models/radarr_models.rs b/src/models/radarr_models.rs index e9b1d0e..70b9bdd 100644 --- a/src/models/radarr_models.rs +++ b/src/models/radarr_models.rs @@ -10,11 +10,11 @@ use serde::{Deserialize, Serialize}; use serde_json::{Number, Value}; use strum_macros::{Display, EnumIter}; +use super::Serdeable; use super::servarr_models::{ DiskSpace, HostConfig, Indexer, Language, LogResponse, QualityProfile, QualityWrapper, QueueEvent, RootFolder, SecurityConfig, Tag, Update, }; -use super::Serdeable; #[cfg(test)] #[path = "radarr_models_tests.rs"] diff --git a/src/models/radarr_models_tests.rs b/src/models/radarr_models_tests.rs index 2a611e8..0820f39 100644 --- a/src/models/radarr_models_tests.rs +++ b/src/models/radarr_models_tests.rs @@ -4,6 +4,7 @@ mod tests { use serde_json::json; use crate::models::{ + Serdeable, radarr_models::{ AddMovieSearchResult, BlocklistItem, BlocklistResponse, Collection, Credit, DiskSpace, DownloadRecord, DownloadsResponse, Indexer, IndexerSettings, IndexerTestResult, @@ -11,7 +12,6 @@ mod tests { RadarrSerdeable, RadarrTask, RadarrTaskName, SystemStatus, Tag, Update, }, servarr_models::{HostConfig, Log, LogResponse, QueueEvent, RootFolder, SecurityConfig}, - Serdeable, }; #[test] diff --git a/src/models/servarr_data/radarr/modals_tests.rs b/src/models/servarr_data/radarr/modals_tests.rs index 91b920b..dabac4d 100644 --- a/src/models/servarr_data/radarr/modals_tests.rs +++ b/src/models/servarr_data/radarr/modals_tests.rs @@ -4,8 +4,8 @@ mod test { use crate::models::servarr_data::radarr::modals::{ AddMovieModal, EditCollectionModal, EditIndexerModal, EditMovieModal, }; - use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::RadarrData; + use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_models::{Indexer, IndexerField, RootFolder}; use crate::models::stateful_table::StatefulTable; use bimap::BiMap; diff --git a/src/models/servarr_data/radarr/radarr_data_tests.rs b/src/models/servarr_data/radarr/radarr_data_tests.rs index cd2d67f..b56d232 100644 --- a/src/models/servarr_data/radarr/radarr_data_tests.rs +++ b/src/models/servarr_data/radarr/radarr_data_tests.rs @@ -13,9 +13,9 @@ mod tests { MOVIE_DETAILS_CONTEXT_CLUES, }; + use crate::models::Route; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; - use crate::models::Route; use crate::assert_movie_info_tabs_reset; use crate::models::BlockSelectionState; @@ -192,9 +192,11 @@ mod tests { radarr_data.movie_info_tabs.tabs[0].route, ActiveRadarrBlock::MovieDetails.into() ); - assert!(radarr_data.movie_info_tabs.tabs[0] - .contextual_help - .is_some()); + assert!( + radarr_data.movie_info_tabs.tabs[0] + .contextual_help + .is_some() + ); assert_eq!( radarr_data.movie_info_tabs.tabs[0].contextual_help.unwrap(), &MOVIE_DETAILS_CONTEXT_CLUES @@ -206,9 +208,11 @@ mod tests { radarr_data.movie_info_tabs.tabs[1].route, ActiveRadarrBlock::MovieHistory.into() ); - assert!(radarr_data.movie_info_tabs.tabs[1] - .contextual_help - .is_some()); + assert!( + radarr_data.movie_info_tabs.tabs[1] + .contextual_help + .is_some() + ); assert_eq!( radarr_data.movie_info_tabs.tabs[1].contextual_help.unwrap(), &MOVIE_DETAILS_CONTEXT_CLUES @@ -220,9 +224,11 @@ mod tests { radarr_data.movie_info_tabs.tabs[2].route, ActiveRadarrBlock::FileInfo.into() ); - assert!(radarr_data.movie_info_tabs.tabs[2] - .contextual_help - .is_some()); + assert!( + radarr_data.movie_info_tabs.tabs[2] + .contextual_help + .is_some() + ); assert_eq!( radarr_data.movie_info_tabs.tabs[2].contextual_help.unwrap(), &MOVIE_DETAILS_CONTEXT_CLUES @@ -234,9 +240,11 @@ mod tests { radarr_data.movie_info_tabs.tabs[3].route, ActiveRadarrBlock::Cast.into() ); - assert!(radarr_data.movie_info_tabs.tabs[3] - .contextual_help - .is_some()); + assert!( + radarr_data.movie_info_tabs.tabs[3] + .contextual_help + .is_some() + ); assert_eq!( radarr_data.movie_info_tabs.tabs[3].contextual_help.unwrap(), &MOVIE_DETAILS_CONTEXT_CLUES @@ -248,9 +256,11 @@ mod tests { radarr_data.movie_info_tabs.tabs[4].route, ActiveRadarrBlock::Crew.into() ); - assert!(radarr_data.movie_info_tabs.tabs[4] - .contextual_help - .is_some()); + assert!( + radarr_data.movie_info_tabs.tabs[4] + .contextual_help + .is_some() + ); assert_eq!( radarr_data.movie_info_tabs.tabs[4].contextual_help.unwrap(), &MOVIE_DETAILS_CONTEXT_CLUES @@ -262,9 +272,11 @@ mod tests { radarr_data.movie_info_tabs.tabs[5].route, ActiveRadarrBlock::ManualSearch.into() ); - assert!(radarr_data.movie_info_tabs.tabs[5] - .contextual_help - .is_some()); + assert!( + radarr_data.movie_info_tabs.tabs[5] + .contextual_help + .is_some() + ); assert_eq!( radarr_data.movie_info_tabs.tabs[5].contextual_help.unwrap(), &MANUAL_MOVIE_SEARCH_CONTEXT_CLUES @@ -277,12 +289,12 @@ mod tests { use pretty_assertions::assert_eq; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, BLOCKLIST_BLOCKS, - COLLECTIONS_BLOCKS, COLLECTION_DETAILS_BLOCKS, DELETE_MOVIE_BLOCKS, + ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, ActiveRadarrBlock, BLOCKLIST_BLOCKS, + COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, DELETE_MOVIE_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_COLLECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_MOVIE_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, - INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, + INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, INDEXERS_BLOCKS, LIBRARY_BLOCKS, MOVIE_DETAILS_BLOCKS, ROOT_FOLDERS_BLOCKS, SYSTEM_DETAILS_BLOCKS, }; @@ -359,8 +371,10 @@ mod tests { assert!( EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionRootFolderPathInput) ); - assert!(EDIT_COLLECTION_BLOCKS - .contains(&ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)); + assert!( + EDIT_COLLECTION_BLOCKS + .contains(&ActiveRadarrBlock::EditCollectionSelectMinimumAvailability) + ); assert!( EDIT_COLLECTION_BLOCKS.contains(&ActiveRadarrBlock::EditCollectionSelectQualityProfile) ); @@ -447,18 +461,26 @@ mod tests { INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsAvailabilityDelayInput) ); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsConfirmPrompt)); - assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsMaximumSizeInput)); + assert!( + INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsMaximumSizeInput) + ); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsMinimumAgeInput)); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsRetentionInput)); assert!( INDEXER_SETTINGS_BLOCKS.contains(&ActiveRadarrBlock::IndexerSettingsRssSyncIntervalInput) ); - assert!(INDEXER_SETTINGS_BLOCKS - .contains(&ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs)); - assert!(INDEXER_SETTINGS_BLOCKS - .contains(&ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags)); - assert!(INDEXER_SETTINGS_BLOCKS - .contains(&ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput)); + assert!( + INDEXER_SETTINGS_BLOCKS + .contains(&ActiveRadarrBlock::IndexerSettingsToggleAllowHardcodedSubs) + ); + assert!( + INDEXER_SETTINGS_BLOCKS + .contains(&ActiveRadarrBlock::IndexerSettingsTogglePreferIndexerFlags) + ); + assert!( + INDEXER_SETTINGS_BLOCKS + .contains(&ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput) + ); } #[test] diff --git a/src/models/servarr_data/servarr_data_tests.rs b/src/models/servarr_data/servarr_data_tests.rs index 5ee250e..d7bc539 100644 --- a/src/models/servarr_data/servarr_data_tests.rs +++ b/src/models/servarr_data/servarr_data_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod tests { - use crate::models::servarr_data::ActiveKeybindingBlock; use crate::models::Route; + use crate::models::servarr_data::ActiveKeybindingBlock; use pretty_assertions::assert_eq; #[test] diff --git a/src/models/servarr_data/sonarr/modals.rs b/src/models/servarr_data/sonarr/modals.rs index 0f6f043..c6e1e16 100644 --- a/src/models/servarr_data/sonarr/modals.rs +++ b/src/models/servarr_data/sonarr/modals.rs @@ -9,12 +9,12 @@ use crate::{ MANUAL_SEASON_SEARCH_CONTEXT_CLUES, SEASON_DETAILS_CONTEXT_CLUES, SEASON_HISTORY_CONTEXT_CLUES, }, models::{ + HorizontallyScrollableText, ScrollableText, TabRoute, TabState, servarr_data::modals::EditIndexerModal, servarr_models::{Indexer, RootFolder}, sonarr_models::{Episode, Series, SeriesMonitor, SeriesType, SonarrHistoryItem, SonarrRelease}, stateful_list::StatefulList, stateful_table::StatefulTable, - HorizontallyScrollableText, ScrollableText, TabRoute, TabState, }, }; diff --git a/src/models/servarr_data/sonarr/modals_tests.rs b/src/models/servarr_data/sonarr/modals_tests.rs index 5aa259a..0a867c8 100644 --- a/src/models/servarr_data/sonarr/modals_tests.rs +++ b/src/models/servarr_data/sonarr/modals_tests.rs @@ -255,9 +255,11 @@ mod tests { episode_details_modal.episode_details_tabs.tabs[0].route, ActiveSonarrBlock::EpisodeDetails.into() ); - assert!(episode_details_modal.episode_details_tabs.tabs[0] - .contextual_help - .is_some()); + assert!( + episode_details_modal.episode_details_tabs.tabs[0] + .contextual_help + .is_some() + ); assert_eq!( episode_details_modal.episode_details_tabs.tabs[0] .contextual_help @@ -277,9 +279,11 @@ mod tests { episode_details_modal.episode_details_tabs.tabs[1].route, ActiveSonarrBlock::EpisodeHistory.into() ); - assert!(episode_details_modal.episode_details_tabs.tabs[1] - .contextual_help - .is_some()); + assert!( + episode_details_modal.episode_details_tabs.tabs[1] + .contextual_help + .is_some() + ); assert_eq!( episode_details_modal.episode_details_tabs.tabs[1] .contextual_help @@ -299,9 +303,11 @@ mod tests { episode_details_modal.episode_details_tabs.tabs[2].route, ActiveSonarrBlock::EpisodeFile.into() ); - assert!(episode_details_modal.episode_details_tabs.tabs[2] - .contextual_help - .is_some()); + assert!( + episode_details_modal.episode_details_tabs.tabs[2] + .contextual_help + .is_some() + ); assert_eq!( episode_details_modal.episode_details_tabs.tabs[2] .contextual_help @@ -321,9 +327,11 @@ mod tests { episode_details_modal.episode_details_tabs.tabs[3].route, ActiveSonarrBlock::ManualEpisodeSearch.into() ); - assert!(episode_details_modal.episode_details_tabs.tabs[3] - .contextual_help - .is_some()); + assert!( + episode_details_modal.episode_details_tabs.tabs[3] + .contextual_help + .is_some() + ); assert_eq!( episode_details_modal.episode_details_tabs.tabs[3] .contextual_help @@ -356,9 +364,11 @@ mod tests { season_details_modal.season_details_tabs.tabs[0].route, ActiveSonarrBlock::SeasonDetails.into() ); - assert!(season_details_modal.season_details_tabs.tabs[0] - .contextual_help - .is_some()); + assert!( + season_details_modal.season_details_tabs.tabs[0] + .contextual_help + .is_some() + ); assert_eq!( season_details_modal.season_details_tabs.tabs[0] .contextual_help @@ -378,9 +388,11 @@ mod tests { season_details_modal.season_details_tabs.tabs[1].route, ActiveSonarrBlock::SeasonHistory.into() ); - assert!(season_details_modal.season_details_tabs.tabs[1] - .contextual_help - .is_some()); + assert!( + season_details_modal.season_details_tabs.tabs[1] + .contextual_help + .is_some() + ); assert_eq!( season_details_modal.season_details_tabs.tabs[1] .contextual_help @@ -400,9 +412,11 @@ mod tests { season_details_modal.season_details_tabs.tabs[2].route, ActiveSonarrBlock::ManualSeasonSearch.into() ); - assert!(season_details_modal.season_details_tabs.tabs[2] - .contextual_help - .is_some()); + assert!( + season_details_modal.season_details_tabs.tabs[2] + .contextual_help + .is_some() + ); assert_eq!( season_details_modal.season_details_tabs.tabs[2] .contextual_help diff --git a/src/models/servarr_data/sonarr/sonarr_data.rs b/src/models/servarr_data/sonarr/sonarr_data.rs index 6caa97d..55d9456 100644 --- a/src/models/servarr_data/sonarr/sonarr_data.rs +++ b/src/models/servarr_data/sonarr/sonarr_data.rs @@ -14,6 +14,7 @@ use crate::{ }, }, models::{ + BlockSelectionState, HorizontallyScrollableText, Route, ScrollableText, TabRoute, TabState, servarr_data::modals::{EditIndexerModal, IndexerTestResultModalItem}, servarr_models::{DiskSpace, Indexer, QueueEvent, RootFolder}, sonarr_models::{ @@ -22,7 +23,6 @@ use crate::{ }, stateful_list::StatefulList, stateful_table::StatefulTable, - BlockSelectionState, HorizontallyScrollableText, Route, ScrollableText, TabRoute, TabState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/models/servarr_data/sonarr/sonarr_data_tests.rs b/src/models/servarr_data/sonarr/sonarr_data_tests.rs index 9b666dd..92b9275 100644 --- a/src/models/servarr_data/sonarr/sonarr_data_tests.rs +++ b/src/models/servarr_data/sonarr/sonarr_data_tests.rs @@ -18,8 +18,8 @@ mod tests { }, }, models::{ - servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData}, BlockSelectionState, Route, + servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData}, }, }; @@ -209,9 +209,11 @@ mod tests { sonarr_data.series_info_tabs.tabs[0].route, ActiveSonarrBlock::SeriesDetails.into() ); - assert!(sonarr_data.series_info_tabs.tabs[0] - .contextual_help - .is_some()); + assert!( + sonarr_data.series_info_tabs.tabs[0] + .contextual_help + .is_some() + ); assert_eq!( sonarr_data.series_info_tabs.tabs[0] .contextual_help @@ -225,9 +227,11 @@ mod tests { sonarr_data.series_info_tabs.tabs[1].route, ActiveSonarrBlock::SeriesHistory.into() ); - assert!(sonarr_data.series_info_tabs.tabs[1] - .contextual_help - .is_some()); + assert!( + sonarr_data.series_info_tabs.tabs[1] + .contextual_help + .is_some() + ); assert_eq!( sonarr_data.series_info_tabs.tabs[1] .contextual_help @@ -240,11 +244,11 @@ mod tests { mod active_sonarr_block_tests { use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, BLOCKLIST_BLOCKS, + ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, ActiveSonarrBlock, BLOCKLIST_BLOCKS, DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS, - EDIT_SERIES_SELECTION_BLOCKS, EPISODE_DETAILS_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS, - INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, + EDIT_SERIES_SELECTION_BLOCKS, EPISODE_DETAILS_BLOCKS, HISTORY_BLOCKS, + INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, INDEXERS_BLOCKS, LIBRARY_BLOCKS, ROOT_FOLDERS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, SYSTEM_DETAILS_BLOCKS, }; @@ -394,7 +398,9 @@ mod tests { assert!(DELETE_SERIES_BLOCKS.contains(&ActiveSonarrBlock::DeleteSeriesPrompt)); assert!(DELETE_SERIES_BLOCKS.contains(&ActiveSonarrBlock::DeleteSeriesConfirmPrompt)); assert!(DELETE_SERIES_BLOCKS.contains(&ActiveSonarrBlock::DeleteSeriesToggleDeleteFile)); - assert!(DELETE_SERIES_BLOCKS.contains(&ActiveSonarrBlock::DeleteSeriesToggleAddListExclusion)); + assert!( + DELETE_SERIES_BLOCKS.contains(&ActiveSonarrBlock::DeleteSeriesToggleAddListExclusion) + ); } #[test] @@ -533,7 +539,9 @@ mod tests { assert_eq!(INDEXER_SETTINGS_BLOCKS.len(), 6); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::AllIndexerSettingsPrompt)); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsConfirmPrompt)); - assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsMaximumSizeInput)); + assert!( + INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsMaximumSizeInput) + ); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsMinimumAgeInput)); assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsRetentionInput)); assert!( @@ -652,8 +660,12 @@ mod tests { assert!(EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::EpisodeFile)); assert!(EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualEpisodeSearch)); assert!(EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualEpisodeSearchSortPrompt)); - assert!(EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt)); - assert!(EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::AutomaticallySearchEpisodePrompt)); + assert!( + EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt) + ); + assert!( + EPISODE_DETAILS_BLOCKS.contains(&ActiveSonarrBlock::AutomaticallySearchEpisodePrompt) + ); } } } diff --git a/src/models/servarr_data/sonarr/sonarr_test_utils.rs b/src/models/servarr_data/sonarr/sonarr_test_utils.rs index 2dd552a..7e3ea53 100644 --- a/src/models/servarr_data/sonarr/sonarr_test_utils.rs +++ b/src/models/servarr_data/sonarr/sonarr_test_utils.rs @@ -3,13 +3,13 @@ pub mod utils { use crate::models::servarr_models::{Indexer, RootFolder}; use crate::models::sonarr_models::{BlocklistItem, Series}; use crate::models::{ + HorizontallyScrollableText, ScrollableText, servarr_data::sonarr::{ modals::{EpisodeDetailsModal, SeasonDetailsModal}, sonarr_data::SonarrData, }, sonarr_models::{AddSeriesSearchResult, Episode, Season, SonarrHistoryItem, SonarrRelease}, stateful_table::StatefulTable, - HorizontallyScrollableText, ScrollableText, }; pub fn create_test_sonarr_data<'a>() -> SonarrData<'a> { diff --git a/src/models/sonarr_models.rs b/src/models/sonarr_models.rs index 1a9886e..1cf983f 100644 --- a/src/models/sonarr_models.rs +++ b/src/models/sonarr_models.rs @@ -11,11 +11,11 @@ use strum::EnumIter; use strum_macros::Display; use super::{ + HorizontallyScrollableText, Serdeable, servarr_models::{ DiskSpace, HostConfig, Indexer, Language, LogResponse, QualityProfile, QualityWrapper, QueueEvent, RootFolder, SecurityConfig, Tag, Update, }, - HorizontallyScrollableText, Serdeable, }; #[cfg(test)] diff --git a/src/models/sonarr_models_tests.rs b/src/models/sonarr_models_tests.rs index 632bacb..30c96fb 100644 --- a/src/models/sonarr_models_tests.rs +++ b/src/models/sonarr_models_tests.rs @@ -4,6 +4,7 @@ mod tests { use serde_json::json; use crate::models::{ + Serdeable, servarr_models::{ DiskSpace, HostConfig, Indexer, IndexerTestResult, Language, Log, LogResponse, QualityProfile, QueueEvent, RootFolder, SecurityConfig, Tag, Update, @@ -14,7 +15,6 @@ mod tests { SeriesStatus, SeriesType, SonarrHistoryEventType, SonarrHistoryItem, SonarrRelease, SonarrSerdeable, SonarrTask, SonarrTaskName, SystemStatus, }, - Serdeable, }; #[test] diff --git a/src/models/stateful_list_tests.rs b/src/models/stateful_list_tests.rs index 3101cfe..c709f97 100644 --- a/src/models/stateful_list_tests.rs +++ b/src/models/stateful_list_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod tests { - use crate::models::stateful_list::StatefulList; use crate::models::Scrollable; + use crate::models::stateful_list::StatefulList; use pretty_assertions::{assert_eq, assert_str_eq}; #[test] diff --git a/src/models/stateful_table.rs b/src/models/stateful_table.rs index cd2cc28..3db5c61 100644 --- a/src/models/stateful_table.rs +++ b/src/models/stateful_table.rs @@ -1,6 +1,6 @@ use crate::models::stateful_list::StatefulList; use crate::models::{ - strip_non_search_characters, HorizontallyScrollableText, Paginated, Scrollable, + HorizontallyScrollableText, Paginated, Scrollable, strip_non_search_characters, }; use ratatui::widgets::TableState; use std::cmp::Ordering; diff --git a/src/models/stateful_tree_tests.rs b/src/models/stateful_tree_tests.rs index dcedf07..4548017 100644 --- a/src/models/stateful_tree_tests.rs +++ b/src/models/stateful_tree_tests.rs @@ -2,8 +2,8 @@ mod tests { use std::hash::{DefaultHasher, Hash, Hasher}; - use crate::models::stateful_tree::StatefulTree; use crate::models::Scrollable; + use crate::models::stateful_tree::StatefulTree; use managarr_tree_widget::{Tree, TreeItem, TreeState}; use pretty_assertions::{assert_eq, assert_str_eq}; use ratatui::buffer::Buffer; diff --git a/src/network/mod.rs b/src/network/mod.rs index 8f28b1f..1e65cd79 100644 --- a/src/network/mod.rs +++ b/src/network/mod.rs @@ -1,13 +1,13 @@ use std::fmt::Debug; use std::sync::Arc; -use anyhow::{anyhow, Result}; +use anyhow::{Result, anyhow}; use async_trait::async_trait; use log::{debug, error, warn}; use regex::Regex; use reqwest::{Client, RequestBuilder}; -use serde::de::DeserializeOwned; use serde::Serialize; +use serde::de::DeserializeOwned; use sonarr_network::SonarrEvent; use strum_macros::Display; use tokio::select; diff --git a/src/network/network_tests.rs b/src/network/network_tests.rs index 6329fb1..745ef9d 100644 --- a/src/network/network_tests.rs +++ b/src/network/network_tests.rs @@ -6,54 +6,41 @@ mod tests { use mockito::{Mock, Server, ServerGuard}; use pretty_assertions::assert_str_eq; - use reqwest::header::HeaderMap; use reqwest::Client; + use reqwest::header::HeaderMap; use rstest::rstest; use serde::{Deserialize, Serialize}; - use tokio::sync::{mpsc, Mutex}; + use serde_json::json; + use tokio::sync::{Mutex, mpsc}; use tokio_util::sync::CancellationToken; + use super::test_utils; use crate::app::{App, AppConfig, ServarrConfig}; use crate::models::HorizontallyScrollableText; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::test_network; use crate::network::radarr_network::RadarrEvent; use crate::network::sonarr_network::SonarrEvent; - use crate::network::NetworkResource; use crate::network::{Network, NetworkEvent, NetworkTrait, RequestMethod, RequestProps}; #[tokio::test] async fn test_handle_network_event_radarr_event() { - let mut server = Server::new_async().await; - let radarr_server = server - .mock("GET", "/api/v3/health") - .with_status(200) - .with_body("{}") - .create_async() + use test_utils::{MockServarrApi, test_network}; + + let (mock, app, _server) = MockServarrApi::get() + .returns(json!({})) + .build_for(RadarrEvent::HealthCheck) .await; - let host = Some(server.host_with_port().split(':').collect::>()[0].to_owned()); - let port = Some( - server.host_with_port().split(':').collect::>()[1] - .parse() - .unwrap(), - ); - let mut app = App::test_default(); - app.is_loading = true; - let radarr_config = ServarrConfig { - host, - api_token: Some(String::new()), - port, - ssl_cert_path: None, - ..ServarrConfig::default() - }; - app.server_tabs.tabs[0].config = Some(radarr_config); - let app_arc = Arc::new(Mutex::new(app)); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + + app.lock().await.is_loading = true; + let mut network = test_network(&app); let _ = network .handle_network_event(RadarrEvent::HealthCheck.into()) .await; - radarr_server.assert_async().await; - assert!(!app_arc.lock().await.is_loading); + mock.assert_async().await; + assert!(!app.lock().await.is_loading); } #[rstest] @@ -70,7 +57,7 @@ mod tests { .create_async() .await; let app_arc = Arc::new(Mutex::new(App::test_default())); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let _ = network .handle_request::( @@ -97,7 +84,7 @@ mod tests { #[values(RequestMethod::Get, RequestMethod::Post)] request_method: RequestMethod, ) { let (async_server, app_arc, server) = mock_api(request_method, 200, true).await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let resp = network .handle_request::<(), Test>( @@ -130,7 +117,7 @@ mod tests { #[values(RequestMethod::Get, RequestMethod::Post)] request_method: RequestMethod, ) { let (async_server, app_arc, server) = mock_api(request_method, 400, true).await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let mut test_result = String::new(); let resp = network @@ -224,7 +211,7 @@ mod tests { .create_async() .await; let app_arc = Arc::new(Mutex::new(App::test_default())); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let resp = network .handle_request::<(), Test>( @@ -241,23 +228,27 @@ mod tests { .await; async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .error - .text - .starts_with("Failed to parse response!")); + assert!( + app_arc + .lock() + .await + .error + .text + .starts_with("Failed to parse response!") + ); assert!(resp.is_err()); - assert!(resp - .unwrap_err() - .to_string() - .starts_with("Failed to parse response!")); + assert!( + resp + .unwrap_err() + .to_string() + .starts_with("Failed to parse response!") + ); } #[tokio::test] async fn test_handle_request_failure_to_send_request() { let app_arc = Arc::new(Mutex::new(App::test_default())); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let resp = network .handle_request::<(), Test>( @@ -273,17 +264,21 @@ mod tests { ) .await; - assert!(app_arc - .lock() - .await - .error - .text - .starts_with("Failed to send request.")); + assert!( + app_arc + .lock() + .await + .error + .text + .starts_with("Failed to send request.") + ); assert!(resp.is_err()); - assert!(resp - .unwrap_err() - .to_string() - .starts_with("Failed to send request.")); + assert!( + resp + .unwrap_err() + .to_string() + .starts_with("Failed to send request.") + ); } #[rstest] @@ -298,7 +293,7 @@ mod tests { request_method: RequestMethod, ) { let (async_server, app_arc, server) = mock_api(request_method, 404, true).await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let resp = network .handle_request::<(), Test>( @@ -329,7 +324,7 @@ mod tests { #[tokio::test] async fn test_handle_request_non_success_code_empty_response_body() { let (async_server, app_arc, server) = mock_api(RequestMethod::Post, 404, false).await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); let resp = network .handle_request::<(), Test>( @@ -391,7 +386,7 @@ mod tests { async_server = async_server.create_async().await; let app_arc = Arc::new(Mutex::new(App::test_default())); - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); network .call_api(RequestProps { @@ -415,10 +410,10 @@ mod tests { #[rstest] async fn test_request_props_from_requires_radarr_config_to_be_present_for_all_network_events( #[values(RadarrEvent::HealthCheck, SonarrEvent::HealthCheck)] network_event: impl Into - + NetworkResource, + + NetworkResource, ) { let app_arc = Arc::new(Mutex::new(App::default())); - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); network .request_props_from(network_event, RequestMethod::Get, None::<()>, None, None) @@ -434,7 +429,7 @@ mod tests { #[case] default_port: u16, ) { let app_arc = Arc::new(Mutex::new(App::test_default())); - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let resource = network_event.resource(); { let mut app = app_arc.lock().await; @@ -460,7 +455,7 @@ mod tests { #[tokio::test] async fn test_request_props_from_custom_config( #[values(RadarrEvent::GetMovies, SonarrEvent::ListSeries)] network_event: impl Into - + NetworkResource, + + NetworkResource, ) { let api_token = "testToken1234".to_owned(); let app_arc = Arc::new(Mutex::new(App::test_default())); @@ -477,7 +472,7 @@ mod tests { app.server_tabs.tabs[0].config = Some(servarr_config.clone()); app.server_tabs.tabs[1].config = Some(servarr_config); } - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let request_props = network .request_props_from(network_event, RequestMethod::Get, None::<()>, None, None) @@ -497,7 +492,7 @@ mod tests { #[tokio::test] async fn test_request_props_from_custom_config_custom_headers( #[values(RadarrEvent::GetMovies, SonarrEvent::ListSeries)] network_event: impl Into - + NetworkResource, + + NetworkResource, ) { let api_token = "testToken1234".to_owned(); let app_arc = Arc::new(Mutex::new(App::test_default())); @@ -517,7 +512,7 @@ mod tests { app.server_tabs.tabs[0].config = Some(servarr_config.clone()); app.server_tabs.tabs[1].config = Some(servarr_config); } - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let request_props = network .request_props_from(network_event, RequestMethod::Get, None::<()>, None, None) @@ -537,7 +532,7 @@ mod tests { #[tokio::test] async fn test_request_props_from_custom_config_using_uri_instead_of_host_and_port( #[values(RadarrEvent::GetMovies, SonarrEvent::ListSeries)] network_event: impl Into - + NetworkResource, + + NetworkResource, ) { let api_token = "testToken1234".to_owned(); let app_arc = Arc::new(Mutex::new(App::test_default())); @@ -552,7 +547,7 @@ mod tests { app.server_tabs.tabs[0].config = Some(servarr_config.clone()); app.server_tabs.tabs[1].config = Some(servarr_config); } - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let request_props = network .request_props_from(network_event, RequestMethod::Get, None::<()>, None, None) @@ -577,7 +572,7 @@ mod tests { #[case] default_port: u16, ) { let app_arc = Arc::new(Mutex::new(App::test_default())); - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let resource = network_event.resource(); { let mut app = app_arc.lock().await; @@ -609,7 +604,7 @@ mod tests { #[tokio::test] async fn test_request_props_from_custom_config_with_path_and_query_params( #[values(RadarrEvent::GetMovies, SonarrEvent::ListSeries)] network_event: impl Into - + NetworkResource, + + NetworkResource, ) { let api_token = "testToken1234".to_owned(); let app_arc = Arc::new(Mutex::new(App::test_default())); @@ -626,7 +621,7 @@ mod tests { app.server_tabs.tabs[0].config = Some(servarr_config.clone()); app.server_tabs.tabs[1].config = Some(servarr_config); } - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let request_props = network .request_props_from( @@ -652,7 +647,7 @@ mod tests { #[tokio::test] async fn test_request_props_from_custom_config_using_uri_instead_of_host_and_port_with_path_and_query_params( #[values(RadarrEvent::GetMovies, SonarrEvent::ListSeries)] network_event: impl Into - + NetworkResource, + + NetworkResource, ) { let api_token = "testToken1234".to_owned(); let app_arc = Arc::new(Mutex::new(App::test_default())); @@ -667,7 +662,7 @@ mod tests { app.server_tabs.tabs[0].config = Some(servarr_config.clone()); app.server_tabs.tabs[1].config = Some(servarr_config); } - let network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let network = test_network(&app_arc); let request_props = network .request_props_from( @@ -725,72 +720,161 @@ pub(in crate::network) mod test_utils { use std::sync::Arc; use mockito::{Matcher, Mock, Server, ServerGuard}; + use reqwest::Client; use serde_json::Value; use tokio::sync::Mutex; + use tokio_util::sync::CancellationToken; use crate::{ app::{App, ServarrConfig}, - network::{NetworkEvent, NetworkResource, RequestMethod}, + network::{Network, NetworkEvent, NetworkResource, RequestMethod}, }; - pub async fn mock_servarr_api<'a>( + /// Creates a test HTTP client + pub fn test_client() -> Client { + Client::new() + } + + /// Creates a test cancellation token + pub fn test_cancellation_token() -> CancellationToken { + CancellationToken::new() + } + + /// Creates a test network instance + pub fn test_network<'a, 'b>(app: &'a Arc>>) -> Network<'a, 'b> { + Network::new(app, test_cancellation_token(), test_client()) + } + + pub struct MockServarrApi { method: RequestMethod, request_body: Option, response_body: Option, - response_status: Option, - network_event: impl Into + NetworkResource, - path: Option<&str>, - query_params: Option<&str>, - ) -> (Mock, Arc>>, ServerGuard) { - let status = response_status.unwrap_or(200); - let resource = network_event.resource(); - let mut server = Server::new_async().await; - let mut uri = format!("/api/v3{resource}"); + response_status: usize, + path: Option, + query_params: Option, + } - if let Some(path) = path { - uri = format!("{uri}{path}"); + impl MockServarrApi { + /// Create a GET request builder + pub fn get() -> Self { + Self::new(RequestMethod::Get) } - if let Some(params) = query_params { - uri = format!("{uri}?{params}"); + /// Create a POST request builder + pub fn post() -> Self { + Self::new(RequestMethod::Post) } - let mut async_server = server - .mock(&method.to_string().to_uppercase(), uri.as_str()) - .match_header("X-Api-Key", "test1234") - .with_status(status); - - if let Some(body) = request_body { - async_server = async_server.match_body(Matcher::Json(body)); + /// Create a PUT request builder + #[allow(dead_code)] + pub fn put() -> Self { + Self::new(RequestMethod::Put) } - if let Some(body) = response_body { - async_server = async_server.with_body(body.to_string()); + /// Create a DELETE request builder + pub fn delete() -> Self { + Self::new(RequestMethod::Delete) } - async_server = async_server.create_async().await; - - let host = Some(server.host_with_port().split(':').collect::>()[0].to_owned()); - let port = Some( - server.host_with_port().split(':').collect::>()[1] - .parse() - .unwrap(), - ); - let mut app = App::test_default(); - let servarr_config = ServarrConfig { - host, - port, - api_token: Some("test1234".to_owned()), - ..ServarrConfig::default() - }; - - match network_event.into() { - NetworkEvent::Radarr(_) => app.server_tabs.tabs[0].config = Some(servarr_config), - NetworkEvent::Sonarr(_) => app.server_tabs.tabs[1].config = Some(servarr_config), + /// Create a builder with a specific request method + pub fn new(method: RequestMethod) -> Self { + Self { + method, + request_body: None, + response_body: None, + response_status: 200, + path: None, + query_params: None, + } } - let app_arc = Arc::new(Mutex::new(app)); + /// Set the expected request body + pub fn with_request_body(mut self, body: Value) -> Self { + self.request_body = Some(body); + self + } - (async_server, app_arc, server) + /// Set the response body to return + pub fn returns(mut self, body: Value) -> Self { + self.response_body = Some(body); + self + } + + /// Set the HTTP status code + pub fn status(mut self, status: usize) -> Self { + self.response_status = status; + self + } + + /// Add a path suffix to the resource URL + pub fn path(mut self, path: impl Into) -> Self { + self.path = Some(path.into()); + self + } + + /// Add query parameters + pub fn query(mut self, params: impl Into) -> Self { + self.query_params = Some(params.into()); + self + } + + /// Build the mock for a specific network event + pub async fn build_for( + self, + network_event: E, + ) -> (Mock, Arc>>, ServerGuard) + where + E: Into + NetworkResource, + { + let resource = network_event.resource(); + let mut server = Server::new_async().await; + let mut uri = format!("/api/v3{resource}"); + + if let Some(path) = &self.path { + uri = format!("{uri}{path}"); + } + + if let Some(params) = &self.query_params { + uri = format!("{uri}?{params}"); + } + + let mut mock_builder = server + .mock(&self.method.to_string().to_uppercase(), uri.as_str()) + .match_header("X-Api-Key", "test1234") + .with_status(self.response_status); + + if let Some(body) = &self.request_body { + mock_builder = mock_builder.match_body(Matcher::Json(body.clone())); + } + + if let Some(body) = &self.response_body { + mock_builder = mock_builder.with_body(body.to_string()); + } + + let mock = mock_builder.create_async().await; + + let host = Some(server.host_with_port().split(':').collect::>()[0].to_owned()); + let port = Some( + server.host_with_port().split(':').collect::>()[1] + .parse() + .unwrap(), + ); + let mut app = App::test_default(); + let servarr_config = ServarrConfig { + host, + port, + api_token: Some("test1234".to_owned()), + ..ServarrConfig::default() + }; + + match network_event.into() { + NetworkEvent::Radarr(_) => app.server_tabs.tabs[0].config = Some(servarr_config), + NetworkEvent::Sonarr(_) => app.server_tabs.tabs[1].config = Some(servarr_config), + } + + let app_arc = Arc::new(Mutex::new(app)); + + (mock, app_arc, server) + } } } diff --git a/src/network/radarr_network/blocklist/mod.rs b/src/network/radarr_network/blocklist/mod.rs index 477b658..333b05a 100644 --- a/src/network/radarr_network/blocklist/mod.rs +++ b/src/network/radarr_network/blocklist/mod.rs @@ -1,11 +1,11 @@ +use crate::models::Route; use crate::models::radarr_models::BlocklistResponse; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; -use crate::models::Route; use crate::network::radarr_network::RadarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::info; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[cfg(test)] #[path = "radarr_blocklist_network_tests.rs"] diff --git a/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs b/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs index 86e8885..2ee20e4 100644 --- a/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs +++ b/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs @@ -5,16 +5,13 @@ mod tests { use crate::models::radarr_models::BlocklistResponse; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::stateful_table::SortOption; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::radarr_network::radarr_network_test_utils::test_utils::blocklist_item; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::radarr_network::RadarrEvent; use crate::network::radarr_network::RadarrSerdeable; - use crate::network::{Network, RequestMethod}; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::blocklist_item; use pretty_assertions::assert_eq; - use reqwest::Client; use rstest::rstest; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_clear_radarr_blocklist_event() { @@ -33,53 +30,45 @@ mod tests { }, ]; let expected_request_json = json!({ "ids": [1, 2, 3]}); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - Some(expected_request_json), - None, - None, - RadarrEvent::ClearBlocklist, - None, - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::delete() + .with_request_body(expected_request_json) + .build_for(RadarrEvent::ClearBlocklist) + .await; + app .lock() .await .data .radarr_data .blocklist .set_items(blocklist_items); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::ClearBlocklist) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::ClearBlocklist) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_delete_radarr_blocklist_item_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteBlocklistItem(1), - Some("/1"), - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(RadarrEvent::DeleteBlocklistItem(1)) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::DeleteBlocklistItem(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::DeleteBlocklistItem(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[rstest] @@ -179,17 +168,11 @@ mod tests { ..blocklist_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(blocklist_json), - None, - RadarrEvent::GetBlocklist, - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.blocklist.sort_asc = true; + let (mock, app, _server) = MockServarrApi::get() + .returns(blocklist_json) + .build_for(RadarrEvent::GetBlocklist) + .await; + app.lock().await.data.radarr_data.blocklist.sort_asc = true; if use_custom_sorting { let cmp_fn = |a: &BlocklistItem, b: &BlocklistItem| { a.source_title @@ -202,7 +185,7 @@ mod tests { name: "Source Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data @@ -210,19 +193,19 @@ mod tests { .blocklist .sorting(vec![blocklist_sort_option]); } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); if let RadarrSerdeable::BlocklistResponse(blocklist) = network .handle_radarr_event(RadarrEvent::GetBlocklist) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.blocklist.items, + app.lock().await.data.radarr_data.blocklist.items, expected_blocklist ); - assert!(app_arc.lock().await.data.radarr_data.blocklist.sort_asc); + assert!(app.lock().await.data.radarr_data.blocklist.sort_asc); assert_eq!(blocklist, response); } } @@ -302,18 +285,12 @@ mod tests { }, }, }]}); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(blocklist_json), - None, - RadarrEvent::GetBlocklist, - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.blocklist.sort_asc = true; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(blocklist_json) + .build_for(RadarrEvent::GetBlocklist) + .await; + app.lock().await.data.radarr_data.blocklist.sort_asc = true; + app .lock() .await .push_navigation_stack(ActiveRadarrBlock::BlocklistSortPrompt.into()); @@ -326,29 +303,24 @@ mod tests { name: "Source Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data .radarr_data .blocklist .sorting(vec![blocklist_sort_option]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::GetBlocklist) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetBlocklist) + .await + .is_ok() + ); - async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .blocklist - .items - .is_empty()); - assert!(app_arc.lock().await.data.radarr_data.blocklist.sort_asc); + mock.assert_async().await; + assert!(app.lock().await.data.radarr_data.blocklist.items.is_empty()); + assert!(app.lock().await.data.radarr_data.blocklist.sort_asc); } } diff --git a/src/network/radarr_network/collections/mod.rs b/src/network/radarr_network/collections/mod.rs index 6003098..7c04146 100644 --- a/src/network/radarr_network/collections/mod.rs +++ b/src/network/radarr_network/collections/mod.rs @@ -1,12 +1,12 @@ +use crate::models::Route; use crate::models::radarr_models::{Collection, EditCollectionParams}; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_models::CommandBody; -use crate::models::Route; use crate::network::radarr_network::RadarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::{debug, info}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[cfg(test)] #[path = "radarr_collections_network_tests.rs"] diff --git a/src/network/radarr_network/collections/radarr_collections_network_tests.rs b/src/network/radarr_network/collections/radarr_collections_network_tests.rs index 9c9b95f..4439db7 100644 --- a/src/network/radarr_network/collections/radarr_collections_network_tests.rs +++ b/src/network/radarr_network/collections/radarr_collections_network_tests.rs @@ -5,16 +5,14 @@ mod tests { }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::stateful_table::SortOption; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::radarr_network::radarr_network_test_utils::test_utils::collection; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::radarr_network::RadarrEvent; - use crate::network::{Network, NetworkResource, RequestMethod}; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::collection; use mockito::Matcher; use pretty_assertions::assert_eq; - use reqwest::Client; use rstest::rstest; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_edit_collection_event() { @@ -64,17 +62,12 @@ mod tests { search_on_add: Some(false), }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(detailed_collection_body), - None, - RadarrEvent::GetCollections, - Some("/123"), - None, - ) - .await; - let async_edit_server = server + let (mock_details, app, mut server) = MockServarrApi::get() + .returns(detailed_collection_body) + .path("/123") + .build_for(RadarrEvent::GetCollections) + .await; + let mock_edit = server .mock( "PUT", format!( @@ -88,20 +81,22 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditCollection(edit_collection_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditCollection(edit_collection_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details.assert_async().await; + mock_edit.assert_async().await; } #[tokio::test] - async fn test_handle_edit_collection_event_defaults_to_previous_values_when_no_params_are_provided( - ) { + async fn test_handle_edit_collection_event_defaults_to_previous_values_when_no_params_are_provided() + { let detailed_collection_body = json!({ "id": 123, "title": "Test Collection", @@ -140,21 +135,16 @@ mod tests { *expected_body.get_mut("rootFolderPath").unwrap() = json!("/nfs/movies"); *expected_body.get_mut("searchOnAdd").unwrap() = json!(true); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(detailed_collection_body), - None, - RadarrEvent::GetCollections, - Some("/123"), - None, - ) - .await; + let (mock_details, app, mut server) = MockServarrApi::get() + .returns(detailed_collection_body) + .path("/123") + .build_for(RadarrEvent::GetCollections) + .await; let edit_collection_params = EditCollectionParams { collection_id: 123, ..EditCollectionParams::default() }; - let async_edit_server = server + let mock_edit = server .mock( "PUT", format!( @@ -172,15 +162,17 @@ mod tests { collection_id: 123, ..EditCollectionParams::default() }; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditCollection(edit_collection_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditCollection(edit_collection_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details.assert_async().await; + mock_edit.assert_async().await; } #[rstest] @@ -257,17 +249,11 @@ mod tests { ..collection() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(collections_json), - None, - RadarrEvent::GetCollections, - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.collections.sort_asc = true; + let (mock, app, _server) = MockServarrApi::get() + .returns(collections_json) + .build_for(RadarrEvent::GetCollections) + .await; + app.lock().await.data.radarr_data.collections.sort_asc = true; if use_custom_sorting { let cmp_fn = |a: &Collection, b: &Collection| { a.title @@ -281,7 +267,7 @@ mod tests { name: "Collection", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data @@ -289,19 +275,19 @@ mod tests { .collections .sorting(vec![collection_sort_option]); } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); if let RadarrSerdeable::Collections(collections) = network .handle_radarr_event(RadarrEvent::GetCollections) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.collections.items, + app.lock().await.data.radarr_data.collections.items, expected_collections ); - assert!(app_arc.lock().await.data.radarr_data.collections.sort_asc); + assert!(app.lock().await.data.radarr_data.collections.sort_asc); assert_eq!(collections, response); } } @@ -366,18 +352,12 @@ mod tests { } }], }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(collections_json), - None, - RadarrEvent::GetCollections, - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.collections.sort_asc = true; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(collections_json) + .build_for(RadarrEvent::GetCollections) + .await; + app.lock().await.data.radarr_data.collections.sort_asc = true; + app .lock() .await .push_navigation_stack(ActiveRadarrBlock::CollectionsSortPrompt.into()); @@ -391,53 +371,54 @@ mod tests { name: "Collection", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data .radarr_data .collections .sorting(vec![collection_sort_option]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::GetCollections) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetCollections) + .await + .is_ok() + ); - async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .collections - .items - .is_empty()); - assert!(app_arc.lock().await.data.radarr_data.collections.sort_asc); + mock.assert_async().await; + assert!( + app + .lock() + .await + .data + .radarr_data + .collections + .items + .is_empty() + ); + assert!(app.lock().await.data.radarr_data.collections.sort_asc); } #[tokio::test] async fn test_handle_update_collections_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "RefreshCollections" - })), - Some(json!({})), - None, - RadarrEvent::UpdateCollections, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(RadarrEvent::UpdateCollections) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::UpdateCollections) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::UpdateCollections) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } } diff --git a/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs b/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs index b5e5d18..b72c7bf 100644 --- a/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs +++ b/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs @@ -1,34 +1,27 @@ #[cfg(test)] mod tests { use crate::models::radarr_models::{DownloadsResponse, RadarrSerdeable}; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::radarr_network::radarr_network_test_utils::test_utils::downloads_response; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::radarr_network::RadarrEvent; - use crate::network::{Network, RequestMethod}; - use reqwest::Client; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::downloads_response; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_delete_radarr_download_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteDownload(1), - Some("/1"), - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(RadarrEvent::DeleteDownload(1)) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::DeleteDownload(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::DeleteDownload(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -48,26 +41,21 @@ mod tests { }); let response: DownloadsResponse = serde_json::from_value(downloads_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(downloads_response_json), - None, - RadarrEvent::GetDownloads(500), - None, - Some("pageSize=500"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(downloads_response_json) + .path("?pageSize=500") + .build_for(RadarrEvent::GetDownloads(500)) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::DownloadsResponse(downloads) = network .handle_radarr_event(RadarrEvent::GetDownloads(500)) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; pretty_assertions::assert_eq!( - app_arc.lock().await.data.radarr_data.downloads.items, + app.lock().await.data.radarr_data.downloads.items, downloads_response().records ); pretty_assertions::assert_eq!(downloads, response); @@ -76,25 +64,22 @@ mod tests { #[tokio::test] async fn test_handle_update_radarr_downloads_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "RefreshMonitoredDownloads" - })), - Some(json!({})), - None, - RadarrEvent::UpdateDownloads, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(RadarrEvent::UpdateDownloads) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::UpdateDownloads) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::UpdateDownloads) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } } diff --git a/src/network/radarr_network/indexers/mod.rs b/src/network/radarr_network/indexers/mod.rs index b06d5f5..e190ea7 100644 --- a/src/network/radarr_network/indexers/mod.rs +++ b/src/network/radarr_network/indexers/mod.rs @@ -6,7 +6,7 @@ use crate::network::radarr_network::RadarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::{debug, info}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[cfg(test)] #[path = "radarr_indexers_network_tests.rs"] diff --git a/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs b/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs index 675931b..b02e789 100644 --- a/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs +++ b/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs @@ -1,40 +1,34 @@ #[cfg(test)] mod tests { + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{IndexerSettings, RadarrSerdeable}; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_models::{EditIndexerParams, Indexer, IndexerTestResult}; - use crate::models::HorizontallyScrollableText; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::radarr_network::RadarrEvent; use crate::network::radarr_network::radarr_network_test_utils::test_utils::{ indexer, indexer_settings, }; - use crate::network::radarr_network::RadarrEvent; - use crate::network::{Network, NetworkResource, RequestMethod}; use bimap::BiMap; use mockito::Matcher; use pretty_assertions::assert_eq; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_delete_radarr_indexer_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteIndexer(1), - Some("/1"), - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(RadarrEvent::DeleteIndexer(1)) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::DeleteIndexer(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::DeleteIndexer(1)) + .await + .is_ok() + ); async_server.assert_async().await; } @@ -52,22 +46,18 @@ mod tests { "whitelistedHardcodedSubs": "", "id": 1 }); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Put, - Some(indexer_settings_json), - None, - None, - RadarrEvent::EditAllIndexerSettings(indexer_settings()), - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::put() + .with_request_body(indexer_settings_json) + .build_for(RadarrEvent::EditAllIndexerSettings(indexer_settings())) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditAllIndexerSettings(indexer_settings())) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditAllIndexerSettings(indexer_settings())) + .await + .is_ok() + ); async_server.assert_async().await; } @@ -133,16 +123,11 @@ mod tests { priority: Some(0), ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -157,22 +142,24 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.radarr_data.tags_map = + app.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_radarr_indexer_event_does_not_overwrite_tags_vec_if_tag_input_string_is_none( - ) { + async fn test_handle_edit_radarr_indexer_event_does_not_overwrite_tags_vec_if_tag_input_string_is_none() + { let indexer_details_json = json!({ "enableRss": true, "enableAutomaticSearch": true, @@ -232,16 +219,11 @@ mod tests { priority: Some(0), ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -256,22 +238,24 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.radarr_data.tags_map = + app.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_radarr_indexer_event_does_not_add_seed_ratio_when_seed_ratio_field_is_none_in_details( - ) { + async fn test_handle_edit_radarr_indexer_event_does_not_add_seed_ratio_when_seed_ratio_field_is_none_in_details() + { let indexer_details_json = json!({ "enableRss": true, "enableAutomaticSearch": true, @@ -323,16 +307,11 @@ mod tests { priority: Some(0), ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -347,22 +326,24 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.radarr_data.tags_map = + app.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_radarr_indexer_event_populates_the_seed_ratio_value_when_seed_ratio_field_is_present_in_details( - ) { + async fn test_handle_edit_radarr_indexer_event_populates_the_seed_ratio_value_when_seed_ratio_field_is_present_in_details() + { let indexer_details_json = json!({ "enableRss": true, "enableAutomaticSearch": true, @@ -421,16 +402,11 @@ mod tests { priority: Some(0), ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -445,14 +421,16 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.radarr_data.tags_map = + app.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -488,16 +466,11 @@ mod tests { ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json.clone()), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json.clone()) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -512,12 +485,14 @@ mod tests { .match_body(Matcher::Json(indexer_details_json)) .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -577,16 +552,11 @@ mod tests { ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -601,12 +571,14 @@ mod tests { .match_body(Matcher::Json(expected_edit_indexer_body)) .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -645,17 +617,11 @@ mod tests { "id": 1 }]); let response: Vec = serde_json::from_value(indexers_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexers_response_json), - None, - RadarrEvent::GetIndexers, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(indexers_response_json) + .build_for(RadarrEvent::GetIndexers) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::Indexers(indexers) = network .handle_radarr_event(RadarrEvent::GetIndexers) @@ -664,7 +630,7 @@ mod tests { { async_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.indexers.items, + app.lock().await.data.radarr_data.indexers.items, vec![indexer()] ); assert_eq!(indexers, response); @@ -686,17 +652,11 @@ mod tests { }); let response: IndexerSettings = serde_json::from_value(indexer_settings_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_settings_response_json), - None, - RadarrEvent::GetAllIndexerSettings, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(indexer_settings_response_json) + .build_for(RadarrEvent::GetAllIndexerSettings) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::IndexerSettings(settings) = network .handle_radarr_event(RadarrEvent::GetAllIndexerSettings) @@ -705,7 +665,7 @@ mod tests { { async_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.indexer_settings, + app.lock().await.data.radarr_data.indexer_settings, Some(indexer_settings()) ); assert_eq!(settings, response); @@ -725,27 +685,23 @@ mod tests { "whitelistedHardcodedSubs": "", "id": 1 }); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_settings_response_json), - None, - RadarrEvent::GetAllIndexerSettings, - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.indexer_settings = Some(IndexerSettings::default()); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(indexer_settings_response_json) + .build_for(RadarrEvent::GetAllIndexerSettings) + .await; + app.lock().await.data.radarr_data.indexer_settings = Some(IndexerSettings::default()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::GetAllIndexerSettings) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetAllIndexerSettings) + .await + .is_ok() + ); async_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.indexer_settings, + app.lock().await.data.radarr_data.indexer_settings, Some(IndexerSettings::default()) ); } @@ -781,16 +737,11 @@ mod tests { "errorMessage": "test failure", "severity": "error" }]); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json.clone()), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json.clone()) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_test_server = server .mock( "POST", @@ -802,7 +753,7 @@ mod tests { .with_body(response_json.to_string()) .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); if let RadarrSerdeable::Value(value) = network .handle_radarr_event(RadarrEvent::TestIndexer(1)) @@ -812,7 +763,7 @@ mod tests { async_details_server.assert_async().await; async_test_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.indexer_test_errors, + app.lock().await.data.radarr_data.indexer_test_errors, Some("\"test failure\"".to_owned()) ); assert_eq!(value, response_json) @@ -843,16 +794,11 @@ mod tests { "tags": [1], "id": 1 }); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json.clone()), - None, - RadarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json.clone()) + .path("/1") + .build_for(RadarrEvent::GetIndexers) + .await; let async_test_server = server .mock( "POST", @@ -864,7 +810,7 @@ mod tests { .with_body("{}") .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); if let RadarrSerdeable::Value(value) = network .handle_radarr_event(RadarrEvent::TestIndexer(1)) @@ -874,7 +820,7 @@ mod tests { async_details_server.assert_async().await; async_test_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.indexer_test_errors, + app.lock().await.data.radarr_data.indexer_test_errors, Some(String::new()) ); assert_eq!(value, json!({})); @@ -930,24 +876,19 @@ mod tests { ] }]); let response: Vec = serde_json::from_value(response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - None, - Some(response_json), - Some(400), - RadarrEvent::TestAllIndexers, - None, - None, - ) - .await; - app_arc + let (async_server, app, _server) = MockServarrApi::post() + .returns(response_json) + .status(400) + .build_for(RadarrEvent::TestAllIndexers) + .await; + app .lock() .await .data .radarr_data .indexers .set_items(indexers); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); if let RadarrSerdeable::IndexerTestResults(results) = network .handle_radarr_event(RadarrEvent::TestAllIndexers) @@ -955,15 +896,17 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .indexer_test_all_results - .is_some()); + assert!( + app + .lock() + .await + .data + .radarr_data + .indexer_test_all_results + .is_some() + ); assert_eq!( - app_arc + app .lock() .await .data diff --git a/src/network/radarr_network/library/mod.rs b/src/network/radarr_network/library/mod.rs index b71b338..f828069 100644 --- a/src/network/radarr_network/library/mod.rs +++ b/src/network/radarr_network/library/mod.rs @@ -13,7 +13,7 @@ use crate::utils::{convert_runtime, convert_to_gb}; use anyhow::Result; use indoc::formatdoc; use log::{debug, info, warn}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use urlencoding::encode; #[cfg(test)] @@ -53,7 +53,9 @@ impl Network<'_, '_> { delete_movie_files, add_list_exclusion, } = delete_movie_params; - info!("Deleting Radarr movie with ID: {id} with deleteFiles={delete_movie_files} and addImportExclusion={add_list_exclusion}"); + info!( + "Deleting Radarr movie with ID: {id} with deleteFiles={delete_movie_files} and addImportExclusion={add_list_exclusion}" + ); let request_props = self .request_props_from( diff --git a/src/network/radarr_network/library/radarr_library_network_tests.rs b/src/network/radarr_network/library/radarr_library_network_tests.rs index 3199972..e16e8c3 100644 --- a/src/network/radarr_network/library/radarr_library_network_tests.rs +++ b/src/network/radarr_network/library/radarr_library_network_tests.rs @@ -7,50 +7,44 @@ mod tests { use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::stateful_table::SortOption; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::radarr_network::RadarrEvent; + use crate::network::radarr_network::RadarrSerdeable; use crate::network::radarr_network::library::get_movie_status; use crate::network::radarr_network::radarr_network_test_utils::test_utils::MOVIE_JSON; use crate::network::radarr_network::radarr_network_test_utils::test_utils::{ add_movie_search_result, cast_credit, crew_credit, movie, movie_history_item, release, }; - use crate::network::radarr_network::RadarrEvent; - use crate::network::radarr_network::RadarrSerdeable; - use crate::network::{Network, NetworkResource, RequestMethod}; use bimap::BiMap; use indoc::formatdoc; use mockito::Matcher; use pretty_assertions::{assert_eq, assert_str_eq}; - use reqwest::Client; use rstest::rstest; - use serde_json::{json, Value}; + use serde_json::{Value, json}; use std::slice; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_add_movie_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "tmdbId": 1234, - "title": "Test", - "rootFolderPath": "/nfs2", - "minimumAvailability": "announced", - "monitored": true, - "qualityProfileId": 2222, - "tags": [1, 2], - "addOptions": { - "monitor": "movieOnly", - "searchForMovie": true - } - })), - Some(json!({})), - None, - RadarrEvent::AddMovie(AddMovieBody::default()), - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.tags_map = + let body = json!({ + "tmdbId": 1234, + "title": "Test", + "rootFolderPath": "/nfs2", + "minimumAvailability": "announced", + "monitored": true, + "qualityProfileId": 2222, + "tags": [1, 2], + "addOptions": { + "monitor": "movieOnly", + "searchForMovie": true + } + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(RadarrEvent::AddMovie(AddMovieBody::default())) + .await; + app.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); let add_movie_body = AddMovieBody { tmdb_id: 1234, @@ -67,41 +61,39 @@ mod tests { }, }; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::AddMovie(add_movie_body)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::AddMovie(add_movie_body)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_add_movie_event_does_not_overwrite_tags_field_if_tag_input_string_is_none() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "tmdbId": 1234, - "title": "Test", - "rootFolderPath": "/nfs2", - "minimumAvailability": "announced", - "monitored": true, - "qualityProfileId": 2222, - "tags": [1, 2], - "addOptions": { - "monitor": "movieOnly", - "searchForMovie": true - } - })), - Some(json!({})), - None, - RadarrEvent::AddMovie(AddMovieBody::default()), - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.tags_map = + let body = json!({ + "tmdbId": 1234, + "title": "Test", + "rootFolderPath": "/nfs2", + "minimumAvailability": "announced", + "monitored": true, + "qualityProfileId": 2222, + "tags": [1, 2], + "addOptions": { + "monitor": "movieOnly", + "searchForMovie": true + } + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(RadarrEvent::AddMovie(AddMovieBody::default())) + .await; + app.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); let add_movie_body = AddMovieBody { tmdb_id: 1234, @@ -117,14 +109,16 @@ mod tests { search_for_movie: true, }, }; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::AddMovie(add_movie_body)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::AddMovie(add_movie_body)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -134,22 +128,19 @@ mod tests { delete_movie_files: true, add_list_exclusion: true, }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteMovie(delete_movie_params.clone()), - Some("/1"), - Some("deleteFiles=true&addImportExclusion=true"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app_arc, _server) = MockServarrApi::delete() + .path("/1") + .query("deleteFiles=true&addImportExclusion=true") + .build_for(RadarrEvent::DeleteMovie(delete_movie_params.clone())) + .await; + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::DeleteMovie(delete_movie_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::DeleteMovie(delete_movie_params)) + .await + .is_ok() + ); async_server.assert_async().await; } @@ -161,28 +152,26 @@ mod tests { indexer_id: 2, movie_id: 1, }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "guid": "1234", - "indexerId": 2, - "movieId": 1 - })), - Some(json!({})), - None, - RadarrEvent::DownloadRelease(expected_body.clone()), - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let body = json!({ + "guid": "1234", + "indexerId": 2, + "movieId": 1 + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(RadarrEvent::DownloadRelease(expected_body.clone())) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::DownloadRelease(expected_body)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::DownloadRelease(expected_body)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -203,16 +192,11 @@ mod tests { ..EditMovieParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(MOVIE_JSON).unwrap()), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app_arc, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(MOVIE_JSON).unwrap()) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; let async_edit_server = server .mock( "PUT", @@ -229,12 +213,14 @@ mod tests { .await; app_arc.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -257,16 +243,11 @@ mod tests { tags: Some(vec![1, 2]), ..EditMovieParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(MOVIE_JSON).unwrap()), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app_arc, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(MOVIE_JSON).unwrap()) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; let async_edit_server = server .mock( "PUT", @@ -283,12 +264,14 @@ mod tests { .await; app_arc.lock().await.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -297,16 +280,11 @@ mod tests { #[tokio::test] async fn test_handle_edit_movie_event_defaults_to_previous_values() { let expected_body: Value = serde_json::from_str(MOVIE_JSON).unwrap(); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(MOVIE_JSON).unwrap()), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app_arc, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(MOVIE_JSON).unwrap()) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; let edit_movie_params = EditMovieParams { movie_id: 1, ..EditMovieParams::default() @@ -325,32 +303,29 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_movie_event_uses_provided_parameters_returns_empty_tags_vec_when_clear_tags_is_true( - ) { + async fn test_handle_edit_movie_event_uses_provided_parameters_returns_empty_tags_vec_when_clear_tags_is_true() + { let mut expected_body: Value = serde_json::from_str(MOVIE_JSON).unwrap(); *expected_body.get_mut("tags").unwrap() = json!([]); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(MOVIE_JSON).unwrap()), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app_arc, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(MOVIE_JSON).unwrap()) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; let edit_movie_params = EditMovieParams { movie_id: 1, clear_tags: true, @@ -370,12 +345,14 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::EditMovie(edit_movie_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -397,18 +374,13 @@ mod tests { } ]); let response: Vec = serde_json::from_value(credits_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(credits_json), - None, - RadarrEvent::GetMovieCredits(1), - None, - Some("movieId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(credits_json) + .query("movieId=1") + .build_for(RadarrEvent::GetMovieCredits(1)) + .await; app_arc.lock().await.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let RadarrSerdeable::Credits(credits) = network .handle_radarr_event(RadarrEvent::GetMovieCredits(1)) @@ -440,22 +412,19 @@ mod tests { "type": "crew", } ]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(credits_json), - None, - RadarrEvent::GetMovieCredits(1), - None, - Some("movieId=1"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(credits_json) + .query("movieId=1") + .build_for(RadarrEvent::GetMovieCredits(1)) + .await; + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::GetMovieCredits(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetMovieCredits(1)) + .await + .is_ok() + ); let app = app_arc.lock().await; let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap(); @@ -498,17 +467,11 @@ mod tests { ..movie() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([movie_1, movie_2])), - None, - RadarrEvent::GetMovies, - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.movies.sort_asc = true; + let (mock, app, _server) = MockServarrApi::get() + .returns(json!([movie_1, movie_2])) + .build_for(RadarrEvent::GetMovies) + .await; + app.lock().await.data.radarr_data.movies.sort_asc = true; if use_custom_sorting { let cmp_fn = |a: &Movie, b: &Movie| { a.title @@ -521,7 +484,7 @@ mod tests { name: "Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data @@ -529,21 +492,22 @@ mod tests { .movies .sorting(vec![title_sort_option]); } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - if let RadarrSerdeable::Movies(movies) = network - .handle_radarr_event(RadarrEvent::GetMovies) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.radarr_data.movies.items, - expected_sorted_movies - ); - assert!(app_arc.lock().await.data.radarr_data.movies.sort_asc); - assert_eq!(movies, expected_movies); - } + let result = network.handle_radarr_event(RadarrEvent::GetMovies).await; + + mock.assert_async().await; + + let RadarrSerdeable::Movies(movies) = result.unwrap() else { + panic!("Expected Movies variant") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.movies.items, + expected_sorted_movies + ); + assert!(app.lock().await.data.radarr_data.movies.sort_asc); + assert_eq!(movies, expected_movies); } #[tokio::test] @@ -554,21 +518,15 @@ mod tests { *movie_1.get_mut("title").unwrap() = json!("z test"); *movie_2.get_mut("id").unwrap() = json!(2); *movie_2.get_mut("title").unwrap() = json!("A test"); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([movie_1, movie_2])), - None, - RadarrEvent::GetMovies, - None, - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(json!([movie_1, movie_2])) + .build_for(RadarrEvent::GetMovies) + .await; + app .lock() .await .push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); - app_arc.lock().await.data.radarr_data.movies.sort_asc = true; + app.lock().await.data.radarr_data.movies.sort_asc = true; let cmp_fn = |a: &Movie, b: &Movie| { a.title .text @@ -579,48 +537,38 @@ mod tests { name: "Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data .radarr_data .movies .sorting(vec![title_sort_option]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::GetMovies) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetMovies) + .await + .is_ok() + ); - async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .movies - .items - .is_empty()); - assert!(app_arc.lock().await.data.radarr_data.movies.sort_asc); + mock.assert_async().await; + assert!(app.lock().await.data.radarr_data.movies.items.is_empty()); + assert!(app.lock().await.data.radarr_data.movies.sort_asc); } #[tokio::test] async fn test_handle_get_movie_details_event() { let response: Movie = serde_json::from_str(MOVIE_JSON).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(MOVIE_JSON).unwrap()), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(serde_json::from_str(MOVIE_JSON).unwrap()) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; app_arc.lock().await.data.radarr_data.quality_profile_map = BiMap::from_iter([(2222, "HD - 1080p".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let RadarrSerdeable::Movie(movie) = network .handle_radarr_event(RadarrEvent::GetMovieDetails(1)) @@ -628,13 +576,15 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .movie_details_modal - .is_some()); + assert!( + app_arc + .lock() + .await + .data + .radarr_data + .movie_details_modal + .is_some() + ); assert_eq!(movie, response); let app = app_arc.lock().await; @@ -718,33 +668,32 @@ mod tests { "minimumAvailability": "released", "ratings": {} }); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(movie_json_with_missing_fields), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(movie_json_with_missing_fields) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; app_arc.lock().await.data.radarr_data.quality_profile_map = BiMap::from_iter([(2222, "HD - 1080p".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::GetMovieDetails(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetMovieDetails(1)) + .await + .is_ok() + ); async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .movie_details_modal - .is_some()); + assert!( + app_arc + .lock() + .await + .data + .radarr_data + .movie_details_modal + .is_some() + ); let app = app_arc.lock().await; let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap(); @@ -784,18 +733,13 @@ mod tests { }]); let response: Vec = serde_json::from_value(movie_history_item_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(movie_history_item_json), - None, - RadarrEvent::GetMovieHistory(1), - None, - Some("movieId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(movie_history_item_json) + .query("movieId=1") + .build_for(RadarrEvent::GetMovieHistory(1)) + .await; app_arc.lock().await.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let RadarrSerdeable::MovieHistoryItems(history) = network .handle_radarr_event(RadarrEvent::GetMovieHistory(1)) @@ -829,22 +773,19 @@ mod tests { "date": "2022-12-30T07:37:56Z", "eventType": "grabbed" }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(movie_history_item_json), - None, - RadarrEvent::GetMovieHistory(1), - None, - Some("movieId=1"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(movie_history_item_json) + .query("movieId=1") + .build_for(RadarrEvent::GetMovieHistory(1)) + .await; + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::GetMovieHistory(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetMovieHistory(1)) + .await + .is_ok() + ); async_server.assert_async().await; assert_eq!( @@ -879,18 +820,13 @@ mod tests { "languages": [ { "id": 1, "name": "English" } ], "quality": { "quality": { "name": "HD - 1080p" }} }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - RadarrEvent::GetReleases(1), - None, - Some("movieId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(release_json) + .query("movieId=1") + .build_for(RadarrEvent::GetReleases(1)) + .await; app_arc.lock().await.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let RadarrSerdeable::Releases(releases_vec) = network .handle_radarr_event(RadarrEvent::GetReleases(1)) @@ -932,22 +868,19 @@ mod tests { "languages": [ { "id": 1, "name": "English" } ], "quality": { "quality": { "name": "HD - 1080p" }} }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - RadarrEvent::GetReleases(1), - None, - Some("movieId=1"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(release_json) + .query("movieId=1") + .build_for(RadarrEvent::GetReleases(1)) + .await; + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::GetReleases(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::GetReleases(1)) + .await + .is_ok() + ); async_server.assert_async().await; assert_eq!( @@ -988,17 +921,12 @@ mod tests { } } }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(add_movie_search_result_json), - None, - RadarrEvent::SearchNewMovie("test term".into()), - None, - Some("term=test%20term"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(add_movie_search_result_json) + .query("term=test%20term") + .build_for(RadarrEvent::SearchNewMovie("test term".into())) + .await; + let mut network = test_network(&app_arc); if let RadarrSerdeable::AddMovieSearchResults(add_movie_search_results) = network .handle_radarr_event(RadarrEvent::SearchNewMovie("test term".into())) @@ -1006,13 +934,15 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .add_searched_movies - .is_some()); + assert!( + app_arc + .lock() + .await + .data + .radarr_data + .add_searched_movies + .is_some() + ); assert_eq!( app_arc .lock() @@ -1031,31 +961,30 @@ mod tests { #[tokio::test] async fn test_handle_search_new_movie_event_no_results() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([])), - None, - RadarrEvent::SearchNewMovie("test term".into()), - None, - Some("term=test%20term"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(json!([])) + .query("term=test%20term") + .build_for(RadarrEvent::SearchNewMovie("test term".into())) + .await; + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::SearchNewMovie("test term".into())) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::SearchNewMovie("test term".into())) + .await + .is_ok() + ); async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .radarr_data - .add_searched_movies - .is_none()); + assert!( + app_arc + .lock() + .await + .data + .radarr_data + .add_searched_movies + .is_none() + ); assert_eq!( app_arc.lock().await.get_current_route(), ActiveRadarrBlock::AddMovieEmptySearchResults.into() @@ -1067,16 +996,11 @@ mod tests { let mut expected_body: Value = serde_json::from_str(MOVIE_JSON).unwrap(); *expected_body.get_mut("monitored").unwrap() = json!(false); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(MOVIE_JSON).unwrap()), - None, - RadarrEvent::GetMovieDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app_arc, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(MOVIE_JSON).unwrap()) + .path("/1") + .build_for(RadarrEvent::GetMovieDetails(1)) + .await; let async_toggle_server = server .mock( "PUT", @@ -1095,12 +1019,14 @@ mod tests { let mut app = app_arc.lock().await; app.data.radarr_data.movies.set_items(vec![movie()]); } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_radarr_event(RadarrEvent::ToggleMovieMonitoring(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::ToggleMovieMonitoring(1)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_toggle_server.assert_async().await; @@ -1108,77 +1034,71 @@ mod tests { #[tokio::test] async fn test_handle_trigger_automatic_movie_search_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "name": "MoviesSearch", - "movieIds": [ 1 ] - })), - Some(json!({})), - None, - RadarrEvent::TriggerAutomaticSearch(1), - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let body = json!({ + "name": "MoviesSearch", + "movieIds": [ 1 ] + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(RadarrEvent::TriggerAutomaticSearch(1)) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::TriggerAutomaticSearch(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::TriggerAutomaticSearch(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_update_all_movies_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "name": "RefreshMovie", - "movieIds": [] - })), - Some(json!({})), - None, - RadarrEvent::UpdateAllMovies, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let body = json!({ + "name": "RefreshMovie", + "movieIds": [] + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(RadarrEvent::UpdateAllMovies) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::UpdateAllMovies) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::UpdateAllMovies) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_update_and_scan_movie_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "name": "RefreshMovie", - "movieIds": [ 1 ] - })), - Some(json!({})), - None, - RadarrEvent::UpdateAndScan(1), - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let body = json!({ + "name": "RefreshMovie", + "movieIds": [ 1 ] + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(RadarrEvent::UpdateAndScan(1)) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::UpdateAndScan(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::UpdateAndScan(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[test] diff --git a/src/network/radarr_network/mod.rs b/src/network/radarr_network/mod.rs index 14e5511..892de58 100644 --- a/src/network/radarr_network/mod.rs +++ b/src/network/radarr_network/mod.rs @@ -2,7 +2,7 @@ use anyhow::Result; use std::fmt::Debug; use log::info; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use crate::models::radarr_models::{ AddMovieBody, DeleteMovieParams, EditCollectionParams, EditMovieParams, IndexerSettings, diff --git a/src/network/radarr_network/radarr_network_test_utils.rs b/src/network/radarr_network/radarr_network_test_utils.rs index 54fb205..30e66ae 100644 --- a/src/network/radarr_network/radarr_network_test_utils.rs +++ b/src/network/radarr_network/radarr_network_test_utils.rs @@ -1,5 +1,6 @@ #[cfg(test)] pub(in crate::network::radarr_network) mod test_utils { + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{ AddMovieSearchResult, BlocklistItem, BlocklistItemMovie, Collection, CollectionMovie, Credit, CreditType, DownloadRecord, DownloadsResponse, IndexerSettings, MediaInfo, MinimumAvailability, @@ -8,9 +9,8 @@ pub(in crate::network::radarr_network) mod test_utils { use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; - use crate::models::HorizontallyScrollableText; use chrono::DateTime; - use serde_json::{json, Number}; + use serde_json::{Number, Value, json}; pub const MOVIE_JSON: &str = r#"{ "id": 1, @@ -378,4 +378,18 @@ pub(in crate::network::radarr_network) mod test_utils { ..IndexerSettings::default() } } + + pub fn tag() -> Value { + json!({ + "id": 3, + "label": "testing" + }) + } + + pub fn quality_profile() -> Value { + json!({ + "id": 2222, + "name": "HD - 1080p" + }) + } } diff --git a/src/network/radarr_network/radarr_network_tests.rs b/src/network/radarr_network/radarr_network_tests.rs index a0cba2f..c5af96e 100644 --- a/src/network/radarr_network/radarr_network_tests.rs +++ b/src/network/radarr_network/radarr_network_tests.rs @@ -1,21 +1,22 @@ #[cfg(test)] mod test { use super::super::*; + use crate::App; use crate::models::radarr_models::{ EditCollectionParams, EditMovieParams, IndexerSettings, RadarrTaskName, }; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_models::EditIndexerParams; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::App; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::{ + quality_profile, tag, + }; use bimap::BiMap; use pretty_assertions::{assert_eq, assert_str_eq}; - use reqwest::Client; use rstest::rstest; use serde_json::json; use std::sync::Arc; use tokio::sync::Mutex; - use tokio_util::sync::CancellationToken; #[rstest] fn test_resource_movie( @@ -161,146 +162,129 @@ mod test { #[tokio::test] async fn test_handle_get_radarr_healthcheck_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - None, - None, - RadarrEvent::HealthCheck, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .build_for(RadarrEvent::HealthCheck) + .await; + + let mut network = test_network(&app); let _ = network.handle_radarr_event(RadarrEvent::HealthCheck).await; - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_get_radarr_quality_profiles_event() { - let quality_profile_json = json!([{ - "id": 2222, - "name": "HD - 1080p" - }]); - let response: Vec = - serde_json::from_value(quality_profile_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(quality_profile_json), - None, - RadarrEvent::GetQualityProfiles, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let expected: Vec = vec![QualityProfile { + id: 2222, + name: "HD - 1080p".to_owned(), + }]; - if let RadarrSerdeable::QualityProfiles(quality_profiles) = network + let (mock, app, _server) = MockServarrApi::get() + .returns(json!([quality_profile()])) + .build_for(RadarrEvent::GetQualityProfiles) + .await; + + let mut network = test_network(&app); + + let result = network .handle_radarr_event(RadarrEvent::GetQualityProfiles) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.radarr_data.quality_profile_map, - BiMap::from_iter([(2222i64, "HD - 1080p".to_owned())]) - ); - assert_eq!(quality_profiles, response); - } + .await; + + mock.assert_async().await; + + let RadarrSerdeable::QualityProfiles(quality_profiles) = result.unwrap() else { + panic!("Expected QualityProfiles variant"); + }; + assert_eq!(quality_profiles, expected); + assert_eq!( + app.lock().await.data.radarr_data.quality_profile_map, + BiMap::from_iter([(2222i64, "HD - 1080p".to_owned())]) + ); } #[tokio::test] async fn test_handle_get_radarr_tags_event() { - let tags_json = json!([{ - "id": 2222, - "label": "usenet" - }]); - let response: Vec = serde_json::from_value(tags_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(tags_json), - None, - RadarrEvent::GetTags, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let expected: Vec = vec![Tag { + id: 2222, + label: "usenet".to_owned(), + }]; - if let RadarrSerdeable::Tags(tags) = network - .handle_radarr_event(RadarrEvent::GetTags) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.radarr_data.tags_map, - BiMap::from_iter([(2222i64, "usenet".to_owned())]) - ); - assert_eq!(tags, response); - } + let (mock, app, _server) = MockServarrApi::get() + .returns(json!([{ + "id": 2222, + "label": "usenet" + }])) + .build_for(RadarrEvent::GetTags) + .await; + + let mut network = test_network(&app); + + let result = network.handle_radarr_event(RadarrEvent::GetTags).await; + + mock.assert_async().await; + + let RadarrSerdeable::Tags(tags) = result.unwrap() else { + panic!("Expected Tags variant"); + }; + assert_eq!(tags, expected); + assert_eq!( + app.lock().await.data.radarr_data.tags_map, + BiMap::from_iter([(2222i64, "usenet".to_owned())]) + ); } #[tokio::test] async fn test_handle_add_radarr_tag() { - let tag_json = json!({ "id": 3, "label": "testing" }); - let response: Tag = serde_json::from_value(tag_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ "label": "testing" })), - Some(tag_json), - None, - RadarrEvent::AddTag(String::new()), - None, - None, - ) - .await; - app_arc.lock().await.data.radarr_data.tags_map = - BiMap::from_iter([(1, "usenet".to_owned()), (2, "test".to_owned())]); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let expected = Tag { + id: 3, + label: "testing".to_owned(), + }; - if let RadarrSerdeable::Tag(tag) = network + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "label": "testing" })) + .returns(tag()) + .build_for(RadarrEvent::AddTag(String::new())) + .await; + + app.lock().await.data.radarr_data.tags_map = + BiMap::from_iter([(1, "usenet".to_owned()), (2, "test".to_owned())]); + + let mut network = test_network(&app); + + let result = network .handle_radarr_event(RadarrEvent::AddTag("testing".to_owned())) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.radarr_data.tags_map, - BiMap::from_iter([ - (1, "usenet".to_owned()), - (2, "test".to_owned()), - (3, "testing".to_owned()) - ]) - ); - assert_eq!(tag, response); - } + .await; + + mock.assert_async().await; + + let RadarrSerdeable::Tag(tag) = result.unwrap() else { + panic!("Expected Tag variant"); + }; + assert_eq!(tag, expected); + assert_eq!( + app.lock().await.data.radarr_data.tags_map, + BiMap::from_iter([ + (1, "usenet".to_owned()), + (2, "test".to_owned()), + (3, "testing".to_owned()) + ]) + ); } #[tokio::test] async fn test_handle_delete_radarr_tag_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteTag(1), - Some("/1"), - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(RadarrEvent::DeleteTag(1)) + .await; - assert!(network - .handle_radarr_event(RadarrEvent::DeleteTag(1)) - .await - .is_ok()); + let mut network = test_network(&app); - async_server.assert_async().await; + let result = network.handle_radarr_event(RadarrEvent::DeleteTag(1)).await; + + mock.assert_async().await; + assert!(result.is_ok()); } #[tokio::test] @@ -315,7 +299,7 @@ mod test { (3, "hi".to_owned()), ]); } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); assert_eq!( network.extract_and_add_radarr_tag_ids_vec(tags).await, @@ -325,34 +309,29 @@ mod test { #[tokio::test] async fn test_extract_and_add_radarr_tag_ids_vec_add_missing_tags_first() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ "label": "TESTING" })), - Some(json!({ "id": 3, "label": "testing" })), - None, - RadarrEvent::GetTags, - None, - None, - ) - .await; + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "label": "TESTING" })) + .returns(json!({ "id": 3, "label": "testing" })) + .build_for(RadarrEvent::GetTags) + .await; let tags = "usenet, test, TESTING"; { - let mut app = app_arc.lock().await; - app.data.radarr_data.edit_movie_modal = Some(EditMovieModal { + let mut app_guard = app.lock().await; + app_guard.data.radarr_data.edit_movie_modal = Some(EditMovieModal { tags: tags.into(), ..EditMovieModal::default() }); - app.data.radarr_data.tags_map = + app_guard.data.radarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "test".to_owned())]); } - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); let tag_ids_vec = network.extract_and_add_radarr_tag_ids_vec(tags).await; async_server.assert_async().await; assert_eq!(tag_ids_vec, vec![1, 2, 3]); assert_eq!( - app_arc.lock().await.data.radarr_data.tags_map, + app.lock().await.data.radarr_data.tags_map, BiMap::from_iter([ (1, "usenet".to_owned()), (2, "test".to_owned()), diff --git a/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs b/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs index abc806c..0c03765 100644 --- a/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs +++ b/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs @@ -2,62 +2,52 @@ mod tests { use crate::models::radarr_models::RadarrSerdeable; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::radarr_network::radarr_network_test_utils::test_utils::root_folder; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::radarr_network::RadarrEvent; - use crate::network::{Network, RequestMethod}; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::root_folder; use pretty_assertions::assert_eq; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_add_radarr_root_folder_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "path": "/nfs/test" - })), - Some(json!({})), - None, - RadarrEvent::AddRootFolder(AddRootFolderBody::default()), - None, - None, - ) - .await; + })) + .returns(json!({})) + .build_for(RadarrEvent::AddRootFolder(AddRootFolderBody::default())) + .await; let add_root_folder_body = AddRootFolderBody { path: "/nfs/test".to_owned(), }; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::AddRootFolder(add_root_folder_body)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::AddRootFolder(add_root_folder_body)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_delete_radarr_root_folder_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - RadarrEvent::DeleteRootFolder(1), - Some("/1"), - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(RadarrEvent::DeleteRootFolder(1)) + .await; + let mut network = test_network(&app); - assert!(network - .handle_radarr_event(RadarrEvent::DeleteRootFolder(1)) - .await - .is_ok()); + assert!( + network + .handle_radarr_event(RadarrEvent::DeleteRootFolder(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -69,26 +59,20 @@ mod tests { "freeSpace": 219902325555200u64, }]); let response: Vec = serde_json::from_value(root_folder_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(root_folder_json), - None, - RadarrEvent::GetRootFolders, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(root_folder_json) + .build_for(RadarrEvent::GetRootFolders) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::RootFolders(root_folders) = network .handle_radarr_event(RadarrEvent::GetRootFolders) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.root_folders.items, + app.lock().await.data.radarr_data.root_folders.items, vec![root_folder()] ); assert_eq!(root_folders, response); diff --git a/src/network/radarr_network/system/radarr_system_network_tests.rs b/src/network/radarr_network/system/radarr_system_network_tests.rs index e7b28d0..6936776 100644 --- a/src/network/radarr_network/system/radarr_system_network_tests.rs +++ b/src/network/radarr_network/system/radarr_system_network_tests.rs @@ -5,22 +5,17 @@ mod tests { DiskSpace, HostConfig, LogResponse, QueueEvent, SecurityConfig, Update, }; use crate::models::{HorizontallyScrollableText, ScrollableText}; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::radarr_network::RadarrEvent; - use crate::network::{Network, RequestMethod}; use chrono::DateTime; use indoc::formatdoc; use pretty_assertions::{assert_eq, assert_str_eq}; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_get_radarr_diskspace_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([ + let (mock, app, _server) = MockServarrApi::get() + .returns(json!([ { "freeSpace": 1111, "totalSpace": 2222, @@ -29,14 +24,10 @@ mod tests { "freeSpace": 3333, "totalSpace": 4444 } - ])), - None, - RadarrEvent::GetDiskSpace, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + ])) + .build_for(RadarrEvent::GetDiskSpace) + .await; + let mut network = test_network(&app); let disk_space_vec = vec![ DiskSpace { free_space: 1111, @@ -53,9 +44,9 @@ mod tests { .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.disk_space_vec, + app.lock().await.data.radarr_data.disk_space_vec, disk_space_vec ); assert_eq!(disk_space, disk_space_vec); @@ -76,24 +67,18 @@ mod tests { "sslCertPassword": "test" }); let response: HostConfig = serde_json::from_value(host_config_response.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(host_config_response), - None, - RadarrEvent::GetHostConfig, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(host_config_response) + .build_for(RadarrEvent::GetHostConfig) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::HostConfig(host_config) = network .handle_radarr_event(RadarrEvent::GetHostConfig) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!(host_config, response); } } @@ -131,37 +116,31 @@ mod tests { ] }); let response: LogResponse = serde_json::from_value(logs_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(logs_response_json), - None, - RadarrEvent::GetLogs(500), - None, - Some("pageSize=500&sortDirection=descending&sortKey=time"), - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(logs_response_json) + .query("pageSize=500&sortDirection=descending&sortKey=time") + .build_for(RadarrEvent::GetLogs(500)) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::LogResponse(logs) = network .handle_radarr_event(RadarrEvent::GetLogs(500)) .await .unwrap() { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.radarr_data.logs.items, - expected_logs + mock.assert_async().await; + assert_eq!(app.lock().await.data.radarr_data.logs.items, expected_logs); + assert!( + app + .lock() + .await + .data + .radarr_data + .logs + .current_selection() + .text + .contains("INFO") ); - assert!(app_arc - .lock() - .await - .data - .radarr_data - .logs - .current_selection() - .text - .contains("INFO")); assert_eq!(logs, response); } } @@ -191,26 +170,20 @@ mod tests { trigger: "scheduled".to_owned(), }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(queued_events_json), - None, - RadarrEvent::GetQueuedEvents, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(queued_events_json) + .build_for(RadarrEvent::GetQueuedEvents) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::QueueEvents(events) = network .handle_radarr_event(RadarrEvent::GetQueuedEvents) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.queued_events.items, + app.lock().await.data.radarr_data.queued_events.items, vec![expected_event] ); assert_eq!(events, response); @@ -229,44 +202,32 @@ mod tests { }); let response: SecurityConfig = serde_json::from_value(security_config_response.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(security_config_response), - None, - RadarrEvent::GetSecurityConfig, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(security_config_response) + .build_for(RadarrEvent::GetSecurityConfig) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::SecurityConfig(security_config) = network .handle_radarr_event(RadarrEvent::GetSecurityConfig) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!(security_config, response); } } #[tokio::test] async fn test_handle_get_radarr_status_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::get() + .returns(json!({ "version": "v1", "startTime": "2023-02-25T20:16:43Z" - })), - None, - RadarrEvent::GetStatus, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .build_for(RadarrEvent::GetStatus) + .await; + let mut network = test_network(&app); let date_time = DateTime::from(DateTime::parse_from_rfc3339("2023-02-25T20:16:43Z").unwrap()); if let RadarrSerdeable::SystemStatus(status) = network @@ -275,8 +236,8 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert_str_eq!(app_arc.lock().await.data.radarr_data.version, "v1"); - assert_eq!(app_arc.lock().await.data.radarr_data.start_time, date_time); + assert_str_eq!(app.lock().await.data.radarr_data.version, "v1"); + assert_eq!(app.lock().await.data.radarr_data.start_time, date_time); assert_eq!( status, SystemStatus { @@ -356,17 +317,11 @@ mod tests { * Killed bug 1 * Fixed bug 2" )); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(updates_json), - None, - RadarrEvent::GetUpdates, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(updates_json) + .build_for(RadarrEvent::GetUpdates) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::Updates(updates) = network .handle_radarr_event(RadarrEvent::GetUpdates) @@ -375,7 +330,7 @@ mod tests { { async_server.assert_async().await; assert_str_eq!( - app_arc.lock().await.data.radarr_data.updates.get_text(), + app.lock().await.data.radarr_data.updates.get_text(), expected_text.get_text() ); assert_eq!(updates, response); @@ -420,17 +375,11 @@ mod tests { last_duration: "00:00:00.5111547".to_owned(), }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(tasks_json), - None, - RadarrEvent::GetTasks, - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(tasks_json) + .build_for(RadarrEvent::GetTasks) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::Tasks(tasks) = network .handle_radarr_event(RadarrEvent::GetTasks) @@ -439,7 +388,7 @@ mod tests { { async_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.radarr_data.tasks.items, + app.lock().await.data.radarr_data.tasks.items, expected_tasks ); assert_eq!(tasks, response); @@ -449,19 +398,16 @@ mod tests { #[tokio::test] async fn test_handle_start_radarr_task_event() { let response = json!({ "test": "test"}); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "ApplicationCheckUpdate" - })), - Some(response.clone()), - None, - RadarrEvent::StartTask(RadarrTaskName::ApplicationCheckUpdate), - None, - None, - ) - .await; - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(response.clone()) + .build_for(RadarrEvent::StartTask( + RadarrTaskName::ApplicationCheckUpdate, + )) + .await; + let mut network = test_network(&app); if let RadarrSerdeable::Value(value) = network .handle_radarr_event(RadarrEvent::StartTask( diff --git a/src/network/sonarr_network/blocklist/mod.rs b/src/network/sonarr_network/blocklist/mod.rs index 648b853..d43f46e 100644 --- a/src/network/sonarr_network/blocklist/mod.rs +++ b/src/network/sonarr_network/blocklist/mod.rs @@ -1,11 +1,11 @@ +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::sonarr_models::{BlocklistItem, BlocklistResponse}; -use crate::models::Route; use crate::network::sonarr_network::SonarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::info; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[cfg(test)] #[path = "sonarr_blocklist_network_tests.rs"] diff --git a/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs b/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs index 75ec0c8..72afc8e 100644 --- a/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs +++ b/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs @@ -3,17 +3,14 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::sonarr_models::{BlocklistItem, BlocklistResponse, Series, SonarrSerdeable}; use crate::models::stateful_table::SortOption; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::sonarr_network::SonarrEvent; use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ blocklist_item, series, }; - use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, RequestMethod}; use pretty_assertions::assert_eq; - use reqwest::Client; use rstest::rstest; - use serde_json::{json, Number}; - use tokio_util::sync::CancellationToken; + use serde_json::{Number, json}; #[tokio::test] async fn test_handle_clear_sonarr_blocklist_event() { @@ -32,62 +29,54 @@ mod tests { }, ]; let expected_request_json = json!({ "ids": [1, 2, 3]}); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - Some(expected_request_json), - None, - None, - SonarrEvent::ClearBlocklist, - None, - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::delete() + .with_request_body(expected_request_json) + .build_for(SonarrEvent::ClearBlocklist) + .await; + app .lock() .await .data .sonarr_data .blocklist .set_items(blocklist_items); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::ClearBlocklist) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::ClearBlocklist) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] async fn test_handle_delete_sonarr_blocklist_item_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteBlocklistItem(1), - Some("/1"), - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(SonarrEvent::DeleteBlocklistItem(1)) + .await; + app .lock() .await .data .sonarr_data .blocklist .set_items(vec![blocklist_item()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteBlocklistItem(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteBlocklistItem(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[rstest] @@ -135,17 +124,11 @@ mod tests { ..blocklist_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(blocklist_json), - None, - SonarrEvent::GetBlocklist, - None, - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(blocklist_json) + .build_for(SonarrEvent::GetBlocklist) + .await; + app .lock() .await .data @@ -156,7 +139,7 @@ mod tests { title: "Z Series".into(), ..series() }]); - app_arc.lock().await.data.sonarr_data.blocklist.sort_asc = true; + app.lock().await.data.sonarr_data.blocklist.sort_asc = true; if use_custom_sorting { let cmp_fn = |a: &BlocklistItem, b: &BlocklistItem| { a.source_title @@ -169,7 +152,7 @@ mod tests { name: "Source Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data @@ -177,20 +160,20 @@ mod tests { .blocklist .sorting(vec![blocklist_sort_option]); } - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::BlocklistResponse(blocklist) = network .handle_sonarr_event(SonarrEvent::GetBlocklist) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.blocklist.items, + app.lock().await.data.sonarr_data.blocklist.items, expected_blocklist ); - assert!(app_arc.lock().await.data.sonarr_data.blocklist.sort_asc); + assert!(app.lock().await.data.sonarr_data.blocklist.sort_asc); assert_eq!(blocklist, response); } } @@ -222,18 +205,12 @@ mod tests { "id": 456 }]}); let response: BlocklistResponse = serde_json::from_value(blocklist_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(blocklist_json), - None, - SonarrEvent::GetBlocklist, - None, - None, - ) - .await; - app_arc.lock().await.data.sonarr_data.blocklist.sort_asc = true; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(blocklist_json) + .build_for(SonarrEvent::GetBlocklist) + .await; + app.lock().await.data.sonarr_data.blocklist.sort_asc = true; + app .lock() .await .push_navigation_stack(ActiveSonarrBlock::BlocklistSortPrompt.into()); @@ -246,24 +223,24 @@ mod tests { name: "Source Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data .sonarr_data .blocklist .sorting(vec![blocklist_sort_option]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::BlocklistResponse(blocklist) = network .handle_sonarr_event(SonarrEvent::GetBlocklist) .await .unwrap() { - async_server.assert_async().await; - assert!(app_arc.lock().await.data.sonarr_data.blocklist.is_empty()); - assert!(app_arc.lock().await.data.sonarr_data.blocklist.sort_asc); + mock.assert_async().await; + assert!(app.lock().await.data.sonarr_data.blocklist.is_empty()); + assert!(app.lock().await.data.sonarr_data.blocklist.sort_asc); assert_eq!(blocklist, response); } } diff --git a/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs b/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs index 4500b45..a664ab7 100644 --- a/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs +++ b/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs @@ -1,45 +1,38 @@ #[cfg(test)] mod tests { use crate::models::sonarr_models::{DownloadsResponse, SonarrSerdeable}; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::sonarr_network::SonarrEvent; use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ download_record, downloads_response, }; - use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, RequestMethod}; use pretty_assertions::assert_eq; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_delete_sonarr_download_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteDownload(1), - Some("/1"), - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(SonarrEvent::DeleteDownload(1)) + .await; + app .lock() .await .data .sonarr_data .downloads .set_items(vec![download_record()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteDownload(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteDownload(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -59,27 +52,22 @@ mod tests { }); let response: DownloadsResponse = serde_json::from_value(downloads_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(downloads_response_json), - None, - SonarrEvent::GetDownloads(500), - None, - Some("pageSize=500"), - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(downloads_response_json) + .query("pageSize=500") + .build_for(SonarrEvent::GetDownloads(500)) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::DownloadsResponse(downloads) = network .handle_sonarr_event(SonarrEvent::GetDownloads(500)) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.downloads.items, + app.lock().await.data.sonarr_data.downloads.items, downloads_response().records ); assert_eq!(downloads, response); @@ -88,26 +76,23 @@ mod tests { #[tokio::test] async fn test_handle_update_sonarr_downloads_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "RefreshMonitoredDownloads" - })), - Some(json!({})), - None, - SonarrEvent::UpdateDownloads, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::UpdateDownloads) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::UpdateDownloads) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::UpdateDownloads) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } } diff --git a/src/network/sonarr_network/history/mod.rs b/src/network/sonarr_network/history/mod.rs index 20e1fff..0fddf3c 100644 --- a/src/network/sonarr_network/history/mod.rs +++ b/src/network/sonarr_network/history/mod.rs @@ -1,6 +1,6 @@ +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::sonarr_models::SonarrHistoryWrapper; -use crate::models::Route; use crate::network::sonarr_network::SonarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; diff --git a/src/network/sonarr_network/history/sonarr_history_network_tests.rs b/src/network/sonarr_network/history/sonarr_history_network_tests.rs index aa5476f..04803c6 100644 --- a/src/network/sonarr_network/history/sonarr_history_network_tests.rs +++ b/src/network/sonarr_network/history/sonarr_history_network_tests.rs @@ -3,15 +3,12 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::sonarr_models::{SonarrHistoryItem, SonarrHistoryWrapper, SonarrSerdeable}; use crate::models::stateful_table::SortOption; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::history_item; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, RequestMethod}; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::history_item; use pretty_assertions::assert_eq; - use reqwest::Client; use rstest::rstest; use serde_json::json; - use tokio_util::sync::CancellationToken; #[rstest] #[tokio::test] @@ -57,17 +54,12 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetHistory(500), - None, - Some("pageSize=500&sortDirection=descending&sortKey=date"), - ) - .await; - app_arc.lock().await.data.sonarr_data.history.sort_asc = true; + let (mock, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("pageSize=500&sortDirection=descending&sortKey=date") + .build_for(SonarrEvent::GetHistory(500)) + .await; + app.lock().await.data.sonarr_data.history.sort_asc = true; if use_custom_sorting { let cmp_fn = |a: &SonarrHistoryItem, b: &SonarrHistoryItem| { a.source_title @@ -81,7 +73,7 @@ mod tests { name: "Source Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data @@ -89,20 +81,20 @@ mod tests { .history .sorting(vec![history_sort_option]); } - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetHistory(500)) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.history.items, + app.lock().await.data.sonarr_data.history.items, expected_history_items ); - assert!(app_arc.lock().await.data.sonarr_data.history.sort_asc); + assert!(app.lock().await.data.sonarr_data.history.sort_asc); assert_eq!(history, response); } } @@ -136,18 +128,13 @@ mod tests { } }]}); let response: SonarrHistoryWrapper = serde_json::from_value(history_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetHistory(500), - None, - Some("pageSize=500&sortDirection=descending&sortKey=date"), - ) - .await; - app_arc.lock().await.data.sonarr_data.history.sort_asc = true; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("pageSize=500&sortDirection=descending&sortKey=date") + .build_for(SonarrEvent::GetHistory(500)) + .await; + app.lock().await.data.sonarr_data.history.sort_asc = true; + app .lock() .await .push_navigation_stack(ActiveSonarrBlock::HistorySortPrompt.into()); @@ -161,24 +148,24 @@ mod tests { name: "Source Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data .sonarr_data .history .sorting(vec![history_sort_option]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetHistory(500)) .await .unwrap() { - async_server.assert_async().await; - assert!(app_arc.lock().await.data.sonarr_data.history.is_empty()); - assert!(app_arc.lock().await.data.sonarr_data.history.sort_asc); + mock.assert_async().await; + assert!(app.lock().await.data.sonarr_data.history.is_empty()); + assert!(app.lock().await.data.sonarr_data.history.sort_asc); assert_eq!(history, response); } } @@ -186,25 +173,24 @@ mod tests { #[tokio::test] async fn test_handle_mark_sonarr_history_item_as_failed_event() { let expected_history_item_id = 1; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - None, - Some(json!({})), - None, - SonarrEvent::MarkHistoryItemAsFailed(expected_history_item_id), - Some("/1"), - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); - - assert!(network - .handle_sonarr_event(SonarrEvent::MarkHistoryItemAsFailed( - expected_history_item_id + let (mock, app, _server) = MockServarrApi::post() + .returns(json!({})) + .path("/1") + .build_for(SonarrEvent::MarkHistoryItemAsFailed( + expected_history_item_id, )) - .await - .is_ok()); - async_server.assert_async().await; + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); + + assert!( + network + .handle_sonarr_event(SonarrEvent::MarkHistoryItemAsFailed( + expected_history_item_id + )) + .await + .is_ok() + ); + mock.assert_async().await; } } diff --git a/src/network/sonarr_network/indexers/mod.rs b/src/network/sonarr_network/indexers/mod.rs index ed19639..1fe256b 100644 --- a/src/network/sonarr_network/indexers/mod.rs +++ b/src/network/sonarr_network/indexers/mod.rs @@ -6,7 +6,7 @@ use crate::network::sonarr_network::SonarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::{debug, info}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[cfg(test)] #[path = "sonarr_indexers_network_tests.rs"] diff --git a/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs b/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs index 4a4ed73..38330ae 100644 --- a/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs +++ b/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs @@ -1,50 +1,44 @@ #[cfg(test)] mod tests { + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_models::{EditIndexerParams, Indexer, IndexerTestResult}; use crate::models::sonarr_models::SonarrSerdeable; - use crate::models::HorizontallyScrollableText; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::sonarr_network::SonarrEvent; use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ indexer, indexer_settings, }; - use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, NetworkResource, RequestMethod}; use bimap::BiMap; use mockito::Matcher; use pretty_assertions::assert_eq; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_delete_sonarr_indexer_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteIndexer(1), - Some("/1"), - None, - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(SonarrEvent::DeleteIndexer(1)) + .await; + app .lock() .await .data .sonarr_data .indexers .set_items(vec![indexer()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteIndexer(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteIndexer(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -56,26 +50,22 @@ mod tests { "retention": 1, "rssSyncInterval": 60 }); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Put, - Some(indexer_settings_json), - None, - None, - SonarrEvent::EditAllIndexerSettings(indexer_settings()), - None, - None, - ) - .await; + let (mock, app, _server) = MockServarrApi::put() + .with_request_body(indexer_settings_json) + .build_for(SonarrEvent::EditAllIndexerSettings(indexer_settings())) + .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditAllIndexerSettings(indexer_settings())) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditAllIndexerSettings(indexer_settings())) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -139,17 +129,12 @@ mod tests { "tags": [1, 2], "id": 1 }); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; - let async_edit_server = server + let (mock_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; + let mock_edit_server = server .mock( "PUT", format!( @@ -163,23 +148,25 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.sonarr_data.tags_map = + app.lock().await.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details_server.assert_async().await; + mock_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_sonarr_indexer_event_does_not_overwrite_tags_vec_if_tag_input_string_is_none( - ) { + async fn test_handle_edit_sonarr_indexer_event_does_not_overwrite_tags_vec_if_tag_input_string_is_none() + { let expected_edit_indexer_params = EditIndexerParams { indexer_id: 1, name: Some("Test Update".to_owned()), @@ -239,17 +226,12 @@ mod tests { "tags": [1, 2], "id": 1 }); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; - let async_edit_server = server + let (mock_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; + let mock_edit_server = server .mock( "PUT", format!( @@ -263,21 +245,23 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details_server.assert_async().await; + mock_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_sonarr_indexer_event_does_not_add_seed_ratio_when_seed_ratio_field_is_none_in_details( - ) { + async fn test_handle_edit_sonarr_indexer_event_does_not_add_seed_ratio_when_seed_ratio_field_is_none_in_details() + { let expected_edit_indexer_params = EditIndexerParams { indexer_id: 1, name: Some("Test Update".to_owned()), @@ -330,17 +314,12 @@ mod tests { "id": 1 }); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; - let async_edit_server = server + let (mock_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; + let mock_edit_server = server .mock( "PUT", format!( @@ -354,23 +333,25 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.sonarr_data.tags_map = + app.lock().await.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details_server.assert_async().await; + mock_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_sonarr_indexer_event_populates_the_seed_ratio_value_when_seed_ratio_field_is_present_in_details( - ) { + async fn test_handle_edit_sonarr_indexer_event_populates_the_seed_ratio_value_when_seed_ratio_field_is_present_in_details() + { let expected_edit_indexer_params = EditIndexerParams { indexer_id: 1, name: Some("Test Update".to_owned()), @@ -430,17 +411,12 @@ mod tests { "id": 1 }); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; - let async_edit_server = server + let (mock_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; + let mock_edit_server = server .mock( "PUT", format!( @@ -454,18 +430,20 @@ mod tests { .match_body(Matcher::Json(expected_indexer_edit_body_json)) .create_async() .await; - app_arc.lock().await.data.sonarr_data.tags_map = + app.lock().await.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditIndexer(expected_edit_indexer_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details_server.assert_async().await; + mock_edit_server.assert_async().await; } #[tokio::test] @@ -497,17 +475,12 @@ mod tests { indexer_id: 1, ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json.clone()), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; - let async_edit_server = server + let (mock_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json.clone()) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; + let mock_edit_server = server .mock( "PUT", format!( @@ -521,16 +494,18 @@ mod tests { .match_body(Matcher::Json(indexer_details_json)) .create_async() .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); - async_details_server.assert_async().await; - async_edit_server.assert_async().await; + mock_details_server.assert_async().await; + mock_edit_server.assert_async().await; } #[tokio::test] @@ -587,16 +562,11 @@ mod tests { ..EditIndexerParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; let async_edit_server = server .mock( "PUT", @@ -611,13 +581,15 @@ mod tests { .match_body(Matcher::Json(expected_edit_indexer_body)) .create_async() .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditIndexer(edit_indexer_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditIndexer(edit_indexer_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -656,18 +628,12 @@ mod tests { "id": 1 }]); let response: Vec = serde_json::from_value(indexers_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexers_response_json), - None, - SonarrEvent::GetIndexers, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(indexers_response_json) + .build_for(SonarrEvent::GetIndexers) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Indexers(indexers) = network .handle_sonarr_event(SonarrEvent::GetIndexers) @@ -676,7 +642,7 @@ mod tests { { async_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.indexers.items, + app.lock().await.data.sonarr_data.indexers.items, vec![indexer()] ); assert_eq!(indexers, response); @@ -714,16 +680,11 @@ mod tests { "errorMessage": "test failure", "severity": "error" }]); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json.clone()), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json.clone()) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; let async_test_server = server .mock( "POST", @@ -735,15 +696,15 @@ mod tests { .with_body(response_json.to_string()) .create_async() .await; - app_arc + app .lock() .await .data .sonarr_data .indexers .set_items(vec![indexer()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Value(value) = network .handle_sonarr_event(SonarrEvent::TestIndexer(1)) @@ -753,7 +714,7 @@ mod tests { async_details_server.assert_async().await; async_test_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.indexer_test_errors, + app.lock().await.data.sonarr_data.indexer_test_errors, Some("\"test failure\"".to_owned()) ); assert_eq!(value, response_json) @@ -784,16 +745,11 @@ mod tests { "tags": [1], "id": 1 }); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(indexer_details_json.clone()), - None, - SonarrEvent::GetIndexers, - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(indexer_details_json.clone()) + .path("/1") + .build_for(SonarrEvent::GetIndexers) + .await; let async_test_server = server .mock( "POST", @@ -805,15 +761,15 @@ mod tests { .with_body("{}") .create_async() .await; - app_arc + app .lock() .await .data .sonarr_data .indexers .set_items(vec![indexer()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Value(value) = network .handle_sonarr_event(SonarrEvent::TestIndexer(1)) @@ -823,7 +779,7 @@ mod tests { async_details_server.assert_async().await; async_test_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.indexer_test_errors, + app.lock().await.data.sonarr_data.indexer_test_errors, Some(String::new()) ); assert_eq!(value, json!({})); @@ -879,25 +835,20 @@ mod tests { ] }]); let response: Vec = serde_json::from_value(response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - None, - Some(response_json), - Some(400), - SonarrEvent::TestAllIndexers, - None, - None, - ) - .await; - app_arc + let (async_server, app, _server) = MockServarrApi::post() + .returns(response_json) + .status(400) + .build_for(SonarrEvent::TestAllIndexers) + .await; + app .lock() .await .data .sonarr_data .indexers .set_items(indexers); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::IndexerTestResults(results) = network .handle_sonarr_event(SonarrEvent::TestAllIndexers) @@ -905,15 +856,17 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .indexer_test_all_results - .is_some()); + assert!( + app + .lock() + .await + .data + .sonarr_data + .indexer_test_all_results + .is_some() + ); assert_eq!( - app_arc + app .lock() .await .data diff --git a/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs b/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs index 83a5d2a..74ca0af 100644 --- a/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs +++ b/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs @@ -7,43 +7,37 @@ mod tests { SonarrHistoryWrapper, SonarrSerdeable, }; use crate::models::stateful_table::SortOption; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::sonarr_network::SonarrEvent; use crate::network::sonarr_network::library::episodes::get_episode_status; use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ - episode, episode_file, history_item, release, EPISODE_JSON, + EPISODE_JSON, episode, episode_file, history_item, release, }; - use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, NetworkResource, RequestMethod}; use indoc::formatdoc; use mockito::Matcher; use pretty_assertions::{assert_eq, assert_str_eq}; - use reqwest::Client; use rstest::rstest; - use serde_json::{json, Number}; + use serde_json::{Number, json}; use std::slice; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_delete_sonarr_episode_file_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteEpisodeFile(1), - Some("/1"), - None, - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::delete() + .path("/1") + .build_for(SonarrEvent::DeleteEpisodeFile(1)) + .await; app_arc.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteEpisodeFile(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteEpisodeFile(1)) + .await + .is_ok() + ); async_server.assert_async().await; } @@ -76,16 +70,11 @@ mod tests { }; let expected_episodes = vec![episode_1.clone(), episode_2.clone(), episode_3.clone()]; let mut expected_sorted_episodes = vec![episode_1.clone(), episode_3.clone()]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([episode_1, episode_2, episode_3])), - None, - SonarrEvent::GetEpisodes(1), - None, - Some("seriesId=1"), - ) - .await; + let (mock, app, _server) = MockServarrApi::get() + .query("seriesId=1") + .returns(json!([episode_1, episode_2, episode_3])) + .build_for(SonarrEvent::GetEpisodes(1)) + .await; let mut season_details_modal = SeasonDetailsModal::default(); season_details_modal.episodes.sort_asc = true; if use_custom_sorting { @@ -99,8 +88,8 @@ mod tests { .episodes .sorting(vec![title_sort_option]); } - app_arc.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); - app_arc + app.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); + app .lock() .await .data @@ -110,7 +99,7 @@ mod tests { id: 1, ..Series::default() }]); - app_arc + app .lock() .await .data @@ -120,42 +109,44 @@ mod tests { season_number: 1, ..Season::default() }]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - if let SonarrSerdeable::Episodes(episodes) = network + let result = network .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .items, - expected_sorted_episodes - ); - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .sort_asc - ); - assert_eq!(episodes, expected_episodes); - } + .await; + + mock.assert_async().await; + + let SonarrSerdeable::Episodes(episodes) = result.unwrap() else { + panic!("Expected Episodes variant") + }; + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .items, + expected_sorted_episodes + ); + assert!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .sort_asc + ); + assert_eq!(episodes, expected_episodes); } #[tokio::test] @@ -184,20 +175,15 @@ mod tests { ..episode() }; let expected_episodes = vec![episode_1.clone(), episode_2.clone(), episode_3.clone()]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([episode_1, episode_2, episode_3])), - None, - SonarrEvent::GetEpisodes(1), - None, - Some("seriesId=1"), - ) - .await; + let (mock, app, _server) = MockServarrApi::get() + .query("seriesId=1") + .returns(json!([episode_1, episode_2, episode_3])) + .build_for(SonarrEvent::GetEpisodes(1)) + .await; let mut season_details_modal = SeasonDetailsModal::default(); season_details_modal.episodes.sort_asc = true; - app_arc.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); - app_arc + app.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); + app .lock() .await .data @@ -207,56 +193,53 @@ mod tests { id: 1, ..Series::default() }]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - if let SonarrSerdeable::Episodes(episodes) = network + let result = network .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .items, - expected_episodes - ); - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .sort_asc - ); - assert_eq!(episodes, expected_episodes); - } + .await; + + mock.assert_async().await; + + let SonarrSerdeable::Episodes(episodes) = result.unwrap() else { + panic!("Expected Episodes variant") + }; + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .items, + expected_episodes + ); + assert!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .sort_asc + ); + assert_eq!(episodes, expected_episodes); } #[tokio::test] async fn test_handle_get_episodes_event_empty_season_details_modal() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([episode()])), - None, - SonarrEvent::GetEpisodes(1), - None, - Some("seriesId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(json!([episode()])) + .query("seriesId=1") + .build_for(SonarrEvent::GetEpisodes(1)) + .await; app_arc .lock() .await @@ -268,7 +251,7 @@ mod tests { ..Series::default() }]); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Episodes(episodes) = network .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) @@ -336,16 +319,11 @@ mod tests { ..episode() }; let mut expected_episodes = vec![episode_2.clone(), episode_1.clone()]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(episodes_json), - None, - SonarrEvent::GetEpisodes(1), - None, - Some("seriesId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(episodes_json) + .query("seriesId=1") + .build_for(SonarrEvent::GetEpisodes(1)) + .await; app_arc .lock() .await @@ -373,7 +351,7 @@ mod tests { }]); app_arc.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Episodes(episodes) = network .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) @@ -381,16 +359,18 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .is_empty()); + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .is_empty() + ); assert!( app_arc .lock() @@ -409,16 +389,11 @@ mod tests { #[tokio::test] async fn test_handle_get_episode_files_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([episode_file()])), - None, - SonarrEvent::GetEpisodeFiles(1), - None, - Some("seriesId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(json!([episode_file()])) + .query("seriesId=1") + .build_for(SonarrEvent::GetEpisodeFiles(1)) + .await; app_arc.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); app_arc @@ -432,7 +407,7 @@ mod tests { ..Series::default() }]); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::EpisodeFiles(episode_files) = network .handle_sonarr_event(SonarrEvent::GetEpisodeFiles(1)) @@ -459,16 +434,11 @@ mod tests { #[tokio::test] async fn test_handle_get_episode_files_event_empty_season_details_modal() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([episode_file()])), - None, - SonarrEvent::GetEpisodeFiles(1), - None, - Some("seriesId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(json!([episode_file()])) + .query("seriesId=1") + .build_for(SonarrEvent::GetEpisodeFiles(1)) + .await; app_arc .lock() .await @@ -480,7 +450,7 @@ mod tests { ..Series::default() }]); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::EpisodeFiles(episode_files) = network .handle_sonarr_event(SonarrEvent::GetEpisodeFiles(1)) @@ -488,13 +458,15 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .is_some()); + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .is_some() + ); assert_eq!( app_arc .lock() @@ -555,16 +527,11 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetEpisodeHistory(1), - None, - Some("episodeId=1&pageSize=1000&sortDirection=descending&sortKey=date"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(history_json) + .query("episodeId=1&pageSize=1000&sortDirection=descending&sortKey=date") + .build_for(SonarrEvent::GetEpisodeHistory(1)) + .await; app_arc.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); app_arc @@ -600,7 +567,7 @@ mod tests { .episode_history .sort_asc = true; app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetEpisodeHistory(1)) @@ -686,16 +653,11 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetEpisodeHistory(1), - None, - Some("episodeId=1&pageSize=1000&sortDirection=descending&sortKey=date"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(history_json) + .query("episodeId=1&pageSize=1000&sortDirection=descending&sortKey=date") + .build_for(SonarrEvent::GetEpisodeHistory(1)) + .await; app_arc.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); app_arc @@ -709,7 +671,7 @@ mod tests { .episodes .set_items(vec![episode()]); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetEpisodeHistory(1)) @@ -795,18 +757,13 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetEpisodeHistory(1), - None, - Some("episodeId=1&pageSize=1000&sortDirection=descending&sortKey=date"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(history_json) + .query("episodeId=1&pageSize=1000&sortDirection=descending&sortKey=date") + .build_for(SonarrEvent::GetEpisodeHistory(1)) + .await; app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetEpisodeHistory(1)) @@ -852,16 +809,11 @@ mod tests { #[tokio::test] async fn test_handle_get_episode_details_event() { let response: Episode = serde_json::from_str(EPISODE_JSON).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(EPISODE_JSON).unwrap()), - None, - SonarrEvent::GetEpisodeDetails(1), - Some("/1"), - None, - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(serde_json::from_str(EPISODE_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetEpisodeDetails(1)) + .await; let mut episode_details_modal = EpisodeDetailsModal::default(); episode_details_modal.episode_details_tabs.next(); let mut season_details_modal = SeasonDetailsModal::default(); @@ -873,7 +825,7 @@ mod tests { .await .push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Episode(episode) = network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) @@ -881,16 +833,18 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_some()); + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .is_some() + ); assert_eq!( app_arc .lock() @@ -969,16 +923,11 @@ mod tests { #[tokio::test] async fn test_handle_get_episode_details_event_empty_episode_details_modal() { let response: Episode = serde_json::from_str(EPISODE_JSON).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(EPISODE_JSON).unwrap()), - None, - SonarrEvent::GetEpisodeDetails(1), - Some("/1"), - None, - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(serde_json::from_str(EPISODE_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetEpisodeDetails(1)) + .await; let mut season_details_modal = SeasonDetailsModal::default(); season_details_modal.episodes.set_items(vec![episode()]); app_arc.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); @@ -987,7 +936,7 @@ mod tests { .await .push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Episode(episode) = network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) @@ -995,16 +944,18 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_some()); + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .is_some() + ); assert_eq!(episode, response); let app = app_arc.lock().await; @@ -1067,19 +1018,14 @@ mod tests { #[tokio::test] async fn test_handle_get_episode_details_event_season_details_modal_not_required_in_cli_mode() { let response: Episode = serde_json::from_str(EPISODE_JSON).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(EPISODE_JSON).unwrap()), - None, - SonarrEvent::GetEpisodeDetails(1), - Some("/1"), - None, - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(serde_json::from_str(EPISODE_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetEpisodeDetails(1)) + .await; app_arc.lock().await.cli_mode = true; app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Episode(episode) = network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) @@ -1093,20 +1039,15 @@ mod tests { #[tokio::test] #[should_panic(expected = "Season details modal is empty")] - async fn test_handle_get_episode_details_event_requires_season_details_modal_to_be_some_when_in_tui_mode( - ) { - let (_async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(EPISODE_JSON).unwrap()), - None, - SonarrEvent::GetEpisodeDetails(1), - Some("/1"), - None, - ) - .await; + async fn test_handle_get_episode_details_event_requires_season_details_modal_to_be_some_when_in_tui_mode() + { + let (_async_server, app_arc, _server) = MockServarrApi::get() + .returns(serde_json::from_str(EPISODE_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetEpisodeDetails(1)) + .await; app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) @@ -1131,16 +1072,11 @@ mod tests { "languages": [ { "id": 1, "name": "English" } ], "quality": { "quality": { "name": "Bluray-1080p" }} }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - SonarrEvent::GetEpisodeReleases(1), - None, - Some("episodeId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(release_json) + .query("episodeId=1") + .build_for(SonarrEvent::GetEpisodeReleases(1)) + .await; let mut season_details_modal = SeasonDetailsModal::default(); season_details_modal.episodes.set_items(vec![episode()]); app_arc.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); @@ -1154,7 +1090,7 @@ mod tests { .unwrap() .episode_details_modal = Some(EpisodeDetailsModal::default()); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Releases(releases_vec) = network .handle_sonarr_event(SonarrEvent::GetEpisodeReleases(1)) @@ -1199,21 +1135,16 @@ mod tests { "languages": [ { "id": 1, "name": "English" } ], "quality": { "quality": { "name": "Bluray-1080p" }} }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - SonarrEvent::GetEpisodeReleases(1), - None, - Some("episodeId=1"), - ) - .await; + let (async_server, app_arc, _server) = MockServarrApi::get() + .returns(release_json) + .query("episodeId=1") + .build_for(SonarrEvent::GetEpisodeReleases(1)) + .await; let mut season_details_modal = SeasonDetailsModal::default(); season_details_modal.episodes.set_items(vec![episode()]); app_arc.lock().await.data.sonarr_data.season_details_modal = Some(season_details_modal); app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); if let SonarrSerdeable::Releases(releases_vec) = network .handle_sonarr_event(SonarrEvent::GetEpisodeReleases(1)) @@ -1249,16 +1180,11 @@ mod tests { }; let body = Episode { id: 2, ..episode() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!(body)), - None, - SonarrEvent::GetEpisodeDetails(2), - Some("/2"), - None, - ) - .await; + let (async_details_server, app_arc, mut server) = MockServarrApi::get() + .returns(json!(body)) + .path("/2") + .build_for(SonarrEvent::GetEpisodeDetails(2)) + .await; let async_toggle_server = server .mock( "PUT", @@ -1274,12 +1200,14 @@ mod tests { .create_async() .await; app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); - assert!(network - .handle_sonarr_event(SonarrEvent::ToggleEpisodeMonitoring(2)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::ToggleEpisodeMonitoring(2)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_toggle_server.assert_async().await; @@ -1287,28 +1215,26 @@ mod tests { #[tokio::test] async fn test_handle_trigger_automatic_episode_search_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ - "name": "EpisodeSearch", - "episodeIds": [ 1 ] - })), - Some(json!({})), - None, - SonarrEvent::TriggerAutomaticEpisodeSearch(1), - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let body = json!({ + "name": "EpisodeSearch", + "episodeIds": [ 1 ] + }); + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(body) + .returns(json!({})) + .build_for(SonarrEvent::TriggerAutomaticEpisodeSearch(1)) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::TriggerAutomaticEpisodeSearch(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::TriggerAutomaticEpisodeSearch(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[test] diff --git a/src/network/sonarr_network/library/seasons/mod.rs b/src/network/sonarr_network/library/seasons/mod.rs index 5f0695f..7ed2912 100644 --- a/src/network/sonarr_network/library/seasons/mod.rs +++ b/src/network/sonarr_network/library/seasons/mod.rs @@ -4,7 +4,7 @@ use crate::network::sonarr_network::SonarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::{debug, info, warn}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; #[cfg(test)] #[path = "sonarr_seasons_network_tests.rs"] diff --git a/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs b/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs index 23d8de6..69db1ac 100644 --- a/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs +++ b/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs @@ -2,17 +2,15 @@ mod tests { use crate::models::servarr_data::sonarr::modals::SeasonDetailsModal; use crate::models::sonarr_models::{SonarrHistoryItem, SonarrRelease, SonarrSerdeable}; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ - history_item, release, season, series, SERIES_JSON, - }; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, NetworkResource, RequestMethod}; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ + SERIES_JSON, history_item, release, season, series, + }; use mockito::Matcher; use pretty_assertions::assert_eq; - use reqwest::Client; - use serde_json::{json, Value}; - use tokio_util::sync::CancellationToken; + use serde_json::{Value, json}; #[tokio::test] async fn test_handle_toggle_season_monitoring_event() { @@ -28,16 +26,11 @@ mod tests { .get_mut("monitored") .unwrap() = json!(false); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; let async_toggle_server = server .mock( "PUT", @@ -53,17 +46,19 @@ mod tests { .create_async() .await; { - let mut app = app_arc.lock().await; - app.data.sonarr_data.series.set_items(vec![series()]); - app.data.sonarr_data.seasons.set_items(vec![season()]); + let mut app_lock = app.lock().await; + app_lock.data.sonarr_data.series.set_items(vec![series()]); + app_lock.data.sonarr_data.seasons.set_items(vec![season()]); } - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::ToggleSeasonMonitoring((1, 1))) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::ToggleSeasonMonitoring((1, 1))) + .await + .is_ok() + ); async_details_server.assert_async().await; async_toggle_server.assert_async().await; @@ -118,43 +113,37 @@ mod tests { ..release() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - SonarrEvent::GetSeasonReleases((1, 1)), - None, - Some("seriesId=1&seasonNumber=1"), - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(release_json) + .query("seriesId=1&seasonNumber=1") + .build_for(SonarrEvent::GetSeasonReleases((1, 1))) + .await; + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc + app .lock() .await .data .sonarr_data .seasons .set_items(vec![season()]); - app_arc.lock().await.data.sonarr_data.season_details_modal = - Some(SeasonDetailsModal::default()); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Releases(releases_vec) = network .handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1))) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc + app .lock() .await .data @@ -209,41 +198,38 @@ mod tests { full_season: true, ..release() }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(release_json), - None, - SonarrEvent::GetSeasonReleases((1, 1)), - None, - Some("seriesId=1&seasonNumber=1"), - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(release_json) + .query("seriesId=1&seasonNumber=1") + .build_for(SonarrEvent::GetSeasonReleases((1, 1))) + .await; + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc + app .lock() .await .data .sonarr_data .seasons .set_items(vec![season()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1))) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1))) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc + app .lock() .await .data @@ -300,33 +286,27 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetSeasonHistory((1, 1)), - None, - Some("seriesId=1&seasonNumber=1"), - ) - .await; - app_arc.lock().await.data.sonarr_data.season_details_modal = - Some(SeasonDetailsModal::default()); - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("seriesId=1&seasonNumber=1") + .build_for(SonarrEvent::GetSeasonHistory((1, 1))) + .await; + app.lock().await.data.sonarr_data.season_details_modal = Some(SeasonDetailsModal::default()); + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc + app .lock() .await .data .sonarr_data .seasons .set_items(vec![season()]); - app_arc + app .lock() .await .data @@ -336,17 +316,17 @@ mod tests { .unwrap() .season_history .sort_asc = true; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryItems(history) = network .handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1))) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc + app .lock() .await .data @@ -359,7 +339,7 @@ mod tests { expected_history_items ); assert!( - app_arc + app .lock() .await .data @@ -417,48 +397,45 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetSeasonHistory((1, 1)), - None, - Some("seriesId=1&seasonNumber=1"), - ) - .await; - app_arc + let (mock, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("seriesId=1&seasonNumber=1") + .build_for(SonarrEvent::GetSeasonHistory((1, 1))) + .await; + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc + app .lock() .await .data .sonarr_data .seasons .set_items(vec![season()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryItems(history) = network .handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1))) .await .unwrap() { - async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .is_some()); + mock.assert_async().await; + assert!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .is_some() + ); assert_eq!( - app_arc + app .lock() .await .data @@ -471,7 +448,7 @@ mod tests { expected_history_items ); assert!( - !app_arc + !app .lock() .await .data @@ -488,28 +465,25 @@ mod tests { #[tokio::test] async fn test_handle_trigger_automatic_season_search_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "SeasonSearch", "seriesId": 1, "seasonNumber": 1 - })), - Some(json!({})), - None, - SonarrEvent::TriggerAutomaticSeasonSearch((1, 1)), - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::TriggerAutomaticSeasonSearch((1, 1))) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::TriggerAutomaticSeasonSearch((1, 1))) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::TriggerAutomaticSeasonSearch((1, 1))) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } } diff --git a/src/network/sonarr_network/library/series/mod.rs b/src/network/sonarr_network/library/series/mod.rs index a9bbf7f..7e0bc7d 100644 --- a/src/network/sonarr_network/library/series/mod.rs +++ b/src/network/sonarr_network/library/series/mod.rs @@ -1,15 +1,15 @@ +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::sonarr_models::{ AddSeriesBody, AddSeriesSearchResult, DeleteSeriesParams, EditSeriesParams, Series, SonarrCommandBody, SonarrHistoryItem, }; use crate::models::stateful_table::StatefulTable; -use crate::models::Route; use crate::network::sonarr_network::SonarrEvent; use crate::network::{Network, RequestMethod}; use anyhow::Result; use log::{debug, info, warn}; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use urlencoding::encode; #[cfg(test)] @@ -56,7 +56,9 @@ impl Network<'_, '_> { add_list_exclusion, } = delete_series_params; - info!("Deleting Sonarr series with ID: {id} with deleteFiles={delete_series_files} and addImportExclusion={add_list_exclusion}"); + info!( + "Deleting Sonarr series with ID: {id} with deleteFiles={delete_series_files} and addImportExclusion={add_list_exclusion}" + ); let request_props = self .request_props_from( diff --git a/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs b/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs index de74cfe..e1f5f31 100644 --- a/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs +++ b/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs @@ -6,19 +6,17 @@ mod tests { SonarrHistoryItem, SonarrSerdeable, }; use crate::models::stateful_table::{SortOption, StatefulTable}; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ - add_series_search_result, history_item, season, series, SERIES_JSON, - }; + use crate::network::NetworkResource; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, NetworkResource, RequestMethod}; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ + SERIES_JSON, add_series_search_result, history_item, season, series, + }; use bimap::BiMap; use mockito::Matcher; use pretty_assertions::assert_eq; - use reqwest::Client; use rstest::rstest; - use serde_json::{json, Value}; - use tokio_util::sync::CancellationToken; + use serde_json::{Value, json}; #[tokio::test] async fn test_handle_add_sonarr_series_event() { @@ -39,9 +37,8 @@ mod tests { search_for_missing_episodes: true, }, }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "tvdbId": 1234, "title": "Test", "monitored": true, @@ -56,30 +53,28 @@ mod tests { "searchForCutoffUnmetEpisodes": true, "searchForMissingEpisodes": true } - })), - Some(json!({})), - None, - SonarrEvent::AddSeries(expected_add_series_body.clone()), - None, - None, - ) - .await; - app_arc.lock().await.data.sonarr_data.tags_map = + })) + .returns(json!({})) + .build_for(SonarrEvent::AddSeries(expected_add_series_body.clone())) + .await; + app.lock().await.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::AddSeries(expected_add_series_body)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::AddSeries(expected_add_series_body)) + .await + .is_ok() + ); async_server.assert_async().await; } #[tokio::test] - async fn test_handle_add_sonarr_series_event_does_not_overwrite_tags_vec_when_tag_input_string_is_none( - ) { + async fn test_handle_add_sonarr_series_event_does_not_overwrite_tags_vec_when_tag_input_string_is_none() + { let expected_add_series_body = AddSeriesBody { tvdb_id: 1234, title: "Test".to_owned(), @@ -97,9 +92,8 @@ mod tests { search_for_missing_episodes: true, }, }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "tvdbId": 1234, "title": "Test", "monitored": true, @@ -114,21 +108,19 @@ mod tests { "searchForCutoffUnmetEpisodes": true, "searchForMissingEpisodes": true } - })), - Some(json!({})), - None, - SonarrEvent::AddSeries(expected_add_series_body.clone()), - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::AddSeries(expected_add_series_body.clone())) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::AddSeries(expected_add_series_body)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::AddSeries(expected_add_series_body)) + .await + .is_ok() + ); async_server.assert_async().await; } @@ -140,23 +132,20 @@ mod tests { delete_series_files: true, add_list_exclusion: true, }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteSeries(delete_series_params.clone()), - Some("/1"), - Some("deleteFiles=true&addImportExclusion=true"), - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::delete() + .path("/1") + .query("deleteFiles=true&addImportExclusion=true") + .build_for(SonarrEvent::DeleteSeries(delete_series_params.clone())) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteSeries(delete_series_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteSeries(delete_series_params)) + .await + .is_ok() + ); async_server.assert_async().await; } @@ -183,16 +172,11 @@ mod tests { ..EditSeriesParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; let async_edit_server = server .mock( "PUT", @@ -207,23 +191,25 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - app_arc.lock().await.data.sonarr_data.tags_map = + app.lock().await.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; } #[tokio::test] - async fn test_handle_edit_series_event_does_not_overwrite_tag_ids_vec_when_tag_input_string_is_none( - ) { + async fn test_handle_edit_series_event_does_not_overwrite_tag_ids_vec_when_tag_input_string_is_none() + { let mut expected_body: Value = serde_json::from_str(SERIES_JSON).unwrap(); *expected_body.get_mut("monitored").unwrap() = json!(false); *expected_body.get_mut("seasonFolder").unwrap() = json!(false); @@ -244,16 +230,11 @@ mod tests { ..EditSeriesParams::default() }; - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; let async_edit_server = server .mock( "PUT", @@ -268,15 +249,17 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - app_arc.lock().await.data.sonarr_data.tags_map = + app.lock().await.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "testing".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -289,16 +272,11 @@ mod tests { ..EditSeriesParams::default() }; let expected_body: Value = serde_json::from_str(SERIES_JSON).unwrap(); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; let async_edit_server = server .mock( "PUT", @@ -313,13 +291,15 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -330,16 +310,11 @@ mod tests { let mut expected_body: Value = serde_json::from_str(SERIES_JSON).unwrap(); *expected_body.get_mut("tags").unwrap() = json!([]); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; let edit_series_params = EditSeriesParams { series_id: 1, clear_tags: true, @@ -359,13 +334,15 @@ mod tests { .match_body(Matcher::Json(expected_body)) .create_async() .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::EditSeries(edit_series_params)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_edit_server.assert_async().await; @@ -376,16 +353,11 @@ mod tests { let mut expected_body: Value = serde_json::from_str(SERIES_JSON).unwrap(); *expected_body.get_mut("monitored").unwrap() = json!(false); - let (async_details_server, app_arc, mut server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; + let (async_details_server, app, mut server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; let async_toggle_server = server .mock( "PUT", @@ -401,17 +373,19 @@ mod tests { .create_async() .await; { - let mut app = app_arc.lock().await; + let mut app = app.lock().await; app.data.sonarr_data.series.set_items(vec![series()]); app.data.sonarr_data.seasons.set_items(vec![season()]); } - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::ToggleSeriesMonitoring(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::ToggleSeriesMonitoring(1)) + .await + .is_ok() + ); async_details_server.assert_async().await; async_toggle_server.assert_async().await; @@ -420,25 +394,20 @@ mod tests { #[tokio::test] async fn test_handle_get_series_details_event() { let expected_series: Series = serde_json::from_str(SERIES_JSON).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(serde_json::from_str(SERIES_JSON).unwrap()), - None, - SonarrEvent::GetSeriesDetails(1), - Some("/1"), - None, - ) - .await; - app_arc + let (async_server, app, _server) = MockServarrApi::get() + .returns(serde_json::from_str(SERIES_JSON).unwrap()) + .path("/1") + .build_for(SonarrEvent::GetSeriesDetails(1)) + .await; + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Series(series) = network .handle_sonarr_event(SonarrEvent::GetSeriesDetails(1)) @@ -496,16 +465,11 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetSeriesHistory(1), - None, - Some("seriesId=1"), - ) - .await; + let (async_server, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("seriesId=1") + .build_for(SonarrEvent::GetSeriesHistory(1)) + .await; let mut series_history_table = StatefulTable { sort_asc: true, ..StatefulTable::default() @@ -525,16 +489,16 @@ mod tests { }; series_history_table.sorting(vec![history_sort_option]); } - app_arc + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc.lock().await.data.sonarr_data.series_history = Some(series_history_table); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.data.sonarr_data.series_history = Some(series_history_table); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryItems(history_items) = network .handle_sonarr_event(SonarrEvent::GetSeriesHistory(1)) @@ -542,15 +506,9 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .series_history - .is_some()); + assert!(app.lock().await.data.sonarr_data.series_history.is_some()); assert_eq!( - app_arc + app .lock() .await .data @@ -562,7 +520,7 @@ mod tests { expected_history_items ); assert!( - app_arc + app .lock() .await .data @@ -619,25 +577,20 @@ mod tests { ..history_item() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetSeriesHistory(1), - None, - Some("seriesId=1"), - ) - .await; - app_arc + let (async_server, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("seriesId=1") + .build_for(SonarrEvent::GetSeriesHistory(1)) + .await; + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryItems(history_items) = network .handle_sonarr_event(SonarrEvent::GetSeriesHistory(1)) @@ -645,15 +598,9 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .series_history - .is_some()); + assert!(app.lock().await.data.sonarr_data.series_history.is_some()); assert_eq!( - app_arc + app .lock() .await .data @@ -665,7 +612,7 @@ mod tests { expected_history_items ); assert!( - !app_arc + !app .lock() .await .data @@ -708,16 +655,11 @@ mod tests { } }]); let response: Vec = serde_json::from_value(history_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(history_json), - None, - SonarrEvent::GetSeriesHistory(1), - None, - Some("seriesId=1"), - ) - .await; + let (async_server, app, _server) = MockServarrApi::get() + .returns(history_json) + .query("seriesId=1") + .build_for(SonarrEvent::GetSeriesHistory(1)) + .await; let cmp_fn = |a: &SonarrHistoryItem, b: &SonarrHistoryItem| { a.source_title .text @@ -733,20 +675,20 @@ mod tests { ..StatefulTable::default() }; series_history_table.sorting(vec![history_sort_option]); - app_arc.lock().await.data.sonarr_data.series_history = Some(series_history_table); - app_arc + app.lock().await.data.sonarr_data.series_history = Some(series_history_table); + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc + app .lock() .await .push_navigation_stack(ActiveSonarrBlock::SeriesHistorySortPrompt.into()); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SonarrHistoryItems(history_items) = network .handle_sonarr_event(SonarrEvent::GetSeriesHistory(1)) @@ -754,24 +696,20 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .series_history - .is_some()); - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .is_empty()); + assert!(app.lock().await.data.sonarr_data.series_history.is_some()); assert!( - app_arc + app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .is_empty() + ); + assert!( + app .lock() .await .data @@ -818,17 +756,11 @@ mod tests { ..series() }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([series_1, series_2])), - None, - SonarrEvent::ListSeries, - None, - None, - ) - .await; - app_arc.lock().await.data.sonarr_data.series.sort_asc = true; + let (async_server, app, _server) = MockServarrApi::get() + .returns(json!([series_1, series_2])) + .build_for(SonarrEvent::ListSeries) + .await; + app.lock().await.data.sonarr_data.series.sort_asc = true; if use_custom_sorting { let cmp_fn = |a: &Series, b: &Series| { a.title @@ -841,7 +773,7 @@ mod tests { name: "Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data @@ -849,8 +781,8 @@ mod tests { .series .sorting(vec![title_sort_option]); } - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SeriesVec(series) = network .handle_sonarr_event(SonarrEvent::ListSeries) @@ -859,10 +791,10 @@ mod tests { { async_server.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.series.items, + app.lock().await.data.sonarr_data.series.items, expected_sorted_series ); - assert!(app_arc.lock().await.data.sonarr_data.series.sort_asc); + assert!(app.lock().await.data.sonarr_data.series.sort_asc); assert_eq!(series, expected_series); } } @@ -875,21 +807,15 @@ mod tests { *series_1.get_mut("title").unwrap() = json!("z test"); *series_2.get_mut("id").unwrap() = json!(2); *series_2.get_mut("title").unwrap() = json!("A test"); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([series_1, series_2])), - None, - SonarrEvent::ListSeries, - None, - None, - ) - .await; - app_arc + let (async_server, app, _server) = MockServarrApi::get() + .returns(json!([series_1, series_2])) + .build_for(SonarrEvent::ListSeries) + .await; + app .lock() .await .push_navigation_stack(ActiveSonarrBlock::SeriesSortPrompt.into()); - app_arc.lock().await.data.sonarr_data.series.sort_asc = true; + app.lock().await.data.sonarr_data.series.sort_asc = true; let cmp_fn = |a: &Series, b: &Series| { a.title .text @@ -900,31 +826,26 @@ mod tests { name: "Title", cmp_fn: Some(cmp_fn), }; - app_arc + app .lock() .await .data .sonarr_data .series .sorting(vec![title_sort_option]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::ListSeries) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::ListSeries) + .await + .is_ok() + ); async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .series - .items - .is_empty()); - assert!(app_arc.lock().await.data.sonarr_data.series.sort_asc); + assert!(app.lock().await.data.sonarr_data.series.items.is_empty()); + assert!(app.lock().await.data.sonarr_data.series.sort_asc); } #[tokio::test] @@ -942,19 +863,14 @@ mod tests { "ratings": { "votes": 406744, "value": 8.4 }, "statistics": { "seasonCount": 3 } }]); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(add_series_search_result_json), - None, - SonarrEvent::SearchNewSeries("test term".into()), - None, - Some("term=test%20term"), - ) - .await; - app_arc.lock().await.data.sonarr_data.add_series_search = Some("test term".into()); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(add_series_search_result_json) + .query("term=test%20term") + .build_for(SonarrEvent::SearchNewSeries("test term".into())) + .await; + app.lock().await.data.sonarr_data.add_series_search = Some("test term".into()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::AddSeriesSearchResults(add_series_search_results) = network .handle_sonarr_event(SonarrEvent::SearchNewSeries("test term".into())) @@ -962,15 +878,17 @@ mod tests { .unwrap() { async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .add_searched_series - .is_some()); + assert!( + app + .lock() + .await + .data + .sonarr_data + .add_searched_series + .is_some() + ); assert_eq!( - app_arc + app .lock() .await .data @@ -987,119 +905,109 @@ mod tests { #[tokio::test] async fn test_handle_search_new_series_event_no_results() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([])), - None, - SonarrEvent::SearchNewSeries("test term".into()), - None, - Some("term=test%20term"), - ) - .await; - app_arc.lock().await.data.sonarr_data.add_series_search = Some("test term".into()); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::get() + .returns(json!([])) + .query("term=test%20term") + .build_for(SonarrEvent::SearchNewSeries("test term".into())) + .await; + app.lock().await.data.sonarr_data.add_series_search = Some("test term".into()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::SearchNewSeries("test term".into())) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::SearchNewSeries("test term".into())) + .await + .is_ok() + ); async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .add_searched_series - .is_none()); + assert!( + app + .lock() + .await + .data + .sonarr_data + .add_searched_series + .is_none() + ); assert_eq!( - app_arc.lock().await.get_current_route(), + app.lock().await.get_current_route(), ActiveSonarrBlock::AddSeriesEmptySearchResults.into() ); } #[tokio::test] async fn test_handle_trigger_automatic_series_search_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "SeriesSearch", "seriesId": 1 - })), - Some(json!({})), - None, - SonarrEvent::TriggerAutomaticSeriesSearch(1), - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::TriggerAutomaticSeriesSearch(1)) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::TriggerAutomaticSeriesSearch(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::TriggerAutomaticSeriesSearch(1)) + .await + .is_ok() + ); async_server.assert_async().await; } #[tokio::test] async fn test_handle_update_all_series_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "RefreshSeries", - })), - Some(json!({})), - None, - SonarrEvent::UpdateAllSeries, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::UpdateAllSeries) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::UpdateAllSeries) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::UpdateAllSeries) + .await + .is_ok() + ); async_server.assert_async().await; } #[tokio::test] async fn test_handle_update_and_scan_series_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (async_server, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "RefreshSeries", "seriesId": 1, - })), - Some(json!({})), - None, - SonarrEvent::UpdateAndScanSeries(1), - None, - None, - ) - .await; - app_arc + })) + .returns(json!({})) + .build_for(SonarrEvent::UpdateAndScanSeries(1)) + .await; + app .lock() .await .data .sonarr_data .series .set_items(vec![series()]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::UpdateAndScanSeries(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::UpdateAndScanSeries(1)) + .await + .is_ok() + ); async_server.assert_async().await; } diff --git a/src/network/sonarr_network/library/sonarr_library_network_tests.rs b/src/network/sonarr_network/library/sonarr_library_network_tests.rs index 7e036a3..0323dd2 100644 --- a/src/network/sonarr_network/library/sonarr_library_network_tests.rs +++ b/src/network/sonarr_network/library/sonarr_library_network_tests.rs @@ -1,12 +1,9 @@ #[cfg(test)] mod tests { use crate::models::sonarr_models::SonarrReleaseDownloadBody; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, RequestMethod}; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_download_sonarr_release_event_uses_provided_params() { @@ -16,28 +13,25 @@ mod tests { series_id: Some(1), ..SonarrReleaseDownloadBody::default() }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "guid": "1234", "indexerId": 2, "seriesId": 1, - })), - Some(json!({})), - None, - SonarrEvent::DownloadRelease(params.clone()), - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::DownloadRelease(params.clone())) + .await; - assert!(network + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); + + let result = network .handle_sonarr_event(SonarrEvent::DownloadRelease(params)) - .await - .is_ok()); + .await; - async_server.assert_async().await; + mock.assert_async().await; + assert!(result.is_ok()); } } diff --git a/src/network/sonarr_network/mod.rs b/src/network/sonarr_network/mod.rs index f97fce5..6d45118 100644 --- a/src/network/sonarr_network/mod.rs +++ b/src/network/sonarr_network/mod.rs @@ -1,6 +1,6 @@ use anyhow::Result; use log::info; -use serde_json::{json, Value}; +use serde_json::{Value, json}; use super::{Network, NetworkEvent, NetworkResource}; use crate::{ diff --git a/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs b/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs index b2a79e3..9cdb416 100644 --- a/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs +++ b/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs @@ -2,71 +2,57 @@ mod tests { use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; use crate::models::sonarr_models::SonarrSerdeable; - use crate::network::network_tests::test_utils::mock_servarr_api; - use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::root_folder; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, RequestMethod}; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::root_folder; use pretty_assertions::assert_eq; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_add_sonarr_root_folder_event() { let expected_add_root_folder_body = AddRootFolderBody { path: "/nfs/test".to_owned(), }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "path": "/nfs/test" - })), - Some(json!({})), - None, - SonarrEvent::AddRootFolder(expected_add_root_folder_body.clone()), - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .returns(json!({})) + .build_for(SonarrEvent::AddRootFolder( + expected_add_root_folder_body.clone(), + )) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::AddRootFolder(expected_add_root_folder_body)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::AddRootFolder(expected_add_root_folder_body)) + .await + .is_ok() + ); - async_server.assert_async().await; - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .edit_root_folder - .is_none()); + mock.assert_async().await; + assert!(app.lock().await.data.sonarr_data.edit_root_folder.is_none()); } #[tokio::test] async fn test_handle_delete_sonarr_root_folder_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteRootFolder(1), - Some("/1"), - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(SonarrEvent::DeleteRootFolder(1)) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteRootFolder(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteRootFolder(1)) + .await + .is_ok() + ); - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -78,27 +64,21 @@ mod tests { "freeSpace": 219902325555200u64, }]); let response: Vec = serde_json::from_value(root_folder_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(root_folder_json), - None, - SonarrEvent::GetRootFolders, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(root_folder_json) + .build_for(SonarrEvent::GetRootFolders) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::RootFolders(root_folders) = network .handle_sonarr_event(SonarrEvent::GetRootFolders) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.root_folders.items, + app.lock().await.data.sonarr_data.root_folders.items, vec![root_folder()] ); assert_eq!(root_folders, response); diff --git a/src/network/sonarr_network/sonarr_network_test_utils.rs b/src/network/sonarr_network/sonarr_network_test_utils.rs index d3e0d4b..aa57d5b 100644 --- a/src/network/sonarr_network/sonarr_network_test_utils.rs +++ b/src/network/sonarr_network/sonarr_network_test_utils.rs @@ -1,5 +1,6 @@ #[cfg(test)] pub(in crate::network::sonarr_network) mod test_utils { + use crate::models::HorizontallyScrollableText; use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; @@ -9,9 +10,8 @@ pub(in crate::network::sonarr_network) mod test_utils { Season, SeasonStatistics, Series, SeriesStatistics, SeriesStatus, SeriesType, SonarrHistoryData, SonarrHistoryEventType, SonarrHistoryItem, SonarrRelease, }; - use crate::models::HorizontallyScrollableText; use chrono::DateTime; - use serde_json::{json, Number}; + use serde_json::{Number, Value, json}; pub const SERIES_JSON: &str = r#"{ "title": "Test", @@ -392,4 +392,11 @@ pub(in crate::network::sonarr_network) mod test_utils { unmapped_folders: None, } } + + pub fn tag() -> Value { + json!({ + "id": 3, + "label": "testing" + }) + } } diff --git a/src/network/sonarr_network/sonarr_network_tests.rs b/src/network/sonarr_network/sonarr_network_tests.rs index 23e5d26..87bdb62 100644 --- a/src/network/sonarr_network/sonarr_network_tests.rs +++ b/src/network/sonarr_network/sonarr_network_tests.rs @@ -9,18 +9,15 @@ mod test { AddSeriesBody, EditSeriesParams, IndexerSettings, SonarrTaskName, }; use crate::models::sonarr_models::{DeleteSeriesParams, SonarrSerdeable}; - use crate::network::{ - network_tests::test_utils::mock_servarr_api, sonarr_network::SonarrEvent, Network, - NetworkEvent, NetworkResource, RequestMethod, - }; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::tag; + use crate::network::{NetworkEvent, NetworkResource, sonarr_network::SonarrEvent}; use bimap::BiMap; use pretty_assertions::{assert_eq, assert_str_eq}; - use reqwest::Client; use rstest::rstest; use serde_json::json; use std::sync::Arc; use tokio::sync::Mutex; - use tokio_util::sync::CancellationToken; #[rstest] fn test_resource_all_indexer_settings( @@ -191,82 +188,73 @@ mod test { #[tokio::test] async fn test_handle_add_sonarr_tag() { - let tag_json = json!({ "id": 3, "label": "testing" }); - let response: Tag = serde_json::from_value(tag_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ "label": "testing" })), - Some(tag_json), - None, - SonarrEvent::AddTag(String::new()), - None, - None, - ) - .await; - app_arc.lock().await.data.sonarr_data.tags_map = - BiMap::from_iter([(1, "usenet".to_owned()), (2, "test".to_owned())]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let expected = Tag { + id: 3, + label: "testing".to_owned(), + }; - if let SonarrSerdeable::Tag(tag) = network + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "label": "testing" })) + .returns(tag()) + .build_for(SonarrEvent::AddTag(String::new())) + .await; + + app.lock().await.data.sonarr_data.tags_map = + BiMap::from_iter([(1, "usenet".to_owned()), (2, "test".to_owned())]); + app.lock().await.server_tabs.next(); + + let mut network = test_network(&app); + + let result = network .handle_sonarr_event(SonarrEvent::AddTag("testing".to_owned())) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.sonarr_data.tags_map, - BiMap::from_iter([ - (1, "usenet".to_owned()), - (2, "test".to_owned()), - (3, "testing".to_owned()) - ]) - ); - assert_eq!(tag, response); - } + .await; + + mock.assert_async().await; + + let SonarrSerdeable::Tag(tag) = result.unwrap() else { + panic!("Expected Tag variant"); + }; + assert_eq!(tag, expected); + assert_eq!( + app.lock().await.data.sonarr_data.tags_map, + BiMap::from_iter([ + (1, "usenet".to_owned()), + (2, "test".to_owned()), + (3, "testing".to_owned()) + ]) + ); } #[tokio::test] async fn test_handle_delete_sonarr_tag_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Delete, - None, - None, - None, - SonarrEvent::DeleteTag(1), - Some("/1"), - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (async_server, app, _server) = MockServarrApi::delete() + .path("/1") + .build_for(SonarrEvent::DeleteTag(1)) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - assert!(network - .handle_sonarr_event(SonarrEvent::DeleteTag(1)) - .await - .is_ok()); + assert!( + network + .handle_sonarr_event(SonarrEvent::DeleteTag(1)) + .await + .is_ok() + ); async_server.assert_async().await; } #[tokio::test] async fn test_handle_get_sonarr_healthcheck_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - None, - None, - SonarrEvent::HealthCheck, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .build_for(SonarrEvent::HealthCheck) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); let _ = network.handle_sonarr_event(SonarrEvent::HealthCheck).await; - async_server.assert_async().await; + mock.assert_async().await; } #[tokio::test] @@ -276,31 +264,27 @@ mod test { "name": "English" }]); let response: Vec = serde_json::from_value(language_profiles_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(language_profiles_json), - None, - SonarrEvent::GetLanguageProfiles, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(language_profiles_json) + .build_for(SonarrEvent::GetLanguageProfiles) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - if let SonarrSerdeable::LanguageProfiles(language_profiles) = network + let result = network .handle_sonarr_event(SonarrEvent::GetLanguageProfiles) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.sonarr_data.language_profiles_map, - BiMap::from_iter([(2222i64, "English".to_owned())]) - ); - assert_eq!(language_profiles, response); - } + .await; + + mock.assert_async().await; + + let SonarrSerdeable::LanguageProfiles(language_profiles) = result.unwrap() else { + panic!("Expected the LanguageProfiles variant") + }; + assert_eq!( + app.lock().await.data.sonarr_data.language_profiles_map, + BiMap::from_iter([(2222i64, "English".to_owned())]) + ); + assert_eq!(language_profiles, response); } #[tokio::test] @@ -311,31 +295,27 @@ mod test { }]); let response: Vec = serde_json::from_value(quality_profile_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(quality_profile_json), - None, - SonarrEvent::GetQualityProfiles, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(quality_profile_json) + .build_for(SonarrEvent::GetQualityProfiles) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - if let SonarrSerdeable::QualityProfiles(quality_profiles) = network + let result = network .handle_sonarr_event(SonarrEvent::GetQualityProfiles) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.sonarr_data.quality_profile_map, - BiMap::from_iter([(2222i64, "HD - 1080p".to_owned())]) - ); - assert_eq!(quality_profiles, response); - } + .await; + + mock.assert_async().await; + + let SonarrSerdeable::QualityProfiles(quality_profiles) = result.unwrap() else { + panic!("Expected the QualityProfiles variant") + }; + assert_eq!( + app.lock().await.data.sonarr_data.quality_profile_map, + BiMap::from_iter([(2222i64, "HD - 1080p".to_owned())]) + ); + assert_eq!(quality_profiles, response); } #[tokio::test] @@ -345,31 +325,26 @@ mod test { "label": "usenet" }]); let response: Vec = serde_json::from_value(tags_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(tags_json), - None, - SonarrEvent::GetTags, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(tags_json) + .build_for(SonarrEvent::GetTags) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); - if let SonarrSerdeable::Tags(tags) = network - .handle_sonarr_event(SonarrEvent::GetTags) - .await - .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.sonarr_data.tags_map, - BiMap::from_iter([(2222i64, "usenet".to_owned())]) - ); - assert_eq!(tags, response); - } + let result = network.handle_sonarr_event(SonarrEvent::GetTags).await; + + mock.assert_async().await; + + let SonarrSerdeable::Tags(tags) = result.unwrap() else { + panic!("Expected the Tag variant") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.tags_map, + BiMap::from_iter([(2222i64, "usenet".to_owned())]) + ); + assert_eq!(tags, response); } #[tokio::test] @@ -385,7 +360,7 @@ mod test { ]); } app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let mut network = test_network(&app_arc); assert_eq!( network.extract_and_add_sonarr_tag_ids_vec(tags).await, @@ -395,35 +370,30 @@ mod test { #[tokio::test] async fn test_extract_and_add_sonarr_tag_ids_vec_add_missing_tags_first() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ "label": "TESTING" })), - Some(json!({ "id": 3, "label": "testing" })), - None, - SonarrEvent::GetTags, - None, - None, - ) - .await; + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "label": "TESTING" })) + .returns(json!({ "id": 3, "label": "testing" })) + .build_for(SonarrEvent::GetTags) + .await; let tags = "usenet, test, TESTING"; { - let mut app = app_arc.lock().await; - app.data.sonarr_data.add_series_modal = Some(AddSeriesModal { + let mut app_guard = app.lock().await; + app_guard.data.sonarr_data.add_series_modal = Some(AddSeriesModal { tags: tags.into(), ..AddSeriesModal::default() }); - app.data.sonarr_data.tags_map = + app_guard.data.sonarr_data.tags_map = BiMap::from_iter([(1, "usenet".to_owned()), (2, "test".to_owned())]); } - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); let tag_ids_vec = network.extract_and_add_sonarr_tag_ids_vec(tags).await; - async_server.assert_async().await; + mock.assert_async().await; assert_eq!(tag_ids_vec, vec![1, 2, 3]); assert_eq!( - app_arc.lock().await.data.sonarr_data.tags_map, + app.lock().await.data.sonarr_data.tags_map, BiMap::from_iter([ (1, "usenet".to_owned()), (2, "test".to_owned()), diff --git a/src/network/sonarr_network/system/sonarr_system_network_tests.rs b/src/network/sonarr_network/system/sonarr_system_network_tests.rs index 4ee3f37..0e001c5 100644 --- a/src/network/sonarr_network/system/sonarr_system_network_tests.rs +++ b/src/network/sonarr_network/system/sonarr_system_network_tests.rs @@ -5,15 +5,12 @@ mod tests { }; use crate::models::sonarr_models::{SonarrSerdeable, SonarrTask, SonarrTaskName, SystemStatus}; use crate::models::{HorizontallyScrollableText, ScrollableText}; - use crate::network::network_tests::test_utils::mock_servarr_api; + use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; - use crate::network::{Network, RequestMethod}; use chrono::DateTime; use indoc::formatdoc; use pretty_assertions::{assert_eq, assert_str_eq}; - use reqwest::Client; use serde_json::json; - use tokio_util::sync::CancellationToken; #[tokio::test] async fn test_handle_get_sonarr_host_config_event() { @@ -29,25 +26,19 @@ mod tests { "sslCertPassword": "test" }); let response: HostConfig = serde_json::from_value(host_config_response.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(host_config_response), - None, - SonarrEvent::GetHostConfig, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(host_config_response) + .build_for(SonarrEvent::GetHostConfig) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::HostConfig(host_config) = network .handle_sonarr_event(SonarrEvent::GetHostConfig) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!(host_config, response); } } @@ -85,48 +76,40 @@ mod tests { ] }); let response: LogResponse = serde_json::from_value(logs_response_json.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(logs_response_json), - None, - SonarrEvent::GetLogs(500), - None, - Some("pageSize=500&sortDirection=descending&sortKey=time"), - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(logs_response_json) + .query("pageSize=500&sortDirection=descending&sortKey=time") + .build_for(SonarrEvent::GetLogs(500)) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::LogResponse(logs) = network .handle_sonarr_event(SonarrEvent::GetLogs(500)) .await .unwrap() { - async_server.assert_async().await; - assert_eq!( - app_arc.lock().await.data.sonarr_data.logs.items, - expected_logs + mock.assert_async().await; + assert_eq!(app.lock().await.data.sonarr_data.logs.items, expected_logs); + assert!( + app + .lock() + .await + .data + .sonarr_data + .logs + .current_selection() + .text + .contains("INFO") ); - assert!(app_arc - .lock() - .await - .data - .sonarr_data - .logs - .current_selection() - .text - .contains("INFO")); assert_eq!(logs, response); } } #[tokio::test] async fn test_handle_get_sonarr_diskspace_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!([ + let (mock, app, _server) = MockServarrApi::get() + .returns(json!([ { "freeSpace": 1111, "totalSpace": 2222, @@ -135,15 +118,11 @@ mod tests { "freeSpace": 3333, "totalSpace": 4444 } - ])), - None, - SonarrEvent::GetDiskSpace, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + ])) + .build_for(SonarrEvent::GetDiskSpace) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); let disk_space_vec = vec![ DiskSpace { free_space: 1111, @@ -160,9 +139,9 @@ mod tests { .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.disk_space_vec, + app.lock().await.data.sonarr_data.disk_space_vec, disk_space_vec ); assert_eq!(disk_space, disk_space_vec); @@ -194,27 +173,21 @@ mod tests { trigger: "scheduled".to_owned(), }; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(queued_events_json), - None, - SonarrEvent::GetQueuedEvents, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(queued_events_json) + .build_for(SonarrEvent::GetQueuedEvents) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::QueueEvents(events) = network .handle_sonarr_event(SonarrEvent::GetQueuedEvents) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.queued_events.items, + app.lock().await.data.sonarr_data.queued_events.items, vec![expected_event] ); assert_eq!(events, response); @@ -233,46 +206,34 @@ mod tests { }); let response: SecurityConfig = serde_json::from_value(security_config_response.clone()).unwrap(); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(security_config_response), - None, - SonarrEvent::GetSecurityConfig, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(security_config_response) + .build_for(SonarrEvent::GetSecurityConfig) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::SecurityConfig(security_config) = network .handle_sonarr_event(SonarrEvent::GetSecurityConfig) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!(security_config, response); } } #[tokio::test] async fn test_handle_get_status_event() { - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(json!({ + let (mock, app, _server) = MockServarrApi::get() + .returns(json!({ "version": "v1", "startTime": "2023-02-25T20:16:43Z" - })), - None, - SonarrEvent::GetStatus, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + })) + .build_for(SonarrEvent::GetStatus) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); let date_time = DateTime::from(DateTime::parse_from_rfc3339("2023-02-25T20:16:43Z").unwrap()); if let SonarrSerdeable::SystemStatus(status) = network @@ -280,9 +241,9 @@ mod tests { .await .unwrap() { - async_server.assert_async().await; - assert_str_eq!(app_arc.lock().await.data.sonarr_data.version, "v1"); - assert_eq!(app_arc.lock().await.data.sonarr_data.start_time, date_time); + mock.assert_async().await; + assert_str_eq!(app.lock().await.data.sonarr_data.version, "v1"); + assert_eq!(app.lock().await.data.sonarr_data.start_time, date_time); assert_eq!( status, SystemStatus { @@ -327,27 +288,21 @@ mod tests { next_execution: timestamp, }, ]; - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(tasks_json), - None, - SonarrEvent::GetTasks, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(tasks_json) + .build_for(SonarrEvent::GetTasks) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Tasks(tasks) = network .handle_sonarr_event(SonarrEvent::GetTasks) .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!( - app_arc.lock().await.data.sonarr_data.tasks.items, + app.lock().await.data.sonarr_data.tasks.items, expected_tasks ); assert_eq!(tasks, response); @@ -408,43 +363,44 @@ mod tests { * Cool new thing Fixed: * Some bugs killed - - + + 3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) {line_break} New: * Cool new thing (old) * Other cool new thing (old) - - - 2.1.0 - 2023-04-15 02:02:53 UTC + + + 2.1.0 - 2023-04-15 02:02:53 UTC {line_break} Fixed: * Killed bug 1 * Fixed bug 2" )); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Get, - None, - Some(updates_json), - None, - SonarrEvent::GetUpdates, - None, - None, - ) - .await; - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + let (mock, app, _server) = MockServarrApi::get() + .returns(updates_json) + .build_for(SonarrEvent::GetUpdates) + .await; + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Updates(updates) = network .handle_sonarr_event(SonarrEvent::GetUpdates) .await .unwrap() { - async_server.assert_async().await; - assert_str_eq!( - app_arc.lock().await.data.sonarr_data.updates.get_text(), - expected_text.get_text() + mock.assert_async().await; + let actual_text = app.lock().await.data.sonarr_data.updates.get_text(); + let expected = expected_text.get_text(); + + // Trim trailing whitespace from each line for comparison + let actual_trimmed: Vec<&str> = actual_text.lines().map(|l| l.trim_end()).collect(); + let expected_trimmed: Vec<&str> = expected.lines().map(|l| l.trim_end()).collect(); + + assert_eq!( + actual_trimmed, expected_trimmed, + "Updates text mismatch (after trimming trailing whitespace)" ); assert_eq!(updates, response); } @@ -453,19 +409,16 @@ mod tests { #[tokio::test] async fn test_handle_start_sonarr_task_event() { let response = json!({ "test": "test"}); - let (async_server, app_arc, _server) = mock_servarr_api( - RequestMethod::Post, - Some(json!({ + let (mock, app, _server) = MockServarrApi::post() + .with_request_body(json!({ "name": "ApplicationUpdateCheck" - })), - Some(response.clone()), - None, - SonarrEvent::StartTask(SonarrTaskName::ApplicationUpdateCheck), - None, - None, - ) - .await; - app_arc + })) + .returns(response.clone()) + .build_for(SonarrEvent::StartTask( + SonarrTaskName::ApplicationUpdateCheck, + )) + .await; + app .lock() .await .data @@ -475,8 +428,8 @@ mod tests { task_name: SonarrTaskName::default(), ..SonarrTask::default() }]); - app_arc.lock().await.server_tabs.next(); - let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); + app.lock().await.server_tabs.next(); + let mut network = test_network(&app); if let SonarrSerdeable::Value(value) = network .handle_sonarr_event(SonarrEvent::StartTask( @@ -485,7 +438,7 @@ mod tests { .await .unwrap() { - async_server.assert_async().await; + mock.assert_async().await; assert_eq!(value, response); } } diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 78a89f2..b2ed9b3 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,6 +1,7 @@ use std::cell::Cell; use std::sync::atomic::Ordering; +use ratatui::Frame; use ratatui::layout::{Constraint, Flex, Layout, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::{Line, Text}; @@ -8,7 +9,6 @@ use ratatui::widgets::Paragraph; use ratatui::widgets::Tabs; use ratatui::widgets::Wrap; use ratatui::widgets::{Clear, Row}; -use ratatui::Frame; use sonarr_ui::SonarrUi; use utils::layout_block; diff --git a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs index 7609341..c476ec5 100644 --- a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; - use crate::ui::radarr_ui::blocklist::BlocklistUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::blocklist::BlocklistUi; use strum::IntoEnumIterator; #[test] diff --git a/src/ui/radarr_ui/blocklist/mod.rs b/src/ui/radarr_ui/blocklist/mod.rs index c6b30f0..1f1179a 100644 --- a/src/ui/radarr_ui/blocklist/mod.rs +++ b/src/ui/radarr_ui/blocklist/mod.rs @@ -1,19 +1,19 @@ use crate::app::App; +use crate::models::Route; use crate::models::radarr_models::BlocklistItem; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{get_width_from_percentage, layout_block_top_border}; use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; +use ratatui::Frame; use ratatui::layout::{Alignment, Constraint, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::{Line, Text}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; #[cfg(test)] #[path = "blocklist_ui_tests.rs"] diff --git a/src/ui/radarr_ui/collections/collection_details_ui.rs b/src/ui/radarr_ui/collections/collection_details_ui.rs index 7b9337e..a7718d4 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui.rs @@ -1,15 +1,15 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Flex, Layout, Rect}; use ratatui::style::Stylize; use ratatui::text::{Line, Text}; use ratatui::widgets::{Cell, Paragraph, Row, Wrap}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::radarr_models::CollectionMovie; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, }; -use crate::models::Route; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{ borderless_block, get_width_from_percentage, layout_block_top_border_with_title, title_block, @@ -17,7 +17,7 @@ use crate::ui::utils::{ }; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; use crate::utils::convert_runtime; #[cfg(test)] diff --git a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs index 871c688..fae0a22 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, }; - use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; #[test] fn test_collection_details_ui_accepts() { diff --git a/src/ui/radarr_ui/collections/collections_ui_tests.rs b/src/ui/radarr_ui/collections/collections_ui_tests.rs index 1f66677..09cde4a 100644 --- a/src/ui/radarr_ui/collections/collections_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collections_ui_tests.rs @@ -3,10 +3,10 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, COLLECTIONS_BLOCKS, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS, + ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS, }; - use crate::ui::radarr_ui::collections::CollectionsUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::collections::CollectionsUi; #[test] fn test_collections_ui_accepts() { diff --git a/src/ui/radarr_ui/collections/edit_collection_ui.rs b/src/ui/radarr_ui/collections/edit_collection_ui.rs index 407eb23..38ef03c 100644 --- a/src/ui/radarr_ui/collections/edit_collection_ui.rs +++ b/src/ui/radarr_ui/collections/edit_collection_ui.rs @@ -1,14 +1,14 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::widgets::ListItem; -use ratatui::Frame; use std::sync::atomic::Ordering; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS, }; -use crate::models::Route; use crate::render_selectable_input_box; use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; use crate::ui::styles::ManagarrStyle; @@ -18,7 +18,7 @@ use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; #[cfg(test)] #[path = "edit_collection_ui_tests.rs"] @@ -42,10 +42,10 @@ impl DrawUi for EditCollectionUi { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { if let Route::Radarr(active_radarr_block, context_option) = app.get_current_route() { - if let Some(context) = context_option { - if COLLECTION_DETAILS_BLOCKS.contains(&context) { - draw_popup(f, app, CollectionDetailsUi::draw, Size::Large); - } + if let Some(context) = context_option + && COLLECTION_DETAILS_BLOCKS.contains(&context) + { + draw_popup(f, app, CollectionDetailsUi::draw, Size::Large); } draw_popup( @@ -100,19 +100,27 @@ fn draw_edit_collection_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_> let selected_minimum_availability = minimum_availability_list.current_selection(); let selected_quality_profile = quality_profile_list.current_selection(); - let [paragraph_area, monitored_area, min_availability_area, quality_profile_area, root_folder_area, search_on_add_area, _, buttons_area] = - Layout::vertical([ - Constraint::Length(6), - 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 [ + paragraph_area, + monitored_area, + min_availability_area, + quality_profile_area, + root_folder_area, + search_on_add_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Length(6), + 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); diff --git a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs index 6e37d4b..e458671 100644 --- a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +++ b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS, }; - use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi; #[test] fn test_edit_collection_ui_accepts() { diff --git a/src/ui/radarr_ui/collections/mod.rs b/src/ui/radarr_ui/collections/mod.rs index 90034e7..4e19ec8 100644 --- a/src/ui/radarr_ui/collections/mod.rs +++ b/src/ui/radarr_ui/collections/mod.rs @@ -1,11 +1,12 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::radarr_models::Collection; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, COLLECTIONS_BLOCKS}; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi; use crate::ui::styles::ManagarrStyle; @@ -13,7 +14,6 @@ use crate::ui::utils::{get_width_from_percentage, 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; mod collection_details_ui; #[cfg(test)] diff --git a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs index c6b6bc0..a1c4d9c 100644 --- a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; - use crate::ui::radarr_ui::downloads::DownloadsUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::downloads::DownloadsUi; #[test] fn test_downloads_ui_accepts() { diff --git a/src/ui/radarr_ui/downloads/mod.rs b/src/ui/radarr_ui/downloads/mod.rs index 6f27f39..b2a4692 100644 --- a/src/ui/radarr_ui/downloads/mod.rs +++ b/src/ui/radarr_ui/downloads/mod.rs @@ -1,17 +1,17 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; use crate::models::{HorizontallyScrollableText, Route}; +use crate::ui::DrawUi; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{get_width_from_percentage, 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; use crate::utils::convert_to_gb; #[cfg(test)] diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui.rs index 85fc58a..cd7f52a 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui.rs @@ -1,8 +1,8 @@ use std::sync::atomic::Ordering; use crate::app::App; -use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::Route; +use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; use crate::render_selectable_input_box; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::title_block_centered; @@ -11,9 +11,9 @@ use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; -use ratatui::layout::{Constraint, Flex, Layout, Rect}; +use crate::ui::{DrawUi, draw_popup}; use ratatui::Frame; +use ratatui::layout::{Constraint, Flex, Layout, Rect}; #[cfg(test)] #[path = "edit_indexer_ui_tests.rs"] @@ -55,15 +55,20 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { Layout::horizontal([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]) .margin(1) .areas(settings_area); - let [name_area, rss_area, auto_search_area, interactive_search_area, priority_area] = - Layout::vertical([ - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - ]) - .areas(left_side_area); + let [ + name_area, + rss_area, + auto_search_area, + interactive_search_area, + priority_area, + ] = Layout::vertical([ + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + ]) + .areas(left_side_area); let [url_area, api_key_area, seed_ratio_area, tags_area] = Layout::vertical([ Constraint::Length(3), Constraint::Length(3), diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs index 09b1c97..bf89691 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; - use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use strum::IntoEnumIterator; #[test] diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui.rs index 1aa709c..a8343a9 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui.rs @@ -1,13 +1,13 @@ use std::sync::atomic::Ordering; -use ratatui::layout::{Constraint, Flex, Layout, Rect}; use ratatui::Frame; +use ratatui::layout::{Constraint, Flex, Layout, Rect}; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, }; -use crate::models::Route; use crate::render_selectable_input_box; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::title_block_centered; @@ -16,7 +16,7 @@ use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; #[cfg(test)] #[path = "indexer_settings_ui_tests.rs"] @@ -62,21 +62,30 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Layout::horizontal([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]) .margin(1) .areas(settings_area); - let [min_age_area, retention_area, max_size_area, prefer_flags_area] = Layout::vertical([ + let [ + min_age_area, + retention_area, + max_size_area, + prefer_flags_area, + ] = Layout::vertical([ Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), Constraint::Length(3), ]) .areas(left_side_area); - let [availability_delay_area, rss_sync_interval_area, whitelisted_sub_tags_area, allow_hardcoded_subs_area] = - Layout::vertical([ - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - ]) - .areas(right_side_area); + let [ + availability_delay_area, + rss_sync_interval_area, + whitelisted_sub_tags_area, + allow_hardcoded_subs_area, + ] = Layout::vertical([ + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + ]) + .areas(right_side_area); if let Route::Radarr(active_radarr_block, _) = app.get_current_route() { let min_age = indexer_settings.minimum_age.to_string(); diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs index bef1814..e2cb89b 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, }; - use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; #[test] fn test_indexer_settings_ui_accepts() { diff --git a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs index 4bf9eec..214cded 100644 --- a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs @@ -3,10 +3,10 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, + ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; - use crate::ui::radarr_ui::indexers::IndexersUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::indexers::IndexersUi; #[test] fn test_indexers_ui_accepts() { diff --git a/src/ui/radarr_ui/indexers/mod.rs b/src/ui/radarr_ui/indexers/mod.rs index d1864a6..bc63c90 100644 --- a/src/ui/radarr_ui/indexers/mod.rs +++ b/src/ui/radarr_ui/indexers/mod.rs @@ -1,13 +1,14 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::Text; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, INDEXERS_BLOCKS}; use crate::models::servarr_models::Indexer; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; @@ -18,7 +19,6 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; mod edit_indexer_ui; mod indexer_settings_ui; diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs index b24375c..afa165d 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs @@ -1,15 +1,15 @@ use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; -use crate::models::Route; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{get_width_from_percentage, title_block}; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; #[cfg(test)] #[path = "test_all_indexers_ui_tests.rs"] diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs index 66ffea8..6b19994 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; #[test] fn test_test_all_indexers_ui_accepts() { diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index f981e52..e6defa9 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -1,13 +1,13 @@ use std::sync::atomic::Ordering; +use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::widgets::{Cell, ListItem, Row}; -use ratatui::Frame; +use crate::models::Route; use crate::models::radarr_models::AddMovieSearchResult; use crate::models::servarr_data::radarr::modals::AddMovieModal; -use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; -use crate::models::Route; +use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; use crate::ui::radarr_ui::collections::CollectionsUi; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{ @@ -19,9 +19,9 @@ use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; use crate::utils::convert_runtime; -use crate::{render_selectable_input_box, App}; +use crate::{App, render_selectable_input_box}; #[cfg(test)] #[path = "add_movie_ui_tests.rs"] @@ -297,19 +297,27 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { f.render_widget(title_block_centered(&title), area); - let [paragraph_area, root_folder_area, monitor_area, min_availability_area, quality_profile_area, tags_area, _, buttons_area] = - Layout::vertical([ - Constraint::Length(6), - 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 [ + paragraph_area, + root_folder_area, + monitor_area, + min_availability_area, + quality_profile_area, + tags_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Length(6), + 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 prompt_paragraph = layout_paragraph_borderless(&prompt); f.render_widget(prompt_paragraph, paragraph_area); diff --git a/src/ui/radarr_ui/library/add_movie_ui_tests.rs b/src/ui/radarr_ui/library/add_movie_ui_tests.rs index ff24d30..417ffc5 100644 --- a/src/ui/radarr_ui/library/add_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/add_movie_ui_tests.rs @@ -2,9 +2,9 @@ mod tests { use strum::IntoEnumIterator; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; - use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi; + use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; use crate::ui::DrawUi; + use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi; #[test] fn test_add_movie_ui_accepts() { diff --git a/src/ui/radarr_ui/library/delete_movie_ui.rs b/src/ui/radarr_ui/library/delete_movie_ui.rs index 9a338da..95ce33e 100644 --- a/src/ui/radarr_ui/library/delete_movie_ui.rs +++ b/src/ui/radarr_ui/library/delete_movie_ui.rs @@ -1,13 +1,13 @@ -use ratatui::layout::Rect; use ratatui::Frame; +use ratatui::layout::Rect; use crate::app::App; -use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; use crate::models::Route; +use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; +use crate::ui::DrawUi; use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; #[cfg(test)] #[path = "delete_movie_ui_tests.rs"] diff --git a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs index 625ce88..8fbd936 100644 --- a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; - use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi; #[test] fn test_delete_movie_ui_accepts() { diff --git a/src/ui/radarr_ui/library/edit_movie_ui.rs b/src/ui/radarr_ui/library/edit_movie_ui.rs index bc2a8c6..cfc9df9 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui.rs @@ -1,16 +1,16 @@ use std::sync::atomic::Ordering; +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::prelude::Layout; use ratatui::widgets::ListItem; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, MOVIE_DETAILS_BLOCKS, }; -use crate::models::Route; use crate::render_selectable_input_box; use crate::ui::radarr_ui::library::movie_details_ui::MovieDetailsUi; @@ -21,7 +21,7 @@ use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; #[cfg(test)] #[path = "edit_movie_ui_tests.rs"] @@ -40,10 +40,10 @@ impl DrawUi for EditMovieUi { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { if let Route::Radarr(active_radarr_block, context_option) = app.get_current_route() { - if let Some(context) = context_option { - if MOVIE_DETAILS_BLOCKS.contains(&context) { - draw_popup(f, app, MovieDetailsUi::draw, Size::Large); - } + if let Some(context) = context_option + && MOVIE_DETAILS_BLOCKS.contains(&context) + { + draw_popup(f, app, MovieDetailsUi::draw, Size::Large); } draw_popup(f, app, draw_edit_movie_confirmation_prompt, Size::Medium); @@ -92,19 +92,27 @@ fn draw_edit_movie_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, are let selected_minimum_availability = minimum_availability_list.current_selection(); let selected_quality_profile = quality_profile_list.current_selection(); - let [paragraph_area, monitored_area, min_availability_area, quality_profile_area, path_area, tags_area, _, buttons_area] = - Layout::vertical([ - Constraint::Length(6), - 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 [ + paragraph_area, + monitored_area, + min_availability_area, + quality_profile_area, + path_area, + tags_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Length(6), + 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); diff --git a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs index ccaf1ac..a2d802e 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS}; - use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi; #[test] fn test_edit_movie_ui_accepts() { diff --git a/src/ui/radarr_ui/library/library_ui_tests.rs b/src/ui/radarr_ui/library/library_ui_tests.rs index 357def9..e1a91b1 100644 --- a/src/ui/radarr_ui/library/library_ui_tests.rs +++ b/src/ui/radarr_ui/library/library_ui_tests.rs @@ -3,11 +3,11 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_BLOCKS, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, + ADD_MOVIE_BLOCKS, ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, MOVIE_DETAILS_BLOCKS, }; - use crate::ui::radarr_ui::library::LibraryUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::library::LibraryUi; #[test] fn test_library_ui_accepts() { diff --git a/src/ui/radarr_ui/library/mod.rs b/src/ui/radarr_ui/library/mod.rs index c683fd0..811851e 100644 --- a/src/ui/radarr_ui/library/mod.rs +++ b/src/ui/radarr_ui/library/mod.rs @@ -1,11 +1,12 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, LIBRARY_BLOCKS}; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::radarr_ui::decorate_with_row_style; use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi; use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi; @@ -15,7 +16,6 @@ use crate::ui::utils::{get_width_from_percentage, 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; use crate::utils::{convert_runtime, convert_to_gb}; mod add_movie_ui; diff --git a/src/ui/radarr_ui/library/movie_details_ui.rs b/src/ui/radarr_ui/library/movie_details_ui.rs index d7291c0..53b3a77 100644 --- a/src/ui/radarr_ui/library/movie_details_ui.rs +++ b/src/ui/radarr_ui/library/movie_details_ui.rs @@ -1,17 +1,17 @@ use std::iter; +use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::{Line, Span, Text}; use ratatui::widgets::{Cell, Paragraph, Row, Wrap}; -use ratatui::Frame; use serde_json::Number; use crate::app::App; +use crate::models::Route; use crate::models::radarr_models::{Credit, MovieHistoryItem, RadarrRelease}; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; -use crate::models::Route; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{ borderless_block, decorate_peer_style, get_width_from_percentage, layout_block_bottom_border, @@ -21,7 +21,7 @@ use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::{draw_popup, draw_tabs, DrawUi}; +use crate::ui::{DrawUi, draw_popup, draw_tabs}; use crate::utils::convert_to_gb; #[cfg(test)] @@ -117,16 +117,22 @@ fn draw_file_info(f: &mut Frame<'_>, app: &App<'_>, area: Rect) { let file_info = movie_details_modal.file_details.to_owned(); let audio_details = movie_details_modal.audio_details.to_owned(); let video_details = movie_details_modal.video_details.to_owned(); - let [file_details_title_area, file_details_area, audio_details_title_area, audio_details_area, video_details_title_area, video_details_area] = - Layout::vertical([ - Constraint::Length(2), - Constraint::Length(5), - Constraint::Length(1), - Constraint::Length(6), - Constraint::Length(1), - Constraint::Length(7), - ]) - .areas(area); + let [ + file_details_title_area, + file_details_area, + audio_details_title_area, + audio_details_area, + video_details_title_area, + video_details_area, + ] = Layout::vertical([ + Constraint::Length(2), + Constraint::Length(5), + Constraint::Length(1), + Constraint::Length(6), + Constraint::Length(1), + Constraint::Length(7), + ]) + .areas(area); let file_details_title_paragraph = Paragraph::new("File Details".bold()).block(layout_block_top_border()); diff --git a/src/ui/radarr_ui/library/movie_details_ui_tests.rs b/src/ui/radarr_ui/library/movie_details_ui_tests.rs index 9d99d6f..1eb204e 100644 --- a/src/ui/radarr_ui/library/movie_details_ui_tests.rs +++ b/src/ui/radarr_ui/library/movie_details_ui_tests.rs @@ -6,11 +6,11 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; + use crate::ui::DrawUi; use crate::ui::radarr_ui::library::movie_details_ui::{ - style_from_download_status, MovieDetailsUi, + MovieDetailsUi, style_from_download_status, }; use crate::ui::styles::ManagarrStyle; - use crate::ui::DrawUi; #[test] fn test_movie_details_ui_accepts() { diff --git a/src/ui/radarr_ui/mod.rs b/src/ui/radarr_ui/mod.rs index 5e18a70..4868bca 100644 --- a/src/ui/radarr_ui/mod.rs +++ b/src/ui/radarr_ui/mod.rs @@ -1,18 +1,19 @@ use std::{cmp, iter}; use chrono::{Duration, Utc}; +use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::prelude::Stylize; use ratatui::text::Text; use ratatui::widgets::{Paragraph, Row}; -use ratatui::Frame; use crate::app::App; use crate::logos::RADARR_LOGO; +use crate::models::Route; use crate::models::radarr_models::{DownloadRecord, Movie}; use crate::models::servarr_data::radarr::radarr_data::RadarrData; use crate::models::servarr_models::{DiskSpace, RootFolder}; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::draw_tabs; use crate::ui::radarr_ui::blocklist::BlocklistUi; use crate::ui::radarr_ui::collections::CollectionsUi; @@ -26,7 +27,6 @@ use crate::ui::utils::{ borderless_block, layout_block, line_gauge_with_label, line_gauge_with_title, title_block, }; use crate::ui::widgets::loading_block::LoadingBlock; -use crate::ui::DrawUi; use crate::utils::convert_to_gb; mod blocklist; diff --git a/src/ui/radarr_ui/root_folders/mod.rs b/src/ui/radarr_ui/root_folders/mod.rs index f2361e1..36bdc1e 100644 --- a/src/ui/radarr_ui/root_folders/mod.rs +++ b/src/ui/radarr_ui/root_folders/mod.rs @@ -1,17 +1,17 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::RootFolder; -use crate::models::Route; 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::{draw_input_box_popup, draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_input_box_popup, draw_popup}; use crate::utils::convert_to_gb; #[cfg(test)] diff --git a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs index 5a312c4..bed74ce 100644 --- a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; - use crate::ui::radarr_ui::root_folders::RootFoldersUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::root_folders::RootFoldersUi; #[test] fn test_root_folders_ui_accepts() { diff --git a/src/ui/radarr_ui/system/mod.rs b/src/ui/radarr_ui/system/mod.rs index 715197f..10e0d20 100644 --- a/src/ui/radarr_ui/system/mod.rs +++ b/src/ui/radarr_ui/system/mod.rs @@ -6,9 +6,9 @@ use ratatui::style::Style; use ratatui::text::{Span, Text}; use ratatui::widgets::{Cell, Row}; use ratatui::{ + Frame, layout::{Constraint, Rect}, widgets::ListItem, - Frame, }; use crate::app::App; @@ -23,7 +23,7 @@ use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::selectable_list::SelectableList; use crate::{ models::Route, - ui::{utils::title_block, DrawUi}, + ui::{DrawUi, utils::title_block}, }; mod system_details_ui; diff --git a/src/ui/radarr_ui/system/system_details_ui.rs b/src/ui/radarr_ui/system/system_details_ui.rs index bdd6afd..ee0741a 100644 --- a/src/ui/radarr_ui/system/system_details_ui.rs +++ b/src/ui/radarr_ui/system/system_details_ui.rs @@ -1,14 +1,14 @@ +use ratatui::Frame; use ratatui::layout::Rect; use ratatui::text::{Span, Text}; use ratatui::widgets::{Cell, ListItem, Paragraph, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::radarr_models::RadarrTask; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS}; -use crate::models::Route; use crate::ui::radarr_ui::system::{ - draw_queued_events, extract_task_props, TASK_TABLE_CONSTRAINTS, TASK_TABLE_HEADERS, + TASK_TABLE_CONSTRAINTS, TASK_TABLE_HEADERS, draw_queued_events, extract_task_props, }; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{borderless_block, style_log_list_item, title_block}; @@ -17,7 +17,7 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; #[cfg(test)] #[path = "system_details_ui_tests.rs"] diff --git a/src/ui/radarr_ui/system/system_details_ui_tests.rs b/src/ui/radarr_ui/system/system_details_ui_tests.rs index 0690fb7..ff77c51 100644 --- a/src/ui/radarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_details_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, }; - use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi; #[test] fn test_system_details_ui_accepts() { diff --git a/src/ui/radarr_ui/system/system_ui_tests.rs b/src/ui/radarr_ui/system/system_ui_tests.rs index 797e1b0..d41ae77 100644 --- a/src/ui/radarr_ui/system/system_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, }; - use crate::ui::radarr_ui::system::SystemUi; use crate::ui::DrawUi; + use crate::ui::radarr_ui::system::SystemUi; #[test] fn test_system_ui_accepts() { diff --git a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs index 009adc0..4554804 100644 --- a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; - use crate::ui::sonarr_ui::blocklist::BlocklistUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::blocklist::BlocklistUi; use strum::IntoEnumIterator; #[test] diff --git a/src/ui/sonarr_ui/blocklist/mod.rs b/src/ui/sonarr_ui/blocklist/mod.rs index e1bb0f9..4deaa18 100644 --- a/src/ui/sonarr_ui/blocklist/mod.rs +++ b/src/ui/sonarr_ui/blocklist/mod.rs @@ -1,19 +1,19 @@ use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; use crate::models::sonarr_models::BlocklistItem; -use crate::models::Route; +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::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; +use ratatui::Frame; use ratatui::layout::{Alignment, Constraint, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::{Line, Text}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; #[cfg(test)] #[path = "blocklist_ui_tests.rs"] diff --git a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs index 2d040ae..8e0cfe5 100644 --- a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; - use crate::ui::sonarr_ui::downloads::DownloadsUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::downloads::DownloadsUi; #[test] fn test_downloads_ui_accepts() { diff --git a/src/ui/sonarr_ui/downloads/mod.rs b/src/ui/sonarr_ui/downloads/mod.rs index 01362b1..b9928e5 100644 --- a/src/ui/sonarr_ui/downloads/mod.rs +++ b/src/ui/sonarr_ui/downloads/mod.rs @@ -1,17 +1,17 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; use crate::models::sonarr_models::DownloadRecord; use crate::models::{HorizontallyScrollableText, Route}; +use crate::ui::DrawUi; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{get_width_from_percentage, 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; use crate::utils::convert_f64_to_gb; #[cfg(test)] diff --git a/src/ui/sonarr_ui/history/history_ui_tests.rs b/src/ui/sonarr_ui/history/history_ui_tests.rs index bae662e..df15aef 100644 --- a/src/ui/sonarr_ui/history/history_ui_tests.rs +++ b/src/ui/sonarr_ui/history/history_ui_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; - use crate::ui::sonarr_ui::history::HistoryUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::history::HistoryUi; use strum::IntoEnumIterator; #[test] diff --git a/src/ui/sonarr_ui/history/mod.rs b/src/ui/sonarr_ui/history/mod.rs index ea85300..f935df8 100644 --- a/src/ui/sonarr_ui/history/mod.rs +++ b/src/ui/sonarr_ui/history/mod.rs @@ -1,18 +1,18 @@ use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; use crate::models::sonarr_models::{SonarrHistoryEventType, SonarrHistoryItem}; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{get_width_from_percentage, layout_block_top_border}; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; +use ratatui::Frame; use ratatui::layout::{Alignment, Constraint, Rect}; use ratatui::style::Style; use ratatui::text::Text; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use super::sonarr_ui_utils::{ create_download_failed_history_event_details, diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs index 58d716f..0bb7e06 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs @@ -1,8 +1,8 @@ use std::sync::atomic::Ordering; use crate::app::App; -use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::Route; +use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; use crate::render_selectable_input_box; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::title_block_centered; @@ -11,9 +11,9 @@ use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; -use ratatui::layout::{Constraint, Flex, Layout, Rect}; +use crate::ui::{DrawUi, draw_popup}; use ratatui::Frame; +use ratatui::layout::{Constraint, Flex, Layout, Rect}; #[cfg(test)] #[path = "edit_indexer_ui_tests.rs"] @@ -55,15 +55,20 @@ fn draw_edit_indexer_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { Layout::horizontal([Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]) .margin(1) .areas(settings_area); - let [name_area, rss_area, auto_search_area, interactive_search_area, priority_area] = - Layout::vertical([ - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - ]) - .areas(left_side_area); + let [ + name_area, + rss_area, + auto_search_area, + interactive_search_area, + priority_area, + ] = Layout::vertical([ + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + ]) + .areas(left_side_area); let [url_area, api_key_area, seed_ratio_area, tags_area] = Layout::vertical([ Constraint::Length(3), Constraint::Length(3), diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs index 362bc61..3b22177 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; - use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use strum::IntoEnumIterator; #[test] diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs index 3e01503..f606bdb 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs @@ -1,11 +1,11 @@ -use ratatui::layout::{Constraint, Flex, Layout, Rect}; use ratatui::Frame; +use ratatui::layout::{Constraint, Flex, Layout, Rect}; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, }; -use crate::models::Route; use crate::render_selectable_input_box; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::title_block_centered; @@ -13,7 +13,7 @@ use crate::ui::widgets::button::Button; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; #[cfg(test)] #[path = "indexer_settings_ui_tests.rs"] @@ -46,18 +46,25 @@ fn draw_edit_indexer_settings_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: f.render_widget(block, area); let indexer_settings = indexer_settings_option.as_ref().unwrap(); - let [_, min_age_area, retention_area, max_size_area, rss_sync_area, _, buttons_area] = - Layout::vertical([ - Constraint::Fill(1), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Length(3), - Constraint::Fill(1), - Constraint::Length(3), - ]) - .margin(1) - .areas(area); + let [ + _, + min_age_area, + retention_area, + max_size_area, + rss_sync_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Fill(1), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Length(3), + Constraint::Fill(1), + Constraint::Length(3), + ]) + .margin(1) + .areas(area); if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() { let min_age = indexer_settings.minimum_age.to_string(); diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs index f95304f..d7d729d 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, }; - use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; #[test] fn test_indexer_settings_ui_accepts() { diff --git a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs index 84a548d..725b19f 100644 --- a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs @@ -3,10 +3,10 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, + ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; - use crate::ui::sonarr_ui::indexers::IndexersUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::indexers::IndexersUi; #[test] fn test_indexers_ui_accepts() { diff --git a/src/ui/sonarr_ui/indexers/mod.rs b/src/ui/sonarr_ui/indexers/mod.rs index fa7e3f4..86b08b0 100644 --- a/src/ui/sonarr_ui/indexers/mod.rs +++ b/src/ui/sonarr_ui/indexers/mod.rs @@ -1,13 +1,14 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::Text; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, INDEXERS_BLOCKS}; use crate::models::servarr_models::Indexer; -use crate::models::Route; +use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; use crate::ui::sonarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; @@ -18,7 +19,6 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; mod edit_indexer_ui; mod indexer_settings_ui; diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs index 1712a2e..2e5d9b8 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs @@ -1,15 +1,15 @@ use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; -use crate::models::Route; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{get_width_from_percentage, title_block}; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::Size; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; #[cfg(test)] #[path = "test_all_indexers_ui_tests.rs"] diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs index 16f7e2e..c221453 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - use crate::ui::sonarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; #[test] fn test_test_all_indexers_ui_accepts() { diff --git a/src/ui/sonarr_ui/library/add_series_ui.rs b/src/ui/sonarr_ui/library/add_series_ui.rs index 2754ad7..f852215 100644 --- a/src/ui/sonarr_ui/library/add_series_ui.rs +++ b/src/ui/sonarr_ui/library/add_series_ui.rs @@ -1,13 +1,13 @@ use std::sync::atomic::Ordering; +use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::widgets::{Cell, ListItem, Row}; -use ratatui::Frame; -use crate::models::servarr_data::sonarr::modals::AddSeriesModal; -use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS}; -use crate::models::sonarr_models::AddSeriesSearchResult; use crate::models::Route; +use crate::models::servarr_data::sonarr::modals::AddSeriesModal; +use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock}; +use crate::models::sonarr_models::AddSeriesSearchResult; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{ get_width_from_percentage, layout_block, layout_paragraph_borderless, title_block_centered, @@ -19,8 +19,8 @@ use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; -use crate::{render_selectable_input_box, App}; +use crate::ui::{DrawUi, draw_popup}; +use crate::{App, render_selectable_input_box}; #[cfg(test)] #[path = "add_series_ui_tests.rs"] @@ -272,21 +272,31 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { f.render_widget(title_block_centered(&title), area); - let [paragraph_area, root_folder_area, monitor_area, quality_profile_area, language_profile_area, series_type_area, season_folder_area, tags_area, _, buttons_area] = - Layout::vertical([ - Constraint::Length(6), - 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 [ + paragraph_area, + root_folder_area, + monitor_area, + quality_profile_area, + language_profile_area, + series_type_area, + season_folder_area, + tags_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Length(6), + 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 prompt_paragraph = layout_paragraph_borderless(&prompt); f.render_widget(prompt_paragraph, paragraph_area); diff --git a/src/ui/sonarr_ui/library/add_series_ui_tests.rs b/src/ui/sonarr_ui/library/add_series_ui_tests.rs index 6bd15cd..cac470c 100644 --- a/src/ui/sonarr_ui/library/add_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/add_series_ui_tests.rs @@ -2,9 +2,9 @@ mod tests { use strum::IntoEnumIterator; - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS}; - use crate::ui::sonarr_ui::library::add_series_ui::AddSeriesUi; + use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock}; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::add_series_ui::AddSeriesUi; #[test] fn test_add_series_ui_accepts() { diff --git a/src/ui/sonarr_ui/library/delete_series_ui.rs b/src/ui/sonarr_ui/library/delete_series_ui.rs index 13e8ebb..71b3974 100644 --- a/src/ui/sonarr_ui/library/delete_series_ui.rs +++ b/src/ui/sonarr_ui/library/delete_series_ui.rs @@ -1,13 +1,13 @@ -use ratatui::layout::Rect; use ratatui::Frame; +use ratatui::layout::Rect; use crate::app::App; -use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; use crate::models::Route; +use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; +use crate::ui::DrawUi; use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::confirmation_prompt::ConfirmationPrompt; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::DrawUi; #[cfg(test)] #[path = "delete_series_ui_tests.rs"] diff --git a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs index 17c61b1..5dfd620 100644 --- a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; - use crate::ui::sonarr_ui::library::delete_series_ui::DeleteSeriesUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::delete_series_ui::DeleteSeriesUi; #[test] fn test_delete_series_ui_accepts() { diff --git a/src/ui/sonarr_ui/library/edit_series_ui.rs b/src/ui/sonarr_ui/library/edit_series_ui.rs index 9307235..5116a91 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui.rs @@ -1,16 +1,16 @@ use std::sync::atomic::Ordering; +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::prelude::Layout; use ratatui::widgets::ListItem; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_SERIES_BLOCKS, SERIES_DETAILS_BLOCKS, }; -use crate::models::Route; use crate::render_selectable_input_box; use crate::ui::styles::ManagarrStyle; @@ -20,7 +20,7 @@ use crate::ui::widgets::checkbox::Checkbox; use crate::ui::widgets::input_box::InputBox; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; use super::series_details_ui::SeriesDetailsUi; @@ -41,10 +41,10 @@ impl DrawUi for EditSeriesUi { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { if let Route::Sonarr(active_sonarr_block, context_option) = app.get_current_route() { - if let Some(context) = context_option { - if SERIES_DETAILS_BLOCKS.contains(&context) { - draw_popup(f, app, SeriesDetailsUi::draw, Size::Large); - } + if let Some(context) = context_option + && SERIES_DETAILS_BLOCKS.contains(&context) + { + draw_popup(f, app, SeriesDetailsUi::draw, Size::Large); } let draw_edit_series_prompt = |f: &mut Frame<'_>, app: &mut App<'_>, prompt_area: Rect| { @@ -105,21 +105,31 @@ fn draw_edit_series_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, ar let selected_quality_profile = quality_profile_list.current_selection(); let selected_language_profile = language_profile_list.current_selection(); - let [paragraph_area, monitored_area, season_folder_area, quality_profile_area, language_profile_area, series_type_area, path_area, tags_area, _, buttons_area] = - Layout::vertical([ - Constraint::Length(6), - 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 [ + paragraph_area, + monitored_area, + season_folder_area, + quality_profile_area, + language_profile_area, + series_type_area, + path_area, + tags_area, + _, + buttons_area, + ] = Layout::vertical([ + Constraint::Length(6), + 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); diff --git a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs index c138fa1..938dde3 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS}; - use crate::ui::sonarr_ui::library::edit_series_ui::EditSeriesUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::edit_series_ui::EditSeriesUi; #[test] fn test_edit_series_ui_accepts() { diff --git a/src/ui/sonarr_ui/library/episode_details_ui.rs b/src/ui/sonarr_ui/library/episode_details_ui.rs index 786edf7..fda994d 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui.rs @@ -1,9 +1,9 @@ use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS}; use crate::models::sonarr_models::{ DownloadRecord, DownloadStatus, Episode, SonarrHistoryEventType, SonarrHistoryItem, SonarrRelease, }; -use crate::models::Route; use crate::ui::sonarr_ui::sonarr_ui_utils::{ create_download_failed_history_event_details, create_download_folder_imported_history_event_details, @@ -21,14 +21,14 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::{draw_popup, draw_tabs, DrawUi}; +use crate::ui::{DrawUi, draw_popup, draw_tabs}; use crate::utils::convert_to_gb; use chrono::Utc; +use ratatui::Frame; use ratatui::layout::{Alignment, Constraint, Layout, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::{Line, Span, Text}; use ratatui::widgets::{Cell, Paragraph, Row, Wrap}; -use ratatui::Frame; use serde_json::Number; #[cfg(test)] @@ -47,76 +47,80 @@ impl DrawUi for EpisodeDetailsUi { } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { - if let Some(season_details_modal) = app.data.sonarr_data.season_details_modal.as_ref() { - if season_details_modal.episode_details_modal.is_some() { - if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() { - let draw_episode_details_popup = - |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| { - let content_area = draw_tabs( - f, - popup_area, - "Episode Details", - &app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_details_tabs, - ); - draw_episode_details_tabs(f, app, content_area); + if let Some(season_details_modal) = app.data.sonarr_data.season_details_modal.as_ref() + && season_details_modal.episode_details_modal.is_some() + && let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() + { + let draw_episode_details_popup = |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| { + let content_area = draw_tabs( + f, + popup_area, + "Episode Details", + &app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_details_tabs, + ); + draw_episode_details_tabs(f, app, content_area); - match active_sonarr_block { - ActiveSonarrBlock::AutomaticallySearchEpisodePrompt => { - let prompt = format!( - "Do you want to trigger an automatic search of your indexers for the episode: {}", - app.data.sonarr_data.season_details_modal.as_ref().unwrap().episodes.current_selection().title - ); - let confirmation_prompt = ConfirmationPrompt::new() - .title("Automatic Episode Search") - .prompt(&prompt) - .yes_no_value(app.data.sonarr_data.prompt_confirm); + match active_sonarr_block { + ActiveSonarrBlock::AutomaticallySearchEpisodePrompt => { + let prompt = format!( + "Do you want to trigger an automatic search of your indexers for the episode: {}", + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .current_selection() + .title + ); + let confirmation_prompt = ConfirmationPrompt::new() + .title("Automatic Episode Search") + .prompt(&prompt) + .yes_no_value(app.data.sonarr_data.prompt_confirm); - f.render_widget( - Popup::new(confirmation_prompt).size(Size::MediumPrompt), - f.area(), - ); - } - ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt => { - draw_manual_episode_search_confirm_prompt(f, app); - } - ActiveSonarrBlock::EpisodeHistoryDetails => { - draw_history_item_details_popup(f, app, popup_area); - } - _ => (), - } - }; - - draw_popup(f, app, draw_episode_details_popup, Size::Large); + f.render_widget( + Popup::new(confirmation_prompt).size(Size::MediumPrompt), + f.area(), + ); + } + ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt => { + draw_manual_episode_search_confirm_prompt(f, app); + } + ActiveSonarrBlock::EpisodeHistoryDetails => { + draw_history_item_details_popup(f, app, popup_area); + } + _ => (), } - } + }; + + draw_popup(f, app, draw_episode_details_popup, Size::Large); } } } pub fn draw_episode_details_tabs(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { - if let Some(season_details_modal) = app.data.sonarr_data.season_details_modal.as_ref() { - if let Some(episode_details_modal) = season_details_modal.episode_details_modal.as_ref() { - if let Route::Sonarr(active_sonarr_block, _) = episode_details_modal - .episode_details_tabs - .get_active_route() - { - match active_sonarr_block { - ActiveSonarrBlock::EpisodeDetails => draw_episode_details(f, app, area), - ActiveSonarrBlock::EpisodeHistory => draw_episode_history_table(f, app, area), - ActiveSonarrBlock::EpisodeFile => draw_file_info(f, app, area), - ActiveSonarrBlock::ManualEpisodeSearch => draw_episode_releases(f, app, area), - _ => (), - } - } + if let Some(season_details_modal) = app.data.sonarr_data.season_details_modal.as_ref() + && let Some(episode_details_modal) = season_details_modal.episode_details_modal.as_ref() + && let Route::Sonarr(active_sonarr_block, _) = episode_details_modal + .episode_details_tabs + .get_active_route() + { + match active_sonarr_block { + ActiveSonarrBlock::EpisodeDetails => draw_episode_details(f, app, area), + ActiveSonarrBlock::EpisodeHistory => draw_episode_history_table(f, app, area), + ActiveSonarrBlock::EpisodeFile => draw_file_info(f, app, area), + ActiveSonarrBlock::ManualEpisodeSearch => draw_episode_releases(f, app, area), + _ => (), } } } @@ -197,16 +201,22 @@ fn draw_file_info(f: &mut Frame<'_>, app: &App<'_>, area: Rect) { let file_info = episode_details_modal.file_details.to_owned(); let audio_details = episode_details_modal.audio_details.to_owned(); let video_details = episode_details_modal.video_details.to_owned(); - let [file_details_title_area, file_details_area, audio_details_title_area, audio_details_area, video_details_title_area, video_details_area] = - Layout::vertical([ - Constraint::Length(2), - Constraint::Length(5), - Constraint::Length(1), - Constraint::Length(6), - Constraint::Length(1), - Constraint::Length(7), - ]) - .areas(area); + let [ + file_details_title_area, + file_details_area, + audio_details_title_area, + audio_details_area, + video_details_title_area, + video_details_area, + ] = Layout::vertical([ + Constraint::Length(2), + Constraint::Length(5), + Constraint::Length(1), + Constraint::Length(6), + Constraint::Length(1), + Constraint::Length(7), + ]) + .areas(area); let file_details_title_paragraph = Paragraph::new("File Details".bold()).block(layout_block_top_border()); @@ -593,10 +603,10 @@ fn style_from_status(download: Option<&DownloadRecord>, episode: &Episode) -> St return Style::new().unmonitored_missing(); } - if let Some(air_date) = episode.air_date_utc.as_ref() { - if air_date > &Utc::now() { - return Style::new().unreleased(); - } + if let Some(air_date) = episode.air_date_utc.as_ref() + && air_date > &Utc::now() + { + return Style::new().unreleased(); } return Style::new().missing(); diff --git a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs index dc8e654..4246f53 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, }; - use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use strum::IntoEnumIterator; #[test] diff --git a/src/ui/sonarr_ui/library/library_ui_tests.rs b/src/ui/sonarr_ui/library/library_ui_tests.rs index f740d39..fd0c51b 100644 --- a/src/ui/sonarr_ui/library/library_ui_tests.rs +++ b/src/ui/sonarr_ui/library/library_ui_tests.rs @@ -1,15 +1,15 @@ #[cfg(test)] mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, + ADD_SERIES_BLOCKS, ActiveSonarrBlock, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; use crate::models::{ servarr_data::sonarr::sonarr_data::LIBRARY_BLOCKS, sonarr_models::SeriesStatus, }; + use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::LibraryUi; use crate::ui::styles::ManagarrStyle; - use crate::ui::DrawUi; use pretty_assertions::assert_eq; use ratatui::widgets::{Cell, Row}; use strum::IntoEnumIterator; @@ -134,8 +134,8 @@ mod tests { } #[test] - fn test_decorate_row_with_style_unreleased_when_continuing_and_all_monitored_episodes_are_present( - ) { + fn test_decorate_row_with_style_unreleased_when_continuing_and_all_monitored_episodes_are_present() + { let seasons = vec![ Season { monitored: false, diff --git a/src/ui/sonarr_ui/library/mod.rs b/src/ui/sonarr_ui/library/mod.rs index fa2d6da..4fa6ddf 100644 --- a/src/ui/sonarr_ui/library/mod.rs +++ b/src/ui/sonarr_ui/library/mod.rs @@ -2,9 +2,9 @@ use add_series_ui::AddSeriesUi; use delete_series_ui::DeleteSeriesUi; use edit_series_ui::EditSeriesUi; use ratatui::{ + Frame, layout::{Constraint, Rect}, widgets::{Cell, Row}, - Frame, }; use series_details_ui::SeriesDetailsUi; @@ -16,15 +16,15 @@ use crate::utils::convert_to_gb; use crate::{ app::App, models::{ + Route, servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, LIBRARY_BLOCKS}, sonarr_models::{Series, SeriesStatus}, - Route, }, ui::{ + DrawUi, styles::ManagarrStyle, utils::{get_width_from_percentage, layout_block_top_border}, widgets::managarr_table::ManagarrTable, - DrawUi, }, }; diff --git a/src/ui/sonarr_ui/library/season_details_ui.rs b/src/ui/sonarr_ui/library/season_details_ui.rs index 6a8ca36..ed83e5b 100644 --- a/src/ui/sonarr_ui/library/season_details_ui.rs +++ b/src/ui/sonarr_ui/library/season_details_ui.rs @@ -1,9 +1,9 @@ use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SEASON_DETAILS_BLOCKS}; use crate::models::sonarr_models::{ DownloadRecord, DownloadStatus, Episode, SonarrHistoryEventType, SonarrHistoryItem, SonarrRelease, }; -use crate::models::Route; use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use crate::ui::sonarr_ui::sonarr_ui_utils::{ create_download_failed_history_event_details, @@ -21,13 +21,13 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::{draw_popup, draw_tabs, DrawUi}; +use crate::ui::{DrawUi, draw_popup, draw_tabs}; use crate::utils::convert_to_gb; use chrono::Utc; +use ratatui::Frame; use ratatui::layout::{Alignment, Constraint, Rect}; use ratatui::prelude::{Line, Style, Stylize, Text}; use ratatui::widgets::{Cell, Paragraph, Row, Wrap}; -use ratatui::Frame; use serde_json::Number; #[cfg(test)] @@ -48,101 +48,107 @@ impl DrawUi for SeasonDetailsUi { fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { let route = app.get_current_route(); - if app.data.sonarr_data.season_details_modal.is_some() { - if let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() { - let draw_season_details_popup = |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| { - let content_area = draw_tabs( - f, - popup_area, - &format!( - "Season {} Details", + if app.data.sonarr_data.season_details_modal.is_some() + && let Route::Sonarr(active_sonarr_block, _) = app.get_current_route() + { + let draw_season_details_popup = |f: &mut Frame<'_>, app: &mut App<'_>, popup_area: Rect| { + let content_area = draw_tabs( + f, + popup_area, + &format!( + "Season {} Details", + app + .data + .sonarr_data + .seasons + .current_selection() + .season_number + ), + &app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_details_tabs, + ); + draw_season_details(f, app, content_area); + + match active_sonarr_block { + ActiveSonarrBlock::AutomaticallySearchSeasonPrompt => { + let prompt = format!( + "Do you want to trigger an automatic search of your indexers for season packs for: {}", app .data .sonarr_data .seasons .current_selection() - .season_number - ), - &app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_details_tabs, - ); - draw_season_details(f, app, content_area); + .title + .as_ref() + .unwrap() + ); + let confirmation_prompt = ConfirmationPrompt::new() + .title("Automatic Season Search") + .prompt(&prompt) + .yes_no_value(app.data.sonarr_data.prompt_confirm); - match active_sonarr_block { - ActiveSonarrBlock::AutomaticallySearchSeasonPrompt => { - let prompt = format!( - "Do you want to trigger an automatic search of your indexers for season packs for: {}", - app.data.sonarr_data.seasons.current_selection().title.as_ref().unwrap() - ); - let confirmation_prompt = ConfirmationPrompt::new() - .title("Automatic Season Search") - .prompt(&prompt) - .yes_no_value(app.data.sonarr_data.prompt_confirm); - - f.render_widget( - Popup::new(confirmation_prompt).size(Size::MediumPrompt), - f.area(), - ); - } - ActiveSonarrBlock::DeleteEpisodeFilePrompt => { - let prompt = format!( - "Do you really want to delete this episode: \n{}?", - app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .current_selection() - .title - ); - let confirmation_prompt = ConfirmationPrompt::new() - .title("Delete Episode") - .prompt(&prompt) - .yes_no_value(app.data.sonarr_data.prompt_confirm); - - f.render_widget( - Popup::new(confirmation_prompt).size(Size::MediumPrompt), - f.area(), - ); - } - ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt => { - draw_manual_season_search_confirm_prompt(f, app); - } - ActiveSonarrBlock::SeasonHistoryDetails => { - draw_history_item_details_popup(f, app, popup_area); - } - _ => (), + f.render_widget( + Popup::new(confirmation_prompt).size(Size::MediumPrompt), + f.area(), + ); } - }; + ActiveSonarrBlock::DeleteEpisodeFilePrompt => { + let prompt = format!( + "Do you really want to delete this episode: \n{}?", + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .current_selection() + .title + ); + let confirmation_prompt = ConfirmationPrompt::new() + .title("Delete Episode") + .prompt(&prompt) + .yes_no_value(app.data.sonarr_data.prompt_confirm); - draw_popup(f, app, draw_season_details_popup, Size::XLarge); - - if EpisodeDetailsUi::accepts(route) { - EpisodeDetailsUi::draw(f, app, _area); + f.render_widget( + Popup::new(confirmation_prompt).size(Size::MediumPrompt), + f.area(), + ); + } + ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt => { + draw_manual_season_search_confirm_prompt(f, app); + } + ActiveSonarrBlock::SeasonHistoryDetails => { + draw_history_item_details_popup(f, app, popup_area); + } + _ => (), } + }; + + draw_popup(f, app, draw_season_details_popup, Size::XLarge); + + if EpisodeDetailsUi::accepts(route) { + EpisodeDetailsUi::draw(f, app, _area); } } } } pub fn draw_season_details(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { - if let Some(season_details_modal) = app.data.sonarr_data.season_details_modal.as_ref() { - if let Route::Sonarr(active_sonarr_block, _) = + if let Some(season_details_modal) = app.data.sonarr_data.season_details_modal.as_ref() + && let Route::Sonarr(active_sonarr_block, _) = season_details_modal.season_details_tabs.get_active_route() - { - match active_sonarr_block { - ActiveSonarrBlock::SeasonDetails => draw_episodes_table(f, app, area), - ActiveSonarrBlock::SeasonHistory => draw_season_history_table(f, app, area), - ActiveSonarrBlock::ManualSeasonSearch => draw_season_releases(f, app, area), - _ => (), - } + { + match active_sonarr_block { + ActiveSonarrBlock::SeasonDetails => draw_episodes_table(f, app, area), + ActiveSonarrBlock::SeasonHistory => draw_season_history_table(f, app, area), + ActiveSonarrBlock::ManualSeasonSearch => draw_season_releases(f, app, area), + _ => (), } } } @@ -588,10 +594,10 @@ fn decorate_with_row_style<'a>( return row.unmonitored_missing(); } - if let Some(air_date) = episode.air_date_utc.as_ref() { - if air_date > &Utc::now() { - return row.unreleased(); - } + if let Some(air_date) = episode.air_date_utc.as_ref() + && air_date > &Utc::now() + { + return row.unreleased(); } return row.missing(); diff --git a/src/ui/sonarr_ui/library/season_details_ui_tests.rs b/src/ui/sonarr_ui/library/season_details_ui_tests.rs index 7145fbc..cd987ca 100644 --- a/src/ui/sonarr_ui/library/season_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/season_details_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, }; - use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; #[test] fn test_season_details_ui_accepts() { diff --git a/src/ui/sonarr_ui/library/series_details_ui.rs b/src/ui/sonarr_ui/library/series_details_ui.rs index b0986e4..38da6d7 100644 --- a/src/ui/sonarr_ui/library/series_details_ui.rs +++ b/src/ui/sonarr_ui/library/series_details_ui.rs @@ -1,18 +1,18 @@ use chrono::Utc; use deunicode::deunicode; +use ratatui::Frame; use ratatui::layout::{Alignment, Constraint, Layout, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::text::{Line, Text}; use ratatui::widgets::{Cell, Paragraph, Row, Wrap}; -use ratatui::Frame; use regex::Regex; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SERIES_DETAILS_BLOCKS}; use crate::models::sonarr_models::{ Season, SeasonStatistics, SonarrHistoryEventType, SonarrHistoryItem, }; -use crate::models::Route; use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; use crate::ui::sonarr_ui::sonarr_ui_utils::{ @@ -31,7 +31,7 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::message::Message; use crate::ui::widgets::popup::{Popup, Size}; -use crate::ui::{draw_popup, draw_tabs, DrawUi}; +use crate::ui::{DrawUi, draw_popup, draw_tabs}; use crate::utils::convert_to_gb; #[cfg(test)] @@ -75,7 +75,8 @@ impl DrawUi for SeriesDetailsUi { match active_sonarr_block { ActiveSonarrBlock::AutomaticallySearchSeriesPrompt => { let prompt = format!( - "Do you want to trigger an automatic search of your indexers for all monitored episode(s) for the series: {}", app.data.sonarr_data.series.current_selection().title + "Do you want to trigger an automatic search of your indexers for all monitored episode(s) for the series: {}", + app.data.sonarr_data.series.current_selection().title ); let confirmation_prompt = ConfirmationPrompt::new() .title("Automatic Series Search") diff --git a/src/ui/sonarr_ui/library/series_details_ui_tests.rs b/src/ui/sonarr_ui/library/series_details_ui_tests.rs index 9923c87..a261dd7 100644 --- a/src/ui/sonarr_ui/library/series_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/series_details_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; - use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi; #[test] fn test_series_details_ui_accepts() { diff --git a/src/ui/sonarr_ui/mod.rs b/src/ui/sonarr_ui/mod.rs index 20d9f60..90cec31 100644 --- a/src/ui/sonarr_ui/mod.rs +++ b/src/ui/sonarr_ui/mod.rs @@ -7,11 +7,11 @@ use history::HistoryUi; use indexers::IndexersUi; use library::LibraryUi; use ratatui::{ + Frame, layout::{Constraint, Layout, Rect}, style::Stylize, text::Text, widgets::Paragraph, - Frame, }; use root_folders::RootFoldersUi; use system::SystemUi; @@ -20,22 +20,21 @@ use crate::{ app::App, logos::SONARR_LOGO, models::{ + Route, servarr_data::sonarr::sonarr_data::SonarrData, servarr_models::{DiskSpace, RootFolder}, sonarr_models::DownloadRecord, - Route, }, utils::convert_to_gb, }; use super::{ - draw_tabs, + DrawUi, draw_tabs, styles::ManagarrStyle, utils::{ borderless_block, layout_block, line_gauge_with_label, line_gauge_with_title, title_block, }, widgets::loading_block::LoadingBlock, - DrawUi, }; mod blocklist; diff --git a/src/ui/sonarr_ui/root_folders/mod.rs b/src/ui/sonarr_ui/root_folders/mod.rs index 1d2728e..db98c24 100644 --- a/src/ui/sonarr_ui/root_folders/mod.rs +++ b/src/ui/sonarr_ui/root_folders/mod.rs @@ -1,17 +1,17 @@ +use ratatui::Frame; use ratatui::layout::{Constraint, Rect}; use ratatui::widgets::{Cell, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::RootFolder; -use crate::models::Route; 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::{draw_input_box_popup, draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_input_box_popup, draw_popup}; use crate::utils::convert_to_gb; #[cfg(test)] diff --git a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs index 1e9e6c0..0313bd1 100644 --- a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs @@ -3,8 +3,8 @@ mod tests { use strum::IntoEnumIterator; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; - use crate::ui::sonarr_ui::root_folders::RootFoldersUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::root_folders::RootFoldersUi; #[test] fn test_root_folders_ui_accepts() { diff --git a/src/ui/sonarr_ui/sonarr_ui_tests.rs b/src/ui/sonarr_ui/sonarr_ui_tests.rs index 6a1630e..be3aaa6 100644 --- a/src/ui/sonarr_ui/sonarr_ui_tests.rs +++ b/src/ui/sonarr_ui/sonarr_ui_tests.rs @@ -4,7 +4,7 @@ mod tests { use crate::{ models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock, - ui::{sonarr_ui::SonarrUi, DrawUi}, + ui::{DrawUi, sonarr_ui::SonarrUi}, }; #[test] diff --git a/src/ui/sonarr_ui/system/mod.rs b/src/ui/sonarr_ui/system/mod.rs index d4fd709..3006b4f 100644 --- a/src/ui/sonarr_ui/system/mod.rs +++ b/src/ui/sonarr_ui/system/mod.rs @@ -6,9 +6,9 @@ use ratatui::style::Style; use ratatui::text::{Span, Text}; use ratatui::widgets::{Cell, Row}; use ratatui::{ + Frame, layout::{Constraint, Rect}, widgets::ListItem, - Frame, }; use crate::app::App; @@ -23,7 +23,7 @@ use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::selectable_list::SelectableList; use crate::{ models::Route, - ui::{utils::title_block, DrawUi}, + ui::{DrawUi, utils::title_block}, }; mod system_details_ui; diff --git a/src/ui/sonarr_ui/system/system_details_ui.rs b/src/ui/sonarr_ui/system/system_details_ui.rs index ffdfd47..23eb01e 100644 --- a/src/ui/sonarr_ui/system/system_details_ui.rs +++ b/src/ui/sonarr_ui/system/system_details_ui.rs @@ -1,14 +1,14 @@ +use ratatui::Frame; use ratatui::layout::Rect; use ratatui::text::{Span, Text}; use ratatui::widgets::{Cell, ListItem, Paragraph, Row}; -use ratatui::Frame; use crate::app::App; +use crate::models::Route; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS}; use crate::models::sonarr_models::SonarrTask; -use crate::models::Route; use crate::ui::sonarr_ui::system::{ - draw_queued_events, extract_task_props, TASK_TABLE_CONSTRAINTS, TASK_TABLE_HEADERS, + TASK_TABLE_CONSTRAINTS, TASK_TABLE_HEADERS, draw_queued_events, extract_task_props, }; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{borderless_block, style_log_list_item, title_block}; @@ -17,7 +17,7 @@ use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::managarr_table::ManagarrTable; use crate::ui::widgets::popup::{Popup, Size}; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::{draw_popup, DrawUi}; +use crate::ui::{DrawUi, draw_popup}; #[cfg(test)] #[path = "system_details_ui_tests.rs"] diff --git a/src/ui/sonarr_ui/system/system_details_ui_tests.rs b/src/ui/sonarr_ui/system/system_details_ui_tests.rs index 80dc239..cf6af3d 100644 --- a/src/ui/sonarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_details_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; - use crate::ui::sonarr_ui::system::system_details_ui::SystemDetailsUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::system::system_details_ui::SystemDetailsUi; #[test] fn test_system_details_ui_accepts() { diff --git a/src/ui/sonarr_ui/system/system_ui_tests.rs b/src/ui/sonarr_ui/system/system_ui_tests.rs index dc43bdc..9f6fd54 100644 --- a/src/ui/sonarr_ui/system/system_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_ui_tests.rs @@ -5,8 +5,8 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; - use crate::ui::sonarr_ui::system::SystemUi; use crate::ui::DrawUi; + use crate::ui::sonarr_ui::system::SystemUi; #[test] fn test_system_ui_accepts() { diff --git a/src/ui/utils.rs b/src/ui/utils.rs index 88f3514..e56ece7 100644 --- a/src/ui/utils.rs +++ b/src/ui/utils.rs @@ -1,5 +1,5 @@ -use crate::ui::styles::ManagarrStyle; use crate::ui::THEME; +use crate::ui::styles::ManagarrStyle; use ratatui::layout::{Alignment, Constraint, Layout, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::symbols; diff --git a/src/ui/widgets/input_box.rs b/src/ui/widgets/input_box.rs index da32978..918e93c 100644 --- a/src/ui/widgets/input_box.rs +++ b/src/ui/widgets/input_box.rs @@ -1,10 +1,10 @@ use derive_setters::Setters; +use ratatui::Frame; use ratatui::buffer::Buffer; use ratatui::layout::{Constraint, Layout, Position, Rect}; use ratatui::prelude::Text; use ratatui::style::{Style, Styled, Stylize}; use ratatui::widgets::{Block, Paragraph, Widget, WidgetRef}; -use ratatui::Frame; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{borderless_block, layout_block}; diff --git a/src/ui/widgets/managarr_table.rs b/src/ui/widgets/managarr_table.rs index 169fdcd..54162ac 100644 --- a/src/ui/widgets/managarr_table.rs +++ b/src/ui/widgets/managarr_table.rs @@ -2,18 +2,18 @@ use super::input_box_popup::InputBoxPopup; use super::message::Message; use super::popup::Size; use crate::models::stateful_table::StatefulTable; +use crate::ui::HIGHLIGHT_SYMBOL; use crate::ui::styles::ManagarrStyle; use crate::ui::utils::{borderless_block, centered_rect, title_block_centered}; use crate::ui::widgets::loading_block::LoadingBlock; use crate::ui::widgets::popup::Popup; use crate::ui::widgets::selectable_list::SelectableList; -use crate::ui::HIGHLIGHT_SYMBOL; use derive_setters::Setters; +use ratatui::Frame; use ratatui::buffer::Buffer; use ratatui::layout::{Constraint, Layout, Position, Rect}; use ratatui::prelude::{Style, Stylize, Text}; use ratatui::widgets::{Block, ListItem, Row, StatefulWidget, Table, Widget, WidgetRef}; -use ratatui::Frame; use std::fmt::Debug; use std::sync::atomic::Ordering; @@ -193,17 +193,16 @@ where } fn parse_headers(&self) -> Vec> { - if let Some(ref content) = self.content { - if let Some(ref sort_list) = content.sort { - if !self.is_sorting { - let mut new_headers = self.table_headers.clone(); - let idx = sort_list.state.selected().unwrap_or(0); - let direction = if content.sort_asc { " ▲" } else { " ▼" }; - new_headers[idx].push_str(direction); + if let Some(ref content) = self.content + && let Some(ref sort_list) = content.sort + && !self.is_sorting + { + let mut new_headers = self.table_headers.clone(); + let idx = sort_list.state.selected().unwrap_or(0); + let direction = if content.sort_asc { " ▲" } else { " ▼" }; + new_headers[idx].push_str(direction); - return new_headers.into_iter().map(Text::from).collect(); - } - } + return new_headers.into_iter().map(Text::from).collect(); } self diff --git a/src/utils.rs b/src/utils.rs index 9e4170e..0771535 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -5,11 +5,11 @@ use std::process; use std::sync::Arc; use std::time::Duration; -use anyhow::anyhow; use anyhow::Result; +use anyhow::anyhow; use colored::Colorize; use indicatif::{ProgressBar, ProgressStyle}; -use log::{error, LevelFilter}; +use log::{LevelFilter, error}; use log4rs::append::file::FileAppender; use log4rs::config::{Appender, Root}; use log4rs::encode::pattern::PatternEncoder; @@ -18,7 +18,7 @@ use reqwest::{Certificate, Client}; use tokio::sync::Mutex; use tokio_util::sync::CancellationToken; -use crate::app::{log_and_print_error, App, AppConfig}; +use crate::app::{App, AppConfig, log_and_print_error}; use crate::cli::{self, Command}; use crate::network::Network; use crate::ui::theme::ThemeDefinitionsWrapper; @@ -176,7 +176,7 @@ pub(super) fn build_network_client(config: &AppConfig) -> Client { if let Some(radarr_configs) = &config.radarr { for radarr_config in radarr_configs { - if let Some(ref cert_path) = &radarr_config.ssl_cert_path { + if let Some(cert_path) = &radarr_config.ssl_cert_path { let cert = create_cert(cert_path, "Radarr"); client_builder = client_builder.add_root_certificate(cert); } @@ -185,7 +185,7 @@ pub(super) fn build_network_client(config: &AppConfig) -> Client { if let Some(sonarr_configs) = &config.sonarr { for sonarr_config in sonarr_configs { - if let Some(ref cert_path) = &sonarr_config.ssl_cert_path { + if let Some(cert_path) = &sonarr_config.ssl_cert_path { let cert = create_cert(cert_path, "Sonarr"); client_builder = client_builder.add_root_certificate(cert); } From e50fb88bfcdc27237877a90794beb5962821810b Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 3 Dec 2025 15:23:07 -0700 Subject: [PATCH 02/28] refactor: Refactored to use more idiomatic let-else statements where applicable --- .../library/movie_details_handler.rs | 36 +- .../library/episode_details_handler.rs | 34 +- .../library/season_details_handler.rs | 25 +- .../radarr_blocklist_network_tests.rs | 21 +- .../radarr_collections_network_tests.rs | 21 +- .../radarr_downloads_network_tests.rs | 19 +- .../indexers/radarr_indexers_network_tests.rs | 133 +-- .../library/radarr_library_network_tests.rs | 279 +++--- .../radarr_network/radarr_network_tests.rs | 9 +- .../radarr_root_folders_network_tests.rs | 19 +- .../system/radarr_system_network_tests.rs | 171 ++-- .../sonarr_blocklist_network_tests.rs | 36 +- .../sonarr_downloads_network_tests.rs | 19 +- .../history/sonarr_history_network_tests.rs | 36 +- .../indexers/sonarr_indexers_network_tests.rs | 114 +-- .../episodes/sonarr_episodes_network_tests.rs | 800 +++++++++--------- .../seasons/sonarr_seasons_network_tests.rs | 177 ++-- .../series/sonarr_series_network_tests.rs | 260 +++--- .../sonarr_root_folders_network_tests.rs | 19 +- .../sonarr_network/sonarr_network_tests.rs | 12 +- .../system/sonarr_system_network_tests.rs | 181 ++-- src/ui/radarr_ui/blocklist/mod.rs | 9 +- src/ui/radarr_ui/collections/mod.rs | 13 +- src/ui/radarr_ui/downloads/mod.rs | 9 +- .../radarr_ui/indexers/indexer_settings_ui.rs | 9 +- .../indexers/test_all_indexers_ui.rs | 9 +- src/ui/radarr_ui/library/add_movie_ui.rs | 9 +- src/ui/radarr_ui/library/delete_movie_ui.rs | 9 +- src/ui/radarr_ui/library/edit_movie_ui.rs | 9 +- src/ui/radarr_ui/library/movie_details_ui.rs | 9 +- src/ui/radarr_ui/root_folders/mod.rs | 9 +- src/ui/radarr_ui/system/mod.rs | 9 +- src/ui/radarr_ui/system/system_details_ui.rs | 9 +- src/ui/sonarr_ui/indexers/edit_indexer_ui.rs | 9 +- .../sonarr_ui/indexers/indexer_settings_ui.rs | 9 +- src/ui/sonarr_ui/library/add_series_ui.rs | 9 +- src/ui/sonarr_ui/library/delete_series_ui.rs | 9 +- src/ui/sonarr_ui/library/edit_series_ui.rs | 9 +- .../sonarr_ui/library/episode_details_ui.rs | 9 +- src/ui/sonarr_ui/library/season_details_ui.rs | 10 +- src/ui/sonarr_ui/library/series_details_ui.rs | 13 +- src/ui/sonarr_ui/system/mod.rs | 9 +- src/ui/sonarr_ui/system/system_details_ui.rs | 9 +- 43 files changed, 1337 insertions(+), 1291 deletions(-) diff --git a/src/handlers/radarr_handlers/library/movie_details_handler.rs b/src/handlers/radarr_handlers/library/movie_details_handler.rs index 685a161..e76fdeb 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler.rs @@ -158,27 +158,23 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< } fn is_ready(&self) -> bool { - if let Some(movie_details_modal) = &self.app.data.radarr_data.movie_details_modal { - match self.active_radarr_block { - ActiveRadarrBlock::MovieDetails => { - !self.app.is_loading && !movie_details_modal.movie_details.is_empty() - } - ActiveRadarrBlock::MovieHistory => { - !self.app.is_loading && !movie_details_modal.movie_history.is_empty() - } - ActiveRadarrBlock::Cast => { - !self.app.is_loading && !movie_details_modal.movie_cast.is_empty() - } - ActiveRadarrBlock::Crew => { - !self.app.is_loading && !movie_details_modal.movie_crew.is_empty() - } - ActiveRadarrBlock::ManualSearch => { - !self.app.is_loading && !movie_details_modal.movie_releases.is_empty() - } - _ => !self.app.is_loading, + let Some(movie_details_modal) = &self.app.data.radarr_data.movie_details_modal else { + return false; + }; + + match self.active_radarr_block { + ActiveRadarrBlock::MovieDetails => { + !self.app.is_loading && !movie_details_modal.movie_details.is_empty() } - } else { - false + ActiveRadarrBlock::MovieHistory => { + !self.app.is_loading && !movie_details_modal.movie_history.is_empty() + } + ActiveRadarrBlock::Cast => !self.app.is_loading && !movie_details_modal.movie_cast.is_empty(), + ActiveRadarrBlock::Crew => !self.app.is_loading && !movie_details_modal.movie_crew.is_empty(), + ActiveRadarrBlock::ManualSearch => { + !self.app.is_loading && !movie_details_modal.movie_releases.is_empty() + } + _ => !self.app.is_loading, } } diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler.rs b/src/handlers/sonarr_handlers/library/episode_details_handler.rs index e9b1ad8..a754419 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler.rs @@ -110,23 +110,23 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for EpisodeDetailsHandle } fn is_ready(&self) -> bool { - !self.app.is_loading - && if let Some(season_details_modal) = self.app.data.sonarr_data.season_details_modal.as_ref() - { - if let Some(episode_details_modal) = &season_details_modal.episode_details_modal { - match self.active_sonarr_block { - ActiveSonarrBlock::EpisodeHistory => !episode_details_modal.episode_history.is_empty(), - ActiveSonarrBlock::ManualEpisodeSearch => { - !episode_details_modal.episode_releases.is_empty() - } - _ => true, - } - } else { - false - } - } else { - false - } + if self.app.is_loading { + return false; + } + + let Some(season_details_modal) = self.app.data.sonarr_data.season_details_modal.as_ref() else { + return false; + }; + + let Some(episode_details_modal) = &season_details_modal.episode_details_modal else { + return false; + }; + + match self.active_sonarr_block { + ActiveSonarrBlock::EpisodeHistory => !episode_details_modal.episode_history.is_empty(), + ActiveSonarrBlock::ManualEpisodeSearch => !episode_details_modal.episode_releases.is_empty(), + _ => true, + } } fn handle_scroll_up(&mut self) {} diff --git a/src/handlers/sonarr_handlers/library/season_details_handler.rs b/src/handlers/sonarr_handlers/library/season_details_handler.rs index 8cff217..3472996 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler.rs @@ -162,17 +162,20 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler } fn is_ready(&self) -> bool { - !self.app.is_loading - && if let Some(season_details_modal) = &self.app.data.sonarr_data.season_details_modal { - match self.active_sonarr_block { - ActiveSonarrBlock::SeasonDetails => !season_details_modal.episodes.is_empty(), - ActiveSonarrBlock::SeasonHistory => !season_details_modal.season_history.is_empty(), - ActiveSonarrBlock::ManualSeasonSearch => !season_details_modal.season_releases.is_empty(), - _ => true, - } - } else { - false - } + if self.app.is_loading { + return false; + } + + let Some(season_details_modal) = &self.app.data.sonarr_data.season_details_modal else { + return false; + }; + + match self.active_sonarr_block { + ActiveSonarrBlock::SeasonDetails => !season_details_modal.episodes.is_empty(), + ActiveSonarrBlock::SeasonHistory => !season_details_modal.season_history.is_empty(), + ActiveSonarrBlock::ManualSeasonSearch => !season_details_modal.season_releases.is_empty(), + _ => true, + } } fn handle_scroll_up(&mut self) {} diff --git a/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs b/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs index 2ee20e4..d74b5d0 100644 --- a/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs +++ b/src/network/radarr_network/blocklist/radarr_blocklist_network_tests.rs @@ -195,19 +195,20 @@ mod tests { } let mut network = test_network(&app); - if let RadarrSerdeable::BlocklistResponse(blocklist) = network + let RadarrSerdeable::BlocklistResponse(blocklist) = network .handle_radarr_event(RadarrEvent::GetBlocklist) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.blocklist.items, - expected_blocklist - ); - assert!(app.lock().await.data.radarr_data.blocklist.sort_asc); - assert_eq!(blocklist, response); - } + else { + panic!("Expected BlocklistResponse") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.blocklist.items, + expected_blocklist + ); + assert!(app.lock().await.data.radarr_data.blocklist.sort_asc); + assert_eq!(blocklist, response); } #[tokio::test] diff --git a/src/network/radarr_network/collections/radarr_collections_network_tests.rs b/src/network/radarr_network/collections/radarr_collections_network_tests.rs index 4439db7..6409f80 100644 --- a/src/network/radarr_network/collections/radarr_collections_network_tests.rs +++ b/src/network/radarr_network/collections/radarr_collections_network_tests.rs @@ -277,19 +277,20 @@ mod tests { } let mut network = test_network(&app); - if let RadarrSerdeable::Collections(collections) = network + let RadarrSerdeable::Collections(collections) = network .handle_radarr_event(RadarrEvent::GetCollections) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.collections.items, - expected_collections - ); - assert!(app.lock().await.data.radarr_data.collections.sort_asc); - assert_eq!(collections, response); - } + else { + panic!("Expected Collections") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.collections.items, + expected_collections + ); + assert!(app.lock().await.data.radarr_data.collections.sort_asc); + assert_eq!(collections, response); } #[tokio::test] diff --git a/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs b/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs index b72c7bf..0bb6ad3 100644 --- a/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs +++ b/src/network/radarr_network/downloads/radarr_downloads_network_tests.rs @@ -48,18 +48,19 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::DownloadsResponse(downloads) = network + let RadarrSerdeable::DownloadsResponse(downloads) = network .handle_radarr_event(RadarrEvent::GetDownloads(500)) .await .unwrap() - { - mock.assert_async().await; - pretty_assertions::assert_eq!( - app.lock().await.data.radarr_data.downloads.items, - downloads_response().records - ); - pretty_assertions::assert_eq!(downloads, response); - } + else { + panic!("Expected DownloadsResponse") + }; + mock.assert_async().await; + pretty_assertions::assert_eq!( + app.lock().await.data.radarr_data.downloads.items, + downloads_response().records + ); + pretty_assertions::assert_eq!(downloads, response); } #[tokio::test] diff --git a/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs b/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs index b02e789..4c0c228 100644 --- a/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs +++ b/src/network/radarr_network/indexers/radarr_indexers_network_tests.rs @@ -623,18 +623,19 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::Indexers(indexers) = network + let RadarrSerdeable::Indexers(indexers) = network .handle_radarr_event(RadarrEvent::GetIndexers) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.indexers.items, - vec![indexer()] - ); - assert_eq!(indexers, response); - } + else { + panic!("Expected Indexers") + }; + async_server.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.indexers.items, + vec![indexer()] + ); + assert_eq!(indexers, response); } #[tokio::test] @@ -658,18 +659,19 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::IndexerSettings(settings) = network + let RadarrSerdeable::IndexerSettings(settings) = network .handle_radarr_event(RadarrEvent::GetAllIndexerSettings) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.indexer_settings, - Some(indexer_settings()) - ); - assert_eq!(settings, response); - } + else { + panic!("Expected IndexerSettings") + }; + async_server.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.indexer_settings, + Some(indexer_settings()) + ); + assert_eq!(settings, response); } #[tokio::test] @@ -755,19 +757,20 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::Value(value) = network + let RadarrSerdeable::Value(value) = network .handle_radarr_event(RadarrEvent::TestIndexer(1)) .await .unwrap() - { - async_details_server.assert_async().await; - async_test_server.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.indexer_test_errors, - Some("\"test failure\"".to_owned()) - ); - assert_eq!(value, response_json) - } + else { + panic!("Expected Value") + }; + async_details_server.assert_async().await; + async_test_server.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.indexer_test_errors, + Some("\"test failure\"".to_owned()) + ); + assert_eq!(value, response_json); } #[tokio::test] @@ -812,19 +815,20 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::Value(value) = network + let RadarrSerdeable::Value(value) = network .handle_radarr_event(RadarrEvent::TestIndexer(1)) .await .unwrap() - { - async_details_server.assert_async().await; - async_test_server.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.indexer_test_errors, - Some(String::new()) - ); - assert_eq!(value, json!({})); - } + else { + panic!("Expected Value") + }; + async_details_server.assert_async().await; + async_test_server.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.indexer_test_errors, + Some(String::new()) + ); + assert_eq!(value, json!({})); } #[tokio::test] @@ -890,34 +894,35 @@ mod tests { .set_items(indexers); let mut network = test_network(&app); - if let RadarrSerdeable::IndexerTestResults(results) = network + let RadarrSerdeable::IndexerTestResults(results) = network .handle_radarr_event(RadarrEvent::TestAllIndexers) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app - .lock() - .await - .data - .radarr_data - .indexer_test_all_results - .is_some() - ); - assert_eq!( - app - .lock() - .await - .data - .radarr_data - .indexer_test_all_results - .as_ref() - .unwrap() - .items, - indexer_test_results_modal_items - ); - assert_eq!(results, response); - } + else { + panic!("Expected IndexerTestResults") + }; + async_server.assert_async().await; + assert!( + app + .lock() + .await + .data + .radarr_data + .indexer_test_all_results + .is_some() + ); + assert_eq!( + app + .lock() + .await + .data + .radarr_data + .indexer_test_all_results + .as_ref() + .unwrap() + .items, + indexer_test_results_modal_items + ); + assert_eq!(results, response); } } diff --git a/src/network/radarr_network/library/radarr_library_network_tests.rs b/src/network/radarr_network/library/radarr_library_network_tests.rs index e16e8c3..d56806e 100644 --- a/src/network/radarr_network/library/radarr_library_network_tests.rs +++ b/src/network/radarr_network/library/radarr_library_network_tests.rs @@ -382,19 +382,20 @@ mod tests { app_arc.lock().await.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); let mut network = test_network(&app_arc); - if let RadarrSerdeable::Credits(credits) = network + let RadarrSerdeable::Credits(credits) = network .handle_radarr_event(RadarrEvent::GetMovieCredits(1)) .await .unwrap() - { - let app = app_arc.lock().await; - let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap(); + else { + panic!("Expected Credits") + }; + let app = app_arc.lock().await; + let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap(); - async_server.assert_async().await; - assert_eq!(movie_details_modal.movie_cast.items, vec![cast_credit()]); - assert_eq!(movie_details_modal.movie_crew.items, vec![crew_credit()]); - assert_eq!(credits, response); - } + async_server.assert_async().await; + assert_eq!(movie_details_modal.movie_cast.items, vec![cast_credit()]); + assert_eq!(movie_details_modal.movie_crew.items, vec![crew_credit()]); + assert_eq!(credits, response); } #[tokio::test] @@ -570,77 +571,78 @@ mod tests { BiMap::from_iter([(2222, "HD - 1080p".to_owned())]); let mut network = test_network(&app_arc); - if let RadarrSerdeable::Movie(movie) = network + let RadarrSerdeable::Movie(movie) = network .handle_radarr_event(RadarrEvent::GetMovieDetails(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app_arc - .lock() - .await - .data - .radarr_data - .movie_details_modal - .is_some() - ); - assert_eq!(movie, response); + else { + panic!("Expected Movie") + }; + async_server.assert_async().await; + assert!( + app_arc + .lock() + .await + .data + .radarr_data + .movie_details_modal + .is_some() + ); + assert_eq!(movie, response); - let app = app_arc.lock().await; - let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap(); - assert_str_eq!( - movie_details_modal.movie_details.get_text(), - formatdoc!( - "Title: Test - Year: 2023 - Runtime: 2h 0m - Rating: R - Collection: Test Collection - Status: Downloaded - Description: Blah blah blah - TMDB: 99% - IMDB: 9.9 - Rotten Tomatoes: - Quality Profile: HD - 1080p - Size: 3.30 GB - Path: /nfs/movies - Studio: 21st Century Alex - Genres: cool, family, fun" - ) - ); - assert_str_eq!( - movie_details_modal.file_details, - formatdoc!( - "Relative Path: Test.mkv - Absolute Path: /nfs/movies/Test.mkv + let app = app_arc.lock().await; + let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap(); + assert_str_eq!( + movie_details_modal.movie_details.get_text(), + formatdoc!( + "Title: Test + Year: 2023 + Runtime: 2h 0m + Rating: R + Collection: Test Collection + Status: Downloaded + Description: Blah blah blah + TMDB: 99% + IMDB: 9.9 + Rotten Tomatoes: + Quality Profile: HD - 1080p Size: 3.30 GB - Date Added: 2022-12-30 07:37:56 UTC" - ) - ); - assert_str_eq!( - movie_details_modal.audio_details, - formatdoc!( - "Bitrate: 0 - Channels: 7.1 - Codec: AAC - Languages: eng - Stream Count: 1" - ) - ); - assert_str_eq!( - movie_details_modal.video_details, - formatdoc!( - "Bit Depth: 10 - Bitrate: 0 - Codec: x265 - FPS: 23.976 - Resolution: 1920x804 - Scan Type: Progressive - Runtime: 2:00:00" - ) - ); - } + Path: /nfs/movies + Studio: 21st Century Alex + Genres: cool, family, fun" + ) + ); + assert_str_eq!( + movie_details_modal.file_details, + formatdoc!( + "Relative Path: Test.mkv + Absolute Path: /nfs/movies/Test.mkv + Size: 3.30 GB + Date Added: 2022-12-30 07:37:56 UTC" + ) + ); + assert_str_eq!( + movie_details_modal.audio_details, + formatdoc!( + "Bitrate: 0 + Channels: 7.1 + Codec: AAC + Languages: eng + Stream Count: 1" + ) + ); + assert_str_eq!( + movie_details_modal.video_details, + formatdoc!( + "Bit Depth: 10 + Bitrate: 0 + Codec: x265 + FPS: 23.976 + Resolution: 1920x804 + Scan Type: Progressive + Runtime: 2:00:00" + ) + ); } #[tokio::test] @@ -741,27 +743,28 @@ mod tests { app_arc.lock().await.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); let mut network = test_network(&app_arc); - if let RadarrSerdeable::MovieHistoryItems(history) = network + let RadarrSerdeable::MovieHistoryItems(history) = network .handle_radarr_event(RadarrEvent::GetMovieHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .radarr_data - .movie_details_modal - .as_ref() - .unwrap() - .movie_history - .items, - vec![movie_history_item()] - ); - assert_eq!(history, response); - } + else { + panic!("Expected MovieHistoryItems") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .radarr_data + .movie_details_modal + .as_ref() + .unwrap() + .movie_history + .items, + vec![movie_history_item()] + ); + assert_eq!(history, response); } #[tokio::test] @@ -828,27 +831,28 @@ mod tests { app_arc.lock().await.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); let mut network = test_network(&app_arc); - if let RadarrSerdeable::Releases(releases_vec) = network + let RadarrSerdeable::Releases(releases_vec) = network .handle_radarr_event(RadarrEvent::GetReleases(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .radarr_data - .movie_details_modal - .as_ref() - .unwrap() - .movie_releases - .items, - vec![release()] - ); - assert_eq!(releases_vec, vec![release()]); - } + else { + panic!("Expected Releases") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .radarr_data + .movie_details_modal + .as_ref() + .unwrap() + .movie_releases + .items, + vec![release()] + ); + assert_eq!(releases_vec, vec![release()]); } #[tokio::test] @@ -928,35 +932,36 @@ mod tests { .await; let mut network = test_network(&app_arc); - if let RadarrSerdeable::AddMovieSearchResults(add_movie_search_results) = network + let RadarrSerdeable::AddMovieSearchResults(add_movie_search_results) = network .handle_radarr_event(RadarrEvent::SearchNewMovie("test term".into())) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app_arc - .lock() - .await - .data - .radarr_data - .add_searched_movies - .is_some() - ); - assert_eq!( - app_arc - .lock() - .await - .data - .radarr_data - .add_searched_movies - .as_ref() - .unwrap() - .items, - vec![add_movie_search_result()] - ); - assert_eq!(add_movie_search_results, vec![add_movie_search_result()]); - } + else { + panic!("Expected AddMovieSearchResults") + }; + async_server.assert_async().await; + assert!( + app_arc + .lock() + .await + .data + .radarr_data + .add_searched_movies + .is_some() + ); + assert_eq!( + app_arc + .lock() + .await + .data + .radarr_data + .add_searched_movies + .as_ref() + .unwrap() + .items, + vec![add_movie_search_result()] + ); + assert_eq!(add_movie_search_results, vec![add_movie_search_result()]); } #[tokio::test] diff --git a/src/network/radarr_network/radarr_network_tests.rs b/src/network/radarr_network/radarr_network_tests.rs index c5af96e..cfa10b0 100644 --- a/src/network/radarr_network/radarr_network_tests.rs +++ b/src/network/radarr_network/radarr_network_tests.rs @@ -194,8 +194,9 @@ mod test { mock.assert_async().await; let RadarrSerdeable::QualityProfiles(quality_profiles) = result.unwrap() else { - panic!("Expected QualityProfiles variant"); + panic!("Expected QualityProfiles"); }; + assert_eq!(quality_profiles, expected); assert_eq!( app.lock().await.data.radarr_data.quality_profile_map, @@ -225,8 +226,9 @@ mod test { mock.assert_async().await; let RadarrSerdeable::Tags(tags) = result.unwrap() else { - panic!("Expected Tags variant"); + panic!("Expected Tags"); }; + assert_eq!(tags, expected); assert_eq!( app.lock().await.data.radarr_data.tags_map, @@ -259,8 +261,9 @@ mod test { mock.assert_async().await; let RadarrSerdeable::Tag(tag) = result.unwrap() else { - panic!("Expected Tag variant"); + panic!("Expected Tag"); }; + assert_eq!(tag, expected); assert_eq!( app.lock().await.data.radarr_data.tags_map, diff --git a/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs b/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs index 0c03765..f323d45 100644 --- a/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs +++ b/src/network/radarr_network/root_folders/radarr_root_folders_network_tests.rs @@ -65,17 +65,18 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::RootFolders(root_folders) = network + let RadarrSerdeable::RootFolders(root_folders) = network .handle_radarr_event(RadarrEvent::GetRootFolders) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.root_folders.items, - vec![root_folder()] - ); - assert_eq!(root_folders, response); - } + else { + panic!("Expected RootFolders") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.root_folders.items, + vec![root_folder()] + ); + assert_eq!(root_folders, response); } } diff --git a/src/network/radarr_network/system/radarr_system_network_tests.rs b/src/network/radarr_network/system/radarr_system_network_tests.rs index 6936776..c6a9cfd 100644 --- a/src/network/radarr_network/system/radarr_system_network_tests.rs +++ b/src/network/radarr_network/system/radarr_system_network_tests.rs @@ -39,18 +39,19 @@ mod tests { }, ]; - if let RadarrSerdeable::DiskSpaces(disk_space) = network + let RadarrSerdeable::DiskSpaces(disk_space) = network .handle_radarr_event(RadarrEvent::GetDiskSpace) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.disk_space_vec, - disk_space_vec - ); - assert_eq!(disk_space, disk_space_vec); - } + else { + panic!("Expected DiskSpaces") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.disk_space_vec, + disk_space_vec + ); + assert_eq!(disk_space, disk_space_vec); } #[tokio::test] @@ -73,14 +74,15 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::HostConfig(host_config) = network + let RadarrSerdeable::HostConfig(host_config) = network .handle_radarr_event(RadarrEvent::GetHostConfig) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(host_config, response); - } + else { + panic!("Expected HostConfig") + }; + mock.assert_async().await; + assert_eq!(host_config, response); } #[tokio::test] @@ -123,26 +125,27 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::LogResponse(logs) = network + let RadarrSerdeable::LogResponse(logs) = network .handle_radarr_event(RadarrEvent::GetLogs(500)) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(app.lock().await.data.radarr_data.logs.items, expected_logs); - assert!( - app - .lock() - .await - .data - .radarr_data - .logs - .current_selection() - .text - .contains("INFO") - ); - assert_eq!(logs, response); - } + else { + panic!("Expected LogResponse") + }; + mock.assert_async().await; + assert_eq!(app.lock().await.data.radarr_data.logs.items, expected_logs); + assert!( + app + .lock() + .await + .data + .radarr_data + .logs + .current_selection() + .text + .contains("INFO") + ); + assert_eq!(logs, response); } #[tokio::test] @@ -176,18 +179,19 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::QueueEvents(events) = network + let RadarrSerdeable::QueueEvents(events) = network .handle_radarr_event(RadarrEvent::GetQueuedEvents) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.queued_events.items, - vec![expected_event] - ); - assert_eq!(events, response); - } + else { + panic!("Expected QueueEvents") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.queued_events.items, + vec![expected_event] + ); + assert_eq!(events, response); } #[tokio::test] @@ -208,14 +212,15 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::SecurityConfig(security_config) = network + let RadarrSerdeable::SecurityConfig(security_config) = network .handle_radarr_event(RadarrEvent::GetSecurityConfig) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(security_config, response); - } + else { + panic!("Expected SecurityConfig") + }; + mock.assert_async().await; + assert_eq!(security_config, response); } #[tokio::test] @@ -230,22 +235,23 @@ mod tests { let mut network = test_network(&app); let date_time = DateTime::from(DateTime::parse_from_rfc3339("2023-02-25T20:16:43Z").unwrap()); - if let RadarrSerdeable::SystemStatus(status) = network + let RadarrSerdeable::SystemStatus(status) = network .handle_radarr_event(RadarrEvent::GetStatus) .await .unwrap() - { - async_server.assert_async().await; - assert_str_eq!(app.lock().await.data.radarr_data.version, "v1"); - assert_eq!(app.lock().await.data.radarr_data.start_time, date_time); - assert_eq!( - status, - SystemStatus { - version: "v1".to_owned(), - start_time: date_time - } - ); - } + else { + panic!("Expected SystemStatus") + }; + async_server.assert_async().await; + assert_str_eq!(app.lock().await.data.radarr_data.version, "v1"); + assert_eq!(app.lock().await.data.radarr_data.start_time, date_time); + assert_eq!( + status, + SystemStatus { + version: "v1".to_owned(), + start_time: date_time + } + ); } #[tokio::test] @@ -323,18 +329,19 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::Updates(updates) = network + let RadarrSerdeable::Updates(updates) = network .handle_radarr_event(RadarrEvent::GetUpdates) .await .unwrap() - { - async_server.assert_async().await; - assert_str_eq!( - app.lock().await.data.radarr_data.updates.get_text(), - expected_text.get_text() - ); - assert_eq!(updates, response); - } + else { + panic!("Expected Updates") + }; + async_server.assert_async().await; + assert_str_eq!( + app.lock().await.data.radarr_data.updates.get_text(), + expected_text.get_text() + ); + assert_eq!(updates, response); } #[tokio::test] @@ -381,18 +388,19 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::Tasks(tasks) = network + let RadarrSerdeable::Tasks(tasks) = network .handle_radarr_event(RadarrEvent::GetTasks) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app.lock().await.data.radarr_data.tasks.items, - expected_tasks - ); - assert_eq!(tasks, response); - } + else { + panic!("Expected Tasks") + }; + async_server.assert_async().await; + assert_eq!( + app.lock().await.data.radarr_data.tasks.items, + expected_tasks + ); + assert_eq!(tasks, response); } #[tokio::test] @@ -409,15 +417,16 @@ mod tests { .await; let mut network = test_network(&app); - if let RadarrSerdeable::Value(value) = network + let RadarrSerdeable::Value(value) = network .handle_radarr_event(RadarrEvent::StartTask( RadarrTaskName::ApplicationCheckUpdate, )) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!(value, response); - } + else { + panic!("Expected Value") + }; + async_server.assert_async().await; + assert_eq!(value, response); } } diff --git a/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs b/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs index 72afc8e..5b818cc 100644 --- a/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs +++ b/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs @@ -163,19 +163,20 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::BlocklistResponse(blocklist) = network + let SonarrSerdeable::BlocklistResponse(blocklist) = network .handle_sonarr_event(SonarrEvent::GetBlocklist) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.blocklist.items, - expected_blocklist - ); - assert!(app.lock().await.data.sonarr_data.blocklist.sort_asc); - assert_eq!(blocklist, response); - } + else { + panic!("Expected BlocklistResponse") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.blocklist.items, + expected_blocklist + ); + assert!(app.lock().await.data.sonarr_data.blocklist.sort_asc); + assert_eq!(blocklist, response); } #[tokio::test] @@ -233,15 +234,16 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::BlocklistResponse(blocklist) = network + let SonarrSerdeable::BlocklistResponse(blocklist) = network .handle_sonarr_event(SonarrEvent::GetBlocklist) .await .unwrap() - { - mock.assert_async().await; - assert!(app.lock().await.data.sonarr_data.blocklist.is_empty()); - assert!(app.lock().await.data.sonarr_data.blocklist.sort_asc); - assert_eq!(blocklist, response); - } + else { + panic!("Expected BlocklistResponse") + }; + mock.assert_async().await; + assert!(app.lock().await.data.sonarr_data.blocklist.is_empty()); + assert!(app.lock().await.data.sonarr_data.blocklist.sort_asc); + assert_eq!(blocklist, response); } } diff --git a/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs b/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs index a664ab7..3a74f39 100644 --- a/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs +++ b/src/network/sonarr_network/downloads/sonarr_downloads_network_tests.rs @@ -60,18 +60,19 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::DownloadsResponse(downloads) = network + let SonarrSerdeable::DownloadsResponse(downloads) = network .handle_sonarr_event(SonarrEvent::GetDownloads(500)) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.downloads.items, - downloads_response().records - ); - assert_eq!(downloads, response); - } + else { + panic!("Expected DownloadsResponse") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.downloads.items, + downloads_response().records + ); + assert_eq!(downloads, response); } #[tokio::test] diff --git a/src/network/sonarr_network/history/sonarr_history_network_tests.rs b/src/network/sonarr_network/history/sonarr_history_network_tests.rs index 04803c6..7bb1dae 100644 --- a/src/network/sonarr_network/history/sonarr_history_network_tests.rs +++ b/src/network/sonarr_network/history/sonarr_history_network_tests.rs @@ -84,19 +84,20 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryWrapper(history) = network + let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetHistory(500)) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.history.items, - expected_history_items - ); - assert!(app.lock().await.data.sonarr_data.history.sort_asc); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryWrapper") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.history.items, + expected_history_items + ); + assert!(app.lock().await.data.sonarr_data.history.sort_asc); + assert_eq!(history, response); } #[tokio::test] @@ -158,16 +159,17 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryWrapper(history) = network + let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetHistory(500)) .await .unwrap() - { - mock.assert_async().await; - assert!(app.lock().await.data.sonarr_data.history.is_empty()); - assert!(app.lock().await.data.sonarr_data.history.sort_asc); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryWrapper") + }; + mock.assert_async().await; + assert!(app.lock().await.data.sonarr_data.history.is_empty()); + assert!(app.lock().await.data.sonarr_data.history.sort_asc); + assert_eq!(history, response); } #[tokio::test] diff --git a/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs b/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs index 38330ae..3bd86bd 100644 --- a/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs +++ b/src/network/sonarr_network/indexers/sonarr_indexers_network_tests.rs @@ -635,18 +635,19 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Indexers(indexers) = network + let SonarrSerdeable::Indexers(indexers) = network .handle_sonarr_event(SonarrEvent::GetIndexers) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.indexers.items, - vec![indexer()] - ); - assert_eq!(indexers, response); - } + else { + panic!("Expected Indexers") + }; + async_server.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.indexers.items, + vec![indexer()] + ); + assert_eq!(indexers, response); } #[tokio::test] @@ -706,19 +707,20 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Value(value) = network + let SonarrSerdeable::Value(value) = network .handle_sonarr_event(SonarrEvent::TestIndexer(1)) .await .unwrap() - { - async_details_server.assert_async().await; - async_test_server.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.indexer_test_errors, - Some("\"test failure\"".to_owned()) - ); - assert_eq!(value, response_json) - } + else { + panic!("Expected Value") + }; + async_details_server.assert_async().await; + async_test_server.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.indexer_test_errors, + Some("\"test failure\"".to_owned()) + ); + assert_eq!(value, response_json); } #[tokio::test] @@ -771,19 +773,20 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Value(value) = network + let SonarrSerdeable::Value(value) = network .handle_sonarr_event(SonarrEvent::TestIndexer(1)) .await .unwrap() - { - async_details_server.assert_async().await; - async_test_server.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.indexer_test_errors, - Some(String::new()) - ); - assert_eq!(value, json!({})); - } + else { + panic!("Expected Value") + }; + async_details_server.assert_async().await; + async_test_server.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.indexer_test_errors, + Some(String::new()) + ); + assert_eq!(value, json!({})); } #[tokio::test] @@ -850,34 +853,35 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::IndexerTestResults(results) = network + let SonarrSerdeable::IndexerTestResults(results) = network .handle_sonarr_event(SonarrEvent::TestAllIndexers) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app - .lock() - .await - .data - .sonarr_data - .indexer_test_all_results - .is_some() - ); - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .indexer_test_all_results - .as_ref() - .unwrap() - .items, - indexer_test_results_modal_items - ); - assert_eq!(results, response); - } + else { + panic!("Expected IndexerTestResults") + }; + async_server.assert_async().await; + assert!( + app + .lock() + .await + .data + .sonarr_data + .indexer_test_all_results + .is_some() + ); + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .indexer_test_all_results + .as_ref() + .unwrap() + .items, + indexer_test_results_modal_items + ); + assert_eq!(results, response); } } diff --git a/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs b/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs index 74ca0af..cd4f536 100644 --- a/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs +++ b/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs @@ -253,27 +253,28 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Episodes(episodes) = network + let SonarrSerdeable::Episodes(episodes) = network .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .items, - vec![episode()] - ); - assert_eq!(episodes, vec![episode()]); - } + else { + panic!("Expected Episodes") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .items, + vec![episode()] + ); + assert_eq!(episodes, vec![episode()]); } #[tokio::test] @@ -353,38 +354,39 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Episodes(episodes) = network + let SonarrSerdeable::Episodes(episodes) = network .handle_sonarr_event(SonarrEvent::GetEpisodes(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .is_empty() - ); - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episodes - .sort_asc - ); - assert_eq!(episodes, expected_episodes); - } + else { + panic!("Expected Episodes") + }; + async_server.assert_async().await; + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .is_empty() + ); + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episodes + .sort_asc + ); + assert_eq!(episodes, expected_episodes); } #[tokio::test] @@ -409,27 +411,28 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::EpisodeFiles(episode_files) = network + let SonarrSerdeable::EpisodeFiles(episode_files) = network .handle_sonarr_event(SonarrEvent::GetEpisodeFiles(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_files - .items, - vec![episode_file()] - ); - assert_eq!(episode_files, vec![episode_file()]); - } + else { + panic!("Expected EpisodeFiles") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_files + .items, + vec![episode_file()] + ); + assert_eq!(episode_files, vec![episode_file()]); } #[tokio::test] @@ -452,36 +455,37 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::EpisodeFiles(episode_files) = network + let SonarrSerdeable::EpisodeFiles(episode_files) = network .handle_sonarr_event(SonarrEvent::GetEpisodeFiles(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .is_some() - ); - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_files - .items, - vec![episode_file()] - ); - assert_eq!(episode_files, vec![episode_file()]); - } + else { + panic!("Expected EpisodeFiles") + }; + async_server.assert_async().await; + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .is_some() + ); + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_files + .items, + vec![episode_file()] + ); + assert_eq!(episode_files, vec![episode_file()]); } #[tokio::test] @@ -569,45 +573,46 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::SonarrHistoryWrapper(history) = network + let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetEpisodeHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_history - .items, - expected_history_items - ); - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_history - .sort_asc - ); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryWrapper") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_history + .items, + expected_history_items + ); + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_history + .sort_asc + ); + assert_eq!(history, response); } #[tokio::test] @@ -673,45 +678,46 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::SonarrHistoryWrapper(history) = network + let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetEpisodeHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_history - .items, - expected_history_items - ); - assert!( - !app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_history - .sort_asc - ); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryWrapper") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_history + .items, + expected_history_items + ); + assert!( + !app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_history + .sort_asc + ); + assert_eq!(history, response); } #[tokio::test] @@ -765,45 +771,46 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::SonarrHistoryWrapper(history) = network + let SonarrSerdeable::SonarrHistoryWrapper(history) = network .handle_sonarr_event(SonarrEvent::GetEpisodeHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_history - .items, - expected_history_items - ); - assert!( - !app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_history - .sort_asc - ); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryWrapper") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_history + .items, + expected_history_items + ); + assert!( + !app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_history + .sort_asc + ); + assert_eq!(history, response); } #[tokio::test] @@ -827,44 +834,30 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Episode(episode) = network + let SonarrSerdeable::Episode(episode) = network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_some() - ); - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_details_tabs - .get_active_route(), - ActiveSonarrBlock::EpisodeHistory.into() - ); - assert_eq!(episode, response); - - let app = app_arc.lock().await; - let episode_details_modal = app + else { + panic!("Expected Episode") + }; + async_server.assert_async().await; + assert!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .is_some() + ); + assert_eq!( + app_arc + .lock() + .await .data .sonarr_data .season_details_modal @@ -872,52 +865,67 @@ mod tests { .unwrap() .episode_details_modal .as_ref() - .unwrap(); - assert_str_eq!( - episode_details_modal.episode_details.get_text(), - formatdoc!( - "Title: Something cool - Season: 1 - Episode Number: 1 - Air Date: 2024-02-10 07:28:45 UTC - Status: Downloaded - Description: Okay so this one time at band camp..." - ) - ); - assert_str_eq!( - episode_details_modal.file_details, - formatdoc!( - "Relative Path: /season 1/episode 1.mkv - Absolute Path: /nfs/tv/series/season 1/episode 1.mkv - Size: 3.30 GB - Language: English - Date Added: 2024-02-10 07:28:45 UTC" - ) - ); - assert_str_eq!( - episode_details_modal.audio_details, - formatdoc!( - "Bitrate: 0 - Channels: 7.1 - Codec: AAC - Languages: eng - Stream Count: 1" - ) - ); - assert_str_eq!( - episode_details_modal.video_details, - formatdoc!( - "Bit Depth: 10 - Bitrate: 0 - Codec: x265 - FPS: 23.976 - Resolution: 1920x1080 - Scan Type: Progressive - Runtime: 23:51 - Subtitles: English" - ) - ); - } + .unwrap() + .episode_details_tabs + .get_active_route(), + ActiveSonarrBlock::EpisodeHistory.into() + ); + assert_eq!(episode, response); + + let app = app_arc.lock().await; + let episode_details_modal = app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap(); + assert_str_eq!( + episode_details_modal.episode_details.get_text(), + formatdoc!( + "Title: Something cool + Season: 1 + Episode Number: 1 + Air Date: 2024-02-10 07:28:45 UTC + Status: Downloaded + Description: Okay so this one time at band camp..." + ) + ); + assert_str_eq!( + episode_details_modal.file_details, + formatdoc!( + "Relative Path: /season 1/episode 1.mkv + Absolute Path: /nfs/tv/series/season 1/episode 1.mkv + Size: 3.30 GB + Language: English + Date Added: 2024-02-10 07:28:45 UTC" + ) + ); + assert_str_eq!( + episode_details_modal.audio_details, + formatdoc!( + "Bitrate: 0 + Channels: 7.1 + Codec: AAC + Languages: eng + Stream Count: 1" + ) + ); + assert_str_eq!( + episode_details_modal.video_details, + formatdoc!( + "Bit Depth: 10 + Bitrate: 0 + Codec: x265 + FPS: 23.976 + Resolution: 1920x1080 + Scan Type: Progressive + Runtime: 23:51 + Subtitles: English" + ) + ); } #[tokio::test] @@ -938,81 +946,82 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Episode(episode) = network + let SonarrSerdeable::Episode(episode) = network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_some() - ); - assert_eq!(episode, response); - - let app = app_arc.lock().await; - let episode_details_modal = app + else { + panic!("Expected Episode") + }; + async_server.assert_async().await; + assert!( + app_arc + .lock() + .await .data .sonarr_data .season_details_modal .as_ref() .unwrap() .episode_details_modal - .as_ref() - .unwrap(); - assert_str_eq!( - episode_details_modal.episode_details.get_text(), - formatdoc!( - "Title: Something cool - Season: 1 - Episode Number: 1 - Air Date: 2024-02-10 07:28:45 UTC - Status: Downloaded - Description: Okay so this one time at band camp..." - ) - ); - assert_str_eq!( - episode_details_modal.file_details, - formatdoc!( - "Relative Path: /season 1/episode 1.mkv - Absolute Path: /nfs/tv/series/season 1/episode 1.mkv - Size: 3.30 GB - Language: English - Date Added: 2024-02-10 07:28:45 UTC" - ) - ); - assert_str_eq!( - episode_details_modal.audio_details, - formatdoc!( - "Bitrate: 0 - Channels: 7.1 - Codec: AAC - Languages: eng - Stream Count: 1" - ) - ); - assert_str_eq!( - episode_details_modal.video_details, - formatdoc!( - "Bit Depth: 10 - Bitrate: 0 - Codec: x265 - FPS: 23.976 - Resolution: 1920x1080 - Scan Type: Progressive - Runtime: 23:51 - Subtitles: English" - ) - ); - } + .is_some() + ); + assert_eq!(episode, response); + + let app = app_arc.lock().await; + let episode_details_modal = app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap(); + assert_str_eq!( + episode_details_modal.episode_details.get_text(), + formatdoc!( + "Title: Something cool + Season: 1 + Episode Number: 1 + Air Date: 2024-02-10 07:28:45 UTC + Status: Downloaded + Description: Okay so this one time at band camp..." + ) + ); + assert_str_eq!( + episode_details_modal.file_details, + formatdoc!( + "Relative Path: /season 1/episode 1.mkv + Absolute Path: /nfs/tv/series/season 1/episode 1.mkv + Size: 3.30 GB + Language: English + Date Added: 2024-02-10 07:28:45 UTC" + ) + ); + assert_str_eq!( + episode_details_modal.audio_details, + formatdoc!( + "Bitrate: 0 + Channels: 7.1 + Codec: AAC + Languages: eng + Stream Count: 1" + ) + ); + assert_str_eq!( + episode_details_modal.video_details, + formatdoc!( + "Bit Depth: 10 + Bitrate: 0 + Codec: x265 + FPS: 23.976 + Resolution: 1920x1080 + Scan Type: Progressive + Runtime: 23:51 + Subtitles: English" + ) + ); } #[tokio::test] @@ -1027,14 +1036,15 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Episode(episode) = network + let SonarrSerdeable::Episode(episode) = network .handle_sonarr_event(SonarrEvent::GetEpisodeDetails(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!(episode, response); - } + else { + panic!("Expected Episode") + }; + async_server.assert_async().await; + assert_eq!(episode, response); } #[tokio::test] @@ -1092,30 +1102,31 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Releases(releases_vec) = network + let SonarrSerdeable::Releases(releases_vec) = network .handle_sonarr_event(SonarrEvent::GetEpisodeReleases(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_releases - .items, - vec![release()] - ); - assert_eq!(releases_vec, vec![release()]); - } + else { + panic!("Expected Releases") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_releases + .items, + vec![release()] + ); + assert_eq!(releases_vec, vec![release()]); } #[tokio::test] @@ -1146,30 +1157,31 @@ mod tests { app_arc.lock().await.server_tabs.next(); let mut network = test_network(&app_arc); - if let SonarrSerdeable::Releases(releases_vec) = network + let SonarrSerdeable::Releases(releases_vec) = network .handle_sonarr_event(SonarrEvent::GetEpisodeReleases(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app_arc - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .as_ref() - .unwrap() - .episode_releases - .items, - vec![release()] - ); - assert_eq!(releases_vec, vec![release()]); - } + else { + panic!("Expected Releases") + }; + async_server.assert_async().await; + assert_eq!( + app_arc + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .as_ref() + .unwrap() + .episode_releases + .items, + vec![release()] + ); + assert_eq!(releases_vec, vec![release()]); } #[tokio::test] diff --git a/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs b/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs index 69db1ac..25fb1f1 100644 --- a/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs +++ b/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs @@ -136,27 +136,28 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Releases(releases_vec) = network + let SonarrSerdeable::Releases(releases_vec) = network .handle_sonarr_event(SonarrEvent::GetSeasonReleases((1, 1))) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_releases - .items, - vec![expected_filtered_sonarr_release] - ); - assert_eq!(releases_vec, expected_raw_sonarr_releases); - } + else { + panic!("Expected Releases") + }; + mock.assert_async().await; + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_releases + .items, + vec![expected_filtered_sonarr_release] + ); + assert_eq!(releases_vec, expected_raw_sonarr_releases); } #[tokio::test] @@ -319,39 +320,40 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryItems(history) = network + let SonarrSerdeable::SonarrHistoryItems(history) = network .handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1))) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .items, - expected_history_items - ); - assert!( - app - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .sort_asc - ); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryItems") + }; + mock.assert_async().await; + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .items, + expected_history_items + ); + assert!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .sort_asc + ); + assert_eq!(history, response); } #[tokio::test] @@ -419,48 +421,49 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryItems(history) = network + let SonarrSerdeable::SonarrHistoryItems(history) = network .handle_sonarr_event(SonarrEvent::GetSeasonHistory((1, 1))) .await .unwrap() - { - mock.assert_async().await; - assert!( - app - .lock() - .await - .data - .sonarr_data - .season_details_modal - .is_some() - ); - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .items, - expected_history_items - ); - assert!( - !app - .lock() - .await - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .season_history - .sort_asc - ); - assert_eq!(history, response); - } + else { + panic!("Expected SonarrHistoryItems") + }; + mock.assert_async().await; + assert!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .is_some() + ); + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .items, + expected_history_items + ); + assert!( + !app + .lock() + .await + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .season_history + .sort_asc + ); + assert_eq!(history, response); } #[tokio::test] diff --git a/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs b/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs index e1f5f31..fabd110 100644 --- a/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs +++ b/src/network/sonarr_network/library/series/sonarr_series_network_tests.rs @@ -409,14 +409,15 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Series(series) = network + let SonarrSerdeable::Series(series) = network .handle_sonarr_event(SonarrEvent::GetSeriesDetails(1)) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!(series, expected_series); - } + else { + panic!("Expected Series") + }; + async_server.assert_async().await; + assert_eq!(series, expected_series); } #[rstest] @@ -500,38 +501,39 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryItems(history_items) = network + let SonarrSerdeable::SonarrHistoryItems(history_items) = network .handle_sonarr_event(SonarrEvent::GetSeriesHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!(app.lock().await.data.sonarr_data.series_history.is_some()); - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .items, - expected_history_items - ); - assert!( - app - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .sort_asc - ); - assert_eq!(history_items, response); - } + else { + panic!("Expected SonarrHistoryItems") + }; + async_server.assert_async().await; + assert!(app.lock().await.data.sonarr_data.series_history.is_some()); + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .items, + expected_history_items + ); + assert!( + app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .sort_asc + ); + assert_eq!(history_items, response); } #[tokio::test] @@ -592,38 +594,39 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryItems(history_items) = network + let SonarrSerdeable::SonarrHistoryItems(history_items) = network .handle_sonarr_event(SonarrEvent::GetSeriesHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!(app.lock().await.data.sonarr_data.series_history.is_some()); - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .items, - expected_history_items - ); - assert!( - !app - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .sort_asc - ); - assert_eq!(history_items, response); - } + else { + panic!("Expected SonarrHistoryItems") + }; + async_server.assert_async().await; + assert!(app.lock().await.data.sonarr_data.series_history.is_some()); + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .items, + expected_history_items + ); + assert!( + !app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .sort_asc + ); + assert_eq!(history_items, response); } #[tokio::test] @@ -690,37 +693,38 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SonarrHistoryItems(history_items) = network + let SonarrSerdeable::SonarrHistoryItems(history_items) = network .handle_sonarr_event(SonarrEvent::GetSeriesHistory(1)) .await .unwrap() - { - async_server.assert_async().await; - assert!(app.lock().await.data.sonarr_data.series_history.is_some()); - assert!( - app - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .is_empty() - ); - assert!( - app - .lock() - .await - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .sort_asc - ); - assert_eq!(history_items, response); - } + else { + panic!("Expected SonarrHistoryItems") + }; + async_server.assert_async().await; + assert!(app.lock().await.data.sonarr_data.series_history.is_some()); + assert!( + app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .is_empty() + ); + assert!( + app + .lock() + .await + .data + .sonarr_data + .series_history + .as_ref() + .unwrap() + .sort_asc + ); + assert_eq!(history_items, response); } #[rstest] @@ -784,19 +788,20 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SeriesVec(series) = network + let SonarrSerdeable::SeriesVec(series) = network .handle_sonarr_event(SonarrEvent::ListSeries) .await .unwrap() - { - async_server.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.series.items, - expected_sorted_series - ); - assert!(app.lock().await.data.sonarr_data.series.sort_asc); - assert_eq!(series, expected_series); - } + else { + panic!("Expected SeriesVec") + }; + async_server.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.series.items, + expected_sorted_series + ); + assert!(app.lock().await.data.sonarr_data.series.sort_asc); + assert_eq!(series, expected_series); } #[tokio::test] @@ -872,35 +877,36 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::AddSeriesSearchResults(add_series_search_results) = network + let SonarrSerdeable::AddSeriesSearchResults(add_series_search_results) = network .handle_sonarr_event(SonarrEvent::SearchNewSeries("test term".into())) .await .unwrap() - { - async_server.assert_async().await; - assert!( - app - .lock() - .await - .data - .sonarr_data - .add_searched_series - .is_some() - ); - assert_eq!( - app - .lock() - .await - .data - .sonarr_data - .add_searched_series - .as_ref() - .unwrap() - .items, - vec![add_series_search_result()] - ); - assert_eq!(add_series_search_results, vec![add_series_search_result()]); - } + else { + panic!("Expected AddSeriesSearchResults") + }; + async_server.assert_async().await; + assert!( + app + .lock() + .await + .data + .sonarr_data + .add_searched_series + .is_some() + ); + assert_eq!( + app + .lock() + .await + .data + .sonarr_data + .add_searched_series + .as_ref() + .unwrap() + .items, + vec![add_series_search_result()] + ); + assert_eq!(add_series_search_results, vec![add_series_search_result()]); } #[tokio::test] diff --git a/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs b/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs index 9cdb416..cd77d8e 100644 --- a/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs +++ b/src/network/sonarr_network/root_folders/sonarr_root_folders_network_tests.rs @@ -71,17 +71,18 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::RootFolders(root_folders) = network + let SonarrSerdeable::RootFolders(root_folders) = network .handle_sonarr_event(SonarrEvent::GetRootFolders) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.root_folders.items, - vec![root_folder()] - ); - assert_eq!(root_folders, response); - } + else { + panic!("Expected RootFolders") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.root_folders.items, + vec![root_folder()] + ); + assert_eq!(root_folders, response); } } diff --git a/src/network/sonarr_network/sonarr_network_tests.rs b/src/network/sonarr_network/sonarr_network_tests.rs index 87bdb62..87aa4ce 100644 --- a/src/network/sonarr_network/sonarr_network_tests.rs +++ b/src/network/sonarr_network/sonarr_network_tests.rs @@ -212,8 +212,9 @@ mod test { mock.assert_async().await; let SonarrSerdeable::Tag(tag) = result.unwrap() else { - panic!("Expected Tag variant"); + panic!("Expected Tag"); }; + assert_eq!(tag, expected); assert_eq!( app.lock().await.data.sonarr_data.tags_map, @@ -278,8 +279,9 @@ mod test { mock.assert_async().await; let SonarrSerdeable::LanguageProfiles(language_profiles) = result.unwrap() else { - panic!("Expected the LanguageProfiles variant") + panic!("Expected LanguageProfiles") }; + assert_eq!( app.lock().await.data.sonarr_data.language_profiles_map, BiMap::from_iter([(2222i64, "English".to_owned())]) @@ -309,8 +311,9 @@ mod test { mock.assert_async().await; let SonarrSerdeable::QualityProfiles(quality_profiles) = result.unwrap() else { - panic!("Expected the QualityProfiles variant") + panic!("Expected QualityProfiles") }; + assert_eq!( app.lock().await.data.sonarr_data.quality_profile_map, BiMap::from_iter([(2222i64, "HD - 1080p".to_owned())]) @@ -337,8 +340,9 @@ mod test { mock.assert_async().await; let SonarrSerdeable::Tags(tags) = result.unwrap() else { - panic!("Expected the Tag variant") + panic!("Expected Tags") }; + mock.assert_async().await; assert_eq!( app.lock().await.data.sonarr_data.tags_map, diff --git a/src/network/sonarr_network/system/sonarr_system_network_tests.rs b/src/network/sonarr_network/system/sonarr_system_network_tests.rs index 0e001c5..99c3f58 100644 --- a/src/network/sonarr_network/system/sonarr_system_network_tests.rs +++ b/src/network/sonarr_network/system/sonarr_system_network_tests.rs @@ -33,14 +33,15 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::HostConfig(host_config) = network + let SonarrSerdeable::HostConfig(host_config) = network .handle_sonarr_event(SonarrEvent::GetHostConfig) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(host_config, response); - } + else { + panic!("Expected HostConfig") + }; + mock.assert_async().await; + assert_eq!(host_config, response); } #[tokio::test] @@ -84,26 +85,27 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::LogResponse(logs) = network + let SonarrSerdeable::LogResponse(logs) = network .handle_sonarr_event(SonarrEvent::GetLogs(500)) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(app.lock().await.data.sonarr_data.logs.items, expected_logs); - assert!( - app - .lock() - .await - .data - .sonarr_data - .logs - .current_selection() - .text - .contains("INFO") - ); - assert_eq!(logs, response); - } + else { + panic!("Expected LogResponse") + }; + mock.assert_async().await; + assert_eq!(app.lock().await.data.sonarr_data.logs.items, expected_logs); + assert!( + app + .lock() + .await + .data + .sonarr_data + .logs + .current_selection() + .text + .contains("INFO") + ); + assert_eq!(logs, response); } #[tokio::test] @@ -134,18 +136,19 @@ mod tests { }, ]; - if let SonarrSerdeable::DiskSpaces(disk_space) = network + let SonarrSerdeable::DiskSpaces(disk_space) = network .handle_sonarr_event(SonarrEvent::GetDiskSpace) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.disk_space_vec, - disk_space_vec - ); - assert_eq!(disk_space, disk_space_vec); - } + else { + panic!("Expected DiskSpaces") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.disk_space_vec, + disk_space_vec + ); + assert_eq!(disk_space, disk_space_vec); } #[tokio::test] @@ -180,18 +183,19 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::QueueEvents(events) = network + let SonarrSerdeable::QueueEvents(events) = network .handle_sonarr_event(SonarrEvent::GetQueuedEvents) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.queued_events.items, - vec![expected_event] - ); - assert_eq!(events, response); - } + else { + panic!("Expected QueueEvents") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.queued_events.items, + vec![expected_event] + ); + assert_eq!(events, response); } #[tokio::test] @@ -213,14 +217,15 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::SecurityConfig(security_config) = network + let SonarrSerdeable::SecurityConfig(security_config) = network .handle_sonarr_event(SonarrEvent::GetSecurityConfig) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(security_config, response); - } + else { + panic!("Expected SecurityConfig") + }; + mock.assert_async().await; + assert_eq!(security_config, response); } #[tokio::test] @@ -236,22 +241,23 @@ mod tests { let mut network = test_network(&app); let date_time = DateTime::from(DateTime::parse_from_rfc3339("2023-02-25T20:16:43Z").unwrap()); - if let SonarrSerdeable::SystemStatus(status) = network + let SonarrSerdeable::SystemStatus(status) = network .handle_sonarr_event(SonarrEvent::GetStatus) .await .unwrap() - { - mock.assert_async().await; - assert_str_eq!(app.lock().await.data.sonarr_data.version, "v1"); - assert_eq!(app.lock().await.data.sonarr_data.start_time, date_time); - assert_eq!( - status, - SystemStatus { - version: "v1".to_owned(), - start_time: date_time - } - ); - } + else { + panic!("Expected SystemStatus") + }; + mock.assert_async().await; + assert_str_eq!(app.lock().await.data.sonarr_data.version, "v1"); + assert_eq!(app.lock().await.data.sonarr_data.start_time, date_time); + assert_eq!( + status, + SystemStatus { + version: "v1".to_owned(), + start_time: date_time + } + ); } #[tokio::test] @@ -295,18 +301,19 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Tasks(tasks) = network + let SonarrSerdeable::Tasks(tasks) = network .handle_sonarr_event(SonarrEvent::GetTasks) .await .unwrap() - { - mock.assert_async().await; - assert_eq!( - app.lock().await.data.sonarr_data.tasks.items, - expected_tasks - ); - assert_eq!(tasks, response); - } + else { + panic!("Expected Tasks") + }; + mock.assert_async().await; + assert_eq!( + app.lock().await.data.sonarr_data.tasks.items, + expected_tasks + ); + assert_eq!(tasks, response); } #[tokio::test] @@ -385,25 +392,26 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Updates(updates) = network + let SonarrSerdeable::Updates(updates) = network .handle_sonarr_event(SonarrEvent::GetUpdates) .await .unwrap() - { - mock.assert_async().await; - let actual_text = app.lock().await.data.sonarr_data.updates.get_text(); - let expected = expected_text.get_text(); + else { + panic!("Expected Updates") + }; + mock.assert_async().await; + let actual_text = app.lock().await.data.sonarr_data.updates.get_text(); + let expected = expected_text.get_text(); - // Trim trailing whitespace from each line for comparison - let actual_trimmed: Vec<&str> = actual_text.lines().map(|l| l.trim_end()).collect(); - let expected_trimmed: Vec<&str> = expected.lines().map(|l| l.trim_end()).collect(); + // Trim trailing whitespace from each line for comparison + let actual_trimmed: Vec<&str> = actual_text.lines().map(|l| l.trim_end()).collect(); + let expected_trimmed: Vec<&str> = expected.lines().map(|l| l.trim_end()).collect(); - assert_eq!( - actual_trimmed, expected_trimmed, - "Updates text mismatch (after trimming trailing whitespace)" - ); - assert_eq!(updates, response); - } + assert_eq!( + actual_trimmed, expected_trimmed, + "Updates text mismatch (after trimming trailing whitespace)" + ); + assert_eq!(updates, response); } #[tokio::test] @@ -431,15 +439,16 @@ mod tests { app.lock().await.server_tabs.next(); let mut network = test_network(&app); - if let SonarrSerdeable::Value(value) = network + let SonarrSerdeable::Value(value) = network .handle_sonarr_event(SonarrEvent::StartTask( SonarrTaskName::ApplicationUpdateCheck, )) .await .unwrap() - { - mock.assert_async().await; - assert_eq!(value, response); - } + else { + panic!("Expected Value") + }; + mock.assert_async().await; + assert_eq!(value, response); } } diff --git a/src/ui/radarr_ui/blocklist/mod.rs b/src/ui/radarr_ui/blocklist/mod.rs index 1f1179a..f547564 100644 --- a/src/ui/radarr_ui/blocklist/mod.rs +++ b/src/ui/radarr_ui/blocklist/mod.rs @@ -23,11 +23,10 @@ pub(super) struct BlocklistUi; impl DrawUi for BlocklistUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return BLOCKLIST_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + BLOCKLIST_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/radarr_ui/collections/mod.rs b/src/ui/radarr_ui/collections/mod.rs index 4e19ec8..8112bd9 100644 --- a/src/ui/radarr_ui/collections/mod.rs +++ b/src/ui/radarr_ui/collections/mod.rs @@ -25,13 +25,12 @@ pub(super) struct CollectionsUi; impl DrawUi for CollectionsUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return CollectionDetailsUi::accepts(route) - || EditCollectionUi::accepts(route) - || COLLECTIONS_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + CollectionDetailsUi::accepts(route) + || EditCollectionUi::accepts(route) + || COLLECTIONS_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/radarr_ui/downloads/mod.rs b/src/ui/radarr_ui/downloads/mod.rs index b2a4692..e8d7973 100644 --- a/src/ui/radarr_ui/downloads/mod.rs +++ b/src/ui/radarr_ui/downloads/mod.rs @@ -22,11 +22,10 @@ pub(super) struct DownloadsUi; impl DrawUi for DownloadsUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return DOWNLOADS_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + DOWNLOADS_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui.rs index a8343a9..677f17f 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui.rs @@ -26,11 +26,10 @@ pub(super) struct IndexerSettingsUi; impl DrawUi for IndexerSettingsUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return INDEXER_SETTINGS_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + INDEXER_SETTINGS_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs index afa165d..5536039 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs @@ -19,11 +19,10 @@ pub(super) struct TestAllIndexersUi; impl DrawUi for TestAllIndexersUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return active_radarr_block == ActiveRadarrBlock::TestAllIndexers; - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + active_radarr_block == ActiveRadarrBlock::TestAllIndexers } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index e6defa9..8836d82 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -31,11 +31,10 @@ pub(super) struct AddMovieUi; impl DrawUi for AddMovieUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return ADD_MOVIE_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + ADD_MOVIE_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/radarr_ui/library/delete_movie_ui.rs b/src/ui/radarr_ui/library/delete_movie_ui.rs index 95ce33e..d750477 100644 --- a/src/ui/radarr_ui/library/delete_movie_ui.rs +++ b/src/ui/radarr_ui/library/delete_movie_ui.rs @@ -17,11 +17,10 @@ pub(super) struct DeleteMovieUi; impl DrawUi for DeleteMovieUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return DELETE_MOVIE_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + DELETE_MOVIE_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/radarr_ui/library/edit_movie_ui.rs b/src/ui/radarr_ui/library/edit_movie_ui.rs index cfc9df9..46512d4 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui.rs @@ -31,11 +31,10 @@ pub(super) struct EditMovieUi; impl DrawUi for EditMovieUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return EDIT_MOVIE_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + EDIT_MOVIE_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/radarr_ui/library/movie_details_ui.rs b/src/ui/radarr_ui/library/movie_details_ui.rs index 53b3a77..fddc871 100644 --- a/src/ui/radarr_ui/library/movie_details_ui.rs +++ b/src/ui/radarr_ui/library/movie_details_ui.rs @@ -32,11 +32,10 @@ pub(super) struct MovieDetailsUi; impl DrawUi for MovieDetailsUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return MOVIE_DETAILS_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + MOVIE_DETAILS_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/radarr_ui/root_folders/mod.rs b/src/ui/radarr_ui/root_folders/mod.rs index 36bdc1e..9c5ecfe 100644 --- a/src/ui/radarr_ui/root_folders/mod.rs +++ b/src/ui/radarr_ui/root_folders/mod.rs @@ -22,11 +22,10 @@ pub(super) struct RootFoldersUi; impl DrawUi for RootFoldersUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return ROOT_FOLDERS_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + ROOT_FOLDERS_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/radarr_ui/system/mod.rs b/src/ui/radarr_ui/system/mod.rs index 10e0d20..f876ee1 100644 --- a/src/ui/radarr_ui/system/mod.rs +++ b/src/ui/radarr_ui/system/mod.rs @@ -52,11 +52,10 @@ pub(super) struct SystemUi; impl DrawUi for SystemUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return SystemDetailsUi::accepts(route) || active_radarr_block == ActiveRadarrBlock::System; - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + SystemDetailsUi::accepts(route) || active_radarr_block == ActiveRadarrBlock::System } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/radarr_ui/system/system_details_ui.rs b/src/ui/radarr_ui/system/system_details_ui.rs index ee0741a..bc8db27 100644 --- a/src/ui/radarr_ui/system/system_details_ui.rs +++ b/src/ui/radarr_ui/system/system_details_ui.rs @@ -27,11 +27,10 @@ pub(super) struct SystemDetailsUi; impl DrawUi for SystemDetailsUi { fn accepts(route: Route) -> bool { - if let Route::Radarr(active_radarr_block, _) = route { - return SYSTEM_DETAILS_BLOCKS.contains(&active_radarr_block); - } - - false + let Route::Radarr(active_radarr_block, _) = route else { + return false; + }; + SYSTEM_DETAILS_BLOCKS.contains(&active_radarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs index 0bb7e06..c12cafe 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui.rs @@ -23,11 +23,10 @@ pub(super) struct EditIndexerUi; impl DrawUi for EditIndexerUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return EDIT_INDEXER_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + EDIT_INDEXER_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs index f606bdb..5dcdce9 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui.rs @@ -23,11 +23,10 @@ pub(super) struct IndexerSettingsUi; impl DrawUi for IndexerSettingsUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return INDEXER_SETTINGS_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + INDEXER_SETTINGS_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/library/add_series_ui.rs b/src/ui/sonarr_ui/library/add_series_ui.rs index f852215..477f5a2 100644 --- a/src/ui/sonarr_ui/library/add_series_ui.rs +++ b/src/ui/sonarr_ui/library/add_series_ui.rs @@ -30,11 +30,10 @@ pub(super) struct AddSeriesUi; impl DrawUi for AddSeriesUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return ADD_SERIES_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + ADD_SERIES_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/library/delete_series_ui.rs b/src/ui/sonarr_ui/library/delete_series_ui.rs index 71b3974..c5e33b0 100644 --- a/src/ui/sonarr_ui/library/delete_series_ui.rs +++ b/src/ui/sonarr_ui/library/delete_series_ui.rs @@ -17,11 +17,10 @@ pub(super) struct DeleteSeriesUi; impl DrawUi for DeleteSeriesUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return DELETE_SERIES_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + DELETE_SERIES_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/library/edit_series_ui.rs b/src/ui/sonarr_ui/library/edit_series_ui.rs index 5116a91..f7086ba 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui.rs @@ -32,11 +32,10 @@ pub(super) struct EditSeriesUi; impl DrawUi for EditSeriesUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return EDIT_SERIES_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + EDIT_SERIES_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/library/episode_details_ui.rs b/src/ui/sonarr_ui/library/episode_details_ui.rs index fda994d..67196ac 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui.rs @@ -39,11 +39,10 @@ pub(super) struct EpisodeDetailsUi; impl DrawUi for EpisodeDetailsUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return EPISODE_DETAILS_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + EPISODE_DETAILS_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/library/season_details_ui.rs b/src/ui/sonarr_ui/library/season_details_ui.rs index ed83e5b..276e3be 100644 --- a/src/ui/sonarr_ui/library/season_details_ui.rs +++ b/src/ui/sonarr_ui/library/season_details_ui.rs @@ -38,12 +38,10 @@ pub(super) struct SeasonDetailsUi; impl DrawUi for SeasonDetailsUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return EpisodeDetailsUi::accepts(route) - || SEASON_DETAILS_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + EpisodeDetailsUi::accepts(route) || SEASON_DETAILS_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { diff --git a/src/ui/sonarr_ui/library/series_details_ui.rs b/src/ui/sonarr_ui/library/series_details_ui.rs index 38da6d7..b134403 100644 --- a/src/ui/sonarr_ui/library/series_details_ui.rs +++ b/src/ui/sonarr_ui/library/series_details_ui.rs @@ -42,13 +42,12 @@ pub(super) struct SeriesDetailsUi; impl DrawUi for SeriesDetailsUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return SeasonDetailsUi::accepts(route) - || EpisodeDetailsUi::accepts(route) - || SERIES_DETAILS_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + SeasonDetailsUi::accepts(route) + || EpisodeDetailsUi::accepts(route) + || SERIES_DETAILS_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/sonarr_ui/system/mod.rs b/src/ui/sonarr_ui/system/mod.rs index 3006b4f..7876112 100644 --- a/src/ui/sonarr_ui/system/mod.rs +++ b/src/ui/sonarr_ui/system/mod.rs @@ -46,11 +46,10 @@ pub(super) struct SystemUi; impl DrawUi for SystemUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return SystemDetailsUi::accepts(route) || active_sonarr_block == ActiveSonarrBlock::System; - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + SystemDetailsUi::accepts(route) || active_sonarr_block == ActiveSonarrBlock::System } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { diff --git a/src/ui/sonarr_ui/system/system_details_ui.rs b/src/ui/sonarr_ui/system/system_details_ui.rs index 23eb01e..f25c5e9 100644 --- a/src/ui/sonarr_ui/system/system_details_ui.rs +++ b/src/ui/sonarr_ui/system/system_details_ui.rs @@ -27,11 +27,10 @@ pub(super) struct SystemDetailsUi; impl DrawUi for SystemDetailsUi { fn accepts(route: Route) -> bool { - if let Route::Sonarr(active_sonarr_block, _) = route { - return SYSTEM_DETAILS_BLOCKS.contains(&active_sonarr_block); - } - - false + let Route::Sonarr(active_sonarr_block, _) = route else { + return false; + }; + SYSTEM_DETAILS_BLOCKS.contains(&active_sonarr_block) } fn draw(f: &mut Frame<'_>, app: &mut App<'_>, _area: Rect) { From cba53e0841a58d19f4537fad401027a73407305c Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 09:03:58 -0700 Subject: [PATCH 03/28] refactor: Improved error handling project-wide and cleaned up some regexes with unnecessary escapes (tail_logs and interpolate_env_vars) --- src/app/mod.rs | 16 +- src/handlers/table_handler.rs | 80 ++++++-- src/models/servarr_data/radarr/modals.rs | 42 +++-- src/models/servarr_data/sonarr/modals.rs | 42 +++-- src/models/stateful_table.rs | 86 +++++++-- src/network/radarr_network/indexers/mod.rs | 98 +++++----- src/network/radarr_network/system/mod.rs | 22 ++- src/network/sonarr_network/indexers/mod.rs | 98 +++++----- src/network/sonarr_network/system/mod.rs | 22 ++- src/ui/radarr_ui/library/add_movie_ui.rs | 29 ++- src/ui/radarr_ui/library/edit_movie_ui.rs | 11 +- src/ui/radarr_ui/library/mod.rs | 4 +- src/ui/radarr_ui/library/movie_details_ui.rs | 2 +- src/ui/sonarr_ui/library/add_series_ui.rs | 25 ++- src/ui/sonarr_ui/library/edit_series_ui.rs | 13 +- .../sonarr_ui/library/episode_details_ui.rs | 24 +-- src/ui/sonarr_ui/library/mod.rs | 6 +- src/ui/sonarr_ui/library/season_details_ui.rs | 10 +- src/ui/sonarr_ui/library/series_details_ui.rs | 7 +- src/ui/styles.rs | 176 ++++++++++++++++-- src/utils.rs | 8 +- 21 files changed, 577 insertions(+), 244 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 5d8153e..eba8dec 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -200,10 +200,14 @@ impl App<'_> { } pub fn get_current_route(&self) -> Route { - *self - .navigation_stack - .last() - .unwrap_or(&self.server_tabs.tabs.first().unwrap().route) + *self.navigation_stack.last().unwrap_or( + &self + .server_tabs + .tabs + .first() + .expect("At least one server tab must exist") + .route, + ) } } @@ -474,8 +478,8 @@ where fn interpolate_env_vars(s: &str) -> String { let result = s.to_string(); - let scrubbing_regex = Regex::new(r#"[\s\{\}!\$^\(\)\[\]\\\|`'"]+"#).unwrap(); - let var_regex = Regex::new(r"\$\{(.*?)\}").unwrap(); + let scrubbing_regex = Regex::new(r#"[\s{}!$^()\[\]\\|`'"]+"#).unwrap(); + let var_regex = Regex::new(r"\$\{(.*?)}").unwrap(); var_regex .replace_all(s, |caps: ®ex::Captures<'_>| { diff --git a/src/handlers/table_handler.rs b/src/handlers/table_handler.rs index e17fa25..77e32c4 100644 --- a/src/handlers/table_handler.rs +++ b/src/handlers/table_handler.rs @@ -56,12 +56,16 @@ macro_rules! handle_table_events { _ if $crate::matches_key!(submit, $self.key) => $self.[](config), _ if $crate::matches_key!(esc, $self.key) => $self.[](config), _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.searching_block + .as_ref() + .expect("searching_block must be configured for this table") => { $self.[]() } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.filtering_block + .as_ref() + .expect("filtering_block must be configured for this table") => { $self.[]() } @@ -87,7 +91,9 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.sorting_block + .as_ref() + .expect("sorting_block must be configured for this table") => { $table.sort.as_mut().unwrap().scroll_up(); true @@ -105,7 +111,9 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.sorting_block + .as_ref() + .expect("sorting_block must be configured for this table") => { $table .sort @@ -151,7 +159,9 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.sorting_block + .as_ref() + .expect("sorting_block must be configured for this table") => { $table .sort @@ -161,7 +171,9 @@ macro_rules! handle_table_events { true } _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.searching_block + .as_ref() + .expect("searching_block must be configured for this table") => { $table .search @@ -171,7 +183,9 @@ macro_rules! handle_table_events { true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.filtering_block + .as_ref() + .expect("filtering_block must be configured for this table") => { $table .filter @@ -193,7 +207,9 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.sorting_block + .as_ref() + .expect("sorting_block must be configured for this table") => { $table .sort @@ -203,7 +219,9 @@ macro_rules! handle_table_events { true } _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.searching_block + .as_ref() + .expect("searching_block must be configured for this table") => { $table .search @@ -213,7 +231,9 @@ macro_rules! handle_table_events { true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.filtering_block + .as_ref() + .expect("filtering_block must be configured for this table") => { $table .filter @@ -229,7 +249,9 @@ macro_rules! handle_table_events { fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { match $self.app.get_current_route() { _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.searching_block + .as_ref() + .expect("searching_block must be configured for this table") => { $crate::handle_text_box_left_right_keys!( $self, @@ -239,7 +261,9 @@ macro_rules! handle_table_events { true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.filtering_block + .as_ref() + .expect("filtering_block must be configured for this table") => { $crate::handle_text_box_left_right_keys!( $self, @@ -255,7 +279,9 @@ macro_rules! handle_table_events { fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { match $self.app.get_current_route() { _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.sorting_block + .as_ref() + .expect("sorting_block must be configured for this table") => { if let Some(sort_by_fn) = config.sort_by_fn { $table.items.sort_by(sort_by_fn); @@ -267,7 +293,9 @@ macro_rules! handle_table_events { true } _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.searching_block + .as_ref() + .expect("searching_block must be configured for this table") => { $self.app.pop_navigation_stack(); $self.app.ignore_special_keys_for_textbox_input = false; @@ -290,7 +318,9 @@ macro_rules! handle_table_events { true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.filtering_block + .as_ref() + .expect("filtering_block must be configured for this table") => { $self.app.pop_navigation_stack(); $self.app.ignore_special_keys_for_textbox_input = false; @@ -319,15 +349,21 @@ macro_rules! handle_table_events { fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { match $self.app.get_current_route() { _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => + && $self.app.get_current_route() == *config.sorting_block + .as_ref() + .expect("sorting_block must be configured for this table") => { $self.app.pop_navigation_stack(); true } _ if (config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap()) + && $self.app.get_current_route() == *config.searching_block + .as_ref() + .expect("searching_block must be configured for this table")) || (config.search_error_block.is_some() - && $self.app.get_current_route() == *config.search_error_block.as_ref().unwrap()) => + && $self.app.get_current_route() == *config.search_error_block + .as_ref() + .expect("search_error_block must be configured for this table")) => { $self.app.pop_navigation_stack(); $table.reset_search(); @@ -335,9 +371,13 @@ macro_rules! handle_table_events { true } _ if (config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap()) + && $self.app.get_current_route() == *config.filtering_block + .as_ref() + .expect("filtering_block must be configured for this table")) || (config.filter_error_block.is_some() - && $self.app.get_current_route() == *config.filter_error_block.as_ref().unwrap()) => + && $self.app.get_current_route() == *config.filter_error_block + .as_ref() + .expect("filter_error_block must be configured for this table")) => { $self.app.pop_navigation_stack(); $table.reset_filter(); diff --git a/src/models/servarr_data/radarr/modals.rs b/src/models/servarr_data/radarr/modals.rs index 55e3398..ca7b457 100644 --- a/src/models/servarr_data/radarr/modals.rs +++ b/src/models/servarr_data/radarr/modals.rs @@ -41,47 +41,53 @@ impl From<&RadarrData<'_>> for EditIndexerModal { } = radarr_data.indexers.current_selection(); let seed_ratio_field_option = fields .as_ref() - .unwrap() + .expect("indexer fields must exist") .iter() - .find(|field| field.name.as_ref().unwrap() == "seedCriteria.seedRatio"); + .find(|field| { + field.name.as_ref().expect("indexer field name must exist") == "seedCriteria.seedRatio" + }); let seed_ratio_value_option = if let Some(seed_ratio_field) = seed_ratio_field_option { seed_ratio_field.value.clone() } else { None }; - edit_indexer_modal.name = name.clone().unwrap().into(); + edit_indexer_modal.name = name.clone().expect("indexer name must exist").into(); edit_indexer_modal.enable_rss = Some(*enable_rss); edit_indexer_modal.enable_automatic_search = Some(*enable_automatic_search); edit_indexer_modal.enable_interactive_search = Some(*enable_interactive_search); edit_indexer_modal.priority = *priority; edit_indexer_modal.url = fields .as_ref() - .unwrap() + .expect("indexer fields must exist") .iter() - .find(|field| field.name.as_ref().unwrap() == "baseUrl") - .unwrap() + .find(|field| field.name.as_ref().expect("indexer field name must exist") == "baseUrl") + .expect("baseUrl field must exist") .value .clone() - .unwrap() + .expect("baseUrl field value must exist") .as_str() - .unwrap() + .expect("baseUrl field value must be a string") .into(); edit_indexer_modal.api_key = fields .as_ref() - .unwrap() + .expect("indexer fields must exist") .iter() - .find(|field| field.name.as_ref().unwrap() == "apiKey") - .unwrap() + .find(|field| field.name.as_ref().expect("indexer field name must exist") == "apiKey") + .expect("apiKey field must exist") .value .clone() - .unwrap() + .expect("apiKey field value must exist") .as_str() - .unwrap() + .expect("apiKey field value must be a string") .into(); if let Some(seed_ratio_value) = seed_ratio_value_option { - edit_indexer_modal.seed_ratio = seed_ratio_value.as_f64().unwrap().to_string().into(); + edit_indexer_modal.seed_ratio = seed_ratio_value + .as_f64() + .expect("Seed ratio value must be a valid f64") + .to_string() + .into(); } edit_indexer_modal.tags = tags @@ -89,8 +95,8 @@ impl From<&RadarrData<'_>> for EditIndexerModal { .map(|tag_id| { radarr_data .tags_map - .get_by_left(&tag_id.as_i64().unwrap()) - .unwrap() + .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) + .expect("Tag ID must exist in tags map") .clone() }) .collect::>() @@ -131,8 +137,8 @@ impl From<&RadarrData<'_>> for EditMovieModal { .map(|tag_id| { radarr_data .tags_map - .get_by_left(&tag_id.as_i64().unwrap()) - .unwrap() + .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) + .expect("Tag ID must exist in tags map") .clone() }) .collect::>() diff --git a/src/models/servarr_data/sonarr/modals.rs b/src/models/servarr_data/sonarr/modals.rs index c6e1e16..df7f8e4 100644 --- a/src/models/servarr_data/sonarr/modals.rs +++ b/src/models/servarr_data/sonarr/modals.rs @@ -86,47 +86,53 @@ impl From<&SonarrData<'_>> for EditIndexerModal { } = sonarr_data.indexers.current_selection(); let seed_ratio_field_option = fields .as_ref() - .unwrap() + .expect("indexer fields must exist") .iter() - .find(|field| field.name.as_ref().unwrap() == "seedCriteria.seedRatio"); + .find(|field| { + field.name.as_ref().expect("indexer field name must exist") == "seedCriteria.seedRatio" + }); let seed_ratio_value_option = if let Some(seed_ratio_field) = seed_ratio_field_option { seed_ratio_field.value.clone() } else { None }; - edit_indexer_modal.name = name.clone().unwrap().into(); + edit_indexer_modal.name = name.clone().expect("indexer name must exist").into(); edit_indexer_modal.enable_rss = Some(*enable_rss); edit_indexer_modal.enable_automatic_search = Some(*enable_automatic_search); edit_indexer_modal.enable_interactive_search = Some(*enable_interactive_search); edit_indexer_modal.priority = *priority; edit_indexer_modal.url = fields .as_ref() - .unwrap() + .expect("indexer fields must exist") .iter() - .find(|field| field.name.as_ref().unwrap() == "baseUrl") - .unwrap() + .find(|field| field.name.as_ref().expect("indexer field name must exist") == "baseUrl") + .expect("baseUrl field must exist") .value .clone() - .unwrap() + .expect("baseUrl field value must exist") .as_str() - .unwrap() + .expect("baseUrl field value must be a string") .into(); edit_indexer_modal.api_key = fields .as_ref() - .unwrap() + .expect("indexer fields must exist") .iter() - .find(|field| field.name.as_ref().unwrap() == "apiKey") - .unwrap() + .find(|field| field.name.as_ref().expect("indexer field name must exist") == "apiKey") + .expect("apiKey field must exist") .value .clone() - .unwrap() + .expect("apiKey field value must exist") .as_str() - .unwrap() + .expect("apiKey field value must be a string") .into(); if let Some(seed_ratio_value) = seed_ratio_value_option { - edit_indexer_modal.seed_ratio = seed_ratio_value.as_f64().unwrap().to_string().into(); + edit_indexer_modal.seed_ratio = seed_ratio_value + .as_f64() + .expect("Seed ratio value must be a valid f64") + .to_string() + .into(); } edit_indexer_modal.tags = tags @@ -134,8 +140,8 @@ impl From<&SonarrData<'_>> for EditIndexerModal { .map(|tag_id| { sonarr_data .tags_map - .get_by_left(&tag_id.as_i64().unwrap()) - .unwrap() + .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) + .expect("Tag ID must exist in tags map") .clone() }) .collect::>() @@ -180,8 +186,8 @@ impl From<&SonarrData<'_>> for EditSeriesModal { .map(|tag_id| { sonarr_data .tags_map - .get_by_left(&tag_id.as_i64().unwrap()) - .unwrap() + .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) + .expect("Tag ID must exist in tags map") .clone() }) .collect::>() diff --git a/src/models/stateful_table.rs b/src/models/stateful_table.rs index 3db5c61..a38512a 100644 --- a/src/models/stateful_table.rs +++ b/src/models/stateful_table.rs @@ -55,15 +55,32 @@ where return; } - match self.filtered_state.as_ref().unwrap().selected() { + match self + .filtered_state + .as_ref() + .expect("filtered_state must exist when filtered_items exists") + .selected() + { Some(i) => { if i >= filtered_items.len() - 1 { - self.filtered_state.as_mut().unwrap().select_first(); + self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_first(); } else { - self.filtered_state.as_mut().unwrap().select_next(); + self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_next(); } } - None => self.filtered_state.as_mut().unwrap().select_first(), + None => self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_first(), }; return; @@ -91,19 +108,32 @@ where return; } - match self.filtered_state.as_ref().unwrap().selected() { + match self + .filtered_state + .as_ref() + .expect("filtered_state must exist when filtered_items exists") + .selected() + { Some(i) => { if i == 0 { self .filtered_state .as_mut() - .unwrap() + .expect("filtered_state must exist when filtered_items exists") .select(Some(filtered_items.len() - 1)); } else { - self.filtered_state.as_mut().unwrap().select_previous(); + self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_previous(); } } - None => self.filtered_state.as_mut().unwrap().select_first(), + None => self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_first(), }; return; @@ -131,7 +161,11 @@ where return; } - self.filtered_state.as_mut().unwrap().select_first(); + self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_first(); return; } @@ -151,7 +185,7 @@ where self .filtered_state .as_mut() - .unwrap() + .expect("filtered_state must exist when filtered_items exists") .select(Some(filtered_items.len() - 1)); return; } @@ -174,15 +208,24 @@ where return; } - match self.filtered_state.as_ref().unwrap().selected() { + match self + .filtered_state + .as_ref() + .expect("filtered_state must exist when filtered_items exists") + .selected() + { Some(i) => { self .filtered_state .as_mut() - .unwrap() + .expect("filtered_state must exist when filtered_items exists") .select(Some(i.saturating_add(20) % (filtered_items.len() - 1))); } - None => self.filtered_state.as_mut().unwrap().select_first(), + None => self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_first(), }; return; @@ -208,16 +251,25 @@ where return; } - match self.filtered_state.as_ref().unwrap().selected() { + match self + .filtered_state + .as_ref() + .expect("filtered_state must exist when filtered_items exists") + .selected() + { Some(i) => { let len = filtered_items.len() - 1; self .filtered_state .as_mut() - .unwrap() + .expect("filtered_state must exist when filtered_items exists") .select(Some((i + len - (20 % len)) % len)); } - None => self.filtered_state.as_mut().unwrap().select_last(), + None => self + .filtered_state + .as_mut() + .expect("filtered_state must exist when filtered_items exists") + .select_last(), }; return; @@ -278,7 +330,7 @@ where &filtered_items[self .filtered_state .as_ref() - .unwrap() + .expect("filtered_state must exist when filtered_items exists") .selected() .unwrap_or(0)] } else { diff --git a/src/network/radarr_network/indexers/mod.rs b/src/network/radarr_network/indexers/mod.rs index e190ea7..e9c67ee 100644 --- a/src/network/radarr_network/indexers/mod.rs +++ b/src/network/radarr_network/indexers/mod.rs @@ -4,7 +4,7 @@ use crate::models::servarr_models::{EditIndexerParams, Indexer, IndexerTestResul use crate::models::stateful_table::StatefulTable; use crate::network::radarr_network::RadarrEvent; use crate::network::{Network, RequestMethod}; -use anyhow::Result; +use anyhow::{Context, Result}; use log::{debug, info}; use serde_json::{Value, json}; @@ -103,57 +103,57 @@ impl Network<'_, '_> { ) = { let priority = detailed_indexer_body["priority"] .as_i64() - .expect("Unable to deserialize 'priority'"); + .context("Failed to deserialize indexer 'priority' field")?; let seed_ratio_field_option = detailed_indexer_body["fields"] .as_array() - .unwrap() + .context("Failed to get indexer 'fields' array")? .iter() .find(|field| field["name"] == "seedCriteria.seedRatio"); let name = edit_indexer_params.name.unwrap_or( detailed_indexer_body["name"] .as_str() - .expect("Unable to deserialize 'name'") + .context("Failed to deserialize indexer 'name' field")? .to_owned(), ); let enable_rss = edit_indexer_params.enable_rss.unwrap_or( detailed_indexer_body["enableRss"] .as_bool() - .expect("Unable to deserialize 'enableRss'"), + .context("Failed to deserialize indexer 'enableRss' field")?, ); let enable_automatic_search = edit_indexer_params.enable_automatic_search.unwrap_or( detailed_indexer_body["enableAutomaticSearch"] .as_bool() - .expect("Unable to deserialize 'enableAutomaticSearch"), + .context("Failed to deserialize indexer 'enableAutomaticSearch' field")?, ); let enable_interactive_search = edit_indexer_params.enable_interactive_search.unwrap_or( detailed_indexer_body["enableInteractiveSearch"] .as_bool() - .expect("Unable to deserialize 'enableInteractiveSearch'"), + .context("Failed to deserialize indexer 'enableInteractiveSearch' field")?, ); let url = edit_indexer_params.url.unwrap_or( detailed_indexer_body["fields"] .as_array() - .expect("Unable to deserialize 'fields'") + .context("Failed to get indexer 'fields' array for baseUrl")? .iter() .find(|field| field["name"] == "baseUrl") - .expect("Field 'baseUrl' was not found in the 'fields' array") + .context("Field 'baseUrl' was not found in the indexer fields array")? .get("value") .unwrap_or(&json!("")) .as_str() - .expect("Unable to deserialize 'baseUrl value'") + .context("Failed to deserialize indexer 'baseUrl' value")? .to_owned(), ); let api_key = edit_indexer_params.api_key.unwrap_or( detailed_indexer_body["fields"] .as_array() - .expect("Unable to deserialize 'fields'") + .context("Failed to get indexer 'fields' array for apiKey")? .iter() .find(|field| field["name"] == "apiKey") - .expect("Field 'apiKey' was not found in the 'fields' array") + .context("Field 'apiKey' was not found in the indexer fields array")? .get("value") .unwrap_or(&json!("")) .as_str() - .expect("Unable to deserialize 'apiKey value'") + .context("Failed to deserialize indexer 'apiKey' value")? .to_owned(), ); let seed_ratio = edit_indexer_params.seed_ratio.unwrap_or_else(|| { @@ -162,7 +162,7 @@ impl Network<'_, '_> { .get("value") .unwrap_or(&json!("")) .as_str() - .expect("Unable to deserialize 'seedCriteria.seedRatio value'") + .unwrap_or("") .to_owned(); } @@ -174,10 +174,14 @@ impl Network<'_, '_> { edit_indexer_params.tags.unwrap_or( detailed_indexer_body["tags"] .as_array() - .expect("Unable to deserialize 'tags'") + .context("Failed to get indexer 'tags' array")? .iter() - .map(|item| item.as_i64().expect("Unable to deserialize tag ID")) - .collect(), + .map(|item| { + item + .as_i64() + .context("Failed to deserialize indexer tag ID") + }) + .collect::>>()?, ) }; let priority = edit_indexer_params.priority.unwrap_or(priority); @@ -195,47 +199,54 @@ impl Network<'_, '_> { ) }; - *detailed_indexer_body.get_mut("name").unwrap() = json!(name); - *detailed_indexer_body.get_mut("priority").unwrap() = json!(priority); - *detailed_indexer_body.get_mut("enableRss").unwrap() = json!(enable_rss); + *detailed_indexer_body + .get_mut("name") + .context("Failed to get mutable reference to indexer 'name' field")? = json!(name); + *detailed_indexer_body + .get_mut("priority") + .context("Failed to get mutable reference to indexer 'priority' field")? = json!(priority); + *detailed_indexer_body + .get_mut("enableRss") + .context("Failed to get mutable reference to indexer 'enableRss' field")? = json!(enable_rss); *detailed_indexer_body .get_mut("enableAutomaticSearch") - .unwrap() = json!(enable_automatic_search); + .context("Failed to get mutable reference to indexer 'enableAutomaticSearch' field")? = + json!(enable_automatic_search); *detailed_indexer_body .get_mut("enableInteractiveSearch") - .unwrap() = json!(enable_interactive_search); + .context("Failed to get mutable reference to indexer 'enableInteractiveSearch' field")? = + json!(enable_interactive_search); *detailed_indexer_body .get_mut("fields") - .unwrap() - .as_array_mut() - .unwrap() + .and_then(|f| f.as_array_mut()) + .context("Failed to get mutable reference to indexer 'fields' array")? .iter_mut() .find(|field| field["name"] == "baseUrl") - .unwrap() + .context("Failed to find 'baseUrl' field in indexer fields array")? .get_mut("value") - .unwrap() = json!(url); + .context("Failed to get mutable reference to 'baseUrl' value")? = json!(url); *detailed_indexer_body .get_mut("fields") - .unwrap() - .as_array_mut() - .unwrap() + .and_then(|f| f.as_array_mut()) + .context("Failed to get mutable reference to indexer 'fields' array for apiKey")? .iter_mut() .find(|field| field["name"] == "apiKey") - .unwrap() + .context("Failed to find 'apiKey' field in indexer fields array")? .get_mut("value") - .unwrap() = json!(api_key); - *detailed_indexer_body.get_mut("tags").unwrap() = json!(tags); + .context("Failed to get mutable reference to 'apiKey' value")? = json!(api_key); + *detailed_indexer_body + .get_mut("tags") + .context("Failed to get mutable reference to indexer 'tags' field")? = json!(tags); let seed_ratio_field_option = detailed_indexer_body .get_mut("fields") - .unwrap() - .as_array_mut() - .unwrap() + .and_then(|f| f.as_array_mut()) + .context("Failed to get mutable reference to indexer 'fields' array for seed ratio")? .iter_mut() .find(|field| field["name"] == "seedCriteria.seedRatio"); if let Some(seed_ratio_field) = seed_ratio_field_option { seed_ratio_field .as_object_mut() - .unwrap() + .context("Failed to get mutable reference to 'seedCriteria.seedRatio' object")? .insert("value".to_string(), json!(seed_ratio)); } @@ -332,12 +343,13 @@ impl Network<'_, '_> { self .handle_request::(request_props, |test_results, mut app| { if test_results.as_object().is_none() { - app.data.radarr_data.indexer_test_errors = Some( - test_results.as_array().unwrap()[0] - .get("errorMessage") - .unwrap() - .to_string(), - ); + let error_message = test_results + .as_array() + .and_then(|arr| arr.first()) + .and_then(|item| item.get("errorMessage")) + .map(|msg| msg.to_string()) + .unwrap_or_else(|| "Unknown indexer test error".to_string()); + app.data.radarr_data.indexer_test_errors = Some(error_message); } else { app.data.radarr_data.indexer_test_errors = Some(String::new()); }; diff --git a/src/network/radarr_network/system/mod.rs b/src/network/radarr_network/system/mod.rs index 1dde56e..16383dd 100644 --- a/src/network/radarr_network/system/mod.rs +++ b/src/network/radarr_network/system/mod.rs @@ -72,17 +72,29 @@ impl Network<'_, '_> { "{}|{}|{}|{}|{}", log.time, log.level.to_uppercase(), - log.logger.as_ref().unwrap(), - log.exception_type.as_ref().unwrap(), - log.exception.as_ref().unwrap() + log + .logger + .as_ref() + .expect("logger must exist when exception is present"), + log + .exception_type + .as_ref() + .expect("exception_type must exist when exception is present"), + log + .exception + .as_ref() + .expect("exception must exist in this branch") )) } else { HorizontallyScrollableText::from(format!( "{}|{}|{}|{}", log.time, log.level.to_uppercase(), - log.logger.as_ref().unwrap(), - log.message.as_ref().unwrap() + log.logger.as_ref().expect("logger must exist in log entry"), + log + .message + .as_ref() + .expect("message must exist when exception is not present") )) } }) diff --git a/src/network/sonarr_network/indexers/mod.rs b/src/network/sonarr_network/indexers/mod.rs index 1fe256b..7200d47 100644 --- a/src/network/sonarr_network/indexers/mod.rs +++ b/src/network/sonarr_network/indexers/mod.rs @@ -4,7 +4,7 @@ use crate::models::sonarr_models::IndexerSettings; use crate::models::stateful_table::StatefulTable; use crate::network::sonarr_network::SonarrEvent; use crate::network::{Network, RequestMethod}; -use anyhow::Result; +use anyhow::{Context, Result}; use log::{debug, info}; use serde_json::{Value, json}; @@ -101,57 +101,57 @@ impl Network<'_, '_> { ) = { let priority = detailed_indexer_body["priority"] .as_i64() - .expect("Unable to deserialize 'priority'"); + .context("Failed to deserialize indexer 'priority' field")?; let seed_ratio_field_option = detailed_indexer_body["fields"] .as_array() - .unwrap() + .context("Failed to get indexer 'fields' array")? .iter() .find(|field| field["name"] == "seedCriteria.seedRatio"); let name = edit_indexer_params.name.unwrap_or( detailed_indexer_body["name"] .as_str() - .expect("Unable to deserialize 'name'") + .context("Failed to deserialize indexer 'name' field")? .to_owned(), ); let enable_rss = edit_indexer_params.enable_rss.unwrap_or( detailed_indexer_body["enableRss"] .as_bool() - .expect("Unable to deserialize 'enableRss'"), + .context("Failed to deserialize indexer 'enableRss' field")?, ); let enable_automatic_search = edit_indexer_params.enable_automatic_search.unwrap_or( detailed_indexer_body["enableAutomaticSearch"] .as_bool() - .expect("Unable to deserialize 'enableAutomaticSearch"), + .context("Failed to deserialize indexer 'enableAutomaticSearch' field")?, ); let enable_interactive_search = edit_indexer_params.enable_interactive_search.unwrap_or( detailed_indexer_body["enableInteractiveSearch"] .as_bool() - .expect("Unable to deserialize 'enableInteractiveSearch'"), + .context("Failed to deserialize indexer 'enableInteractiveSearch' field")?, ); let url = edit_indexer_params.url.unwrap_or( detailed_indexer_body["fields"] .as_array() - .expect("Unable to deserialize 'fields'") + .context("Failed to get indexer 'fields' array for baseUrl")? .iter() .find(|field| field["name"] == "baseUrl") - .expect("Field 'baseUrl' was not found in the 'fields' array") + .context("Field 'baseUrl' was not found in the indexer fields array")? .get("value") .unwrap_or(&json!("")) .as_str() - .expect("Unable to deserialize 'baseUrl value'") + .context("Failed to deserialize indexer 'baseUrl' value")? .to_owned(), ); let api_key = edit_indexer_params.api_key.unwrap_or( detailed_indexer_body["fields"] .as_array() - .expect("Unable to deserialize 'fields'") + .context("Failed to get indexer 'fields' array for apiKey")? .iter() .find(|field| field["name"] == "apiKey") - .expect("Field 'apiKey' was not found in the 'fields' array") + .context("Field 'apiKey' was not found in the indexer fields array")? .get("value") .unwrap_or(&json!("")) .as_str() - .expect("Unable to deserialize 'apiKey value'") + .context("Failed to deserialize indexer 'apiKey' value")? .to_owned(), ); let seed_ratio = edit_indexer_params.seed_ratio.unwrap_or_else(|| { @@ -160,7 +160,7 @@ impl Network<'_, '_> { .get("value") .unwrap_or(&json!("")) .as_str() - .expect("Unable to deserialize 'seedCriteria.seedRatio value'") + .unwrap_or("") .to_owned(); } @@ -172,10 +172,14 @@ impl Network<'_, '_> { edit_indexer_params.tags.unwrap_or( detailed_indexer_body["tags"] .as_array() - .expect("Unable to deserialize 'tags'") + .context("Failed to get indexer 'tags' array")? .iter() - .map(|item| item.as_i64().expect("Unable to deserialize tag ID")) - .collect(), + .map(|item| { + item + .as_i64() + .context("Failed to deserialize indexer tag ID") + }) + .collect::>>()?, ) }; let priority = edit_indexer_params.priority.unwrap_or(priority); @@ -193,47 +197,54 @@ impl Network<'_, '_> { ) }; - *detailed_indexer_body.get_mut("name").unwrap() = json!(name); - *detailed_indexer_body.get_mut("priority").unwrap() = json!(priority); - *detailed_indexer_body.get_mut("enableRss").unwrap() = json!(enable_rss); + *detailed_indexer_body + .get_mut("name") + .context("Failed to get mutable reference to indexer 'name' field")? = json!(name); + *detailed_indexer_body + .get_mut("priority") + .context("Failed to get mutable reference to indexer 'priority' field")? = json!(priority); + *detailed_indexer_body + .get_mut("enableRss") + .context("Failed to get mutable reference to indexer 'enableRss' field")? = json!(enable_rss); *detailed_indexer_body .get_mut("enableAutomaticSearch") - .unwrap() = json!(enable_automatic_search); + .context("Failed to get mutable reference to indexer 'enableAutomaticSearch' field")? = + json!(enable_automatic_search); *detailed_indexer_body .get_mut("enableInteractiveSearch") - .unwrap() = json!(enable_interactive_search); + .context("Failed to get mutable reference to indexer 'enableInteractiveSearch' field")? = + json!(enable_interactive_search); *detailed_indexer_body .get_mut("fields") - .unwrap() - .as_array_mut() - .unwrap() + .and_then(|f| f.as_array_mut()) + .context("Failed to get mutable reference to indexer 'fields' array")? .iter_mut() .find(|field| field["name"] == "baseUrl") - .unwrap() + .context("Failed to find 'baseUrl' field in indexer fields array")? .get_mut("value") - .unwrap() = json!(url); + .context("Failed to get mutable reference to 'baseUrl' value")? = json!(url); *detailed_indexer_body .get_mut("fields") - .unwrap() - .as_array_mut() - .unwrap() + .and_then(|f| f.as_array_mut()) + .context("Failed to get mutable reference to indexer 'fields' array for apiKey")? .iter_mut() .find(|field| field["name"] == "apiKey") - .unwrap() + .context("Failed to find 'apiKey' field in indexer fields array")? .get_mut("value") - .unwrap() = json!(api_key); - *detailed_indexer_body.get_mut("tags").unwrap() = json!(tags); + .context("Failed to get mutable reference to 'apiKey' value")? = json!(api_key); + *detailed_indexer_body + .get_mut("tags") + .context("Failed to get mutable reference to indexer 'tags' field")? = json!(tags); let seed_ratio_field_option = detailed_indexer_body .get_mut("fields") - .unwrap() - .as_array_mut() - .unwrap() + .and_then(|f| f.as_array_mut()) + .context("Failed to get mutable reference to indexer 'fields' array for seed ratio")? .iter_mut() .find(|field| field["name"] == "seedCriteria.seedRatio"); if let Some(seed_ratio_field) = seed_ratio_field_option { seed_ratio_field .as_object_mut() - .unwrap() + .context("Failed to get mutable reference to 'seedCriteria.seedRatio' object")? .insert("value".to_string(), json!(seed_ratio)); } @@ -330,12 +341,13 @@ impl Network<'_, '_> { self .handle_request::(request_props, |test_results, mut app| { if test_results.as_object().is_none() { - app.data.sonarr_data.indexer_test_errors = Some( - test_results.as_array().unwrap()[0] - .get("errorMessage") - .unwrap() - .to_string(), - ); + let error_message = test_results + .as_array() + .and_then(|arr| arr.first()) + .and_then(|item| item.get("errorMessage")) + .map(|msg| msg.to_string()) + .unwrap_or_else(|| "Unknown indexer test error".to_string()); + app.data.sonarr_data.indexer_test_errors = Some(error_message); } else { app.data.sonarr_data.indexer_test_errors = Some(String::new()); }; diff --git a/src/network/sonarr_network/system/mod.rs b/src/network/sonarr_network/system/mod.rs index 63798f2..9bd6b88 100644 --- a/src/network/sonarr_network/system/mod.rs +++ b/src/network/sonarr_network/system/mod.rs @@ -55,17 +55,29 @@ impl Network<'_, '_> { "{}|{}|{}|{}|{}", log.time, log.level.to_uppercase(), - log.logger.as_ref().unwrap(), - log.exception_type.as_ref().unwrap(), - log.exception.as_ref().unwrap() + log + .logger + .as_ref() + .expect("logger must exist when exception is present"), + log + .exception_type + .as_ref() + .expect("exception_type must exist when exception is present"), + log + .exception + .as_ref() + .expect("exception must exist in this branch") )) } else { HorizontallyScrollableText::from(format!( "{}|{}|{}|{}", log.time, log.level.to_uppercase(), - log.logger.as_ref().unwrap(), - log.message.as_ref().unwrap() + log.logger.as_ref().expect("logger must exist in log entry"), + log + .message + .as_ref() + .expect("message must exist when exception is not present") )) } }) diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index 8836d82..a046bc5 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -80,13 +80,19 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { Layout::vertical([Constraint::Length(3), Constraint::Fill(0)]) .margin(1) .areas(area); - let block_content = &app.data.radarr_data.add_movie_search.as_ref().unwrap().text; + let block_content = &app + .data + .radarr_data + .add_movie_search + .as_ref() + .expect("add_movie_search must be populated") + .text; let offset = app .data .radarr_data .add_movie_search .as_ref() - .unwrap() + .expect("add_movie_search must be populated") .offset .load(Ordering::SeqCst); let search_results_row_mapping = |movie: &AddMovieSearchResult| { @@ -260,7 +266,7 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .radarr_data .add_searched_movies .as_ref() - .unwrap() + .expect("add_searched_movies must be populated") .current_selection() .title .text, @@ -269,7 +275,7 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .radarr_data .add_searched_movies .as_ref() - .unwrap() + .expect("add_searched_movies must be populated") .current_selection() .overview .clone(), @@ -287,7 +293,12 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { root_folder_list, tags, .. - } = app.data.radarr_data.add_movie_modal.as_ref().unwrap(); + } = app + .data + .radarr_data + .add_movie_modal + .as_ref() + .expect("add_movie_modal must exist in this context"); let selected_monitor = monitor_list.current_selection(); let selected_minimum_availability = minimum_availability_list.current_selection(); @@ -378,7 +389,7 @@ fn draw_add_movie_select_monitor_popup(f: &mut Frame<'_>, app: &mut App<'_>) { .radarr_data .add_movie_modal .as_mut() - .unwrap() + .expect("add_movie_modal must exist in this context") .monitor_list, |monitor| ListItem::new(monitor.to_display_str().to_owned()), ); @@ -394,7 +405,7 @@ fn draw_add_movie_select_minimum_availability_popup(f: &mut Frame<'_>, app: &mut .radarr_data .add_movie_modal .as_mut() - .unwrap() + .expect("add_movie_modal must exist in this context") .minimum_availability_list, |minimum_availability| ListItem::new(minimum_availability.to_display_str().to_owned()), ); @@ -410,7 +421,7 @@ fn draw_add_movie_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut App< .radarr_data .add_movie_modal .as_mut() - .unwrap() + .expect("add_movie_modal must exist in this context") .quality_profile_list, |quality_profile| ListItem::new(quality_profile.clone()), ); @@ -426,7 +437,7 @@ fn draw_add_movie_select_root_folder_popup(f: &mut Frame<'_>, app: &mut App<'_>) .radarr_data .add_movie_modal .as_mut() - .unwrap() + .expect("add_movie_modal must exist in this context") .root_folder_list, |root_folder| ListItem::new(root_folder.path.to_owned()), ); diff --git a/src/ui/radarr_ui/library/edit_movie_ui.rs b/src/ui/radarr_ui/library/edit_movie_ui.rs index 46512d4..f944e81 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui.rs @@ -87,7 +87,12 @@ fn draw_edit_movie_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, are monitored, path, tags, - } = app.data.radarr_data.edit_movie_modal.as_ref().unwrap(); + } = app + .data + .radarr_data + .edit_movie_modal + .as_ref() + .expect("edit_movie_modal must exist in this context"); let selected_minimum_availability = minimum_availability_list.current_selection(); let selected_quality_profile = quality_profile_list.current_selection(); @@ -175,7 +180,7 @@ fn draw_edit_movie_select_minimum_availability_popup(f: &mut Frame<'_>, app: &mu .radarr_data .edit_movie_modal .as_mut() - .unwrap() + .expect("edit_movie_modal must exist in this context") .minimum_availability_list, |minimum_availability| ListItem::new(minimum_availability.to_display_str().to_owned()), ); @@ -191,7 +196,7 @@ fn draw_edit_movie_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut App .radarr_data .edit_movie_modal .as_mut() - .unwrap() + .expect("edit_movie_modal must exist in this context") .quality_profile_list, |quality_profile| ListItem::new(quality_profile.clone()), ); diff --git a/src/ui/radarr_ui/library/mod.rs b/src/ui/radarr_ui/library/mod.rs index 811851e..7e86def 100644 --- a/src/ui/radarr_ui/library/mod.rs +++ b/src/ui/radarr_ui/library/mod.rs @@ -99,7 +99,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let certification = movie.certification.clone().unwrap_or_default(); let quality_profile = quality_profile_map .get_by_left(&movie.quality_profile_id) - .unwrap() + .expect("Quality profile ID must exist in quality_profile_map") .to_owned(); let empty_tag = String::new(); let tags = if !movie.tags.is_empty() { @@ -108,7 +108,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .iter() .map(|tag_id| { tags_map - .get_by_left(&tag_id.as_i64().unwrap()) + .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) .unwrap_or(&empty_tag) .clone() }) diff --git a/src/ui/radarr_ui/library/movie_details_ui.rs b/src/ui/radarr_ui/library/movie_details_ui.rs index fddc871..e479342 100644 --- a/src/ui/radarr_ui/library/movie_details_ui.rs +++ b/src/ui/radarr_ui/library/movie_details_ui.rs @@ -472,7 +472,7 @@ fn draw_manual_search_confirm_prompt(f: &mut Frame<'_>, app: &mut App<'_>) { .radarr_data .movie_details_modal .as_ref() - .unwrap() + .expect("movie_details_modal must exist in this context") .movie_releases .current_selection(); let title = if current_selection.rejected { diff --git a/src/ui/sonarr_ui/library/add_series_ui.rs b/src/ui/sonarr_ui/library/add_series_ui.rs index 477f5a2..005fac1 100644 --- a/src/ui/sonarr_ui/library/add_series_ui.rs +++ b/src/ui/sonarr_ui/library/add_series_ui.rs @@ -80,14 +80,14 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .add_series_search .as_ref() - .unwrap() + .expect("add_series_search must be populated") .text; let offset = app .data .sonarr_data .add_series_search .as_ref() - .unwrap() + .expect("add_series_search must be populated") .offset .load(Ordering::SeqCst); let search_results_row_mapping = |series: &AddSeriesSearchResult| { @@ -232,7 +232,7 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .add_searched_series .as_ref() - .unwrap() + .expect("add_searched_series must be populated") .current_selection() .title .text, @@ -241,7 +241,7 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .add_searched_series .as_ref() - .unwrap() + .expect("add_searched_series must be populated") .current_selection() .overview .clone() @@ -261,7 +261,12 @@ fn draw_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { use_season_folder, tags, .. - } = app.data.sonarr_data.add_series_modal.as_ref().unwrap(); + } = app + .data + .sonarr_data + .add_series_modal + .as_ref() + .expect("add_series_modal must exist in this context"); let selected_monitor = monitor_list.current_selection(); let selected_series_type = series_type_list.current_selection(); @@ -367,7 +372,7 @@ fn draw_add_series_select_monitor_popup(f: &mut Frame<'_>, app: &mut App<'_>) { .sonarr_data .add_series_modal .as_mut() - .unwrap() + .expect("add_series_modal must exist in this context") .monitor_list, |monitor| ListItem::new(monitor.to_display_str().to_owned()), ); @@ -383,7 +388,7 @@ fn draw_add_series_select_series_type_popup(f: &mut Frame<'_>, app: &mut App<'_> .sonarr_data .add_series_modal .as_mut() - .unwrap() + .expect("add_series_modal must exist in this context") .series_type_list, |series_type| ListItem::new(series_type.to_display_str().to_owned()), ); @@ -399,7 +404,7 @@ fn draw_add_series_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut App .sonarr_data .add_series_modal .as_mut() - .unwrap() + .expect("add_series_modal must exist in this context") .quality_profile_list, |quality_profile| ListItem::new(quality_profile.clone()), ); @@ -415,7 +420,7 @@ fn draw_add_series_select_language_profile_popup(f: &mut Frame<'_>, app: &mut Ap .sonarr_data .add_series_modal .as_mut() - .unwrap() + .expect("add_series_modal must exist in this context") .language_profile_list, |language_profile| ListItem::new(language_profile.clone()), ); @@ -431,7 +436,7 @@ fn draw_add_series_select_root_folder_popup(f: &mut Frame<'_>, app: &mut App<'_> .sonarr_data .add_series_modal .as_mut() - .unwrap() + .expect("add_series_modal must exist in this context") .root_folder_list, |root_folder| ListItem::new(root_folder.path.to_owned()), ); diff --git a/src/ui/sonarr_ui/library/edit_series_ui.rs b/src/ui/sonarr_ui/library/edit_series_ui.rs index f7086ba..40c7f45 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui.rs @@ -99,7 +99,12 @@ fn draw_edit_series_confirmation_prompt(f: &mut Frame<'_>, app: &mut App<'_>, ar use_season_folders, path, tags, - } = app.data.sonarr_data.edit_series_modal.as_ref().unwrap(); + } = app + .data + .sonarr_data + .edit_series_modal + .as_ref() + .expect("edit_series_modal must exist in this context"); let selected_series_type = series_type_list.current_selection(); let selected_quality_profile = quality_profile_list.current_selection(); let selected_language_profile = language_profile_list.current_selection(); @@ -202,7 +207,7 @@ fn draw_edit_series_select_series_type_popup(f: &mut Frame<'_>, app: &mut App<'_ .sonarr_data .edit_series_modal .as_mut() - .unwrap() + .expect("edit_series_modal must exist in this context") .series_type_list, |series_type| ListItem::new(series_type.to_display_str().to_owned()), ); @@ -218,7 +223,7 @@ fn draw_edit_series_select_quality_profile_popup(f: &mut Frame<'_>, app: &mut Ap .sonarr_data .edit_series_modal .as_mut() - .unwrap() + .expect("edit_series_modal must exist in this context") .quality_profile_list, |quality_profile| ListItem::new(quality_profile.clone()), ); @@ -234,7 +239,7 @@ fn draw_edit_series_select_language_profile_popup(f: &mut Frame<'_>, app: &mut A .sonarr_data .edit_series_modal .as_mut() - .unwrap() + .expect("edit_series_modal must exist in this context") .language_profile_list, |language_profile| ListItem::new(language_profile.clone()), ); diff --git a/src/ui/sonarr_ui/library/episode_details_ui.rs b/src/ui/sonarr_ui/library/episode_details_ui.rs index 67196ac..73369b5 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui.rs @@ -60,10 +60,10 @@ impl DrawUi for EpisodeDetailsUi { .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .as_ref() - .unwrap() + .expect("episode_details_modal must exist in this context") .episode_details_tabs, ); draw_episode_details_tabs(f, app, content_area); @@ -77,7 +77,7 @@ impl DrawUi for EpisodeDetailsUi { .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episodes .current_selection() .title @@ -181,7 +181,7 @@ fn draw_episode_details(f: &mut Frame<'_>, app: &App<'_>, area: Rect) { .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .is_none(), block, @@ -303,10 +303,10 @@ fn draw_episode_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) .sonarr_data .season_details_modal .as_mut() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .as_mut() - .unwrap() + .expect("episode_details_modal must exist in this context") .episode_history; let history_table = ManagarrTable::new(Some(&mut episode_history_table), history_row_mapping) @@ -332,7 +332,7 @@ fn draw_episode_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .is_none(), layout_block_top_border(), @@ -474,10 +474,10 @@ fn draw_episode_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .season_details_modal .as_mut() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .as_mut() - .unwrap() + .expect("episode_details_modal must exist in this context") .episode_releases; let release_table = ManagarrTable::new( Some(&mut episode_release_table), @@ -513,7 +513,7 @@ fn draw_episode_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .is_none(), layout_block_top_border(), @@ -529,10 +529,10 @@ fn draw_manual_episode_search_confirm_prompt(f: &mut Frame<'_>, app: &mut App<'_ .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episode_details_modal .as_ref() - .unwrap() + .expect("episode_details_modal must exist in this context") .episode_releases .current_selection(); let title = if current_selection.rejected { diff --git a/src/ui/sonarr_ui/library/mod.rs b/src/ui/sonarr_ui/library/mod.rs index 4fa6ddf..ba3c594 100644 --- a/src/ui/sonarr_ui/library/mod.rs +++ b/src/ui/sonarr_ui/library/mod.rs @@ -106,11 +106,11 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .map_or(0f64, |stats| convert_to_gb(stats.size_on_disk)); let quality_profile = quality_profile_map .get_by_left(&series.quality_profile_id) - .unwrap() + .expect("Quality profile ID must exist in quality_profile_map") .to_owned(); let language_profile = language_profile_map .get_by_left(&series.language_profile_id) - .unwrap() + .expect("Language profile ID must exist in language_profile_map") .to_owned(); let empty_tag = String::new(); let tags = if !series.tags.is_empty() { @@ -119,7 +119,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .iter() .map(|tag_id| { tags_map - .get_by_left(&tag_id.as_i64().unwrap()) + .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) .unwrap_or(&empty_tag) .clone() }) diff --git a/src/ui/sonarr_ui/library/season_details_ui.rs b/src/ui/sonarr_ui/library/season_details_ui.rs index 276e3be..fb0bb02 100644 --- a/src/ui/sonarr_ui/library/season_details_ui.rs +++ b/src/ui/sonarr_ui/library/season_details_ui.rs @@ -67,7 +67,7 @@ impl DrawUi for SeasonDetailsUi { .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .season_details_tabs, ); draw_season_details(f, app, content_area); @@ -103,7 +103,7 @@ impl DrawUi for SeasonDetailsUi { .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .episodes .current_selection() .title @@ -294,7 +294,7 @@ fn draw_season_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .season_details_modal .as_mut() - .unwrap() + .expect("season_details_modal must exist in this context") .season_history; let history_table = ManagarrTable::new(Some(&mut season_history_table), history_row_mapping) @@ -426,7 +426,7 @@ fn draw_season_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .sonarr_data .season_details_modal .as_mut() - .unwrap() + .expect("season_details_modal must exist in this context") .season_releases; let release_table = ManagarrTable::new(Some(&mut season_release_table), season_release_row_mapping) @@ -467,7 +467,7 @@ fn draw_manual_season_search_confirm_prompt(f: &mut Frame<'_>, app: &mut App<'_> .sonarr_data .season_details_modal .as_ref() - .unwrap() + .expect("season_details_modal must exist in this context") .season_releases .current_selection(); let title = if current_selection.rejected { diff --git a/src/ui/sonarr_ui/library/series_details_ui.rs b/src/ui/sonarr_ui/library/series_details_ui.rs index b134403..d62d7e1 100644 --- a/src/ui/sonarr_ui/library/series_details_ui.rs +++ b/src/ui/sonarr_ui/library/series_details_ui.rs @@ -333,7 +333,12 @@ fn draw_series_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { ]) .primary() }; - let mut series_history_table = app.data.sonarr_data.series_history.as_mut().unwrap(); + let mut series_history_table = app + .data + .sonarr_data + .series_history + .as_mut() + .expect("series_history must be populated"); let history_table = ManagarrTable::new(Some(&mut series_history_table), history_row_mapping) .block(layout_block_top_border()) diff --git a/src/ui/styles.rs b/src/ui/styles.rs index 3bc4ef6..306f794 100644 --- a/src/ui/styles.rs +++ b/src/ui/styles.rs @@ -40,31 +40,94 @@ where } fn awaiting_import(self) -> T { - THEME.with(|theme| self.fg(theme.get().awaiting_import.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .awaiting_import + .expect("awaiting_import style must be defined in theme") + .color + .expect("awaiting_import color must be defined"), + ) + }) } fn indeterminate(self) -> T { - THEME.with(|theme| self.fg(theme.get().indeterminate.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .indeterminate + .expect("indeterminate style must be defined in theme") + .color + .expect("indeterminate color must be defined"), + ) + }) } fn default(self) -> T { - THEME.with(|theme| self.fg(theme.get().default.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .default + .expect("default style must be defined in theme") + .color + .expect("default color must be defined"), + ) + }) } fn downloaded(self) -> T { - THEME.with(|theme| self.fg(theme.get().downloaded.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .downloaded + .expect("downloaded style must be defined in theme") + .color + .expect("downloaded color must be defined"), + ) + }) } fn downloading(self) -> T { - THEME.with(|theme| self.fg(theme.get().downloading.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .downloading + .expect("downloading style must be defined in theme") + .color + .expect("downloading color must be defined"), + ) + }) } fn failure(self) -> T { - THEME.with(|theme| self.fg(theme.get().failure.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .failure + .expect("failure style must be defined in theme") + .color + .expect("failure color must be defined"), + ) + }) } fn help(self) -> T { - THEME.with(|theme| self.fg(theme.get().help.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .help + .expect("help style must be defined in theme") + .color + .expect("help color must be defined"), + ) + }) } fn highlight(self) -> T { @@ -72,38 +135,119 @@ where } fn missing(self) -> T { - THEME.with(|theme| self.fg(theme.get().missing.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .missing + .expect("missing style must be defined in theme") + .color + .expect("missing color must be defined"), + ) + }) } fn primary(self) -> T { - THEME.with(|theme| self.fg(theme.get().primary.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .primary + .expect("primary style must be defined in theme") + .color + .expect("primary color must be defined"), + ) + }) } fn secondary(self) -> T { - THEME.with(|theme| self.fg(theme.get().secondary.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .secondary + .expect("secondary style must be defined in theme") + .color + .expect("secondary color must be defined"), + ) + }) } fn success(self) -> T { - THEME.with(|theme| self.fg(theme.get().success.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .success + .expect("success style must be defined in theme") + .color + .expect("success color must be defined"), + ) + }) } fn system_function(self) -> T { - THEME.with(|theme| self.fg(theme.get().system_function.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .system_function + .expect("system_function style must be defined in theme") + .color + .expect("system_function color must be defined"), + ) + }) } fn unmonitored(self) -> T { - THEME.with(|theme| self.fg(theme.get().unmonitored.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .unmonitored + .expect("unmonitored style must be defined in theme") + .color + .expect("unmonitored color must be defined"), + ) + }) } fn unmonitored_missing(self) -> T { - THEME.with(|theme| self.fg(theme.get().unmonitored_missing.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .unmonitored_missing + .expect("unmonitored_missing style must be defined in theme") + .color + .expect("unmonitored_missing color must be defined"), + ) + }) } fn unreleased(self) -> T { - THEME.with(|theme| self.fg(theme.get().unreleased.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .unreleased + .expect("unreleased style must be defined in theme") + .color + .expect("unreleased color must be defined"), + ) + }) } fn warning(self) -> T { - THEME.with(|theme| self.fg(theme.get().warning.unwrap().color.unwrap())) + THEME.with(|theme| { + self.fg( + theme + .get() + .warning + .expect("warning style must be defined in theme") + .color + .expect("warning color must be defined"), + ) + }) } } diff --git a/src/utils.rs b/src/utils.rs index 0771535..d853e2f 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -80,7 +80,7 @@ pub fn convert_runtime(runtime: i64) -> (i64, i64) { } pub async fn tail_logs(no_color: bool) { - let re = Regex::new(r"^(?P\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+<(?P[^\s>]+)>\s+\[(?P[A-Z]+)\]\s+(?P[^:]+):(?P\d+)\s+-\s+(?P.*)$").unwrap(); + let re = Regex::new(r"^(?P\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+<(?P[^\s>]+)>\s+\[(?P[A-Z]+)]\s+(?P[^:]+):(?P\d+)\s+-\s+(?P.*)$").unwrap(); let file_path = get_log_path(); let file = File::open(&file_path).expect("Cannot open file"); let mut reader = BufReader::new(file); @@ -311,11 +311,13 @@ pub fn select_cli_configuration( } else { match command { Command::Radarr(_) => { - let default_radarr_config = config.radarr.as_ref().unwrap()[0].clone(); + let default_radarr_config = + config.radarr.as_ref().expect("Radarr config must exist")[0].clone(); app.server_tabs.select_tab_by_config(&default_radarr_config); } Command::Sonarr(_) => { - let default_sonarr_config = config.sonarr.as_ref().unwrap()[0].clone(); + let default_sonarr_config = + config.sonarr.as_ref().expect("Sonarr config must exist")[0].clone(); app.server_tabs.select_tab_by_config(&default_sonarr_config); } _ => (), From a0073b65ad12cd18ffe301c0db00e07d6d6c9c84 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 10:02:32 -0700 Subject: [PATCH 04/28] refactor: Added accessor methods to servarr_data structs, replaced for loops with functional iterator chains, eliminated mutable state tracking, and updated network module to use get_or_insert_default() for modal options --- src/app/mod.rs | 31 +++++----- src/models/mod.rs | 3 +- src/models/servarr_data/radarr/modals.rs | 50 ++-------------- src/models/servarr_data/radarr/radarr_data.rs | 18 ++++++ src/models/servarr_data/sonarr/modals.rs | 58 ++----------------- src/models/servarr_data/sonarr/sonarr_data.rs | 24 ++++++++ src/network/radarr_network/library/mod.rs | 40 +++---------- .../sonarr_network/library/series/mod.rs | 32 ++++------ src/ui/radarr_ui/library/mod.rs | 25 +++----- src/ui/sonarr_ui/library/mod.rs | 25 +++----- 10 files changed, 109 insertions(+), 197 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index eba8dec..894aac9 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -57,42 +57,43 @@ impl App<'_> { let mut server_tabs = Vec::new(); if let Some(radarr_configs) = config.radarr { - let mut idx = 0; - for radarr_config in radarr_configs { + let mut unnamed_idx = 0; + let radarr_tabs = radarr_configs.into_iter().map(|radarr_config| { let name = if let Some(name) = radarr_config.name.clone() { name } else { - idx += 1; - format!("Radarr {idx}") + unnamed_idx += 1; + format!("Radarr {unnamed_idx}") }; - server_tabs.push(TabRoute { + TabRoute { title: name, route: ActiveRadarrBlock::Movies.into(), contextual_help: None, config: Some(radarr_config), - }); - } + } + }); + server_tabs.extend(radarr_tabs); } if let Some(sonarr_configs) = config.sonarr { - let mut idx = 0; - - for sonarr_config in sonarr_configs { + let mut unnamed_idx = 0; + let sonarr_tabs = sonarr_configs.into_iter().map(|sonarr_config| { let name = if let Some(name) = sonarr_config.name.clone() { name } else { - idx += 1; - format!("Sonarr {idx}") + unnamed_idx += 1; + format!("Sonarr {unnamed_idx}") }; - server_tabs.push(TabRoute { + TabRoute { title: name, route: ActiveSonarrBlock::Series.into(), contextual_help: None, config: Some(sonarr_config), - }); - } + } + }); + server_tabs.extend(sonarr_tabs); } let weight_sorted_tabs = server_tabs diff --git a/src/models/mod.rs b/src/models/mod.rs index b0a2c33..74022de 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -65,8 +65,7 @@ pub struct ScrollableText { impl ScrollableText { pub fn with_string(item: String) -> ScrollableText { - let items: Vec<&str> = item.split('\n').collect(); - let items: Vec = items.iter().map(|it| it.to_string()).collect(); + let items: Vec = item.split('\n').map(str::to_owned).collect(); ScrollableText { items, offset: 0 } } diff --git a/src/models/servarr_data/radarr/modals.rs b/src/models/servarr_data/radarr/modals.rs index ca7b457..922757d 100644 --- a/src/models/servarr_data/radarr/modals.rs +++ b/src/models/servarr_data/radarr/modals.rs @@ -90,18 +90,7 @@ impl From<&RadarrData<'_>> for EditIndexerModal { .into(); } - edit_indexer_modal.tags = tags - .iter() - .map(|tag_id| { - radarr_data - .tags_map - .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) - .expect("Tag ID must exist in tags map") - .clone() - }) - .collect::>() - .join(", ") - .into(); + edit_indexer_modal.tags = radarr_data.tag_ids_to_display(tags).into(); edit_indexer_modal } @@ -132,18 +121,7 @@ impl From<&RadarrData<'_>> for EditMovieModal { .minimum_availability_list .set_items(Vec::from_iter(MinimumAvailability::iter())); edit_movie_modal.path = path.clone().into(); - edit_movie_modal.tags = tags - .iter() - .map(|tag_id| { - radarr_data - .tags_map - .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) - .expect("Tag ID must exist in tags map") - .clone() - }) - .collect::>() - .join(", ") - .into(); + edit_movie_modal.tags = radarr_data.tag_ids_to_display(tags).into(); edit_movie_modal.monitored = Some(*monitored); @@ -157,15 +135,9 @@ impl From<&RadarrData<'_>> for EditMovieModal { .state .select(minimum_availability_index); - let mut quality_profile_names: Vec = radarr_data - .quality_profile_map - .right_values() - .cloned() - .collect(); - quality_profile_names.sort(); edit_movie_modal .quality_profile_list - .set_items(quality_profile_names); + .set_items(radarr_data.sorted_quality_profile_names()); let quality_profile_name = radarr_data .quality_profile_map .get_by_left(quality_profile_id) @@ -202,15 +174,9 @@ impl From<&RadarrData<'_>> for AddMovieModal { add_movie_modal .minimum_availability_list .set_items(Vec::from_iter(MinimumAvailability::iter())); - let mut quality_profile_names: Vec = radarr_data - .quality_profile_map - .right_values() - .cloned() - .collect(); - quality_profile_names.sort(); add_movie_modal .quality_profile_list - .set_items(quality_profile_names); + .set_items(radarr_data.sorted_quality_profile_names()); add_movie_modal .root_folder_list .set_items(radarr_data.root_folders.items.to_vec()); @@ -246,15 +212,9 @@ impl From<&RadarrData<'_>> for EditCollectionModal { edit_collection_modal .minimum_availability_list .set_items(Vec::from_iter(MinimumAvailability::iter())); - let mut quality_profile_names: Vec = radarr_data - .quality_profile_map - .right_values() - .cloned() - .collect(); - quality_profile_names.sort(); edit_collection_modal .quality_profile_list - .set_items(quality_profile_names); + .set_items(radarr_data.sorted_quality_profile_names()); let minimum_availability_index = edit_collection_modal .minimum_availability_list diff --git a/src/models/servarr_data/radarr/radarr_data.rs b/src/models/servarr_data/radarr/radarr_data.rs index 1c43015..dad6b68 100644 --- a/src/models/servarr_data/radarr/radarr_data.rs +++ b/src/models/servarr_data/radarr/radarr_data.rs @@ -23,6 +23,7 @@ use crate::models::{ use crate::network::radarr_network::RadarrEvent; use bimap::BiMap; use chrono::{DateTime, Utc}; +use serde_json::Number; use strum::EnumIter; #[cfg(test)] @@ -81,6 +82,23 @@ impl RadarrData<'_> { self.movie_details_modal = None; self.movie_info_tabs.index = 0; } + + pub fn tag_ids_to_display(&self, tag_ids: &[Number]) -> String { + tag_ids + .iter() + .filter_map(|tag_id| { + let id = tag_id.as_i64()?; + self.tags_map.get_by_left(&id).cloned() + }) + .collect::>() + .join(", ") + } + + pub fn sorted_quality_profile_names(&self) -> Vec { + let mut names: Vec = self.quality_profile_map.right_values().cloned().collect(); + names.sort(); + names + } } impl<'a> Default for RadarrData<'a> { diff --git a/src/models/servarr_data/sonarr/modals.rs b/src/models/servarr_data/sonarr/modals.rs index df7f8e4..91f1dde 100644 --- a/src/models/servarr_data/sonarr/modals.rs +++ b/src/models/servarr_data/sonarr/modals.rs @@ -45,24 +45,12 @@ impl From<&SonarrData<'_>> for AddSeriesModal { add_series_modal .series_type_list .set_items(Vec::from_iter(SeriesType::iter())); - let mut quality_profile_names: Vec = sonarr_data - .quality_profile_map - .right_values() - .cloned() - .collect(); - quality_profile_names.sort(); add_series_modal .quality_profile_list - .set_items(quality_profile_names); - let mut language_profile_names: Vec = sonarr_data - .language_profiles_map - .right_values() - .cloned() - .collect(); - language_profile_names.sort(); + .set_items(sonarr_data.sorted_quality_profile_names()); add_series_modal .language_profile_list - .set_items(language_profile_names); + .set_items(sonarr_data.sorted_language_profile_names()); add_series_modal .root_folder_list .set_items(sonarr_data.root_folders.items.to_vec()); @@ -135,18 +123,7 @@ impl From<&SonarrData<'_>> for EditIndexerModal { .into(); } - edit_indexer_modal.tags = tags - .iter() - .map(|tag_id| { - sonarr_data - .tags_map - .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) - .expect("Tag ID must exist in tags map") - .clone() - }) - .collect::>() - .join(", ") - .into(); + edit_indexer_modal.tags = sonarr_data.tag_ids_to_display(tags).into(); edit_indexer_modal } @@ -181,18 +158,7 @@ impl From<&SonarrData<'_>> for EditSeriesModal { .series_type_list .set_items(Vec::from_iter(SeriesType::iter())); edit_series_modal.path = path.clone().into(); - edit_series_modal.tags = tags - .iter() - .map(|tag_id| { - sonarr_data - .tags_map - .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) - .expect("Tag ID must exist in tags map") - .clone() - }) - .collect::>() - .join(", ") - .into(); + edit_series_modal.tags = sonarr_data.tag_ids_to_display(tags).into(); edit_series_modal.monitored = Some(*monitored); edit_series_modal.use_season_folders = Some(*season_folder); @@ -207,15 +173,9 @@ impl From<&SonarrData<'_>> for EditSeriesModal { .state .select(series_type_index); - let mut quality_profile_names: Vec = sonarr_data - .quality_profile_map - .right_values() - .cloned() - .collect(); - quality_profile_names.sort(); edit_series_modal .quality_profile_list - .set_items(quality_profile_names); + .set_items(sonarr_data.sorted_quality_profile_names()); let quality_profile_name = sonarr_data .quality_profile_map .get_by_left(quality_profile_id) @@ -229,15 +189,9 @@ impl From<&SonarrData<'_>> for EditSeriesModal { .quality_profile_list .state .select(quality_profile_index); - let mut language_profile_names: Vec = sonarr_data - .language_profiles_map - .right_values() - .cloned() - .collect(); - language_profile_names.sort(); edit_series_modal .language_profile_list - .set_items(language_profile_names); + .set_items(sonarr_data.sorted_language_profile_names()); let language_profile_name = sonarr_data .language_profiles_map .get_by_left(language_profile_id) diff --git a/src/models/servarr_data/sonarr/sonarr_data.rs b/src/models/servarr_data/sonarr/sonarr_data.rs index 55d9456..8682088 100644 --- a/src/models/servarr_data/sonarr/sonarr_data.rs +++ b/src/models/servarr_data/sonarr/sonarr_data.rs @@ -1,5 +1,6 @@ use bimap::BiMap; use chrono::{DateTime, Utc}; +use serde_json::Number; use strum::EnumIter; use crate::{ @@ -87,6 +88,29 @@ impl SonarrData<'_> { self.seasons = StatefulTable::default(); self.series_info_tabs.index = 0; } + + pub fn tag_ids_to_display(&self, tag_ids: &[Number]) -> String { + tag_ids + .iter() + .filter_map(|tag_id| { + let id = tag_id.as_i64()?; + self.tags_map.get_by_left(&id).cloned() + }) + .collect::>() + .join(", ") + } + + pub fn sorted_quality_profile_names(&self) -> Vec { + let mut names: Vec = self.quality_profile_map.right_values().cloned().collect(); + names.sort(); + names + } + + pub fn sorted_language_profile_names(&self) -> Vec { + let mut names: Vec = self.language_profiles_map.right_values().cloned().collect(); + names.sort(); + names + } } impl<'a> Default for SonarrData<'a> { diff --git a/src/network/radarr_network/library/mod.rs b/src/network/radarr_network/library/mod.rs index f828069..6d08957 100644 --- a/src/network/radarr_network/library/mod.rs +++ b/src/network/radarr_network/library/mod.rs @@ -225,26 +225,14 @@ impl Network<'_, '_> { .cloned() .collect(); - if app.data.radarr_data.movie_details_modal.is_none() { - app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); - } + let modal = app + .data + .radarr_data + .movie_details_modal + .get_or_insert_default(); - app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_cast - .set_items(cast_vec); - app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_crew - .set_items(crew_vec); + modal.movie_cast.set_items(cast_vec); + modal.movie_crew.set_items(crew_vec); }) .await } @@ -452,16 +440,11 @@ impl Network<'_, '_> { let mut reversed_movie_history_vec = movie_history_vec.to_vec(); reversed_movie_history_vec.reverse(); - if app.data.radarr_data.movie_details_modal.is_none() { - app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()) - } - app .data .radarr_data .movie_details_modal - .as_mut() - .unwrap() + .get_or_insert_default() .movie_history .set_items(reversed_movie_history_vec) }) @@ -487,16 +470,11 @@ impl Network<'_, '_> { self .handle_request::<(), Vec>(request_props, |release_vec, mut app| { - if app.data.radarr_data.movie_details_modal.is_none() { - app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); - } - app .data .radarr_data .movie_details_modal - .as_mut() - .unwrap() + .get_or_insert_default() .movie_releases .set_items(release_vec); }) diff --git a/src/network/sonarr_network/library/series/mod.rs b/src/network/sonarr_network/library/series/mod.rs index 7e0bc7d..800c58d 100644 --- a/src/network/sonarr_network/library/series/mod.rs +++ b/src/network/sonarr_network/library/series/mod.rs @@ -307,29 +307,21 @@ impl Network<'_, '_> { self .handle_request::<(), Vec>(request_props, |mut history_vec, mut app| { - if app.data.sonarr_data.series_history.is_none() { - app.data.sonarr_data.series_history = Some(StatefulTable::default()); - } - - if !matches!( + let is_sorting = matches!( app.get_current_route(), Route::Sonarr(ActiveSonarrBlock::SeriesHistorySortPrompt, _) - ) { + ); + + let series_history = app + .data + .sonarr_data + .series_history + .get_or_insert_default(); + + if !is_sorting { history_vec.sort_by(|a, b| a.id.cmp(&b.id)); - app - .data - .sonarr_data - .series_history - .as_mut() - .unwrap() - .set_items(history_vec); - app - .data - .sonarr_data - .series_history - .as_mut() - .unwrap() - .apply_sorting_toggle(false); + series_history.set_items(history_vec); + series_history.apply_sorting_toggle(false); } }) .await diff --git a/src/ui/radarr_ui/library/mod.rs b/src/ui/radarr_ui/library/mod.rs index 7e86def..6e74e48 100644 --- a/src/ui/radarr_ui/library/mod.rs +++ b/src/ui/radarr_ui/library/mod.rs @@ -101,22 +101,15 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .get_by_left(&movie.quality_profile_id) .expect("Quality profile ID must exist in quality_profile_map") .to_owned(); - let empty_tag = String::new(); - let tags = if !movie.tags.is_empty() { - movie - .tags - .iter() - .map(|tag_id| { - tags_map - .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) - .unwrap_or(&empty_tag) - .clone() - }) - .collect::>() - .join(", ") - } else { - String::new() - }; + let tags = movie + .tags + .iter() + .filter_map(|tag_id| { + let id = tag_id.as_i64()?; + tags_map.get_by_left(&id).cloned() + }) + .collect::>() + .join(", "); decorate_with_row_style( downloads_vec, diff --git a/src/ui/sonarr_ui/library/mod.rs b/src/ui/sonarr_ui/library/mod.rs index ba3c594..0d91894 100644 --- a/src/ui/sonarr_ui/library/mod.rs +++ b/src/ui/sonarr_ui/library/mod.rs @@ -112,22 +112,15 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .get_by_left(&series.language_profile_id) .expect("Language profile ID must exist in language_profile_map") .to_owned(); - let empty_tag = String::new(); - let tags = if !series.tags.is_empty() { - series - .tags - .iter() - .map(|tag_id| { - tags_map - .get_by_left(&tag_id.as_i64().expect("Tag ID must be a valid i64")) - .unwrap_or(&empty_tag) - .clone() - }) - .collect::>() - .join(", ") - } else { - String::new() - }; + let tags = series + .tags + .iter() + .filter_map(|tag_id| { + let id = tag_id.as_i64()?; + tags_map.get_by_left(&id).cloned() + }) + .collect::>() + .join(", "); decorate_series_row_with_style( series, From 659023d561bb187a8e69db1ff2cffdc5235e3589 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 10:10:19 -0700 Subject: [PATCH 05/28] refactor: Improved error handling for the tail-logs subcommand to propagate errors up the stack instead of exiting there. --- src/main.rs | 2 +- .../sonarr_network/library/series/mod.rs | 6 +----- src/utils.rs | 18 ++++++++---------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index bf7c136..848b49a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -152,7 +152,7 @@ async fn main() -> Result<()> { let mut cli = Cli::command(); generate(shell, &mut cli, "managarr", &mut io::stdout()) } - Command::TailLogs { no_color } => tail_logs(no_color).await, + Command::TailLogs { no_color } => tail_logs(no_color).await?, }, None => { let app_nw = Arc::clone(&app); diff --git a/src/network/sonarr_network/library/series/mod.rs b/src/network/sonarr_network/library/series/mod.rs index 800c58d..100a162 100644 --- a/src/network/sonarr_network/library/series/mod.rs +++ b/src/network/sonarr_network/library/series/mod.rs @@ -312,11 +312,7 @@ impl Network<'_, '_> { Route::Sonarr(ActiveSonarrBlock::SeriesHistorySortPrompt, _) ); - let series_history = app - .data - .sonarr_data - .series_history - .get_or_insert_default(); + let series_history = app.data.sonarr_data.series_history.get_or_insert_default(); if !is_sorting { history_vec.sort_by(|a, b| a.id.cmp(&b.id)); diff --git a/src/utils.rs b/src/utils.rs index d853e2f..3de6810 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -6,10 +6,10 @@ use std::sync::Arc; use std::time::Duration; use anyhow::Result; -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use colored::Colorize; use indicatif::{ProgressBar, ProgressStyle}; -use log::{LevelFilter, error}; +use log::{error, LevelFilter}; use log4rs::append::file::FileAppender; use log4rs::config::{Appender, Root}; use log4rs::encode::pattern::PatternEncoder; @@ -18,7 +18,7 @@ use reqwest::{Certificate, Client}; use tokio::sync::Mutex; use tokio_util::sync::CancellationToken; -use crate::app::{App, AppConfig, log_and_print_error}; +use crate::app::{log_and_print_error, App, AppConfig}; use crate::cli::{self, Command}; use crate::network::Network; use crate::ui::theme::ThemeDefinitionsWrapper; @@ -79,16 +79,15 @@ pub fn convert_runtime(runtime: i64) -> (i64, i64) { (hours, minutes) } -pub async fn tail_logs(no_color: bool) { +pub async fn tail_logs(no_color: bool) -> Result<()> { let re = Regex::new(r"^(?P\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\s+<(?P[^\s>]+)>\s+\[(?P[A-Z]+)]\s+(?P[^:]+):(?P\d+)\s+-\s+(?P.*)$").unwrap(); let file_path = get_log_path(); let file = File::open(&file_path).expect("Cannot open file"); let mut reader = BufReader::new(file); - if let Err(e) = reader.seek(SeekFrom::End(0)) { - eprintln!("Unable to tail log file: {e:?}"); - process::exit(1); - }; + reader + .seek(SeekFrom::End(0)) + .with_context(|| "Unable to tail log file")?; let mut lines = reader.lines(); @@ -104,8 +103,7 @@ pub async fn tail_logs(no_color: bool) { } } }) - .await - .unwrap(); + .await? } fn colorize_log_line(line: &str, re: &Regex) -> String { From 71240373c05347953bf536ca992c9810351f5bbc Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 11:34:45 -0700 Subject: [PATCH 06/28] refactor: Simplified both the table_handler macro and the stateful_table implementation --- src/handlers/radarr_handlers/blocklist/mod.rs | 1 - .../radarr_handlers/collections/mod.rs | 1 - .../library/add_movie_handler.rs | 3 +- src/handlers/radarr_handlers/library/mod.rs | 1 - src/handlers/sonarr_handlers/blocklist/mod.rs | 1 - src/handlers/sonarr_handlers/history/mod.rs | 1 - .../library/add_series_handler.rs | 3 +- src/handlers/sonarr_handlers/library/mod.rs | 1 - .../library/season_details_handler.rs | 1 - .../library/series_details_handler.rs | 1 - src/handlers/table_handler.rs | 319 +++++++----------- src/handlers/table_handler_tests.rs | 1 - src/models/stateful_table.rs | 271 ++++----------- src/utils.rs | 6 +- 14 files changed, 192 insertions(+), 419 deletions(-) diff --git a/src/handlers/radarr_handlers/blocklist/mod.rs b/src/handlers/radarr_handlers/blocklist/mod.rs index 11ac0e3..19834f3 100644 --- a/src/handlers/radarr_handlers/blocklist/mod.rs +++ b/src/handlers/radarr_handlers/blocklist/mod.rs @@ -38,7 +38,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for BlocklistHandler<'a, let blocklist_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Blocklist.into()) .sorting_block(ActiveRadarrBlock::BlocklistSortPrompt.into()) - .sort_by_fn(|a: &BlocklistItem, b: &BlocklistItem| a.id.cmp(&b.id)) .sort_options(blocklist_sorting_options()); if !self.handle_blocklist_table_events(blocklist_table_handling_config) { diff --git a/src/handlers/radarr_handlers/collections/mod.rs b/src/handlers/radarr_handlers/collections/mod.rs index 19067d3..ffdaf5c 100644 --- a/src/handlers/radarr_handlers/collections/mod.rs +++ b/src/handlers/radarr_handlers/collections/mod.rs @@ -42,7 +42,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionsHandler<' let collections_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Collections.into()) .sorting_block(ActiveRadarrBlock::CollectionsSortPrompt.into()) - .sort_by_fn(|a: &Collection, b: &Collection| a.id.cmp(&b.id)) .sort_options(collections_sorting_options()) .searching_block(ActiveRadarrBlock::SearchCollection.into()) .search_error_block(ActiveRadarrBlock::SearchCollectionError.into()) diff --git a/src/handlers/radarr_handlers/library/add_movie_handler.rs b/src/handlers/radarr_handlers/library/add_movie_handler.rs index 246a993..2a6b9da 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler.rs @@ -7,7 +7,6 @@ use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, ActiveRadarrBlock, }; -use crate::models::stateful_table::StatefulTable; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::radarr_network::RadarrEvent; use crate::{ @@ -35,7 +34,7 @@ impl AddMovieHandler<'_, '_> { .radarr_data .add_searched_movies .as_mut() - .unwrap_or(&mut StatefulTable::default()), + .expect("add_searched_movies should be initialized"), AddMovieSearchResult ); diff --git a/src/handlers/radarr_handlers/library/mod.rs b/src/handlers/radarr_handlers/library/mod.rs index 7648db5..1834399 100644 --- a/src/handlers/radarr_handlers/library/mod.rs +++ b/src/handlers/radarr_handlers/library/mod.rs @@ -44,7 +44,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for LibraryHandler<'a, ' fn handle(&mut self) { let movie_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Movies.into()) .sorting_block(ActiveRadarrBlock::MoviesSortPrompt.into()) - .sort_by_fn(|a: &Movie, b: &Movie| a.id.cmp(&b.id)) .sort_options(movies_sorting_options()) .searching_block(ActiveRadarrBlock::SearchMovie.into()) .search_error_block(ActiveRadarrBlock::SearchMovieError.into()) diff --git a/src/handlers/sonarr_handlers/blocklist/mod.rs b/src/handlers/sonarr_handlers/blocklist/mod.rs index dff3205..2e66041 100644 --- a/src/handlers/sonarr_handlers/blocklist/mod.rs +++ b/src/handlers/sonarr_handlers/blocklist/mod.rs @@ -38,7 +38,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for BlocklistHandler<'a, let blocklist_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::Blocklist.into()) .sorting_block(ActiveSonarrBlock::BlocklistSortPrompt.into()) - .sort_by_fn(|a: &BlocklistItem, b: &BlocklistItem| a.id.cmp(&b.id)) .sort_options(blocklist_sorting_options()); if !self.handle_blocklist_table_events(blocklist_table_handling_config) { diff --git a/src/handlers/sonarr_handlers/history/mod.rs b/src/handlers/sonarr_handlers/history/mod.rs index e29a95f..91942a0 100644 --- a/src/handlers/sonarr_handlers/history/mod.rs +++ b/src/handlers/sonarr_handlers/history/mod.rs @@ -33,7 +33,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for HistoryHandler<'a, ' fn handle(&mut self) { let history_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::History.into()) .sorting_block(ActiveSonarrBlock::HistorySortPrompt.into()) - .sort_by_fn(|a: &SonarrHistoryItem, b: &SonarrHistoryItem| a.id.cmp(&b.id)) .sort_options(history_sorting_options()) .searching_block(ActiveSonarrBlock::SearchHistory.into()) .search_error_block(ActiveSonarrBlock::SearchHistoryError.into()) diff --git a/src/handlers/sonarr_handlers/library/add_series_handler.rs b/src/handlers/sonarr_handlers/library/add_series_handler.rs index 233126b..d8ac096 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler.rs @@ -5,7 +5,6 @@ use crate::models::servarr_data::sonarr::sonarr_data::{ ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, ActiveSonarrBlock, }; use crate::models::sonarr_models::{AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult}; -use crate::models::stateful_table::StatefulTable; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::sonarr_network::SonarrEvent; use crate::{ @@ -33,7 +32,7 @@ impl AddSeriesHandler<'_, '_> { .sonarr_data .add_searched_series .as_mut() - .unwrap_or(&mut StatefulTable::default()), + .expect("add_searched_series should be initialized"), AddSeriesSearchResult ); diff --git a/src/handlers/sonarr_handlers/library/mod.rs b/src/handlers/sonarr_handlers/library/mod.rs index 1131c15..90b5c31 100644 --- a/src/handlers/sonarr_handlers/library/mod.rs +++ b/src/handlers/sonarr_handlers/library/mod.rs @@ -55,7 +55,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, ' fn handle(&mut self) { let series_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::Series.into()) .sorting_block(ActiveSonarrBlock::SeriesSortPrompt.into()) - .sort_by_fn(|a: &Series, b: &Series| a.id.cmp(&b.id)) .sort_options(series_sorting_options()) .searching_block(ActiveSonarrBlock::SearchSeries.into()) .search_error_block(ActiveSonarrBlock::SearchSeriesError.into()) diff --git a/src/handlers/sonarr_handlers/library/season_details_handler.rs b/src/handlers/sonarr_handlers/library/season_details_handler.rs index 3472996..4ae7fd0 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler.rs @@ -115,7 +115,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler TableHandlingConfig::new(ActiveSonarrBlock::SeasonHistory.into()) .sorting_block(ActiveSonarrBlock::SeasonHistorySortPrompt.into()) .sort_options(history_sorting_options()) - .sort_by_fn(|a: &SonarrHistoryItem, b: &SonarrHistoryItem| a.id.cmp(&b.id)) .searching_block(ActiveSonarrBlock::SearchSeasonHistory.into()) .search_error_block(ActiveSonarrBlock::SearchSeasonHistoryError.into()) .search_field_fn(|history_item: &SonarrHistoryItem| &history_item.source_title.text) diff --git a/src/handlers/sonarr_handlers/library/series_details_handler.rs b/src/handlers/sonarr_handlers/library/series_details_handler.rs index ed8ca49..0b6771b 100644 --- a/src/handlers/sonarr_handlers/library/series_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/series_details_handler.rs @@ -71,7 +71,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler TableHandlingConfig::new(ActiveSonarrBlock::SeriesHistory.into()) .sorting_block(ActiveSonarrBlock::SeriesHistorySortPrompt.into()) .sort_options(history_sorting_options()) - .sort_by_fn(|a: &SonarrHistoryItem, b: &SonarrHistoryItem| a.id.cmp(&b.id)) .searching_block(ActiveSonarrBlock::SearchSeriesHistory.into()) .search_error_block(ActiveSonarrBlock::SearchSeriesHistoryError.into()) .search_field_fn(|history_item: &SonarrHistoryItem| &history_item.source_title.text) diff --git a/src/handlers/table_handler.rs b/src/handlers/table_handler.rs index 77e32c4..c46320e 100644 --- a/src/handlers/table_handler.rs +++ b/src/handlers/table_handler.rs @@ -1,7 +1,6 @@ use crate::models::Route; use crate::models::stateful_table::SortOption; use derive_setters::Setters; -use std::cmp::Ordering; use std::fmt::Debug; #[cfg(test)] @@ -18,8 +17,6 @@ where #[setters(strip_option)] pub sort_options: Option>>, #[setters(strip_option)] - pub sort_by_fn: Option Ordering>, - #[setters(strip_option)] pub searching_block: Option, #[setters(strip_option)] pub search_error_block: Option, @@ -56,16 +53,12 @@ macro_rules! handle_table_events { _ if $crate::matches_key!(submit, $self.key) => $self.[](config), _ if $crate::matches_key!(esc, $self.key) => $self.[](config), _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block - .as_ref() - .expect("searching_block must be configured for this table") => + && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => { $self.[]() } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block - .as_ref() - .expect("filtering_block must be configured for this table") => + && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => { $self.[]() } @@ -91,11 +84,11 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block - .as_ref() - .expect("sorting_block must be configured for this table") => + && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => { - $table.sort.as_mut().unwrap().scroll_up(); + if let Some(ref mut sort) = $table.sort { + sort.scroll_up(); + } true } _ => false, @@ -111,27 +104,12 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block - .as_ref() - .expect("sorting_block must be configured for this table") => + && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => { - $table - .sort - .as_mut() - .unwrap() - .scroll_down(); - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Paginated; - - match $self.app.get_current_route() { - _ if config.table_block == $self.app.get_current_route() => { - $table.page_down(); + if let Some(ref mut sort) = $table.sort { + sort + .scroll_down(); + } true } _ => false, @@ -141,12 +119,22 @@ macro_rules! handle_table_events { fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { use $crate::models::Paginated; - match $self.app.get_current_route() { - _ if config.table_block == $self.app.get_current_route() => { - $table.page_up(); - true - } - _ => false, + if config.table_block == $self.app.get_current_route() { + $table.page_up(); + true + } else { + false + } + } + + fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { + use $crate::models::Paginated; + + if config.table_block == $self.app.get_current_route() { + $table.page_down(); + true + } else { + false } } @@ -159,39 +147,27 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block - .as_ref() - .expect("sorting_block must be configured for this table") => + && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => { - $table - .sort - .as_mut() - .unwrap() - .scroll_to_top(); + if let Some(ref mut sort) = $table.sort { + sort.scroll_to_top(); + } true } _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block - .as_ref() - .expect("searching_block must be configured for this table") => + && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => { - $table - .search - .as_mut() - .unwrap() - .scroll_home(); + if let Some(ref mut search) = $table.search { + search.scroll_home(); + } true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block - .as_ref() - .expect("filtering_block must be configured for this table") => + && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => { - $table - .filter - .as_mut() - .unwrap() - .scroll_home(); + if let Some(ref mut filter) = $table.filter { + filter.scroll_home(); + } true } _ => false, @@ -207,39 +183,27 @@ macro_rules! handle_table_events { true } _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block - .as_ref() - .expect("sorting_block must be configured for this table") => + && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => { - $table - .sort - .as_mut() - .unwrap() - .scroll_to_bottom(); + if let Some(ref mut sort) = $table.sort { + sort.scroll_to_bottom(); + } true } _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block - .as_ref() - .expect("searching_block must be configured for this table") => + && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => { - $table - .search - .as_mut() - .unwrap() - .reset_offset(); + if let Some(ref mut search) = $table.search { + search.reset_offset(); + } true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block - .as_ref() - .expect("filtering_block must be configured for this table") => + && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => { - $table - .filter - .as_mut() - .unwrap() - .reset_offset(); + if let Some(ref mut filter) = $table.filter { + filter.reset_offset(); + } true } _ => false, @@ -249,53 +213,36 @@ macro_rules! handle_table_events { fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { match $self.app.get_current_route() { _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block - .as_ref() - .expect("searching_block must be configured for this table") => + && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => { - $crate::handle_text_box_left_right_keys!( - $self, - $self.key, - $table.search.as_mut().unwrap() - ); + if let Some(ref mut search) = $table.search { + $crate::handle_text_box_left_right_keys!($self, $self.key, search); + } true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block - .as_ref() - .expect("filtering_block must be configured for this table") => + && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => { - $crate::handle_text_box_left_right_keys!( - $self, - $self.key, - $table.filter.as_mut().unwrap() - ); + if let Some(ref mut filter) = $table.filter { + $crate::handle_text_box_left_right_keys!($self, $self.key, filter); + } true } _ => false, } } - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { + fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { match $self.app.get_current_route() { _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block - .as_ref() - .expect("sorting_block must be configured for this table") => + && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => { - if let Some(sort_by_fn) = config.sort_by_fn { - $table.items.sort_by(sort_by_fn); - } - $table.apply_sorting(); $self.app.pop_navigation_stack(); - true } _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block - .as_ref() - .expect("searching_block must be configured for this table") => + && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => { $self.app.pop_navigation_stack(); $self.app.ignore_special_keys_for_textbox_input = false; @@ -318,9 +265,7 @@ macro_rules! handle_table_events { true } _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block - .as_ref() - .expect("filtering_block must be configured for this table") => + && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => { $self.app.pop_navigation_stack(); $self.app.ignore_special_keys_for_textbox_input = false; @@ -349,21 +294,15 @@ macro_rules! handle_table_events { fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { match $self.app.get_current_route() { _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block - .as_ref() - .expect("sorting_block must be configured for this table") => + && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => { $self.app.pop_navigation_stack(); true } _ if (config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block - .as_ref() - .expect("searching_block must be configured for this table")) + && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap()) || (config.search_error_block.is_some() - && $self.app.get_current_route() == *config.search_error_block - .as_ref() - .expect("search_error_block must be configured for this table")) => + && $self.app.get_current_route() == *config.search_error_block.as_ref().unwrap()) => { $self.app.pop_navigation_stack(); $table.reset_search(); @@ -371,13 +310,9 @@ macro_rules! handle_table_events { true } _ if (config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block - .as_ref() - .expect("filtering_block must be configured for this table")) + && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap()) || (config.filter_error_block.is_some() - && $self.app.get_current_route() == *config.filter_error_block - .as_ref() - .expect("filter_error_block must be configured for this table")) => + && $self.app.get_current_route() == *config.filter_error_block.as_ref().unwrap()) => { $self.app.pop_navigation_stack(); $table.reset_filter(); @@ -394,68 +329,67 @@ macro_rules! handle_table_events { } } - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if matches!($self.app.get_current_route(), _ if config.table_block == $self.app.get_current_route()) { - $self - .app - .push_navigation_stack(config.filtering_block.expect("Filtering block is undefined").into()); - $table.reset_filter(); - $table.filter = Some($crate::models::HorizontallyScrollableText::default()); - $self.app.ignore_special_keys_for_textbox_input = true; - - true - } else { - false - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if matches!($self.app.get_current_route(), _ if config.table_block == $self.app.get_current_route()) { - $self - .app - .push_navigation_stack(config.searching_block.expect("Searching block is undefined")); - $table.search = Some($crate::models::HorizontallyScrollableText::default()); - $self.app.ignore_special_keys_for_textbox_input = true; - - true - } else { - false - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if matches!($self.app.get_current_route(), _ if config.table_block == $self.app.get_current_route()) { - $table.sorting( - config - .sort_options - .as_ref() - .expect("Sort options are undefined") - .clone(), - ); - $self - .app - .push_navigation_stack(config.sorting_block.expect("Sorting block is undefined")); - true - } else { - false - } - } - fn [](&mut $self) -> bool { - $crate::handle_text_box_keys!( - $self, - $self.key, - $table.search.as_mut().unwrap() - ); + let Some(ref mut search) = $table.search else { + return false; + }; + + $crate::handle_text_box_keys!($self, $self.key, search); true } fn [](&mut $self) -> bool { - $crate::handle_text_box_keys!( - $self, - $self.key, - $table.filter.as_mut().unwrap() - ); + let Some(ref mut filter) = $table.filter else { + return false; + }; + + $crate::handle_text_box_keys!($self, $self.key, filter); + true + } + + fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { + if $self.app.get_current_route() != config.table_block { + return false; + } + + let Some(ref filtering_block) = config.filtering_block else { + return false; + }; + + let filter = $crate::models::HorizontallyScrollableText::default(); + $table.filter = Some(filter); + $self.app.push_navigation_stack(*filtering_block); + $self.app.ignore_special_keys_for_textbox_input = true; + true + } + + fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { + if $self.app.get_current_route() != config.table_block { + return false; + } + + let Some(ref searching_block) = config.searching_block else { + return false; + }; + + let search = $crate::models::HorizontallyScrollableText::default(); + $table.search = Some(search); + $self.app.push_navigation_stack(*searching_block); + $self.app.ignore_special_keys_for_textbox_input = true; + true + } + + fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { + if $self.app.get_current_route() != config.table_block { + return false; + } + + let (Some(ref sorting_block), Some(sort_options)) = (config.sorting_block, config.sort_options.as_ref()) else { + return false; + }; + + $table.sorting(sort_options.clone()); + $self.app.push_navigation_stack(*sorting_block); true } } @@ -467,17 +401,16 @@ where T: Clone + PartialEq + Eq + Debug + Default, { pub fn new(table_block: Route) -> Self { - TableHandlingConfig { + Self { + table_block, sorting_block: None, sort_options: None, - sort_by_fn: None, searching_block: None, search_error_block: None, search_field_fn: None, filtering_block: None, filter_error_block: None, filter_field_fn: None, - table_block, } } } diff --git a/src/handlers/table_handler_tests.rs b/src/handlers/table_handler_tests.rs index af61ec2..e419dcd 100644 --- a/src/handlers/table_handler_tests.rs +++ b/src/handlers/table_handler_tests.rs @@ -23,7 +23,6 @@ mod tests { fn handle(&mut self) { let movie_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Movies.into()) .sorting_block(ActiveRadarrBlock::MoviesSortPrompt.into()) - .sort_by_fn(|a: &Movie, b: &Movie| a.id.cmp(&b.id)) .sort_options(sort_options()) .searching_block(ActiveRadarrBlock::SearchMovie.into()) .search_error_block(ActiveRadarrBlock::SearchMovieError.into()) diff --git a/src/models/stateful_table.rs b/src/models/stateful_table.rs index a38512a..ba90942 100644 --- a/src/models/stateful_table.rs +++ b/src/models/stateful_table.rs @@ -50,151 +50,46 @@ where T: Clone + PartialEq + Eq + Debug, { fn scroll_down(&mut self) { - if let Some(filtered_items) = self.filtered_items.as_ref() { - if filtered_items.is_empty() { - return; - } - - match self - .filtered_state - .as_ref() - .expect("filtered_state must exist when filtered_items exists") - .selected() - { - Some(i) => { - if i >= filtered_items.len() - 1 { - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_first(); - } else { - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_next(); - } - } - None => self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_first(), - }; - + let items_len = self.active_items().len(); + if items_len == 0 { return; } - if self.items.is_empty() { - return; + let state = self.active_state_mut(); + match state.selected() { + Some(i) if i >= items_len - 1 => state.select_first(), + Some(_) => state.select_next(), + None => state.select_first(), } - - match self.state.selected() { - Some(i) => { - if i >= self.items.len() - 1 { - self.state.select_first(); - } else { - self.state.select_next(); - } - } - None => self.state.select_first(), - }; } fn scroll_up(&mut self) { - if let Some(filtered_items) = self.filtered_items.as_ref() { - if filtered_items.is_empty() { - return; - } - - match self - .filtered_state - .as_ref() - .expect("filtered_state must exist when filtered_items exists") - .selected() - { - Some(i) => { - if i == 0 { - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select(Some(filtered_items.len() - 1)); - } else { - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_previous(); - } - } - None => self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_first(), - }; - + let items_len = self.active_items().len(); + if items_len == 0 { return; } - if self.items.is_empty() { - return; + let state = self.active_state_mut(); + match state.selected() { + Some(0) => state.select(Some(items_len - 1)), + Some(_) => state.select_previous(), + None => state.select_first(), } - - match self.state.selected() { - Some(i) => { - if i == 0 { - self.state.select(Some(self.items.len() - 1)); - } else { - self.state.select_previous(); - } - } - None => self.state.select_first(), - }; } fn scroll_to_top(&mut self) { - if let Some(filtered_items) = self.filtered_items.as_ref() { - if filtered_items.is_empty() { - return; - } - - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_first(); + if self.active_items().is_empty() { return; } - - if self.items.is_empty() { - return; - } - - self.state.select_first(); + self.active_state_mut().select_first(); } fn scroll_to_bottom(&mut self) { - if let Some(filtered_items) = self.filtered_items.as_ref() { - if filtered_items.is_empty() { - return; - } - - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select(Some(filtered_items.len() - 1)); + let items_len = self.active_items().len(); + if items_len == 0 { return; } - - if self.items.is_empty() { - return; - } - - self.state.select(Some(self.items.len() - 1)); + self.active_state_mut().select(Some(items_len - 1)); } } @@ -203,89 +98,56 @@ where T: Clone + PartialEq + Eq + Debug, { fn page_down(&mut self) { - if let Some(filtered_items) = self.filtered_items.as_ref() { - if filtered_items.is_empty() { - return; - } - - match self - .filtered_state - .as_ref() - .expect("filtered_state must exist when filtered_items exists") - .selected() - { - Some(i) => { - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select(Some(i.saturating_add(20) % (filtered_items.len() - 1))); - } - None => self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_first(), - }; - + let items_len = self.active_items().len(); + if items_len == 0 { return; } - if self.items.is_empty() { - return; + let state = self.active_state_mut(); + match state.selected() { + Some(i) => state.select(Some(i.saturating_add(20) % (items_len - 1))), + None => state.select_first(), } - - match self.state.selected() { - Some(i) => { - self - .state - .select(Some(i.saturating_add(20) % (self.items.len() - 1))); - } - None => self.state.select_first(), - }; } fn page_up(&mut self) { - if let Some(filtered_items) = self.filtered_items.as_ref() { - if filtered_items.is_empty() { - return; - } - - match self - .filtered_state - .as_ref() - .expect("filtered_state must exist when filtered_items exists") - .selected() - { - Some(i) => { - let len = filtered_items.len() - 1; - self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select(Some((i + len - (20 % len)) % len)); - } - None => self - .filtered_state - .as_mut() - .expect("filtered_state must exist when filtered_items exists") - .select_last(), - }; - + let items_len = self.active_items().len(); + if items_len == 0 { return; } - if self.items.is_empty() { - return; - } - - match self.state.selected() { + let state = self.active_state_mut(); + match state.selected() { Some(i) => { - let len = self.items.len() - 1; - self.state.select(Some((i + len - (20 % len)) % len)); + let len = items_len - 1; + state.select(Some((i + len - (20 % len)) % len)); } - None => self.state.select_last(), - }; + None => state.select_last(), + } + } +} + +impl StatefulTable +where + T: Clone + PartialEq + Eq + Debug, +{ + fn active_items(&self) -> &[T] { + self + .filtered_items + .as_ref() + .map_or(&self.items[..], |items| &items[..]) + } + + fn active_state_mut(&mut self) -> &mut TableState { + if let Some(ref mut filtered_state) = self.filtered_state { + filtered_state + } else { + &mut self.state + } + } + + fn active_state(&self) -> &TableState { + self.filtered_state.as_ref().unwrap_or(&self.state) } } @@ -318,24 +180,13 @@ where } pub fn select_index(&mut self, index: Option) { - if let Some(filtered_state) = &mut self.filtered_state { - filtered_state.select(index); - } else { - self.state.select(index); - } + self.active_state_mut().select(index); } pub fn current_selection(&self) -> &T { - if let Some(filtered_items) = &self.filtered_items { - &filtered_items[self - .filtered_state - .as_ref() - .expect("filtered_state must exist when filtered_items exists") - .selected() - .unwrap_or(0)] - } else { - &self.items[self.state.selected().unwrap_or(0)] - } + let items = self.active_items(); + let index = self.active_state().selected().unwrap_or(0); + &items[index] } pub fn sorting(&mut self, sort_options: Vec>) { diff --git a/src/utils.rs b/src/utils.rs index 3de6810..c157755 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -6,10 +6,10 @@ use std::sync::Arc; use std::time::Duration; use anyhow::Result; -use anyhow::{anyhow, Context}; +use anyhow::{Context, anyhow}; use colored::Colorize; use indicatif::{ProgressBar, ProgressStyle}; -use log::{error, LevelFilter}; +use log::{LevelFilter, error}; use log4rs::append::file::FileAppender; use log4rs::config::{Appender, Root}; use log4rs::encode::pattern::PatternEncoder; @@ -18,7 +18,7 @@ use reqwest::{Certificate, Client}; use tokio::sync::Mutex; use tokio_util::sync::CancellationToken; -use crate::app::{log_and_print_error, App, AppConfig}; +use crate::app::{App, AppConfig, log_and_print_error}; use crate::cli::{self, Command}; use crate::network::Network; use crate::ui::theme::ThemeDefinitionsWrapper; From 35dce0bf01b109a71e54023bed471435050c0aff Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 16:03:58 -0700 Subject: [PATCH 07/28] refactor: Migrated the handle_table_events macro into a trait for better IDE support, created a TableEventAdapter wrapper for the KeyEventHandlers to make it so that the trait can be used properly and a simple function to replace the previous call to the handle_table_events macro --- Cargo.lock | 1 - Cargo.toml | 1 - src/handlers/keybinding_handler.rs | 27 +- src/handlers/mod.rs | 12 + src/handlers/radarr_handlers/blocklist/mod.rs | 25 +- .../collections/collection_details_handler.rs | 28 +- .../collections/edit_collection_handler.rs | 8 + .../radarr_handlers/collections/mod.rs | 27 +- src/handlers/radarr_handlers/downloads/mod.rs | 26 +- .../indexers/edit_indexer_handler.rs | 8 + .../indexers/edit_indexer_settings_handler.rs | 8 + src/handlers/radarr_handlers/indexers/mod.rs | 21 +- .../indexers/test_all_indexers_handler.rs | 38 +- .../library/add_movie_handler.rs | 40 +- .../library/delete_movie_handler.rs | 8 + .../library/edit_movie_handler.rs | 8 + src/handlers/radarr_handlers/library/mod.rs | 21 +- .../library/movie_details_handler.rs | 123 +- src/handlers/radarr_handlers/mod.rs | 8 + .../radarr_handlers/root_folders/mod.rs | 29 +- src/handlers/radarr_handlers/system/mod.rs | 8 + .../system/system_details_handler.rs | 8 + src/handlers/sonarr_handlers/blocklist/mod.rs | 25 +- src/handlers/sonarr_handlers/downloads/mod.rs | 26 +- src/handlers/sonarr_handlers/history/mod.rs | 27 +- .../indexers/edit_indexer_handler.rs | 8 + .../indexers/edit_indexer_settings_handler.rs | 8 + src/handlers/sonarr_handlers/indexers/mod.rs | 21 +- .../indexers/test_all_indexers_handler.rs | 42 +- .../library/add_series_handler.rs | 40 +- .../library/delete_series_handler.rs | 8 + .../library/edit_series_handler.rs | 8 + .../library/episode_details_handler.rs | 81 +- src/handlers/sonarr_handlers/library/mod.rs | 18 +- .../library/season_details_handler.rs | 93 +- .../library/series_details_handler.rs | 45 +- src/handlers/sonarr_handlers/mod.rs | 8 + .../sonarr_handlers/root_folders/mod.rs | 29 +- src/handlers/sonarr_handlers/system/mod.rs | 8 + .../system/system_details_handler.rs | 8 + src/handlers/table_handler.rs | 1001 +++++++++++------ src/handlers/table_handler_tests.rs | 194 +++- 42 files changed, 1425 insertions(+), 756 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c5bf37..fb845c9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1386,7 +1386,6 @@ dependencies = [ "mockall", "mockito", "openssl", - "paste", "pretty_assertions", "ratatui", "regex", diff --git a/Cargo.toml b/Cargo.toml index 65a5932..f20f503 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,7 +63,6 @@ managarr-tree-widget = "0.24.0" indicatif = "0.17.9" derive_setters = "0.1.6" deunicode = "1.6.0" -paste = "1.0.15" openssl = { version = "0.10.70", features = ["vendored"] } veil = "0.2.0" validate_theme_derive = "0.1.0" diff --git a/src/handlers/keybinding_handler.rs b/src/handlers/keybinding_handler.rs index f7fb972..b9560a0 100644 --- a/src/handlers/keybinding_handler.rs +++ b/src/handlers/keybinding_handler.rs @@ -1,10 +1,8 @@ use crate::app::App; use crate::event::Key; -use crate::handle_table_events; use crate::handlers::KeyEventHandler; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::models::servarr_data::ActiveKeybindingBlock; -use crate::models::servarr_models::KeybindingItem; #[cfg(test)] #[path = "keybinding_handler_tests.rs"] @@ -15,20 +13,15 @@ pub(super) struct KeybindingHandler<'a, 'b> { app: &'a mut App<'b>, } -impl KeybindingHandler<'_, '_> { - handle_table_events!( - self, - keybindings, - self.app.keymapping_table.as_mut().unwrap(), - KeybindingItem - ); -} - impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveKeybindingBlock> for KeybindingHandler<'a, 'b> { fn handle(&mut self) { let keybinding_table_handling_config = TableHandlingConfig::new(self.app.get_current_route()); - if !self.handle_keybindings_table_events(keybinding_table_handling_config) { + if !handle_table( + self, + |app| app.keymapping_table.as_mut().unwrap(), + keybinding_table_handling_config, + ) { self.handle_key_event(); } } @@ -77,4 +70,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveKeybindingBlock> for KeybindingHandle } fn handle_char_key_event(&mut self) {} + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 5393139..6cb0691 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -93,6 +93,18 @@ pub trait KeyEventHandler<'a, 'b, T: Into + Copy> { fn handle_submit(&mut self); fn handle_esc(&mut self); fn handle_char_key_event(&mut self); + + /// Returns a mutable reference to the application state. + /// + /// This method is used by the trait-based table handler to modify app state during + /// table operations (e.g., navigation stack, loading flags). + fn app_mut(&mut self) -> &mut App<'b>; + + /// Returns the current navigation route. + /// + /// This method is used by the trait-based table handler to determine which screen + /// or mode is currently active, enabling context-aware event handling. + fn current_route(&self) -> Route; } pub fn handle_events(key: Key, app: &mut App<'_>) { diff --git a/src/handlers/radarr_handlers/blocklist/mod.rs b/src/handlers/radarr_handlers/blocklist/mod.rs index 19834f3..9cf43a0 100644 --- a/src/handlers/radarr_handlers/blocklist/mod.rs +++ b/src/handlers/radarr_handlers/blocklist/mod.rs @@ -1,13 +1,13 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::matches_key; use crate::models::radarr_models::BlocklistItem; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; use crate::models::stateful_table::SortOption; use crate::network::radarr_network::RadarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "blocklist_handler_tests.rs"] @@ -21,13 +21,6 @@ pub(super) struct BlocklistHandler<'a, 'b> { } impl BlocklistHandler<'_, '_> { - handle_table_events!( - self, - blocklist, - self.app.data.radarr_data.blocklist, - BlocklistItem - ); - fn extract_blocklist_item_id(&self) -> i64 { self.app.data.radarr_data.blocklist.current_selection().id } @@ -40,7 +33,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for BlocklistHandler<'a, .sorting_block(ActiveRadarrBlock::BlocklistSortPrompt.into()) .sort_options(blocklist_sorting_options()); - if !self.handle_blocklist_table_events(blocklist_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.blocklist, + blocklist_table_handling_config, + ) { self.handle_key_event(); } } @@ -176,6 +173,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for BlocklistHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } fn blocklist_sorting_options() -> Vec> { diff --git a/src/handlers/radarr_handlers/collections/collection_details_handler.rs b/src/handlers/radarr_handlers/collections/collection_details_handler.rs index 2f8923b..2cb628b 100644 --- a/src/handlers/radarr_handlers/collections/collection_details_handler.rs +++ b/src/handlers/radarr_handlers/collections/collection_details_handler.rs @@ -1,15 +1,14 @@ use crate::app::App; use crate::event::Key; use crate::handlers::KeyEventHandler; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; +use crate::matches_key; use crate::models::BlockSelectionState; -use crate::models::radarr_models::CollectionMovie; use crate::models::servarr_data::radarr::radarr_data::{ ADD_MOVIE_SELECTION_BLOCKS, ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, }; use crate::models::stateful_table::StatefulTable; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "collection_details_handler_tests.rs"] @@ -22,21 +21,18 @@ pub(super) struct CollectionDetailsHandler<'a, 'b> { _context: Option, } -impl CollectionDetailsHandler<'_, '_> { - handle_table_events!( - self, - collection_movies, - self.app.data.radarr_data.collection_movies, - CollectionMovie - ); -} +impl CollectionDetailsHandler<'_, '_> {} impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionDetailsHandler<'a, 'b> { fn handle(&mut self) { let collection_movies_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::CollectionDetails.into()); - if !self.handle_collection_movies_table_events(collection_movies_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.collection_movies, + collection_movies_table_handling_config, + ) { self.handle_key_event(); } } @@ -147,4 +143,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionDetailsHan BlockSelectionState::new(EDIT_COLLECTION_SELECTION_BLOCKS); } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/collections/edit_collection_handler.rs b/src/handlers/radarr_handlers/collections/edit_collection_handler.rs index 60adb5f..dff7e63 100644 --- a/src/handlers/radarr_handlers/collections/edit_collection_handler.rs +++ b/src/handlers/radarr_handlers/collections/edit_collection_handler.rs @@ -371,4 +371,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditCollectionHandle _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/collections/mod.rs b/src/handlers/radarr_handlers/collections/mod.rs index ffdaf5c..69e22d1 100644 --- a/src/handlers/radarr_handlers/collections/mod.rs +++ b/src/handlers/radarr_handlers/collections/mod.rs @@ -3,8 +3,9 @@ use crate::event::Key; use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; use crate::handlers::radarr_handlers::collections::edit_collection_handler::EditCollectionHandler; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::matches_key; use crate::models::BlockSelectionState; use crate::models::radarr_models::Collection; use crate::models::servarr_data::radarr::radarr_data::{ @@ -12,7 +13,6 @@ use crate::models::servarr_data::radarr::radarr_data::{ }; use crate::models::stateful_table::SortOption; use crate::network::radarr_network::RadarrEvent; -use crate::{handle_table_events, matches_key}; mod collection_details_handler; mod edit_collection_handler; @@ -28,14 +28,7 @@ pub(super) struct CollectionsHandler<'a, 'b> { context: Option, } -impl CollectionsHandler<'_, '_> { - handle_table_events!( - self, - collections, - self.app.data.radarr_data.collections, - Collection - ); -} +impl CollectionsHandler<'_, '_> {} impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionsHandler<'a, 'b> { fn handle(&mut self) { @@ -50,7 +43,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionsHandler<' .filter_error_block(ActiveRadarrBlock::FilterCollectionsError.into()) .filter_field_fn(|collection| &collection.title.text); - if !self.handle_collections_table_events(collections_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.collections, + collections_table_handling_config, + ) { match self.active_radarr_block { _ if CollectionDetailsHandler::accepts(self.active_radarr_block) => { CollectionDetailsHandler::new(self.key, self.app, self.active_radarr_block, self.context) @@ -177,6 +174,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for CollectionsHandler<' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } fn collections_sorting_options() -> Vec> { diff --git a/src/handlers/radarr_handlers/downloads/mod.rs b/src/handlers/radarr_handlers/downloads/mod.rs index 3ee8869..3a449d1 100644 --- a/src/handlers/radarr_handlers/downloads/mod.rs +++ b/src/handlers/radarr_handlers/downloads/mod.rs @@ -1,12 +1,11 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; -use crate::models::radarr_models::DownloadRecord; +use crate::matches_key; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; use crate::network::radarr_network::RadarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "downloads_handler_tests.rs"] @@ -20,13 +19,6 @@ pub(super) struct DownloadsHandler<'a, 'b> { } impl DownloadsHandler<'_, '_> { - handle_table_events!( - self, - downloads, - self.app.data.radarr_data.downloads, - DownloadRecord - ); - fn extract_download_id(&self) -> i64 { self.app.data.radarr_data.downloads.current_selection().id } @@ -37,7 +29,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DownloadsHandler<'a, let downloads_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Downloads.into()); - if !self.handle_downloads_table_events(downloads_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.downloads, + downloads_table_handling_config, + ) { self.handle_key_event(); } } @@ -163,4 +159,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DownloadsHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs index 4f684d2..33a2383 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_handler.rs @@ -522,4 +522,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs index eae3f87..f933187 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler.rs @@ -288,4 +288,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexerSettingsHandl _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/indexers/mod.rs b/src/handlers/radarr_handlers/indexers/mod.rs index 28fa376..85f5adc 100644 --- a/src/handlers/radarr_handlers/indexers/mod.rs +++ b/src/handlers/radarr_handlers/indexers/mod.rs @@ -4,16 +4,15 @@ use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::radarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::radarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::matches_key; use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, INDEXERS_BLOCKS, }; -use crate::models::servarr_models::Indexer; use crate::network::radarr_network::RadarrEvent; -use crate::{handle_table_events, matches_key}; mod edit_indexer_handler; mod edit_indexer_settings_handler; @@ -31,8 +30,6 @@ pub(super) struct IndexersHandler<'a, 'b> { } impl IndexersHandler<'_, '_> { - handle_table_events!(self, indexers, self.app.data.radarr_data.indexers, Indexer); - fn extract_indexer_id(&self) -> i64 { self.app.data.radarr_data.indexers.current_selection().id } @@ -43,7 +40,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexersHandler<'a, let indexer_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Indexers.into()); - if !self.handle_indexers_table_events(indexer_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.indexers, + indexer_table_handling_config, + ) { match self.active_radarr_block { _ if EditIndexerHandler::accepts(self.active_radarr_block) => { EditIndexerHandler::new(self.key, self.app, self.active_radarr_block, self.context) @@ -206,4 +207,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexersHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs index c3dd2ba..c8e26d4 100644 --- a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs +++ b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler.rs @@ -1,9 +1,7 @@ use crate::app::App; use crate::event::Key; -use crate::handle_table_events; use crate::handlers::KeyEventHandler; -use crate::handlers::table_handler::TableHandlingConfig; -use crate::models::servarr_data::modals::IndexerTestResultModalItem; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; #[cfg(test)] @@ -17,27 +15,23 @@ pub(super) struct TestAllIndexersHandler<'a, 'b> { _context: Option, } -impl TestAllIndexersHandler<'_, '_> { - handle_table_events!( - self, - indexer_test_all_results, - self - .app - .data - .radarr_data - .indexer_test_all_results - .as_mut() - .unwrap(), - IndexerTestResultModalItem - ); -} +impl TestAllIndexersHandler<'_, '_> {} impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for TestAllIndexersHandler<'a, 'b> { fn handle(&mut self) { let test_all_indexers_test_results_table_handler_config = TableHandlingConfig::new(ActiveRadarrBlock::TestAllIndexers.into()); - if !self.handle_indexer_test_all_results_table_events( + if !handle_table( + self, + |app| { + app + .data + .radarr_data + .indexer_test_all_results + .as_mut() + .unwrap() + }, test_all_indexers_test_results_table_handler_config, ) { self.handle_key_event(); @@ -102,4 +96,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for TestAllIndexersHandl } fn handle_char_key_event(&mut self) {} + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/library/add_movie_handler.rs b/src/handlers/radarr_handlers/library/add_movie_handler.rs index 2a6b9da..e668304 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler.rs @@ -1,4 +1,4 @@ -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, AddMovieSearchResult, CollectionMovie, @@ -9,9 +9,7 @@ use crate::models::servarr_data::radarr::radarr_data::{ }; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::radarr_network::RadarrEvent; -use crate::{ - App, Key, handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, -}; +use crate::{App, Key, handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; #[cfg(test)] #[path = "add_movie_handler_tests.rs"] @@ -25,19 +23,6 @@ pub(super) struct AddMovieHandler<'a, 'b> { } impl AddMovieHandler<'_, '_> { - handle_table_events!( - self, - add_movie_search_results, - self - .app - .data - .radarr_data - .add_searched_movies - .as_mut() - .expect("add_searched_movies should be initialized"), - AddMovieSearchResult - ); - fn build_add_movie_body(&mut self) -> AddMovieBody { let add_movie_modal = self .app @@ -123,7 +108,18 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a, let add_movie_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::AddMovieSearchResults.into()); - if !self.handle_add_movie_search_results_table_events(add_movie_table_handling_config) { + if !handle_table( + self, + |app| { + app + .data + .radarr_data + .add_searched_movies + .as_mut() + .expect("add_searched_movies should be initialized") + }, + add_movie_table_handling_config, + ) { self.handle_key_event(); } } @@ -557,4 +553,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler.rs b/src/handlers/radarr_handlers/library/delete_movie_handler.rs index 6a38063..561489f 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler.rs @@ -136,4 +136,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<' self.app.pop_navigation_stack(); } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/library/edit_movie_handler.rs b/src/handlers/radarr_handlers/library/edit_movie_handler.rs index 61739b3..f463d0f 100644 --- a/src/handlers/radarr_handlers/library/edit_movie_handler.rs +++ b/src/handlers/radarr_handlers/library/edit_movie_handler.rs @@ -392,4 +392,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/library/mod.rs b/src/handlers/radarr_handlers/library/mod.rs index 1834399..7c441ee 100644 --- a/src/handlers/radarr_handlers/library/mod.rs +++ b/src/handlers/radarr_handlers/library/mod.rs @@ -7,15 +7,15 @@ use crate::handlers::radarr_handlers::library::edit_movie_handler::EditMovieHand use crate::handlers::radarr_handlers::library::movie_details_handler::MovieDetailsHandler; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; +use crate::matches_key; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, DELETE_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, LIBRARY_BLOCKS, }; use crate::models::stateful_table::SortOption; -use crate::models::{BlockSelectionState, HorizontallyScrollableText}; +use crate::models::{BlockSelectionState, HorizontallyScrollableText, Route}; use crate::network::radarr_network::RadarrEvent; -use crate::{handle_table_events, matches_key}; mod add_movie_handler; mod delete_movie_handler; @@ -34,7 +34,6 @@ pub(super) struct LibraryHandler<'a, 'b> { } impl LibraryHandler<'_, '_> { - handle_table_events!(self, movies, self.app.data.radarr_data.movies, Movie); fn extract_movie_id(&self) -> i64 { self.app.data.radarr_data.movies.current_selection().id } @@ -52,7 +51,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for LibraryHandler<'a, ' .filter_error_block(ActiveRadarrBlock::FilterMoviesError.into()) .filter_field_fn(|movie| &movie.title.text); - if !self.handle_movies_table_events(movie_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.movies, + movie_table_handling_config, + ) { match self.active_radarr_block { _ if AddMovieHandler::accepts(self.active_radarr_block) => { AddMovieHandler::new(self.key, self.app, self.active_radarr_block, self.context).handle(); @@ -215,6 +218,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for LibraryHandler<'a, ' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> Route { + self.app.get_current_route() + } } fn movies_sorting_options() -> Vec> { diff --git a/src/handlers/radarr_handlers/library/movie_details_handler.rs b/src/handlers/radarr_handlers/library/movie_details_handler.rs index e76fdeb..9877b79 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler.rs @@ -2,11 +2,10 @@ use serde_json::Number; use crate::app::App; use crate::event::Key; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; -use crate::models::radarr_models::{ - Credit, MovieHistoryItem, RadarrRelease, RadarrReleaseDownloadBody, -}; +use crate::matches_key; +use crate::models::radarr_models::{RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS, }; @@ -14,7 +13,6 @@ use crate::models::servarr_models::Language; use crate::models::stateful_table::SortOption; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::radarr_network::RadarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "movie_details_handler_tests.rs"] @@ -28,59 +26,6 @@ pub(super) struct MovieDetailsHandler<'a, 'b> { } impl MovieDetailsHandler<'_, '_> { - handle_table_events!( - self, - movie_releases, - self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases, - RadarrRelease - ); - handle_table_events!( - self, - movie_history, - self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_history, - MovieHistoryItem - ); - handle_table_events!( - self, - movie_cast, - self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_cast, - Credit - ); - handle_table_events!( - self, - movie_crew, - self - .app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_crew, - Credit - ); - fn build_radarr_release_download_body(&self) -> RadarrReleaseDownloadBody { let movie_id = self.app.data.radarr_data.movies.current_selection().id; let (guid, indexer_id) = { @@ -122,11 +67,55 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< let movie_cast_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Cast.into()); let movie_crew_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Crew.into()); - if !self.handle_movie_history_table_events(movie_history_table_handling_config) - && !self.handle_movie_releases_table_events(movie_releases_table_handling_config) - && !self.handle_movie_cast_table_events(movie_cast_table_handling_config) - && !self.handle_movie_crew_table_events(movie_crew_table_handling_config) - { + if !handle_table( + self, + |app| { + &mut app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_history + }, + movie_history_table_handling_config, + ) && !handle_table( + self, + |app| { + &mut app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_releases + }, + movie_releases_table_handling_config, + ) && !handle_table( + self, + |app| { + &mut app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_cast + }, + movie_cast_table_handling_config, + ) && !handle_table( + self, + |app| { + &mut app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_crew + }, + movie_crew_table_handling_config, + ) { self.handle_key_event(); } } @@ -385,6 +374,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler< _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } fn releases_sorting_options() -> Vec> { diff --git a/src/handlers/radarr_handlers/mod.rs b/src/handlers/radarr_handlers/mod.rs index 79acc5c..d8f8075 100644 --- a/src/handlers/radarr_handlers/mod.rs +++ b/src/handlers/radarr_handlers/mod.rs @@ -107,6 +107,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for RadarrHandler<'a, 'b fn handle_esc(&mut self) {} fn handle_char_key_event(&mut self) {} + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } pub fn handle_change_tab_left_right_keys(app: &mut App<'_>, key: Key) { diff --git a/src/handlers/radarr_handlers/root_folders/mod.rs b/src/handlers/radarr_handlers/root_folders/mod.rs index 8ceb0aa..aa2a64f 100644 --- a/src/handlers/radarr_handlers/root_folders/mod.rs +++ b/src/handlers/radarr_handlers/root_folders/mod.rs @@ -1,15 +1,13 @@ use crate::app::App; use crate::event::Key; use crate::handlers::radarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; -use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; +use crate::models::servarr_models::AddRootFolderBody; use crate::network::radarr_network::RadarrEvent; -use crate::{ - handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, -}; +use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; #[cfg(test)] #[path = "root_folders_handler_tests.rs"] @@ -23,13 +21,6 @@ pub(super) struct RootFoldersHandler<'a, 'b> { } impl RootFoldersHandler<'_, '_> { - handle_table_events!( - self, - root_folders, - self.app.data.radarr_data.root_folders, - RootFolder - ); - fn build_add_root_folder_body(&mut self) -> AddRootFolderBody { let edit_root_folder = self .app @@ -60,7 +51,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for RootFoldersHandler<' let root_folder_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::RootFolders.into()); - if !self.handle_root_folders_table_events(root_folder_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.radarr_data.root_folders, + root_folder_table_handling_config, + ) { self.handle_key_event(); } } @@ -231,4 +226,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for RootFoldersHandler<' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/system/mod.rs b/src/handlers/radarr_handlers/system/mod.rs index f225624..50201b0 100644 --- a/src/handlers/radarr_handlers/system/mod.rs +++ b/src/handlers/radarr_handlers/system/mod.rs @@ -124,4 +124,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for SystemHandler<'a, 'b } } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/radarr_handlers/system/system_details_handler.rs b/src/handlers/radarr_handlers/system/system_details_handler.rs index 77b5082..7b13d4e 100644 --- a/src/handlers/radarr_handlers/system/system_details_handler.rs +++ b/src/handlers/radarr_handlers/system/system_details_handler.rs @@ -196,4 +196,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for SystemDetailsHandler self.app.pop_navigation_stack(); } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/blocklist/mod.rs b/src/handlers/sonarr_handlers/blocklist/mod.rs index 2e66041..fa08c85 100644 --- a/src/handlers/sonarr_handlers/blocklist/mod.rs +++ b/src/handlers/sonarr_handlers/blocklist/mod.rs @@ -1,13 +1,13 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::matches_key; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; use crate::models::sonarr_models::BlocklistItem; use crate::models::stateful_table::SortOption; use crate::network::sonarr_network::SonarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "blocklist_handler_tests.rs"] @@ -21,13 +21,6 @@ pub(super) struct BlocklistHandler<'a, 'b> { } impl BlocklistHandler<'_, '_> { - handle_table_events!( - self, - blocklist, - self.app.data.sonarr_data.blocklist, - BlocklistItem - ); - fn extract_blocklist_item_id(&self) -> i64 { self.app.data.sonarr_data.blocklist.current_selection().id } @@ -40,7 +33,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for BlocklistHandler<'a, .sorting_block(ActiveSonarrBlock::BlocklistSortPrompt.into()) .sort_options(blocklist_sorting_options()); - if !self.handle_blocklist_table_events(blocklist_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.blocklist, + blocklist_table_handling_config, + ) { self.handle_key_event(); } } @@ -176,6 +173,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for BlocklistHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } fn blocklist_sorting_options() -> Vec> { diff --git a/src/handlers/sonarr_handlers/downloads/mod.rs b/src/handlers/sonarr_handlers/downloads/mod.rs index 5229e59..7a9819a 100644 --- a/src/handlers/sonarr_handlers/downloads/mod.rs +++ b/src/handlers/sonarr_handlers/downloads/mod.rs @@ -1,12 +1,11 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::matches_key; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; -use crate::models::sonarr_models::DownloadRecord; use crate::network::sonarr_network::SonarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "downloads_handler_tests.rs"] @@ -20,13 +19,6 @@ pub(super) struct DownloadsHandler<'a, 'b> { } impl DownloadsHandler<'_, '_> { - handle_table_events!( - self, - downloads, - self.app.data.sonarr_data.downloads, - DownloadRecord - ); - fn extract_download_id(&self) -> i64 { self.app.data.sonarr_data.downloads.current_selection().id } @@ -37,7 +29,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for DownloadsHandler<'a, let download_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::Downloads.into()); - if !self.handle_downloads_table_events(download_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.downloads, + download_table_handling_config, + ) { self.handle_key_event(); } } @@ -163,4 +159,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for DownloadsHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/history/mod.rs b/src/handlers/sonarr_handlers/history/mod.rs index 91942a0..58563d1 100644 --- a/src/handlers/sonarr_handlers/history/mod.rs +++ b/src/handlers/sonarr_handlers/history/mod.rs @@ -1,13 +1,13 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors}; +use crate::matches_key; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; use crate::models::servarr_models::Language; use crate::models::sonarr_models::SonarrHistoryItem; use crate::models::stateful_table::SortOption; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "history_handler_tests.rs"] @@ -20,14 +20,7 @@ pub(super) struct HistoryHandler<'a, 'b> { _context: Option, } -impl HistoryHandler<'_, '_> { - handle_table_events!( - self, - history, - self.app.data.sonarr_data.history, - SonarrHistoryItem - ); -} +impl HistoryHandler<'_, '_> {} impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for HistoryHandler<'a, 'b> { fn handle(&mut self) { @@ -41,7 +34,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for HistoryHandler<'a, ' .filter_error_block(ActiveSonarrBlock::FilterHistoryError.into()) .filter_field_fn(|history| &history.source_title.text); - if !self.handle_history_table_events(history_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.history, + history_table_handling_config, + ) { self.handle_key_event(); } } @@ -119,6 +116,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for HistoryHandler<'a, ' } } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } pub(in crate::handlers::sonarr_handlers) fn history_sorting_options() diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs index 551ef61..c253008 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler.rs @@ -521,4 +521,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for EditIndexerHandler<' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs index 4b31164..8da2449 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler.rs @@ -197,4 +197,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for IndexerSettingsHandl self.app.pop_navigation_stack(); } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/indexers/mod.rs b/src/handlers/sonarr_handlers/indexers/mod.rs index dbb7713..cc33890 100644 --- a/src/handlers/sonarr_handlers/indexers/mod.rs +++ b/src/handlers/sonarr_handlers/indexers/mod.rs @@ -4,16 +4,15 @@ use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; use crate::handlers::sonarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::sonarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; +use crate::matches_key; use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, INDEXERS_BLOCKS, }; -use crate::models::servarr_models::Indexer; use crate::network::sonarr_network::SonarrEvent; -use crate::{handle_table_events, matches_key}; mod edit_indexer_handler; mod edit_indexer_settings_handler; @@ -31,8 +30,6 @@ pub(super) struct IndexersHandler<'a, 'b> { } impl IndexersHandler<'_, '_> { - handle_table_events!(self, indexers, self.app.data.sonarr_data.indexers, Indexer); - fn extract_indexer_id(&self) -> i64 { self.app.data.sonarr_data.indexers.current_selection().id } @@ -43,7 +40,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for IndexersHandler<'a, let indexers_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::Indexers.into()); - if !self.handle_indexers_table_events(indexers_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.indexers, + indexers_table_handling_config, + ) { match self.active_sonarr_block { _ if EditIndexerHandler::accepts(self.active_sonarr_block) => { EditIndexerHandler::new(self.key, self.app, self.active_sonarr_block, self.context) @@ -205,4 +206,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for IndexersHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs index 1047772..d0e3d57 100644 --- a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs +++ b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler.rs @@ -1,9 +1,7 @@ use crate::app::App; use crate::event::Key; -use crate::handle_table_events; use crate::handlers::KeyEventHandler; -use crate::handlers::table_handler::TableHandlingConfig; -use crate::models::servarr_data::modals::IndexerTestResultModalItem; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; #[cfg(test)] @@ -17,29 +15,25 @@ pub(super) struct TestAllIndexersHandler<'a, 'b> { _context: Option, } -impl TestAllIndexersHandler<'_, '_> { - handle_table_events!( - self, - indexer_test_all_results, - self - .app - .data - .sonarr_data - .indexer_test_all_results - .as_mut() - .unwrap(), - IndexerTestResultModalItem - ); -} +impl TestAllIndexersHandler<'_, '_> {} impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for TestAllIndexersHandler<'a, 'b> { fn handle(&mut self) { let indexer_test_all_results_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::TestAllIndexers.into()); - if !self - .handle_indexer_test_all_results_table_events(indexer_test_all_results_table_handling_config) - { + if !handle_table( + self, + |app| { + app + .data + .sonarr_data + .indexer_test_all_results + .as_mut() + .unwrap() + }, + indexer_test_all_results_table_handling_config, + ) { self.handle_key_event(); } } @@ -102,4 +96,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for TestAllIndexersHandl } fn handle_char_key_event(&mut self) {} + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/library/add_series_handler.rs b/src/handlers/sonarr_handlers/library/add_series_handler.rs index d8ac096..e6f8162 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler.rs @@ -1,4 +1,4 @@ -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ @@ -7,9 +7,7 @@ use crate::models::servarr_data::sonarr::sonarr_data::{ use crate::models::sonarr_models::{AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult}; use crate::models::{BlockSelectionState, Scrollable}; use crate::network::sonarr_network::SonarrEvent; -use crate::{ - App, Key, handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, -}; +use crate::{App, Key, handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; #[cfg(test)] #[path = "add_series_handler_tests.rs"] @@ -23,19 +21,6 @@ pub(super) struct AddSeriesHandler<'a, 'b> { } impl AddSeriesHandler<'_, '_> { - handle_table_events!( - self, - add_searched_series, - self - .app - .data - .sonarr_data - .add_searched_series - .as_mut() - .expect("add_searched_series should be initialized"), - AddSeriesSearchResult - ); - fn build_add_series_body(&mut self) -> AddSeriesBody { let add_series_modal = self .app @@ -117,7 +102,18 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a, let add_series_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::AddSeriesSearchResults.into()); - if !self.handle_add_searched_series_table_events(add_series_table_handling_config) { + if !handle_table( + self, + |app| { + app + .data + .sonarr_data + .add_searched_series + .as_mut() + .expect("add_searched_series should be initialized") + }, + add_series_table_handling_config, + ) { self.handle_key_event(); } } @@ -624,4 +620,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a, _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/library/delete_series_handler.rs b/src/handlers/sonarr_handlers/library/delete_series_handler.rs index 869a855..97fde80 100644 --- a/src/handlers/sonarr_handlers/library/delete_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/delete_series_handler.rs @@ -138,4 +138,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for DeleteSeriesHandler< self.app.pop_navigation_stack(); } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/library/edit_series_handler.rs b/src/handlers/sonarr_handlers/library/edit_series_handler.rs index c780e6a..a57224e 100644 --- a/src/handlers/sonarr_handlers/library/edit_series_handler.rs +++ b/src/handlers/sonarr_handlers/library/edit_series_handler.rs @@ -466,4 +466,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for EditSeriesHandler<'a _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler.rs b/src/handlers/sonarr_handlers/library/episode_details_handler.rs index a754419..c007778 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler.rs @@ -1,12 +1,12 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::library::season_details_handler::releases_sorting_options; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::matches_key; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS}; -use crate::models::sonarr_models::{SonarrHistoryItem, SonarrRelease, SonarrReleaseDownloadBody}; +use crate::models::sonarr_models::{SonarrRelease, SonarrReleaseDownloadBody}; use crate::network::sonarr_network::SonarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "episode_details_handler_tests.rs"] @@ -20,39 +20,6 @@ pub(super) struct EpisodeDetailsHandler<'a, 'b> { } impl EpisodeDetailsHandler<'_, '_> { - handle_table_events!( - self, - episode_history, - self - .app - .data - .sonarr_data - .season_details_modal - .as_mut() - .expect("Season details modal is undefined") - .episode_details_modal - .as_mut() - .expect("Episode details modal is undefined") - .episode_history, - SonarrHistoryItem - ); - handle_table_events!( - self, - episode_releases, - self - .app - .data - .sonarr_data - .season_details_modal - .as_mut() - .expect("Season details modal is undefined") - .episode_details_modal - .as_mut() - .expect("Episode details modal is undefined") - .episode_releases, - SonarrRelease - ); - fn extract_episode_id(&self) -> i64 { self .app @@ -76,9 +43,37 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for EpisodeDetailsHandle .sorting_block(ActiveSonarrBlock::ManualEpisodeSearchSortPrompt.into()) .sort_options(releases_sorting_options()); - if !self.handle_episode_history_table_events(episode_history_table_handling_config) - && !self.handle_episode_releases_table_events(episode_releases_table_handling_config) - { + if !handle_table( + self, + |app| { + &mut app + .data + .sonarr_data + .season_details_modal + .as_mut() + .expect("Season details modal is undefined") + .episode_details_modal + .as_mut() + .expect("Episode details modal is undefined") + .episode_history + }, + episode_history_table_handling_config, + ) && !handle_table( + self, + |app| { + &mut app + .data + .sonarr_data + .season_details_modal + .as_mut() + .expect("Season details modal is undefined") + .episode_details_modal + .as_mut() + .expect("Episode details modal is undefined") + .episode_releases + }, + episode_releases_table_handling_config, + ) { self.handle_key_event(); } } @@ -370,4 +365,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for EpisodeDetailsHandle _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/library/mod.rs b/src/handlers/sonarr_handlers/library/mod.rs index 90b5c31..dc60579 100644 --- a/src/handlers/sonarr_handlers/library/mod.rs +++ b/src/handlers/sonarr_handlers/library/mod.rs @@ -6,7 +6,6 @@ use edit_series_handler::EditSeriesHandler; use crate::{ app::App, event::Key, - handle_table_events, handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}, matches_key, models::{ @@ -25,7 +24,7 @@ use super::handle_change_tab_left_right_keys; use crate::handlers::sonarr_handlers::library::episode_details_handler::EpisodeDetailsHandler; use crate::handlers::sonarr_handlers::library::season_details_handler::SeasonDetailsHandler; use crate::handlers::sonarr_handlers::library::series_details_handler::SeriesDetailsHandler; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; mod add_series_handler; mod delete_series_handler; @@ -45,7 +44,6 @@ pub(super) struct LibraryHandler<'a, 'b> { } impl LibraryHandler<'_, '_> { - handle_table_events!(self, series, self.app.data.sonarr_data.series, Series); fn extract_series_id(&self) -> i64 { self.app.data.sonarr_data.series.current_selection().id } @@ -63,7 +61,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, ' .filter_error_block(ActiveSonarrBlock::FilterSeriesError.into()) .filter_field_fn(|series| &series.title.text); - if !self.handle_series_table_events(series_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.series, + series_table_handling_config, + ) { match self.active_sonarr_block { _ if AddSeriesHandler::accepts(self.active_sonarr_block) => { AddSeriesHandler::new(self.key, self.app, self.active_sonarr_block, self.context) @@ -238,6 +240,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, ' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } fn series_sorting_options() -> Vec> { diff --git a/src/handlers/sonarr_handlers/library/season_details_handler.rs b/src/handlers/sonarr_handlers/library/season_details_handler.rs index 4ae7fd0..84aeb53 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler.rs @@ -1,8 +1,9 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::history::history_sorting_options; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::matches_key; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SEASON_DETAILS_BLOCKS}; use crate::models::servarr_models::Language; use crate::models::sonarr_models::{ @@ -10,7 +11,6 @@ use crate::models::sonarr_models::{ }; use crate::models::stateful_table::SortOption; use crate::network::sonarr_network::SonarrEvent; -use crate::{handle_table_events, matches_key}; use serde_json::Number; #[cfg(test)] @@ -25,46 +25,6 @@ pub(super) struct SeasonDetailsHandler<'a, 'b> { } impl SeasonDetailsHandler<'_, '_> { - handle_table_events!( - self, - episodes, - self - .app - .data - .sonarr_data - .season_details_modal - .as_mut() - .expect("Season details modal is undefined") - .episodes, - Episode - ); - handle_table_events!( - self, - season_history, - self - .app - .data - .sonarr_data - .season_details_modal - .as_mut() - .expect("Season details modal is undefined") - .season_history, - SonarrHistoryItem - ); - handle_table_events!( - self, - season_releases, - self - .app - .data - .sonarr_data - .season_details_modal - .as_mut() - .expect("Season details modal is undefined") - .season_releases, - SonarrRelease - ); - fn extract_episode_file_id(&self) -> i64 { self .app @@ -126,10 +86,43 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler .sorting_block(ActiveSonarrBlock::ManualSeasonSearchSortPrompt.into()) .sort_options(releases_sorting_options()); - if !self.handle_episodes_table_events(episodes_table_handling_config) - && !self.handle_season_history_table_events(season_history_table_handling_config) - && !self.handle_season_releases_table_events(season_releases_table_handling_config) - { + if !handle_table( + self, + |app| { + &mut app + .data + .sonarr_data + .season_details_modal + .as_mut() + .expect("Season details modal is undefined") + .episodes + }, + episodes_table_handling_config, + ) && !handle_table( + self, + |app| { + &mut app + .data + .sonarr_data + .season_details_modal + .as_mut() + .expect("Season details modal is undefined") + .season_history + }, + season_history_table_handling_config, + ) && !handle_table( + self, + |app| { + &mut app + .data + .sonarr_data + .season_details_modal + .as_mut() + .expect("Season details modal is undefined") + .season_releases + }, + season_releases_table_handling_config, + ) { self.handle_key_event(); } } @@ -460,6 +453,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeasonDetailsHandler _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } pub(in crate::handlers::sonarr_handlers::library) fn releases_sorting_options() diff --git a/src/handlers/sonarr_handlers/library/series_details_handler.rs b/src/handlers/sonarr_handlers/library/series_details_handler.rs index 0b6771b..ee60e3e 100644 --- a/src/handlers/sonarr_handlers/library/series_details_handler.rs +++ b/src/handlers/sonarr_handlers/library/series_details_handler.rs @@ -1,15 +1,15 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::history::history_sorting_options; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_prompt_toggle}; +use crate::matches_key; use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_SERIES_SELECTION_BLOCKS, SERIES_DETAILS_BLOCKS, }; use crate::models::sonarr_models::{Season, SonarrHistoryItem}; use crate::network::sonarr_network::SonarrEvent; -use crate::{handle_table_events, matches_key}; #[cfg(test)] #[path = "series_details_handler_tests.rs"] @@ -23,20 +23,6 @@ pub(super) struct SeriesDetailsHandler<'a, 'b> { } impl SeriesDetailsHandler<'_, '_> { - handle_table_events!(self, season, self.app.data.sonarr_data.seasons, Season); - handle_table_events!( - self, - series_history, - self - .app - .data - .sonarr_data - .series_history - .as_mut() - .expect("Series history is undefined"), - SonarrHistoryItem - ); - fn extract_series_id_season_number_tuple(&self) -> (i64, i64) { let series_id = self.app.data.sonarr_data.series.current_selection().id; let season_number = self @@ -78,9 +64,22 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler .filter_error_block(ActiveSonarrBlock::FilterSeriesHistoryError.into()) .filter_field_fn(|history_item: &SonarrHistoryItem| &history_item.source_title.text); - if !self.handle_season_table_events(season_table_handling_config) - && !self.handle_series_history_table_events(series_history_table_handling_config) - { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.seasons, + season_table_handling_config, + ) && !handle_table( + self, + |app| { + app + .data + .sonarr_data + .series_history + .as_mut() + .expect("Series history is undefined") + }, + series_history_table_handling_config, + ) { self.handle_key_event(); } } @@ -338,4 +337,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/mod.rs b/src/handlers/sonarr_handlers/mod.rs index 2a05c69..033392e 100644 --- a/src/handlers/sonarr_handlers/mod.rs +++ b/src/handlers/sonarr_handlers/mod.rs @@ -110,6 +110,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SonarrHandler<'a, 'b fn handle_esc(&mut self) {} fn handle_char_key_event(&mut self) {} + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } pub fn handle_change_tab_left_right_keys(app: &mut App<'_>, key: Key) { diff --git a/src/handlers/sonarr_handlers/root_folders/mod.rs b/src/handlers/sonarr_handlers/root_folders/mod.rs index e98af49..04da09c 100644 --- a/src/handlers/sonarr_handlers/root_folders/mod.rs +++ b/src/handlers/sonarr_handlers/root_folders/mod.rs @@ -1,15 +1,13 @@ use crate::app::App; use crate::event::Key; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; -use crate::handlers::table_handler::TableHandlingConfig; +use crate::handlers::table_handler::{TableHandlingConfig, handle_table}; use crate::handlers::{KeyEventHandler, handle_clear_errors, handle_prompt_toggle}; use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; -use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; +use crate::models::servarr_models::AddRootFolderBody; use crate::network::sonarr_network::SonarrEvent; -use crate::{ - handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, matches_key, -}; +use crate::{handle_text_box_keys, handle_text_box_left_right_keys, matches_key}; #[cfg(test)] #[path = "root_folders_handler_tests.rs"] @@ -23,13 +21,6 @@ pub(super) struct RootFoldersHandler<'a, 'b> { } impl RootFoldersHandler<'_, '_> { - handle_table_events!( - self, - root_folders, - self.app.data.sonarr_data.root_folders, - RootFolder - ); - fn build_add_root_folder_body(&mut self) -> AddRootFolderBody { let root_folder = self .app @@ -58,7 +49,11 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for RootFoldersHandler<' let root_folders_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::RootFolders.into()); - if !self.handle_root_folders_table_events(root_folders_table_handling_config) { + if !handle_table( + self, + |app| &mut app.data.sonarr_data.root_folders, + root_folders_table_handling_config, + ) { self.handle_key_event(); } } @@ -229,4 +224,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for RootFoldersHandler<' _ => (), } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/system/mod.rs b/src/handlers/sonarr_handlers/system/mod.rs index ad1bd7a..9c70ac4 100644 --- a/src/handlers/sonarr_handlers/system/mod.rs +++ b/src/handlers/sonarr_handlers/system/mod.rs @@ -124,4 +124,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SystemHandler<'a, 'b } } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/sonarr_handlers/system/system_details_handler.rs b/src/handlers/sonarr_handlers/system/system_details_handler.rs index 9352088..57879e2 100644 --- a/src/handlers/sonarr_handlers/system/system_details_handler.rs +++ b/src/handlers/sonarr_handlers/system/system_details_handler.rs @@ -196,4 +196,12 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SystemDetailsHandler self.app.pop_navigation_stack(); } } + + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } diff --git a/src/handlers/table_handler.rs b/src/handlers/table_handler.rs index c46320e..028d6fb 100644 --- a/src/handlers/table_handler.rs +++ b/src/handlers/table_handler.rs @@ -1,7 +1,12 @@ -use crate::models::Route; -use crate::models::stateful_table::SortOption; +use crate::app::App; +use crate::app::key_binding::DEFAULT_KEYBINDINGS; +use crate::event::Key; +use crate::matches_key; +use crate::models::stateful_table::{SortOption, StatefulTable}; +use crate::models::{HorizontallyScrollableText, Paginated, Route, Scrollable}; use derive_setters::Setters; use std::fmt::Debug; +use std::marker::PhantomData; #[cfg(test)] #[path = "table_handler_tests.rs"] @@ -32,370 +37,6 @@ where pub table_block: Route, } -#[macro_export] -macro_rules! handle_table_events { - ($self:expr, $name:ty, $table:expr, $row:ident) => { - paste::paste! { - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if $self.is_ready() { - match $self.key { - _ if $crate::matches_key!(up, $self.key, $self.ignore_special_keys()) => $self.[](config), - _ if $crate::matches_key!(down, $self.key, $self.ignore_special_keys()) => $self.[](config), - _ if $crate::matches_key!(pg_up, $self.key, $self.ignore_special_keys()) => $self.[](config), - _ if $crate::matches_key!(pg_down, $self.key, $self.ignore_special_keys()) => $self.[](config), - _ if $crate::matches_key!(home, $self.key) => $self.[](config), - _ if $crate::matches_key!(end, $self.key) => $self.[](config), - _ if $crate::matches_key!(left, $self.key, $self.ignore_special_keys()) - || $crate::matches_key!(right, $self.key, $self.ignore_special_keys()) => - { - $self.[](config) - } - _ if $crate::matches_key!(submit, $self.key) => $self.[](config), - _ if $crate::matches_key!(esc, $self.key) => $self.[](config), - _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => - { - $self.[]() - } - _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => - { - $self.[]() - } - _ if $crate::matches_key!(filter, $self.key) - && config.filtering_block.is_some() => $self.[](config), - _ if $crate::matches_key!(search, $self.key) - && config.searching_block.is_some() => $self.[](config), - _ if $crate::matches_key!(sort, $self.key) - && config.sorting_block.is_some() => $self.[](config), - _ => false, - } - } else { - false - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Scrollable; - - match $self.app.get_current_route() { - _ if config.table_block == $self.app.get_current_route() => { - $table.scroll_up(); - true - } - _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => - { - if let Some(ref mut sort) = $table.sort { - sort.scroll_up(); - } - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Scrollable; - - match $self.app.get_current_route() { - _ if config.table_block == $self.app.get_current_route() => { - $table.scroll_down(); - true - } - _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => - { - if let Some(ref mut sort) = $table.sort { - sort - .scroll_down(); - } - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Paginated; - - if config.table_block == $self.app.get_current_route() { - $table.page_up(); - true - } else { - false - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Paginated; - - if config.table_block == $self.app.get_current_route() { - $table.page_down(); - true - } else { - false - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Scrollable; - - match $self.app.get_current_route() { - _ if config.table_block == $self.app.get_current_route() => { - $table.scroll_to_top(); - true - } - _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => - { - if let Some(ref mut sort) = $table.sort { - sort.scroll_to_top(); - } - true - } - _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => - { - if let Some(ref mut search) = $table.search { - search.scroll_home(); - } - true - } - _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => - { - if let Some(ref mut filter) = $table.filter { - filter.scroll_home(); - } - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - use $crate::models::Scrollable; - - match $self.app.get_current_route() { - _ if config.table_block == $self.app.get_current_route() => { - $table.scroll_to_bottom(); - true - } - _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => - { - if let Some(ref mut sort) = $table.sort { - sort.scroll_to_bottom(); - } - true - } - _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => - { - if let Some(ref mut search) = $table.search { - search.reset_offset(); - } - true - } - _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => - { - if let Some(ref mut filter) = $table.filter { - filter.reset_offset(); - } - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - match $self.app.get_current_route() { - _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => - { - if let Some(ref mut search) = $table.search { - $crate::handle_text_box_left_right_keys!($self, $self.key, search); - } - true - } - _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => - { - if let Some(ref mut filter) = $table.filter { - $crate::handle_text_box_left_right_keys!($self, $self.key, filter); - } - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - match $self.app.get_current_route() { - _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => - { - $table.apply_sorting(); - $self.app.pop_navigation_stack(); - true - } - _ if config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap() => - { - $self.app.pop_navigation_stack(); - $self.app.ignore_special_keys_for_textbox_input = false; - - if $table.search.is_some() { - let search_field_fn = config - .search_field_fn - .expect("Search field function is required"); - let has_match = $table.apply_search(search_field_fn); - - if !has_match { - $self.app.push_navigation_stack( - config - .search_error_block - .expect("Search error block is undefined"), - ); - } - } - - true - } - _ if config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap() => - { - $self.app.pop_navigation_stack(); - $self.app.ignore_special_keys_for_textbox_input = false; - - if $table.filter.is_some() { - let filter_field_fn = config - .filter_field_fn - .expect("Search field function is required"); - let has_match = $table.apply_filter(filter_field_fn); - - if !has_match { - $self.app.push_navigation_stack( - config - .filter_error_block - .expect("Search error block is undefined"), - ); - } - } - - true - } - _ => false, - } - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - match $self.app.get_current_route() { - _ if config.sorting_block.is_some() - && $self.app.get_current_route() == *config.sorting_block.as_ref().unwrap() => - { - $self.app.pop_navigation_stack(); - true - } - _ if (config.searching_block.is_some() - && $self.app.get_current_route() == *config.searching_block.as_ref().unwrap()) - || (config.search_error_block.is_some() - && $self.app.get_current_route() == *config.search_error_block.as_ref().unwrap()) => - { - $self.app.pop_navigation_stack(); - $table.reset_search(); - $self.app.ignore_special_keys_for_textbox_input = false; - true - } - _ if (config.filtering_block.is_some() - && $self.app.get_current_route() == *config.filtering_block.as_ref().unwrap()) - || (config.filter_error_block.is_some() - && $self.app.get_current_route() == *config.filter_error_block.as_ref().unwrap()) => - { - $self.app.pop_navigation_stack(); - $table.reset_filter(); - $self.app.ignore_special_keys_for_textbox_input = false; - true - } - _ if config.table_block == $self.app.get_current_route() - && $table.filtered_items.is_some() => - { - $table.reset_filter(); - true - } - _ => false, - } - } - - fn [](&mut $self) -> bool { - let Some(ref mut search) = $table.search else { - return false; - }; - - $crate::handle_text_box_keys!($self, $self.key, search); - true - } - - fn [](&mut $self) -> bool { - let Some(ref mut filter) = $table.filter else { - return false; - }; - - $crate::handle_text_box_keys!($self, $self.key, filter); - true - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if $self.app.get_current_route() != config.table_block { - return false; - } - - let Some(ref filtering_block) = config.filtering_block else { - return false; - }; - - let filter = $crate::models::HorizontallyScrollableText::default(); - $table.filter = Some(filter); - $self.app.push_navigation_stack(*filtering_block); - $self.app.ignore_special_keys_for_textbox_input = true; - true - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if $self.app.get_current_route() != config.table_block { - return false; - } - - let Some(ref searching_block) = config.searching_block else { - return false; - }; - - let search = $crate::models::HorizontallyScrollableText::default(); - $table.search = Some(search); - $self.app.push_navigation_stack(*searching_block); - $self.app.ignore_special_keys_for_textbox_input = true; - true - } - - fn [](&mut $self, config: $crate::handlers::table_handler::TableHandlingConfig<$row>) -> bool { - if $self.app.get_current_route() != config.table_block { - return false; - } - - let (Some(ref sorting_block), Some(sort_options)) = (config.sorting_block, config.sort_options.as_ref()) else { - return false; - }; - - $table.sorting(sort_options.clone()); - $self.app.push_navigation_stack(*sorting_block); - true - } - } - }; -} - impl TableHandlingConfig where T: Clone + PartialEq + Eq + Debug + Default, @@ -414,3 +55,631 @@ where } } } + +pub trait TableEventHandler<'b, T> +where + T: Clone + PartialEq + Eq + Debug + Default, +{ + /// Returns a mutable reference to the table being managed. + fn table_mut(&mut self) -> &mut StatefulTable; + + /// Returns the configuration for this table's event handling. + fn config(&self) -> &TableHandlingConfig; + + /// Returns whether the handler is ready to process events. + /// + /// Typically, checks if data is loaded and the table is not empty. + fn is_ready(&self) -> bool; + + /// Returns the current navigation route. + fn current_route(&self) -> Route; + + /// Returns whether special keys should be ignored for textbox input. + fn ignore_special_keys(&self) -> bool; + + /// Returns a mutable reference to the application state. + fn app_mut(&mut self) -> &mut App<'b>; + + /// Returns the current key event being processed. + fn key(&self) -> Key; + + /// Main entry point for table event handling. + /// + /// Returns `true` if the event was handled by table logic, `false` otherwise. + /// When `false` is returned, the caller should delegate to other handlers. + fn handle_table_events(&mut self) -> bool { + if !self.is_ready() { + return false; + } + + let key = self.key(); + let config = self.config(); + let current_route = self.current_route(); + let ignore_special = self.ignore_special_keys(); + + match key { + _ if matches_key!(up, key, ignore_special) => self.handle_scroll_up(), + _ if matches_key!(down, key, ignore_special) => self.handle_scroll_down(), + _ if matches_key!(pg_up, key, ignore_special) => self.handle_page_up(), + _ if matches_key!(pg_down, key, ignore_special) => self.handle_page_down(), + _ if matches_key!(home, key) => self.handle_home(), + _ if matches_key!(end, key) => self.handle_end(), + _ if matches_key!(left, key, ignore_special) || matches_key!(right, key, ignore_special) => { + self.handle_left_right() + } + _ if matches_key!(submit, key) => self.handle_submit(), + _ if matches_key!(esc, key) => self.handle_esc(), + _ if config.searching_block.is_some() + && current_route == *config.searching_block.as_ref().unwrap() => + { + self.handle_search_box_input() + } + _ if config.filtering_block.is_some() + && current_route == *config.filtering_block.as_ref().unwrap() => + { + self.handle_filter_box_input() + } + _ if matches_key!(filter, key) && config.filtering_block.is_some() => { + self.handle_filter_key() + } + _ if matches_key!(search, key) && config.searching_block.is_some() => { + self.handle_search_key() + } + _ if matches_key!(sort, key) && config.sorting_block.is_some() => self.handle_sort_key(), + _ => false, + } + } + + fn handle_scroll_up(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + match current_route { + _ if config.table_block == current_route => { + self.table_mut().scroll_up(); + true + } + _ if config.sorting_block.is_some() + && current_route == *config.sorting_block.as_ref().unwrap() => + { + if let Some(ref mut sort) = self.table_mut().sort { + sort.scroll_up(); + } + true + } + _ => false, + } + } + + fn handle_scroll_down(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + match current_route { + _ if config.table_block == current_route => { + self.table_mut().scroll_down(); + true + } + _ if config.sorting_block.is_some() + && current_route == *config.sorting_block.as_ref().unwrap() => + { + if let Some(ref mut sort) = self.table_mut().sort { + sort.scroll_down(); + } + true + } + _ => false, + } + } + + fn handle_page_up(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + if config.table_block == current_route { + self.table_mut().page_up(); + true + } else { + false + } + } + + fn handle_page_down(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + if config.table_block == current_route { + self.table_mut().page_down(); + true + } else { + false + } + } + + fn handle_home(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + match current_route { + _ if config.table_block == current_route => { + self.table_mut().scroll_to_top(); + true + } + _ if config.sorting_block.is_some() + && current_route == *config.sorting_block.as_ref().unwrap() => + { + if let Some(ref mut sort) = self.table_mut().sort { + sort.scroll_to_top(); + } + true + } + _ if config.searching_block.is_some() + && current_route == *config.searching_block.as_ref().unwrap() => + { + if let Some(ref mut search) = self.table_mut().search { + search.scroll_home(); + } + true + } + _ if config.filtering_block.is_some() + && current_route == *config.filtering_block.as_ref().unwrap() => + { + if let Some(ref mut filter) = self.table_mut().filter { + filter.scroll_home(); + } + true + } + _ => false, + } + } + + fn handle_end(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + match current_route { + _ if config.table_block == current_route => { + self.table_mut().scroll_to_bottom(); + true + } + _ if config.sorting_block.is_some() + && current_route == *config.sorting_block.as_ref().unwrap() => + { + if let Some(ref mut sort) = self.table_mut().sort { + sort.scroll_to_bottom(); + } + true + } + _ if config.searching_block.is_some() + && current_route == *config.searching_block.as_ref().unwrap() => + { + if let Some(ref mut search) = self.table_mut().search { + search.reset_offset(); + } + true + } + _ if config.filtering_block.is_some() + && current_route == *config.filtering_block.as_ref().unwrap() => + { + if let Some(ref mut filter) = self.table_mut().filter { + filter.reset_offset(); + } + true + } + _ => false, + } + } + + fn handle_left_right(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + let key = self.key(); + + match current_route { + _ if config.searching_block.is_some() + && current_route == *config.searching_block.as_ref().unwrap() => + { + if let Some(ref mut search) = self.table_mut().search { + if key == DEFAULT_KEYBINDINGS.left.key { + search.scroll_left(); + } else if key == DEFAULT_KEYBINDINGS.right.key { + search.scroll_right(); + } + } + true + } + _ if config.filtering_block.is_some() + && current_route == *config.filtering_block.as_ref().unwrap() => + { + if let Some(ref mut filter) = self.table_mut().filter { + if key == DEFAULT_KEYBINDINGS.left.key { + filter.scroll_left(); + } else if key == DEFAULT_KEYBINDINGS.right.key { + filter.scroll_right(); + } + } + true + } + _ => false, + } + } + + fn handle_submit(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + let sorting_block = config.sorting_block; + let searching_block = config.searching_block; + let search_field_fn = config.search_field_fn; + let search_error_block = config.search_error_block; + let filtering_block = config.filtering_block; + let filter_field_fn = config.filter_field_fn; + let filter_error_block = config.filter_error_block; + + match current_route { + _ if sorting_block.is_some() && current_route == *sorting_block.as_ref().unwrap() => { + self.table_mut().apply_sorting(); + self.app_mut().pop_navigation_stack(); + true + } + _ if searching_block.is_some() && current_route == *searching_block.as_ref().unwrap() => { + let app = self.app_mut(); + app.pop_navigation_stack(); + app.ignore_special_keys_for_textbox_input = false; + + if self.table_mut().search.is_some() { + let search_fn = search_field_fn.expect("Search field function is required"); + let has_match = self.table_mut().apply_search(search_fn); + + if !has_match { + self + .app_mut() + .push_navigation_stack(search_error_block.expect("Search error block is undefined")); + } + } + + true + } + _ if filtering_block.is_some() && current_route == *filtering_block.as_ref().unwrap() => { + let app = self.app_mut(); + app.pop_navigation_stack(); + app.ignore_special_keys_for_textbox_input = false; + + if self.table_mut().filter.is_some() { + let filter_fn = filter_field_fn.expect("Filter field function is required"); + let has_match = self.table_mut().apply_filter(filter_fn); + + if !has_match { + self + .app_mut() + .push_navigation_stack(filter_error_block.expect("Filter error block is undefined")); + } + } + + true + } + _ => false, + } + } + + fn handle_esc(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + let sorting_block = config.sorting_block; + let searching_block = config.searching_block; + let search_error_block = config.search_error_block; + let filtering_block = config.filtering_block; + let filter_error_block = config.filter_error_block; + let table_block = config.table_block; + + match current_route { + _ if sorting_block.is_some() && current_route == *sorting_block.as_ref().unwrap() => { + self.app_mut().pop_navigation_stack(); + true + } + _ if (searching_block.is_some() && current_route == *searching_block.as_ref().unwrap()) + || (search_error_block.is_some() + && current_route == *search_error_block.as_ref().unwrap()) => + { + self.app_mut().pop_navigation_stack(); + self.table_mut().reset_search(); + self.app_mut().ignore_special_keys_for_textbox_input = false; + true + } + _ if (filtering_block.is_some() && current_route == *filtering_block.as_ref().unwrap()) + || (filter_error_block.is_some() + && current_route == *filter_error_block.as_ref().unwrap()) => + { + self.app_mut().pop_navigation_stack(); + self.table_mut().reset_filter(); + self.app_mut().ignore_special_keys_for_textbox_input = false; + true + } + _ if table_block == current_route && self.table_mut().filtered_items.is_some() => { + self.table_mut().reset_filter(); + true + } + _ => false, + } + } + + fn handle_search_box_input(&mut self) -> bool { + let key = self.key(); + let Some(ref mut search) = self.table_mut().search else { + return false; + }; + + match key { + _ if matches_key!(backspace, key) => { + search.pop(); + } + Key::Char(character) => { + search.push(character); + } + _ => (), + } + true + } + + fn handle_filter_box_input(&mut self) -> bool { + let key = self.key(); + let Some(ref mut filter) = self.table_mut().filter else { + return false; + }; + + match key { + _ if matches_key!(backspace, key) => { + filter.pop(); + } + Key::Char(character) => { + filter.push(character); + } + _ => (), + } + true + } + + fn handle_filter_key(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + if current_route != config.table_block { + return false; + } + + let Some(filtering_block) = config.filtering_block else { + return false; + }; + + let filter = HorizontallyScrollableText::default(); + self.table_mut().filter = Some(filter); + let app = self.app_mut(); + app.push_navigation_stack(filtering_block); + app.ignore_special_keys_for_textbox_input = true; + true + } + + fn handle_search_key(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + if current_route != config.table_block { + return false; + } + + let Some(searching_block) = config.searching_block else { + return false; + }; + + let search = HorizontallyScrollableText::default(); + self.table_mut().search = Some(search); + let app = self.app_mut(); + app.push_navigation_stack(searching_block); + app.ignore_special_keys_for_textbox_input = true; + true + } + + fn handle_sort_key(&mut self) -> bool { + let config = self.config(); + let current_route = self.current_route(); + + if current_route != config.table_block { + return false; + } + + let (Some(sorting_block), Some(sort_options)) = + (config.sorting_block, config.sort_options.as_ref()) + else { + return false; + }; + + let sort_options = sort_options.clone(); + self.table_mut().sorting(sort_options); + self.app_mut().push_navigation_stack(sorting_block); + true + } +} + +/// Adapter struct that implements `TableEventHandler` for any `KeyEventHandler`. +/// +/// This struct enables table handling for existing handlers via composition rather than +/// inheritance. It wraps a handler reference and uses a closure to access the table, +/// allowing flexible access patterns (direct, optional, nested). +/// +/// # Type Parameters +/// +/// - `'a`, `'b`: Lifetimes from the handler +/// - `'handler`: Lifetime of the handler reference +/// - `T`: The table row type +/// - `H`: The handler type that implements `KeyEventHandler` +/// - `R`: The route type that converts into `Route` +/// +/// # Usage +/// +/// This struct is typically created by the `handle_table` helper function and should +/// not be constructed directly: +/// +/// ```rust,ignore +/// if !handle_table(self, |h| &mut h.app.data.my_table, config) { +/// self.handle_key_event(); +/// } +/// ``` +pub struct TableHandlerAdapter<'handler, 'a, 'b, T, H, R, F> +where + T: Clone + PartialEq + Eq + Debug + Default, + H: crate::handlers::KeyEventHandler<'a, 'b, R>, + R: Into + Copy, + F: for<'c> FnMut(&'c mut App<'b>) -> &'c mut StatefulTable, +{ + handler: &'handler mut H, + table_accessor: F, + config: TableHandlingConfig, + _phantom: PhantomData<(&'a (), &'b (), R)>, +} + +impl<'handler, 'a, 'b, T, H, R, F> TableHandlerAdapter<'handler, 'a, 'b, T, H, R, F> +where + T: Clone + PartialEq + Eq + Debug + Default, + H: crate::handlers::KeyEventHandler<'a, 'b, R>, + R: Into + Copy, + F: for<'c> FnMut(&'c mut App<'b>) -> &'c mut StatefulTable, +{ + fn new(handler: &'handler mut H, table_accessor: F, config: TableHandlingConfig) -> Self { + Self { + handler, + table_accessor, + config, + _phantom: PhantomData, + } + } +} + +impl<'handler, 'a, 'b, T, H, R, F> TableEventHandler<'b, T> + for TableHandlerAdapter<'handler, 'a, 'b, T, H, R, F> +where + T: Clone + PartialEq + Eq + Debug + Default, + H: crate::handlers::KeyEventHandler<'a, 'b, R>, + R: Into + Copy, + F: for<'c> FnMut(&'c mut App<'b>) -> &'c mut StatefulTable, +{ + fn table_mut(&mut self) -> &mut StatefulTable { + (self.table_accessor)(self.handler.app_mut()) + } + + fn config(&self) -> &TableHandlingConfig { + &self.config + } + + fn is_ready(&self) -> bool { + self.handler.is_ready() + } + + fn current_route(&self) -> Route { + self.handler.current_route() + } + + fn ignore_special_keys(&self) -> bool { + self.handler.ignore_special_keys() + } + + fn app_mut(&mut self) -> &mut App<'b> { + self.handler.app_mut() + } + + fn key(&self) -> Key { + self.handler.get_key() + } +} + +/// Helper function for ergonomic table event handling. +/// +/// This is the primary entry point for using trait-based table handling. It creates +/// a `TableHandlerAdapter`, calls `handle_table_events()`, and returns the result. +/// +/// # Parameters +/// +/// - `handler`: Mutable reference to a handler implementing `KeyEventHandler` +/// - `table_accessor`: Closure that extracts the table from the handler +/// - `config`: Table handling configuration +/// +/// # Returns +/// +/// `true` if the event was handled by table logic, `false` otherwise. +/// When `false` is returned, the caller should delegate to other event handlers. +/// +/// # Examples +/// +/// ## Single Table Handler +/// +/// ```rust,ignore +/// use crate::handlers::table_handler::{handle_table, TableHandlingConfig}; +/// +/// impl KeyEventHandler for LibraryHandler { +/// fn handle(&mut self) { +/// let config = TableHandlingConfig::new(ActiveBlock::Movies.into()) +/// .sorting_block(ActiveBlock::MoviesSortPrompt.into()) +/// .sort_options(movies_sorting_options()) +/// .searching_block(ActiveBlock::SearchMovie.into()) +/// .search_field_fn(|movie| &movie.title.text) +/// .filtering_block(ActiveBlock::FilterMovies.into()) +/// .filter_field_fn(|movie| &movie.title.text); +/// +/// if !handle_table(self, |h| &mut h.app.data.radarr_data.movies, config) { +/// // Event not handled by table, delegate to other handlers +/// match self.active_block { +/// _ if SubHandler::accepts(self.active_block) => { +/// SubHandler::new(self.key, self.app, self.active_block, self.context).handle(); +/// } +/// _ => self.handle_key_event(), +/// } +/// } +/// } +/// } +/// ``` +/// +/// ## Multiple Tables Handler +/// +/// ```rust,ignore +/// fn handle(&mut self) { +/// let releases_config = TableHandlingConfig::new(ActiveBlock::Releases.into()); +/// let history_config = TableHandlingConfig::new(ActiveBlock::History.into()); +/// +/// // Short-circuit evaluation: try each table in sequence +/// if !handle_table(self, |h| &mut h.app.data.movie_releases, releases_config) +/// && !handle_table(self, |h| &mut h.app.data.movie_history, history_config) +/// { +/// self.handle_key_event(); +/// } +/// } +/// ``` +/// +/// ## Optional Table Access +/// +/// ```rust,ignore +/// fn handle(&mut self) { +/// let config = TableHandlingConfig::new(ActiveBlock::SearchResults.into()); +/// +/// if !handle_table( +/// self, +/// |h| h.app.data.add_searched_movies.as_mut().expect("modal should be initialized"), +/// config, +/// ) { +/// self.handle_key_event(); +/// } +/// } +/// ``` +pub fn handle_table<'a, 'b, T, H, R, F>( + handler: &mut H, + table_accessor: F, + config: TableHandlingConfig, +) -> bool +where + T: Clone + PartialEq + Eq + Debug + Default, + H: crate::handlers::KeyEventHandler<'a, 'b, R>, + R: Into + Copy, + F: for<'c> FnMut(&'c mut App<'b>) -> &'c mut StatefulTable, +{ + let mut adapter = TableHandlerAdapter::new(handler, table_accessor, config); + adapter.handle_table_events() +} diff --git a/src/handlers/table_handler_tests.rs b/src/handlers/table_handler_tests.rs index e419dcd..7e55eaa 100644 --- a/src/handlers/table_handler_tests.rs +++ b/src/handlers/table_handler_tests.rs @@ -3,9 +3,9 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; - use crate::handle_table_events; use crate::handlers::KeyEventHandler; use crate::handlers::table_handler::TableHandlingConfig; + use crate::handlers::table_handler::handle_table; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_models::Language; @@ -33,13 +33,13 @@ mod tests { let minimal_movie_table_handling_config = TableHandlingConfig::new(ActiveRadarrBlock::Movies.into()); - match self.active_radarr_block { - ActiveRadarrBlock::MovieDetails => { - self.handle_movies_table_events(minimal_movie_table_handling_config); - } - _ => { - self.handle_movies_table_events(movie_table_handling_config); - } + let config = match self.active_radarr_block { + ActiveRadarrBlock::MovieDetails => minimal_movie_table_handling_config, + _ => movie_table_handling_config, + }; + + if !handle_table(self, |app| &mut app.data.radarr_data.movies, config) { + self.handle_key_event(); } } @@ -90,10 +90,14 @@ mod tests { fn handle_esc(&mut self) {} fn handle_char_key_event(&mut self) {} - } - impl TableHandlerUnit<'_, '_> { - handle_table_events!(self, movies, self.app.data.radarr_data.movies, Movie); + fn app_mut(&mut self) -> &mut App<'b> { + self.app + } + + fn current_route(&self) -> crate::models::Route { + self.app.get_current_route() + } } mod test_handle_scroll_up_and_down { @@ -198,6 +202,86 @@ mod tests { } } } + + #[test] + fn test_table_sort_scroll_up_with_sort_some() { + let movie_field_vec = sort_options(); + let mut app = App::test_default(); + app.data.radarr_data.movies.sorting(sort_options()); + app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); + + assert_eq!( + app + .data + .radarr_data + .movies + .sort + .as_ref() + .unwrap() + .current_selection(), + &movie_field_vec[0] + ); + + TableHandlerUnit::new( + DEFAULT_KEYBINDINGS.up.key, + &mut app, + ActiveRadarrBlock::MoviesSortPrompt, + None, + ) + .handle(); + + assert_eq!( + app + .data + .radarr_data + .movies + .sort + .as_ref() + .unwrap() + .current_selection(), + &movie_field_vec[movie_field_vec.len() - 1] + ); + } + + #[test] + fn test_table_sort_scroll_down_with_sort_some() { + let movie_field_vec = sort_options(); + let mut app = App::test_default(); + app.data.radarr_data.movies.sorting(sort_options()); + app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); + + assert_eq!( + app + .data + .radarr_data + .movies + .sort + .as_ref() + .unwrap() + .current_selection(), + &movie_field_vec[0] + ); + + TableHandlerUnit::new( + DEFAULT_KEYBINDINGS.down.key, + &mut app, + ActiveRadarrBlock::MoviesSortPrompt, + None, + ) + .handle(); + + assert_eq!( + app + .data + .radarr_data + .movies + .sort + .as_ref() + .unwrap() + .current_selection(), + &movie_field_vec[0] + ); + } } mod test_handle_home_end { @@ -426,6 +510,70 @@ mod tests { &movie_field_vec[0] ); } + + #[test] + fn test_table_sort_home_with_sort_some() { + let movie_field_vec = sort_options(); + let mut app = App::test_default(); + app.data.radarr_data.movies.sorting(sort_options()); + app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); + + TableHandlerUnit::new( + DEFAULT_KEYBINDINGS.down.key, + &mut app, + ActiveRadarrBlock::MoviesSortPrompt, + None, + ) + .handle(); + + TableHandlerUnit::new( + DEFAULT_KEYBINDINGS.home.key, + &mut app, + ActiveRadarrBlock::MoviesSortPrompt, + None, + ) + .handle(); + + assert_eq!( + app + .data + .radarr_data + .movies + .sort + .as_ref() + .unwrap() + .current_selection(), + &movie_field_vec[0] + ); + } + + #[test] + fn test_table_sort_end_with_sort_some() { + let movie_field_vec = sort_options(); + let mut app = App::test_default(); + app.data.radarr_data.movies.sorting(sort_options()); + app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); + + TableHandlerUnit::new( + DEFAULT_KEYBINDINGS.end.key, + &mut app, + ActiveRadarrBlock::MoviesSortPrompt, + None, + ) + .handle(); + + assert_eq!( + app + .data + .radarr_data + .movies + .sort + .as_ref() + .unwrap() + .current_selection(), + &movie_field_vec[movie_field_vec.len() - 1] + ); + } } mod test_handle_pagination_scroll { @@ -835,6 +983,30 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); } + + #[test] + fn test_table_block_esc_with_filter_applied() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.data.radarr_data.movies = StatefulTable { + filter: Some("Test".into()), + filtered_items: Some(Vec::new()), + filtered_state: Some(TableState::default()), + ..StatefulTable::default() + }; + app + .data + .radarr_data + .movies + .set_items(vec![Movie::default()]); + + TableHandlerUnit::new(ESC_KEY, &mut app, ActiveRadarrBlock::Movies, None).handle(); + + assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_eq!(app.data.radarr_data.movies.filter, None); + assert_eq!(app.data.radarr_data.movies.filtered_items, None); + assert_eq!(app.data.radarr_data.movies.filtered_state, None); + } } mod test_handle_key_char { From 49fd086b9228a007b25ffaed09c8f3b1f4ce121b Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 22:57:06 -0700 Subject: [PATCH 08/28] refactor: Created dedicated proptests and assertions to clean up the handler unit tests --- Cargo.lock | 68 ++++++ Cargo.toml | 1 + .../handlers/handler_proptest.txt | 7 + .../handlers/table_handler_tests.txt | 9 + src/handlers/handler_proptest.rs | 221 ++++++++++++++++++ src/handlers/handler_test_utils.rs | 36 +++ src/handlers/handlers_tests.rs | 23 +- src/handlers/keybinding_handler_tests.rs | 7 +- .../blocklist/blocklist_handler_tests.rs | 44 ++-- .../collection_details_handler_tests.rs | 31 +-- .../collections/collections_handler_tests.rs | 55 ++--- .../edit_collection_handler_tests.rs | 65 ++---- .../downloads/downloads_handler_tests.rs | 36 ++- .../indexers/edit_indexer_handler_tests.rs | 59 ++--- .../edit_indexer_settings_handler_tests.rs | 39 ++-- .../indexers/indexers_handler_tests.rs | 53 ++--- .../test_all_indexers_handler_tests.rs | 8 +- .../library/add_movie_handler_tests.rs | 73 +++--- .../library/delete_movie_handler_tests.rs | 12 +- .../library/edit_movie_handler_tests.rs | 57 ++--- .../library/library_handler_tests.rs | 53 ++--- .../library/movie_details_handler_tests.rs | 54 ++--- .../radarr_handler_test_utils.rs | 12 +- .../radarr_handlers/radarr_handler_tests.rs | 9 +- .../root_folders_handler_tests.rs | 77 +++--- .../system/system_details_handler_tests.rs | 42 ++-- .../system/system_handler_tests.rs | 31 +-- .../blocklist/blocklist_handler_tests.rs | 41 ++-- .../downloads/downloads_handler_tests.rs | 34 ++- .../history/history_handler_tests.rs | 15 +- .../indexers/edit_indexer_handler_tests.rs | 59 ++--- .../edit_indexer_settings_handler_tests.rs | 28 +-- .../indexers/indexers_handler_tests.rs | 53 ++--- .../test_all_indexers_handler_tests.rs | 8 +- .../library/add_series_handler_tests.rs | 89 +++---- .../library/delete_series_handler_tests.rs | 12 +- .../library/edit_series_handler_tests.rs | 59 ++--- .../library/episode_details_handler_tests.rs | 57 ++--- .../library/library_handler_tests.rs | 50 ++-- .../library/season_details_handler_tests.rs | 72 ++---- .../library/series_details_handler_tests.rs | 58 ++--- .../root_folders_handler_tests.rs | 76 +++--- .../sonarr_handlers/sonarr_handler_tests.rs | 9 +- .../system/system_details_handler_tests.rs | 42 ++-- .../system/system_handler_tests.rs | 31 +-- src/handlers/table_handler_tests.rs | 66 +++--- 46 files changed, 1023 insertions(+), 1018 deletions(-) create mode 100644 proptest-regressions/handlers/handler_proptest.txt create mode 100644 proptest-regressions/handlers/table_handler_tests.txt create mode 100644 src/handlers/handler_proptest.rs diff --git a/Cargo.lock b/Cargo.lock index fb845c9..52209fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -188,6 +188,21 @@ dependencies = [ "serde", ] +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "2.9.4" @@ -1387,6 +1402,7 @@ dependencies = [ "mockito", "openssl", "pretty_assertions", + "proptest", "ratatui", "regex", "reqwest", @@ -1809,6 +1825,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "proptest" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quick-xml" version = "0.38.3" @@ -1892,6 +1933,15 @@ dependencies = [ "getrandom 0.3.3", ] +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.3", +] + [[package]] name = "ratatui" version = "0.29.0" @@ -2133,6 +2183,18 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.20" @@ -2760,6 +2822,12 @@ dependencies = [ "unsafe-any-ors", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/Cargo.toml b/Cargo.toml index f20f503..16b72b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,6 +73,7 @@ assert_cmd = "2.0.16" mockall = "0.13.0" mockito = "1.0.0" pretty_assertions = "1.3.0" +proptest = "1.6.0" rstest = "0.25.0" serial_test = "3.2.0" diff --git a/proptest-regressions/handlers/handler_proptest.txt b/proptest-regressions/handlers/handler_proptest.txt new file mode 100644 index 0000000..d088279 --- /dev/null +++ b/proptest-regressions/handlers/handler_proptest.txt @@ -0,0 +1,7 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 56330c025ad79db641d0eb9f429ab74e95822e1fb015b58f0e158ea674cd42a1 # shrinks to list_size = 1, page_ops = 1 diff --git a/proptest-regressions/handlers/table_handler_tests.txt b/proptest-regressions/handlers/table_handler_tests.txt new file mode 100644 index 0000000..4d42bee --- /dev/null +++ b/proptest-regressions/handlers/table_handler_tests.txt @@ -0,0 +1,9 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc fb4b58aa3015a125fc33a78dfaf27981db4191247151b327a351fc445e07c231 # shrinks to input = "j" +cc d6ec17d4d3f635f0a095ade650a316d26abc1f9fe2b6d9cf67bf2f8b4ebedb60 # shrinks to backspace_count = 0 +cc cd46ee46e18cf86c940fb89c7206f0b482909880b8f2eabe3dd20682b9912c8a # shrinks to input = "h" diff --git a/src/handlers/handler_proptest.rs b/src/handlers/handler_proptest.rs new file mode 100644 index 0000000..83fe8d6 --- /dev/null +++ b/src/handlers/handler_proptest.rs @@ -0,0 +1,221 @@ +#[cfg(test)] +mod property_tests { + use proptest::prelude::*; + + use crate::app::App; + use crate::handlers::handler_test_utils::test_utils::proptest_helpers::*; + use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::models::stateful_table::StatefulTable; + use crate::models::radarr_models::Movie; + use crate::models::{Scrollable, Paginated}; + + proptest! { + /// Property test: Table never panics on index selection + #[test] + fn test_table_index_selection_safety( + list_size in list_size(), + index in 0usize..1000 + ) { + let mut table = StatefulTable::::default(); + let movies: Vec = (0..list_size).map(|i| { + let mut movie = Movie::default(); + movie.id = i as i64; + movie + }).collect(); + + table.set_items(movies); + + // Try to select an arbitrary index + if index < list_size { + table.select_index(Some(index)); + let selected = table.current_selection(); + prop_assert_eq!(selected.id, index as i64); + } else { + // Out of bounds selection should be safe + table.select_index(Some(index)); + // Should not panic, selection stays valid + } + } + + /// Property test: Table state remains consistent after scroll operations + #[test] + fn test_table_scroll_consistency( + list_size in list_size(), + scroll_amount in 0usize..20 + ) { + let mut table = StatefulTable::::default(); + let movies: Vec = (0..list_size).map(|i| { + let mut movie = Movie::default(); + movie.id = i as i64; + movie + }).collect(); + + table.set_items(movies); + let initial_id = table.current_selection().id; + + // Scroll down multiple times + for _ in 0..scroll_amount { + table.scroll_down(); + } + let after_down_id = table.current_selection().id; + + // Position should increase (up to max) + prop_assert!(after_down_id >= initial_id); + prop_assert!(after_down_id < list_size as i64); + + // Scroll back up + for _ in 0..scroll_amount { + table.scroll_up(); + } + + // Should return to initial position (or 0 if we hit the top) + prop_assert!(table.current_selection().id <= initial_id); + } + + /// Property test: Empty tables handle operations gracefully + #[test] + fn test_empty_table_safety(_scroll_ops in 0usize..50) { + let table = StatefulTable::::default(); + + // Empty table operations should be safe + prop_assert!(table.is_empty()); + prop_assert!(table.items.is_empty()); + } + + /// Property test: Navigation operations maintain consistency + #[test] + fn test_navigation_consistency(pushes in 1usize..20) { + let mut app = App::test_default(); + let initial_route = app.get_current_route(); + + // Push multiple routes + let routes = vec![ + ActiveRadarrBlock::Movies, + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::Downloads, + ActiveRadarrBlock::Blocklist, + ]; + + for i in 0..pushes { + let route = routes[i % routes.len()]; + app.push_navigation_stack(route.into()); + } + + // Current route should be the last pushed + let last_pushed = routes[(pushes - 1) % routes.len()]; + prop_assert_eq!(app.get_current_route(), last_pushed.into()); + + // Pop all routes + for _ in 0..pushes { + app.pop_navigation_stack(); + } + + // Should return to initial route + prop_assert_eq!(app.get_current_route(), initial_route); + } + + /// Property test: String input handling is safe + #[test] + fn test_string_input_safety(input in text_input_string()) { + // String operations should never panic + let _lowercase = input.to_lowercase(); + let _uppercase = input.to_uppercase(); + let _trimmed = input.trim(); + let _len = input.len(); + let _chars: Vec = input.chars().collect(); + + // All operations completed without panic + prop_assert!(true); + } + + /// Property test: Table maintains data integrity after operations + #[test] + fn test_table_data_integrity( + list_size in 1usize..100 + ) { + let mut table = StatefulTable::::default(); + let movies: Vec = (0..list_size).map(|i| { + let mut movie = Movie::default(); + movie.id = i as i64; + movie.title = format!("Movie {}", i).into(); + movie + }).collect(); + + table.set_items(movies.clone()); + let original_count = table.items.len(); + + // Count should remain the same after various operations + prop_assert_eq!(table.items.len(), original_count); + + // All original items should still be present + for movie in &movies { + prop_assert!(table.items.iter().any(|m| m.id == movie.id)); + } + } + + /// Property test: Page up/down maintains bounds + #[test] + fn test_page_navigation_bounds( + list_size in list_size(), + page_ops in 0usize..10 + ) { + let mut table = StatefulTable::::default(); + let movies: Vec = (0..list_size).map(|i| { + let mut movie = Movie::default(); + movie.id = i as i64; + movie + }).collect(); + + table.set_items(movies); + + // Perform page operations + for i in 0..page_ops { + if i % 2 == 0 { + table.page_down(); + } else { + table.page_up(); + } + + // Should never exceed bounds + let current = table.current_selection(); + prop_assert!(current.id >= 0); + prop_assert!(current.id < list_size as i64); + } + } + + /// Property test: Table filtering reduces or maintains size + #[test] + fn test_table_filter_size_invariant( + list_size in list_size(), + filter_term in text_input_string() + ) { + let mut table = StatefulTable::::default(); + let movies: Vec = (0..list_size).map(|i| { + let mut movie = Movie::default(); + movie.id = i as i64; + movie.title = format!("Test Movie {}", i % 10).into(); + movie + }).collect(); + + table.set_items(movies.clone()); + let original_size = table.items.len(); + + // Apply filter + if !filter_term.is_empty() { + let filtered: Vec = movies.into_iter() + .filter(|m| m.title.text.to_lowercase().contains(&filter_term.to_lowercase())) + .collect(); + table.set_items(filtered); + } + + // Filtered size should be <= original + prop_assert!(table.items.len() <= original_size); + + // Selection should still be valid if table not empty + if !table.items.is_empty() { + let current = table.current_selection(); + prop_assert!(current.id >= 0); + } + } + } +} diff --git a/src/handlers/handler_test_utils.rs b/src/handlers/handler_test_utils.rs index 64bfada..f3348c4 100644 --- a/src/handlers/handler_test_utils.rs +++ b/src/handlers/handler_test_utils.rs @@ -452,4 +452,40 @@ mod test_utils { assert!(app.should_refresh); }; } + + #[macro_export] + macro_rules! assert_modal_present { + ($modal:expr) => { + assert!($modal.is_some(), "Expected modal to be present"); + }; + } + + #[macro_export] + macro_rules! assert_modal_absent { + ($modal:expr) => { + assert!($modal.is_none(), "Expected modal to be absent"); + }; + } + + #[macro_export] + macro_rules! assert_navigation_pushed { + ($app:expr, $expected_route:expr) => { + pretty_assertions::assert_eq!( + $app.get_current_route(), + $expected_route, + "Expected route to be pushed onto navigation stack" + ); + }; + } + + #[macro_export] + macro_rules! assert_navigation_popped { + ($app:expr, $expected_route:expr) => { + pretty_assertions::assert_eq!( + $app.get_current_route(), + $expected_route, + "Expected route after popping navigation stack" + ); + }; + } } diff --git a/src/handlers/handlers_tests.rs b/src/handlers/handlers_tests.rs index e66cf2e..f41a375 100644 --- a/src/handlers/handlers_tests.rs +++ b/src/handlers/handlers_tests.rs @@ -1,7 +1,10 @@ #[cfg(test)] mod tests { + use crate::assert_modal_absent; + use crate::assert_navigation_pushed; use crate::models::radarr_models::Movie; use crate::models::sonarr_models::Series; + use crate::{assert_modal_present, assert_navigation_popped}; use pretty_assertions::assert_eq; use rstest::rstest; use tokio_util::sync::CancellationToken; @@ -53,7 +56,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.esc.key, &mut app); - assert_eq!(app.get_current_route(), base_block); + assert_navigation_popped!(app, base_block); } #[rstest] @@ -70,7 +73,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.previous_servarr.key, &mut app); assert_eq!(app.server_tabs.get_active_route(), left_block.into()); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); assert!(app.is_first_render); assert_eq!(app.error, HorizontallyScrollableText::default()); assert!(app.cancellation_token.is_cancelled()); @@ -83,7 +86,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.next_servarr.key, &mut app); assert_eq!(app.server_tabs.get_active_route(), right_block.into()); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); assert!(app.is_first_render); assert_eq!(app.error, HorizontallyScrollableText::default()); assert!(app.cancellation_token.is_cancelled()); @@ -100,7 +103,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.help.key, &mut app); - assert!(app.keymapping_table.is_some()); + assert_modal_present!(app.keymapping_table); assert_eq!( expected_keybinding_items, app.keymapping_table.unwrap().items @@ -115,7 +118,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.help.key, &mut app); - assert!(app.keymapping_table.is_none()); + assert_modal_absent!(app.keymapping_table); } #[test] @@ -133,7 +136,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.help.key, &mut app); - assert!(app.keymapping_table.is_none()); + assert_modal_absent!(app.keymapping_table); } #[test] @@ -158,7 +161,7 @@ mod tests { handle_events(DEFAULT_KEYBINDINGS.down.key, &mut app); - assert!(app.keymapping_table.is_some()); + assert_modal_present!(app.keymapping_table); assert_eq!( &expected_selection, app.keymapping_table.unwrap().current_selection() @@ -219,7 +222,7 @@ mod tests { populate_keymapping_table(&mut app); - assert!(app.keymapping_table.is_some()); + assert_modal_present!(app.keymapping_table); assert_eq!( expected_keybinding_items, app.keymapping_table.unwrap().items @@ -243,7 +246,7 @@ mod tests { populate_keymapping_table(&mut app); - assert!(app.keymapping_table.is_some()); + assert_modal_present!(app.keymapping_table); assert_eq!( expected_keybinding_items, app.keymapping_table.unwrap().items @@ -268,7 +271,7 @@ mod tests { populate_keymapping_table(&mut app); - assert!(app.keymapping_table.is_some()); + assert_modal_present!(app.keymapping_table); assert_eq!( expected_keybinding_items, app.keymapping_table.unwrap().items diff --git a/src/handlers/keybinding_handler_tests.rs b/src/handlers/keybinding_handler_tests.rs index 55f8edb..0556d7e 100644 --- a/src/handlers/keybinding_handler_tests.rs +++ b/src/handlers/keybinding_handler_tests.rs @@ -1,7 +1,8 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::KeybindingHandler; @@ -11,7 +12,9 @@ mod tests { mod test_handle_esc { use super::*; + use crate::assert_navigation_pushed; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::{assert_modal_absent, assert_navigation_popped}; use pretty_assertions::assert_eq; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -25,7 +28,7 @@ mod tests { KeybindingHandler::new(ESC_KEY, &mut app, ActiveKeybindingBlock::Help, None).handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); - assert!(app.keymapping_table.is_none()); + assert_modal_absent!(app.keymapping_table); } } diff --git a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs index c847af1..14576df 100644 --- a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs @@ -9,6 +9,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; @@ -30,10 +31,7 @@ mod tests { BlocklistHandler::new(DELETE_KEY, &mut app, ActiveRadarrBlock::Blocklist, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::DeleteBlocklistItemPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::DeleteBlocklistItemPrompt.into()); } #[test] @@ -54,6 +52,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_blocklist_tab_left(#[values(true, false)] is_ready: bool) { @@ -73,7 +72,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Downloads.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Downloads.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Downloads.into()); } #[rstest] @@ -94,10 +93,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::RootFolders.into() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::RootFolders.into()); } #[rstest] @@ -122,11 +118,11 @@ mod tests { } mod test_handle_submit { + use crate::assert_navigation_popped; + use crate::network::radarr_network::RadarrEvent; use pretty_assertions::assert_eq; use rstest::rstest; - use crate::network::radarr_network::RadarrEvent; - use super::*; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -139,10 +135,7 @@ mod tests { BlocklistHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::Blocklist, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::BlocklistItemDetails.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::BlocklistItemDetails.into()); } #[test] @@ -186,7 +179,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } #[rstest] @@ -206,7 +199,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Blocklist.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Blocklist.into()); } } @@ -217,6 +210,7 @@ mod tests { use crate::handlers::radarr_handlers::downloads::DownloadsHandler; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -240,7 +234,7 @@ mod tests { BlocklistHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); - assert_eq!(app.get_current_route(), base_block.into()); + assert_navigation_popped!(app, base_block.into()); assert!(!app.data.radarr_data.prompt_confirm); } @@ -258,7 +252,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Blocklist.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Blocklist.into()); } #[rstest] @@ -271,7 +265,7 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Blocklist, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Blocklist.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Blocklist.into()); assert!(app.error.text.is_empty()); } } @@ -283,6 +277,7 @@ mod tests { use crate::network::radarr_network::RadarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; #[test] fn test_refresh_blocklist_key() { @@ -298,7 +293,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Blocklist.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Blocklist.into()); assert!(app.should_refresh); } @@ -334,10 +329,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::BlocklistClearAllItemsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::BlocklistClearAllItemsPrompt.into()); } #[test] @@ -392,7 +384,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } } diff --git a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs index 5ffc15e..fb943c9 100644 --- a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_modal_absent; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; @@ -15,12 +16,12 @@ mod tests { }; mod test_handle_submit { - use bimap::BiMap; - use pretty_assertions::assert_eq; - + use crate::assert_navigation_pushed; use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; + use bimap::BiMap; + use pretty_assertions::assert_eq; use super::*; @@ -51,8 +52,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ( ActiveRadarrBlock::AddMoviePrompt, Some(ActiveRadarrBlock::CollectionDetails) @@ -132,7 +133,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::CollectionDetails.into() ); - assert!(app.data.radarr_data.add_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.add_movie_modal); } #[test] @@ -157,15 +158,13 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::ViewMovieOverview.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::ViewMovieOverview.into()); } } mod test_handle_esc { use super::*; + use crate::assert_navigation_popped; use pretty_assertions::assert_eq; use rstest::rstest; @@ -191,10 +190,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); assert!(app.data.radarr_data.collection_movies.items.is_empty()); } @@ -212,10 +208,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::CollectionDetails.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::CollectionDetails.into()); } } @@ -270,7 +263,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::CollectionDetails.into() ); - assert!(app.data.radarr_data.edit_collection_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_collection_modal); } } diff --git a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs index 5b0b556..fd7b683 100644 --- a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs @@ -9,6 +9,8 @@ mod tests { 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::radarr_handlers::collections::{ @@ -25,6 +27,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_collections_tab_left(#[values(true, false)] is_ready: bool) { @@ -44,7 +47,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Movies.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Movies.into()); } #[rstest] @@ -65,7 +68,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Downloads.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Downloads.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Downloads.into()); } #[rstest] @@ -97,9 +100,9 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; use super::*; @@ -116,10 +119,7 @@ mod tests { CollectionsHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::Collections, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::CollectionDetails.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::CollectionDetails.into()); } #[test] @@ -166,10 +166,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::UpdateCollections) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); } #[test] @@ -193,17 +190,14 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); } } mod test_handle_esc { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; + use pretty_assertions::assert_eq; use super::*; @@ -224,10 +218,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); assert!(!app.data.radarr_data.prompt_confirm); } @@ -242,8 +233,7 @@ mod tests { CollectionsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Collections, None).handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into() ); assert!(app.error.text.is_empty()); @@ -261,7 +251,7 @@ mod tests { EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; - use crate::test_edit_collection_key; + use crate::{assert_navigation_popped, test_edit_collection_key}; use super::*; @@ -298,7 +288,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::Collections.into() ); - assert!(app.data.radarr_data.edit_collection_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_collection_modal); } #[test] @@ -318,10 +308,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::UpdateAllCollectionsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::UpdateAllCollectionsPrompt.into()); } #[test] @@ -367,8 +354,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!(app, ActiveRadarrBlock::Collections.into() ); assert!(app.should_refresh); @@ -424,10 +410,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::UpdateCollections) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); } } diff --git a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs index 1054b95..c771e31 100644 --- a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs @@ -7,6 +7,8 @@ mod tests { 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::radarr_handlers::collections::edit_collection_handler::EditCollectionHandler; @@ -443,13 +445,13 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; use crate::models::{BlockSelectionState, Route}; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; + use rstest::rstest; use super::*; @@ -486,10 +488,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditCollectionPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditCollectionPrompt.into()); } #[test] @@ -514,10 +513,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); } @@ -571,16 +567,13 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::EditCollection(expected_edit_collection_params)) ); assert!(app.should_refresh); - assert!(app.data.radarr_data.edit_collection_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_collection_modal); } #[test] @@ -755,8 +748,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, (selected_block, Some(ActiveRadarrBlock::Collections)).into() ); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); @@ -788,10 +781,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditCollectionPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditCollectionPrompt.into()); if active_radarr_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput { assert!(!app.ignore_special_keys_for_textbox_input); @@ -800,11 +790,11 @@ mod tests { } mod test_handle_esc { + use crate::assert_navigation_popped; + use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; - use super::*; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -827,10 +817,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditCollectionPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditCollectionPrompt.into()); } #[test] @@ -848,13 +835,10 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); let radarr_data = &app.data.radarr_data; - assert!(radarr_data.edit_collection_modal.is_none()); + assert_modal_absent!(radarr_data.edit_collection_modal); assert!(!radarr_data.prompt_confirm); } @@ -875,16 +859,14 @@ mod tests { EditCollectionHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); } } mod test_handle_key_char { use super::*; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::radarr::{ @@ -998,16 +980,13 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::EditCollection(expected_edit_collection_params)) ); assert!(app.should_refresh); - assert!(app.data.radarr_data.edit_collection_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_collection_modal); } } @@ -1082,7 +1061,7 @@ mod tests { .build_edit_collection_params(); assert_eq!(edit_collection_params, expected_edit_collection_params); - assert!(app.data.radarr_data.edit_collection_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_collection_modal); } #[test] diff --git a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs index 12ebfb6..f539a4b 100644 --- a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::downloads::DownloadsHandler; @@ -31,10 +32,7 @@ mod tests { DownloadsHandler::new(DELETE_KEY, &mut app, ActiveRadarrBlock::Downloads, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::DeleteDownloadPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::DeleteDownloadPrompt.into()); } #[test] @@ -78,10 +76,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Collections.into() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::Collections.into()); } #[rstest] @@ -102,7 +97,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Blocklist.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Blocklist.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Blocklist.into()); } #[rstest] @@ -133,6 +128,7 @@ mod tests { use crate::network::radarr_network::RadarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -169,7 +165,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } #[rstest] @@ -192,7 +188,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } } @@ -201,6 +197,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -218,7 +215,7 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); - assert_eq!(app.get_current_route(), base_block.into()); + assert_navigation_popped!(app, base_block.into()); assert!(!app.data.radarr_data.prompt_confirm); } @@ -232,17 +229,17 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Downloads, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Downloads.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Downloads.into()); assert!(app.error.text.is_empty()); } } mod test_handle_key_char { + use crate::assert_navigation_popped; + use crate::network::radarr_network::RadarrEvent; use pretty_assertions::assert_eq; use rstest::rstest; - use crate::network::radarr_network::RadarrEvent; - use super::*; #[test] @@ -262,10 +259,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::UpdateDownloadsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::UpdateDownloadsPrompt.into()); } #[test] @@ -308,7 +302,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Downloads.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Downloads.into()); assert!(app.should_refresh); } @@ -373,7 +367,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } } diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs index 8187ebc..e063370 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -2,6 +2,9 @@ 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::radarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; @@ -850,6 +853,7 @@ mod tests { use rstest::rstest; use crate::app::App; + use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ BlockSelectionState, servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, @@ -882,7 +886,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); assert!(!app.should_refresh); assert_eq!(app.data.radarr_data.edit_indexer_modal, None); @@ -936,8 +940,8 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); - assert!(app.data.radarr_data.edit_indexer_modal.is_none()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); + assert_modal_absent!(app.data.radarr_data.edit_indexer_modal); assert!(app.should_refresh); assert_eq!( app.data.radarr_data.prompt_confirm_action, @@ -966,7 +970,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app.data.radarr_data.edit_indexer_modal.is_some()); + assert_modal_present!(app.data.radarr_data.edit_indexer_modal); assert!(!app.should_refresh); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); } @@ -1002,7 +1006,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), block.into()); + assert_navigation_pushed!(app, block.into()); assert!(app.ignore_special_keys_for_textbox_input); } @@ -1024,10 +1028,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPriorityInput.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::EditIndexerPriorityInput.into()); assert!(!app.ignore_special_keys_for_textbox_input); } @@ -1234,10 +1235,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1272,10 +1270,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1310,10 +1305,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1348,10 +1340,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1386,10 +1375,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } } @@ -1398,6 +1384,7 @@ mod tests { use crate::app::App; use crate::event::Key; use crate::models::servarr_data::modals::EditIndexerModal; + use crate::{assert_navigation_popped, assert_navigation_pushed}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -1419,7 +1406,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.edit_indexer_modal, None); } @@ -1444,7 +1431,7 @@ mod tests { EditIndexerHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.ignore_special_keys_for_textbox_input); assert_eq!( app.data.radarr_data.edit_indexer_modal, @@ -1454,15 +1441,15 @@ mod tests { } mod test_handle_key_char { + use super::*; use crate::app::App; + use crate::assert_navigation_popped; use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; use crate::network::radarr_network::RadarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; - use super::*; - #[test] fn test_edit_indexer_name_input_backspace() { let mut app = App::test_default(); @@ -1795,8 +1782,8 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); - assert!(app.data.radarr_data.edit_indexer_modal.is_none()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); + assert_modal_absent!(app.data.radarr_data.edit_indexer_modal); assert!(app.should_refresh); assert_eq!( app.data.radarr_data.prompt_confirm_action, @@ -1874,7 +1861,7 @@ mod tests { .build_edit_indexer_params(); assert_eq!(edit_indexer_params, expected_edit_indexer_params); - assert!(app.data.radarr_data.edit_indexer_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_indexer_modal); } #[test] diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 67aab53..482fa05 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -6,6 +6,8 @@ mod tests { 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::radarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; @@ -424,6 +426,7 @@ mod tests { use rstest::rstest; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, radarr_models::IndexerSettings, servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, @@ -457,7 +460,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); assert!(!app.should_refresh); assert_eq!(app.data.radarr_data.indexer_settings, None); @@ -486,12 +489,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::EditAllIndexerSettings(indexer_settings())) ); - assert!(app.data.radarr_data.indexer_settings.is_none()); + assert_modal_absent!(app.data.radarr_data.indexer_settings); assert!(app.should_refresh); } @@ -549,7 +552,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), selected_block.into()); + assert_navigation_pushed!(app, selected_block.into()); } #[rstest] @@ -599,8 +602,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveRadarrBlock::IndexerSettingsWhitelistedSubtitleTagsInput.into() ); assert!(app.ignore_special_keys_for_textbox_input); @@ -747,10 +750,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AllIndexerSettingsPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::AllIndexerSettingsPrompt.into()); } #[rstest] @@ -771,10 +771,7 @@ mod tests { IndexerSettingsHandler::new(SUBMIT_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AllIndexerSettingsPrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::AllIndexerSettingsPrompt.into()); } } @@ -785,6 +782,7 @@ mod tests { use crate::models::radarr_models::IndexerSettings; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -804,7 +802,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.indexer_settings, None); } @@ -827,7 +825,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.ignore_special_keys_for_textbox_input); assert_eq!( app.data.radarr_data.indexer_settings, @@ -854,7 +852,7 @@ mod tests { IndexerSettingsHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert_eq!( app.data.radarr_data.indexer_settings, Some(IndexerSettings::default()) @@ -866,6 +864,7 @@ mod tests { use pretty_assertions::{assert_eq, assert_str_eq}; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, radarr_models::IndexerSettings, servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, @@ -952,12 +951,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::EditAllIndexerSettings(indexer_settings())) ); - assert!(app.data.radarr_data.indexer_settings.is_none()); + assert_modal_absent!(app.data.radarr_data.indexer_settings); assert!(app.should_refresh); } } @@ -1006,7 +1005,7 @@ mod tests { .build_edit_indexer_settings_body(); assert_eq!(body, indexer_settings()); - assert!(app.data.radarr_data.indexer_settings.is_none()); + assert_modal_absent!(app.data.radarr_data.indexer_settings); } #[test] diff --git a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs index 1becb4a..4fc3cc9 100644 --- a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::IndexersHandler; @@ -34,10 +35,7 @@ mod tests { IndexersHandler::new(DELETE_KEY, &mut app, ActiveRadarrBlock::Indexers, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::DeleteIndexerPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::DeleteIndexerPrompt.into()); } #[test] @@ -81,10 +79,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::RootFolders.into() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::RootFolders.into()); } #[rstest] @@ -105,7 +100,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::System.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::System.into()); } #[rstest] @@ -125,6 +120,8 @@ mod tests { } mod test_handle_submit { + use super::*; + use crate::assert_navigation_popped; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ @@ -136,8 +133,6 @@ mod tests { use pretty_assertions::assert_eq; use serde_json::{Number, Value}; - use super::*; - const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; #[rstest] @@ -196,10 +191,7 @@ mod tests { IndexersHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::Indexers, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); assert_eq!( app.data.radarr_data.edit_indexer_modal, Some((&app.data.radarr_data).into()) @@ -259,7 +251,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::DeleteIndexer(1)) ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); } #[test] @@ -283,7 +275,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); } } @@ -291,6 +283,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -310,7 +303,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.data.radarr_data.prompt_confirm); } @@ -324,7 +317,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::TestIndexer, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert_eq!(app.data.radarr_data.indexer_test_errors, None); } @@ -338,7 +331,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Indexers, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(app.error.text.is_empty()); } } @@ -349,6 +342,7 @@ mod tests { use super::*; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; use crate::{ + assert_navigation_popped, models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, network::radarr_network::RadarrEvent, }; @@ -371,7 +365,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Indexers.into()); assert!(app.should_refresh); } @@ -415,10 +409,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AllIndexerSettingsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::AllIndexerSettingsPrompt.into()); assert_eq!( app.data.radarr_data.selected_block.blocks, INDEXER_SETTINGS_SELECTION_BLOCKS @@ -464,10 +455,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::TestIndexer.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::TestIndexer.into()); } #[test] @@ -509,10 +497,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::TestAllIndexers.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::TestAllIndexers.into()); } #[test] @@ -557,7 +542,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::DeleteIndexer(1)) ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); } } diff --git a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs index cce0859..179f7c1 100644 --- a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -2,6 +2,8 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_modal_absent; + use crate::assert_navigation_pushed; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; @@ -12,7 +14,9 @@ mod tests { mod test_handle_esc { use super::*; + use crate::assert_navigation_pushed; use crate::models::stateful_table::StatefulTable; + use crate::{assert_modal_absent, assert_navigation_popped}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -32,9 +36,9 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.data.radarr_data.prompt_confirm); - assert!(app.data.radarr_data.indexer_test_all_results.is_none()); + assert_modal_absent!(app.data.radarr_data.indexer_test_all_results); } } diff --git a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs index 7893b19..e8a69a5 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs @@ -1,5 +1,8 @@ #[cfg(test)] mod tests { + use crate::assert_modal_absent; + use crate::assert_modal_present; + use crate::assert_navigation_pushed; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::add_movie_search_result; use crate::models::stateful_table::StatefulTable; use pretty_assertions::assert_str_eq; @@ -761,10 +764,7 @@ mod tests { } mod test_handle_submit { - use bimap::BiMap; - use pretty_assertions::{assert_eq, assert_str_eq}; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{ add_movie_body, add_movie_search_result, collection_movie, }; @@ -774,6 +774,9 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; use crate::models::stateful_table::StatefulTable; use crate::network::radarr_network::RadarrEvent; + use bimap::BiMap; + use pretty_assertions::{assert_eq, assert_str_eq}; + use rstest::rstest; use super::*; @@ -847,7 +850,7 @@ mod tests { app.data.radarr_data.selected_block.get_active_block(), ActiveRadarrBlock::AddMovieSelectRootFolder ); - assert!(app.data.radarr_data.add_movie_modal.is_some()); + assert_modal_present!(app.data.radarr_data.add_movie_modal); assert!( !app .data @@ -914,7 +917,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::AddMovieSearchResults.into() ); - assert!(app.data.radarr_data.add_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.add_movie_modal); } #[test] @@ -981,7 +984,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); } @@ -1055,12 +1058,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::AddMovie(add_movie_body())) ); - assert!(app.data.radarr_data.add_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.add_movie_modal); } #[rstest] @@ -1092,8 +1095,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, (selected_block, Some(ActiveRadarrBlock::CollectionDetails)).into() ); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); @@ -1126,10 +1129,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::AddMoviePrompt.into()); if active_radarr_block == ActiveRadarrBlock::AddMovieTagsInput { assert!(!app.ignore_special_keys_for_textbox_input); @@ -1144,9 +1144,10 @@ mod tests { use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::stateful_table::StatefulTable; - use crate::simple_stateful_iterable_vec; + use crate::{assert_navigation_popped, simple_stateful_iterable_vec}; use super::*; + use crate::assert_navigation_pushed; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -1167,7 +1168,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!(app.data.radarr_data.add_movie_search, None); } @@ -1188,10 +1189,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::AddMoviePrompt.into()); } #[rstest] @@ -1214,11 +1212,8 @@ mod tests { AddMovieHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMovieSearchInput.into() - ); - assert!(app.data.radarr_data.add_searched_movies.is_none()); + assert_navigation_popped!(app, ActiveRadarrBlock::AddMovieSearchInput.into()); + assert_modal_absent!(app.data.radarr_data.add_searched_movies); assert!(app.ignore_special_keys_for_textbox_input); } @@ -1237,10 +1232,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMovieSearchResults.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::AddMovieSearchResults.into()); } #[test] @@ -1254,11 +1246,8 @@ mod tests { AddMovieHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::AddMoviePrompt, None).handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMovieSearchResults.into() - ); - assert!(app.data.radarr_data.add_movie_modal.is_none()); + assert_navigation_popped!(app, ActiveRadarrBlock::AddMovieSearchResults.into()); + assert_modal_absent!(app.data.radarr_data.add_movie_modal); } #[test] @@ -1278,10 +1267,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::AddMoviePrompt.into()); } #[rstest] @@ -1318,8 +1304,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_popped!( + app, ( ActiveRadarrBlock::AddMoviePrompt, Some(ActiveRadarrBlock::CollectionDetails), @@ -1336,6 +1322,7 @@ mod tests { use super::*; use crate::{ + assert_navigation_popped, handlers::radarr_handlers::radarr_handler_test_utils::utils::{ add_movie_body, add_movie_search_result, collection_movie, }, @@ -1509,12 +1496,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::AddMovie(add_movie_body())) ); - assert!(app.data.radarr_data.add_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.add_movie_modal); } } diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs index efd500b..579f01c 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler; @@ -88,6 +89,7 @@ mod tests { use crate::network::radarr_network::RadarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -113,7 +115,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); assert!(!app.data.radarr_data.prompt_confirm); assert!(!app.data.radarr_data.delete_movie_files); @@ -149,7 +151,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::DeleteMovie(expected_delete_movie_params)) @@ -222,6 +224,7 @@ mod tests { mod test_handle_esc { use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -245,7 +248,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(!app.data.radarr_data.prompt_confirm); assert!(!app.data.radarr_data.delete_movie_files); assert!(!app.data.radarr_data.add_list_exclusion); @@ -254,6 +257,7 @@ mod tests { mod test_handle_key_char { use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, }, @@ -291,7 +295,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::DeleteMovie(expected_delete_movie_params)) diff --git a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs index 4145908..2e0a9c6 100644 --- a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs @@ -7,6 +7,8 @@ mod tests { 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::radarr_handlers::library::edit_movie_handler::EditMovieHandler; @@ -534,13 +536,13 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_MOVIE_SELECTION_BLOCKS; use crate::models::{BlockSelectionState, Route}; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; + use rstest::rstest; use super::*; @@ -577,10 +579,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } #[test] @@ -614,10 +613,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } #[test] @@ -641,7 +637,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); } @@ -694,12 +690,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::EditMovie(expected_edit_movie_params)) ); - assert!(app.data.radarr_data.edit_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_movie_modal); assert!(app.should_refresh); } @@ -809,8 +805,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, (selected_block, Some(ActiveRadarrBlock::Movies)).into() ); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); @@ -882,10 +878,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); if active_radarr_block == ActiveRadarrBlock::EditMoviePathInput || active_radarr_block == ActiveRadarrBlock::EditMovieTagsInput @@ -896,11 +889,11 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; + use pretty_assertions::assert_eq; + use rstest::rstest; use super::*; @@ -923,10 +916,7 @@ mod tests { EditMovieHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::EditMoviePrompt.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } #[test] @@ -938,9 +928,9 @@ mod tests { EditMovieHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::EditMoviePrompt, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert!(app.data.radarr_data.edit_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_movie_modal); assert!(!app.data.radarr_data.prompt_confirm); } @@ -960,13 +950,14 @@ mod tests { EditMovieHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } } mod test_handle_key_char { use super::*; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::radarr::{modals::EditMovieModal, radarr_data::EDIT_MOVIE_SELECTION_BLOCKS}, @@ -1132,12 +1123,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::EditMovie(expected_edit_movie_params)) ); - assert!(app.data.radarr_data.edit_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_movie_modal); assert!(app.should_refresh); } } @@ -1213,7 +1204,7 @@ mod tests { .build_edit_movie_params(); assert_eq!(edit_movie_params, expected_edit_movie_params); - assert!(app.data.radarr_data.edit_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_movie_modal); } #[test] diff --git a/src/handlers/radarr_handlers/library/library_handler_tests.rs b/src/handlers/radarr_handlers/library/library_handler_tests.rs index dffb432..b21a52f 100644 --- a/src/handlers/radarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/library_handler_tests.rs @@ -7,6 +7,9 @@ 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::radarr_handlers::library::{LibraryHandler, movies_sorting_options}; @@ -72,6 +75,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_movie_tab_left(#[values(true, false)] is_ready: bool) { @@ -91,7 +95,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::System.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::System.into()); } #[rstest] @@ -112,10 +116,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Collections.into() ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::Collections.into()); } #[rstest] @@ -147,9 +148,9 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; use super::*; @@ -166,10 +167,7 @@ mod tests { LibraryHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::Movies, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::MovieDetails.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::MovieDetails.into()); } #[test] @@ -213,7 +211,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::UpdateAllMovies) ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } #[test] @@ -237,7 +235,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } } @@ -249,6 +247,7 @@ mod tests { use crate::models::stateful_table::StatefulTable; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -267,7 +266,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(!app.data.radarr_data.prompt_confirm); } @@ -289,7 +288,7 @@ mod tests { LibraryHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Movies, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(app.error.text.is_empty()); } } @@ -307,7 +306,7 @@ mod tests { }; use crate::network::radarr_network::RadarrEvent; - use crate::test_edit_movie_key; + use crate::{assert_navigation_popped, test_edit_movie_key}; use super::*; @@ -328,12 +327,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddMovieSearchInput.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::AddMovieSearchInput.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.add_movie_search.is_some()); + assert_modal_present!(app.data.radarr_data.add_movie_search); } #[test] @@ -357,7 +353,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.add_movie_search.is_none()); + assert_modal_absent!(app.data.radarr_data.add_movie_search); } #[test] @@ -389,7 +385,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); - assert!(app.data.radarr_data.edit_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_movie_modal); } #[test] @@ -433,7 +429,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(!app.data.radarr_data.prompt_confirm); - assert!(app.data.radarr_data.prompt_confirm_action.is_none()); + assert_modal_absent!(app.data.radarr_data.prompt_confirm_action); assert!(!app.is_routing); } @@ -454,10 +450,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::UpdateAllMoviesPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::UpdateAllMoviesPrompt.into()); } #[test] @@ -500,7 +493,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Movies.into()); assert!(app.should_refresh); } @@ -551,7 +544,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::UpdateAllMovies) ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } } diff --git a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs index e78c2d3..e2b6d37 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -9,6 +9,8 @@ mod tests { 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::radarr_handlers::library::movie_details_handler::{ @@ -294,7 +296,7 @@ mod tests { app.get_current_route(), app.data.radarr_data.movie_info_tabs.get_active_route() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); MovieDetailsHandler::new(DEFAULT_KEYBINDINGS.right.key, &mut app, left_block, None).handle(); @@ -302,16 +304,16 @@ mod tests { app.get_current_route(), app.data.radarr_data.movie_info_tabs.get_active_route() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } } mod test_handle_submit { - use pretty_assertions::assert_eq; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; + use rstest::rstest; use super::*; @@ -333,10 +335,7 @@ mod tests { MovieDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::ManualSearch, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::ManualSearchConfirmPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::ManualSearchConfirmPrompt.into()); } #[test] @@ -393,10 +392,7 @@ mod tests { MovieDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::MovieDetails.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::MovieDetails.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(expected_action) @@ -423,10 +419,7 @@ mod tests { MovieDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::MovieDetails.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::MovieDetails.into()); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); } } @@ -435,10 +428,11 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::assert_movie_info_tabs_reset; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; + use crate::{assert_movie_info_tabs_reset, assert_navigation_popped}; use super::*; + use crate::assert_navigation_pushed; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -463,7 +457,7 @@ mod tests { MovieDetailsHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_movie_info_tabs_reset!(app.data.radarr_data); } @@ -487,7 +481,7 @@ mod tests { MovieDetailsHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } } @@ -505,7 +499,7 @@ mod tests { EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; - use crate::test_edit_movie_key; + use crate::{assert_navigation_popped, test_edit_movie_key}; use super::*; @@ -544,8 +538,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveRadarrBlock::AutomaticallySearchMoviePrompt.into() ); } @@ -629,7 +623,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), active_radarr_block.into()); - assert!(app.data.radarr_data.edit_movie_modal.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_movie_modal); } #[rstest] @@ -667,10 +661,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::UpdateAndScanPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::UpdateAndScanPrompt.into()); } #[rstest] @@ -739,7 +730,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), active_radarr_block.into()); + assert_navigation_pushed!(app, active_radarr_block.into()); assert!(app.is_routing); } @@ -817,10 +808,7 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::MovieDetails.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::MovieDetails.into()); assert_eq!( app.data.radarr_data.prompt_confirm_action, Some(expected_action) diff --git a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs index fd0dc2e..9b89981 100644 --- a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs +++ b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs @@ -1,7 +1,6 @@ #[cfg(test)] #[macro_use] pub(in crate::handlers::radarr_handlers) mod utils { - use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie, DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, @@ -10,8 +9,9 @@ pub(in crate::handlers::radarr_handlers) mod utils { use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; + use crate::models::HorizontallyScrollableText; use chrono::DateTime; - use serde_json::{Number, json}; + use serde_json::{json, Number}; #[macro_export] macro_rules! test_edit_movie_key { @@ -37,8 +37,8 @@ pub(in crate::handlers::radarr_handlers) mod utils { $handler::new(DEFAULT_KEYBINDINGS.edit.key, &mut app, $block, None).handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, (ActiveRadarrBlock::EditMoviePrompt, Some($context)).into() ); assert_eq!( @@ -151,8 +151,8 @@ pub(in crate::handlers::radarr_handlers) mod utils { $handler::new(DEFAULT_KEYBINDINGS.edit.key, &mut app, $block, None).handle(); - assert_eq!( - app.get_current_route(), + $crate::assert_navigation_pushed!( + app, (ActiveRadarrBlock::EditCollectionPrompt, $context).into() ); assert_eq!( diff --git a/src/handlers/radarr_handlers/radarr_handler_tests.rs b/src/handlers/radarr_handlers/radarr_handler_tests.rs index 0de439a..0a3bc46 100644 --- a/src/handlers/radarr_handlers/radarr_handler_tests.rs +++ b/src/handlers/radarr_handlers/radarr_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::{RadarrHandler, handle_change_tab_left_right_keys}; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; @@ -33,7 +34,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), left_block.into() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); app.data.radarr_data.main_tabs.set_index(index); @@ -43,7 +44,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), right_block.into() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } #[rstest] @@ -69,7 +70,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), left_block.into() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); app.data.radarr_data.main_tabs.set_index(index); @@ -79,7 +80,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), right_block.into() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } #[rstest] diff --git a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs index 986577a..13353dd 100644 --- a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs @@ -6,6 +6,9 @@ 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::radarr_handlers::radarr_handler_test_utils::utils::root_folder; @@ -91,10 +94,7 @@ mod tests { RootFoldersHandler::new(DELETE_KEY, &mut app, ActiveRadarrBlock::RootFolders, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::DeleteRootFolderPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::DeleteRootFolderPrompt.into()); } #[test] @@ -124,6 +124,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_root_folders_tab_left(#[values(true, false)] is_ready: bool) { @@ -143,7 +144,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Blocklist.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Blocklist.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Blocklist.into()); } #[rstest] @@ -164,7 +165,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Indexers.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Indexers.into()); } #[rstest] @@ -242,9 +243,9 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; use super::*; @@ -281,10 +282,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::AddRootFolder(expected_add_root_folder_body)) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } #[test] @@ -306,7 +304,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.prompt_confirm_action.is_none()); + assert_modal_absent!(app.data.radarr_data.prompt_confirm_action); assert_eq!( app.get_current_route(), ActiveRadarrBlock::AddRootFolderPrompt.into() @@ -338,10 +336,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::DeleteRootFolder(1)) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } #[test] @@ -365,15 +360,13 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } } mod test_handle_esc { use super::*; + use crate::assert_navigation_popped; use pretty_assertions::assert_eq; use rstest::rstest; @@ -394,10 +387,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); assert!(!app.data.radarr_data.prompt_confirm); } @@ -417,12 +407,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); - assert!(app.data.radarr_data.edit_root_folder.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_root_folder); assert!(!app.data.radarr_data.prompt_confirm); assert!(!app.ignore_special_keys_for_textbox_input); } @@ -437,18 +424,15 @@ mod tests { RootFoldersHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::RootFolders, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); assert!(app.error.text.is_empty()); } } mod test_handle_key_char { - use pretty_assertions::{assert_eq, assert_str_eq}; - + use crate::assert_navigation_popped; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::{assert_eq, assert_str_eq}; use super::*; @@ -469,12 +453,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::AddRootFolderPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::AddRootFolderPrompt.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.edit_root_folder.is_some()); + assert_modal_present!(app.data.radarr_data.edit_root_folder); } #[test] @@ -501,7 +482,7 @@ mod tests { ActiveRadarrBlock::RootFolders.into() ); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.edit_root_folder.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_root_folder); } #[test] @@ -522,10 +503,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::RootFolders.into()); assert!(app.should_refresh); } @@ -627,10 +605,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::DeleteRootFolder(1)) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } } @@ -681,7 +656,7 @@ mod tests { .build_add_root_folder_body(); assert_eq!(actual_add_root_folder_body, expected_add_root_folder_body); - assert!(app.data.radarr_data.edit_root_folder.is_none()); + assert_modal_absent!(app.data.radarr_data.edit_root_folder); } #[test] diff --git a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs index 273dde2..a6bf14b 100644 --- a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; @@ -636,9 +637,9 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::network::radarr_network::RadarrEvent; + use pretty_assertions::assert_eq; use super::*; @@ -652,10 +653,7 @@ mod tests { SystemDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::SystemTasks, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemTaskStartConfirmPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SystemTaskStartConfirmPrompt.into()); } #[test] @@ -699,10 +697,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::StartTask(RadarrTaskName::default())) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); } #[test] @@ -722,10 +717,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_eq!(app.data.radarr_data.prompt_confirm_action, None); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); } } @@ -735,6 +727,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -757,7 +750,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::SystemLogs, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); assert!(app.data.radarr_data.log_details.items.is_empty()); } @@ -775,7 +768,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::SystemTasks, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); } #[rstest] @@ -798,7 +791,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); } #[rstest] @@ -810,7 +803,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::SystemUpdates, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); } #[test] @@ -828,10 +821,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); assert!(!app.data.radarr_data.prompt_confirm); } } @@ -843,6 +833,7 @@ mod tests { use crate::network::radarr_network::RadarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; #[rstest] fn test_refresh_key( @@ -866,7 +857,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), active_radarr_block.into()); + assert_navigation_pushed!(app, active_radarr_block.into()); assert!(app.should_refresh); } @@ -921,10 +912,7 @@ mod tests { app.data.radarr_data.prompt_confirm_action, Some(RadarrEvent::StartTask(RadarrTaskName::default())) ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); } } diff --git a/src/handlers/radarr_handlers/system/system_handler_tests.rs b/src/handlers/radarr_handlers/system/system_handler_tests.rs index 87b758c..769145e 100644 --- a/src/handlers/radarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_handler_tests.rs @@ -5,6 +5,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::system::SystemHandler; @@ -19,6 +20,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_system_tab_left(#[values(true, false)] is_ready: bool) { @@ -38,7 +40,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Indexers.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Indexers.into()); } #[rstest] @@ -59,7 +61,7 @@ mod tests { app.data.radarr_data.main_tabs.get_active_route(), ActiveRadarrBlock::Movies.into() ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::Movies.into()); } } @@ -67,6 +69,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -80,7 +83,7 @@ mod tests { SystemHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::System, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); assert!(app.error.text.is_empty()); } } @@ -118,10 +121,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemUpdates.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SystemUpdates.into()); } #[test] @@ -181,10 +181,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemQueuedEvents.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SystemQueuedEvents.into()); } #[test] @@ -245,7 +242,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); + assert_navigation_pushed!(app, ActiveRadarrBlock::System.into()); assert!(app.should_refresh); } @@ -308,10 +305,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemLogs.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SystemLogs.into()); assert_eq!( app.data.radarr_data.log_details.items, app.data.radarr_data.logs.items @@ -380,10 +374,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SystemTasks.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SystemTasks.into()); } #[test] diff --git a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs index 15786b5..726fe3e 100644 --- a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs @@ -9,6 +9,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; @@ -31,10 +32,7 @@ mod tests { BlocklistHandler::new(DELETE_KEY, &mut app, ActiveSonarrBlock::Blocklist, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::DeleteBlocklistItemPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::DeleteBlocklistItemPrompt.into()); } #[test] @@ -55,6 +53,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_blocklist_tab_left(#[values(true, false)] is_ready: bool) { @@ -75,7 +74,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Downloads.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Downloads.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Downloads.into()); } #[rstest] @@ -97,7 +96,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::History.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::History.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::History.into()); } #[rstest] @@ -123,11 +122,11 @@ mod tests { } mod test_handle_submit { + use crate::assert_navigation_popped; + use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::assert_eq; use rstest::rstest; - use crate::network::sonarr_network::SonarrEvent; - use super::*; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -140,10 +139,7 @@ mod tests { BlocklistHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::Blocklist, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::BlocklistItemDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::BlocklistItemDetails.into()); } #[test] @@ -187,7 +183,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } #[rstest] @@ -207,7 +203,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Blocklist.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Blocklist.into()); } } @@ -216,6 +212,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -239,7 +236,7 @@ mod tests { BlocklistHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); - assert_eq!(app.get_current_route(), base_block.into()); + assert_navigation_popped!(app, base_block.into()); assert!(!app.data.sonarr_data.prompt_confirm); } @@ -257,7 +254,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Blocklist.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Blocklist.into()); } #[rstest] @@ -270,7 +267,7 @@ mod tests { BlocklistHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Blocklist, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Blocklist.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Blocklist.into()); assert!(app.error.text.is_empty()); } } @@ -282,6 +279,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; #[test] fn test_refresh_blocklist_key() { @@ -297,7 +295,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Blocklist.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Blocklist.into()); assert!(app.should_refresh); } @@ -334,10 +332,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::BlocklistClearAllItemsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::BlocklistClearAllItemsPrompt.into()); } #[test] @@ -392,7 +387,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } } diff --git a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs index d7e2786..19ad807 100644 --- a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::downloads::DownloadsHandler; @@ -32,10 +33,7 @@ mod tests { DownloadsHandler::new(DELETE_KEY, &mut app, ActiveSonarrBlock::Downloads, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::DeleteDownloadPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::DeleteDownloadPrompt.into()); } #[test] @@ -60,6 +58,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_downloads_tab_left(#[values(true, false)] is_ready: bool) { @@ -80,7 +79,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Series.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Series.into()); } #[rstest] @@ -102,7 +101,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Blocklist.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Blocklist.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Blocklist.into()); } #[rstest] @@ -134,6 +133,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -170,7 +170,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } #[rstest] @@ -193,7 +193,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } } @@ -202,6 +202,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -219,7 +220,7 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); - assert_eq!(app.get_current_route(), base_block.into()); + assert_navigation_popped!(app, base_block.into()); assert!(!app.data.sonarr_data.prompt_confirm); } @@ -233,17 +234,17 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Downloads, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Downloads.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Downloads.into()); assert!(app.error.text.is_empty()); } } mod test_handle_key_char { + use crate::assert_navigation_popped; + use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::assert_eq; use rstest::rstest; - use crate::network::sonarr_network::SonarrEvent; - use super::*; #[test] @@ -264,10 +265,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::UpdateDownloadsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::UpdateDownloadsPrompt.into()); } #[test] @@ -310,7 +308,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Downloads.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Downloads.into()); assert!(app.should_refresh); } @@ -375,7 +373,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(expected_action) ); - assert_eq!(app.get_current_route(), base_route.into()); + assert_navigation_popped!(app, base_route.into()); } } diff --git a/src/handlers/sonarr_handlers/history/history_handler_tests.rs b/src/handlers/sonarr_handlers/history/history_handler_tests.rs index e4b761c..28fb236 100644 --- a/src/handlers/sonarr_handlers/history/history_handler_tests.rs +++ b/src/handlers/sonarr_handlers/history/history_handler_tests.rs @@ -9,6 +9,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::history::{HistoryHandler, history_sorting_options}; @@ -21,6 +22,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_history_tab_left(#[values(true, false)] is_ready: bool) { @@ -41,7 +43,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Blocklist.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Blocklist.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Blocklist.into()); } #[rstest] @@ -85,10 +87,7 @@ mod tests { HistoryHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::History, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::HistoryItemDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::HistoryItemDetails.into()); } #[test] @@ -111,6 +110,7 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -133,7 +133,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::History.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::History.into()); } #[rstest] @@ -161,6 +161,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::assert_navigation_pushed; #[test] fn test_refresh_history_key() { @@ -176,7 +177,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::History.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::History.into()); assert!(app.should_refresh); } diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs index 406acde..16be928 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -2,6 +2,9 @@ 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::sonarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; @@ -850,6 +853,7 @@ mod tests { use rstest::rstest; use crate::app::App; + use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ BlockSelectionState, servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, @@ -882,7 +886,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); assert!(!app.should_refresh); assert_eq!(app.data.sonarr_data.edit_indexer_modal, None); @@ -936,8 +940,8 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); - assert!(app.data.sonarr_data.edit_indexer_modal.is_none()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); + assert_modal_absent!(app.data.sonarr_data.edit_indexer_modal); assert!(app.should_refresh); assert_eq!( app.data.sonarr_data.prompt_confirm_action, @@ -966,7 +970,7 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app.data.sonarr_data.edit_indexer_modal.is_some()); + assert_modal_present!(app.data.sonarr_data.edit_indexer_modal); assert!(!app.should_refresh); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); } @@ -1002,7 +1006,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), block.into()); + assert_navigation_pushed!(app, block.into()); assert!(app.ignore_special_keys_for_textbox_input); } @@ -1024,10 +1028,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPriorityInput.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::EditIndexerPriorityInput.into()); assert!(!app.ignore_special_keys_for_textbox_input); } @@ -1234,10 +1235,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1272,10 +1270,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1310,10 +1305,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1348,10 +1340,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } #[test] @@ -1386,10 +1375,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } } @@ -1398,6 +1384,7 @@ mod tests { use crate::app::App; use crate::event::Key; use crate::models::servarr_data::modals::EditIndexerModal; + use crate::{assert_navigation_popped, assert_navigation_pushed}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -1419,7 +1406,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.edit_indexer_modal, None); } @@ -1444,7 +1431,7 @@ mod tests { EditIndexerHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.ignore_special_keys_for_textbox_input); assert_eq!( app.data.sonarr_data.edit_indexer_modal, @@ -1454,15 +1441,15 @@ mod tests { } mod test_handle_key_char { + use super::*; use crate::app::App; + use crate::assert_navigation_popped; use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; - use super::*; - #[test] fn test_edit_indexer_name_input_backspace() { let mut app = App::test_default(); @@ -1795,8 +1782,8 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); - assert!(app.data.sonarr_data.edit_indexer_modal.is_none()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); + assert_modal_absent!(app.data.sonarr_data.edit_indexer_modal); assert!(app.should_refresh); assert_eq!( app.data.sonarr_data.prompt_confirm_action, @@ -1874,7 +1861,7 @@ mod tests { .build_edit_indexer_params(); assert_eq!(params, expected_edit_indexer_params); - assert!(app.data.sonarr_data.edit_indexer_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_indexer_modal); } #[test] diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 631b329..e85944c 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -6,6 +6,8 @@ mod tests { 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::sonarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; @@ -237,6 +239,7 @@ mod tests { use rstest::rstest; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, sonarr_models::IndexerSettings, @@ -270,7 +273,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); assert!(!app.should_refresh); assert_eq!(app.data.sonarr_data.indexer_settings, None); @@ -299,12 +302,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::EditAllIndexerSettings(indexer_settings())) ); - assert!(app.data.sonarr_data.indexer_settings.is_none()); + assert_modal_absent!(app.data.sonarr_data.indexer_settings); assert!(app.should_refresh); } @@ -357,7 +360,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), selected_block.into()); + assert_navigation_pushed!(app, selected_block.into()); } #[rstest] @@ -405,10 +408,7 @@ mod tests { IndexerSettingsHandler::new(SUBMIT_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AllIndexerSettingsPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::AllIndexerSettingsPrompt.into()); } } @@ -419,6 +419,7 @@ mod tests { use crate::models::sonarr_models::IndexerSettings; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -438,7 +439,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.indexer_settings, None); } @@ -460,7 +461,7 @@ mod tests { IndexerSettingsHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert_eq!( app.data.sonarr_data.indexer_settings, Some(IndexerSettings::default()) @@ -470,6 +471,7 @@ mod tests { mod test_handle_key_char { use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, @@ -501,12 +503,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::EditAllIndexerSettings(indexer_settings())) ); - assert!(app.data.sonarr_data.indexer_settings.is_none()); + assert_modal_absent!(app.data.sonarr_data.indexer_settings); assert!(app.should_refresh); } } @@ -555,7 +557,7 @@ mod tests { .build_edit_indexer_settings_params(); assert_eq!(actual_indexer_settings, indexer_settings()); - assert!(app.data.sonarr_data.indexer_settings.is_none()); + assert_modal_absent!(app.data.sonarr_data.indexer_settings); } #[test] diff --git a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs index a7a7a08..7f59af5 100644 --- a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::IndexersHandler; @@ -35,10 +36,7 @@ mod tests { IndexersHandler::new(DELETE_KEY, &mut app, ActiveSonarrBlock::Indexers, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::DeleteIndexerPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::DeleteIndexerPrompt.into()); } #[test] @@ -83,10 +81,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::RootFolders.into() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::RootFolders.into()); } #[rstest] @@ -108,7 +103,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::System.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::System.into()); } #[rstest] @@ -129,17 +124,17 @@ mod tests { } mod test_handle_submit { + use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, SonarrData, }; use crate::models::servarr_models::{Indexer, IndexerField}; + use crate::network::sonarr_network::SonarrEvent; use bimap::BiMap; use pretty_assertions::assert_eq; use serde_json::{Number, Value}; - use crate::network::sonarr_network::SonarrEvent; - use super::*; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -201,10 +196,7 @@ mod tests { IndexersHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::Indexers, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditIndexerPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); assert_eq!( app.data.sonarr_data.edit_indexer_modal, Some((&app.data.sonarr_data).into()) @@ -265,7 +257,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DeleteIndexer(1)) ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); } #[test] @@ -289,7 +281,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); } } @@ -297,6 +289,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -316,7 +309,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.data.sonarr_data.prompt_confirm); } @@ -330,7 +323,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::TestIndexer, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert_eq!(app.data.sonarr_data.indexer_test_errors, None); } @@ -344,7 +337,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Indexers, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(app.error.text.is_empty()); } } @@ -353,6 +346,7 @@ mod tests { use pretty_assertions::assert_eq; use crate::{ + assert_navigation_popped, models::servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, network::sonarr_network::SonarrEvent, }; @@ -377,7 +371,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Indexers.into()); assert!(app.should_refresh); } @@ -427,10 +421,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AllIndexerSettingsPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::AllIndexerSettingsPrompt.into()); assert_eq!( app.data.sonarr_data.selected_block.blocks, INDEXER_SETTINGS_SELECTION_BLOCKS @@ -477,10 +468,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::TestIndexer.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::TestIndexer.into()); } #[test] @@ -523,10 +511,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::TestAllIndexers.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::TestAllIndexers.into()); } #[test] @@ -571,7 +556,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DeleteIndexer(1)) ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); } } diff --git a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs index c1cd446..7f81072 100644 --- a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -2,6 +2,8 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_modal_absent; + use crate::assert_navigation_pushed; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; @@ -12,7 +14,9 @@ mod tests { mod test_handle_esc { use super::*; + use crate::assert_navigation_pushed; use crate::models::stateful_table::StatefulTable; + use crate::{assert_modal_absent, assert_navigation_popped}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -32,9 +36,9 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.data.sonarr_data.prompt_confirm); - assert!(app.data.sonarr_data.indexer_test_all_results.is_none()); + assert_modal_absent!(app.data.sonarr_data.indexer_test_all_results); } } diff --git a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs index 2e8a3a0..85827cb 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs @@ -7,6 +7,9 @@ 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::sonarr_handlers::library::add_series_handler::AddSeriesHandler; @@ -894,16 +897,16 @@ mod tests { } mod test_handle_submit { - use bimap::BiMap; - use pretty_assertions::{assert_eq, assert_str_eq}; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; use crate::models::sonarr_models::Series; use crate::models::stateful_table::StatefulTable; use crate::network::sonarr_network::SonarrEvent; + use bimap::BiMap; + use pretty_assertions::{assert_eq, assert_str_eq}; + use rstest::rstest; use super::*; @@ -925,10 +928,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesSearchResults.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::AddSeriesSearchResults.into()); } #[test] @@ -972,15 +972,12 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::AddSeriesPrompt.into()); assert_eq!( app.data.sonarr_data.selected_block.get_active_block(), ActiveSonarrBlock::AddSeriesSelectRootFolder ); - assert!(app.data.sonarr_data.add_series_modal.is_some()); + assert_modal_present!(app.data.sonarr_data.add_series_modal); assert!( !app .data @@ -1048,7 +1045,7 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::AddSeriesSearchResults.into() ); - assert!(app.data.sonarr_data.add_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.add_series_modal); } #[test] @@ -1091,10 +1088,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesAlreadyInLibrary.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::AddSeriesAlreadyInLibrary.into()); } #[test] @@ -1117,7 +1111,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); } @@ -1200,12 +1194,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::AddSeries(expected_add_series_body)) ); - assert!(app.data.sonarr_data.add_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.add_series_modal); } #[rstest] @@ -1233,7 +1227,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), selected_block.into()); + assert_navigation_pushed!(app, selected_block.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); if selected_block == ActiveSonarrBlock::AddSeriesTagsInput { @@ -1260,10 +1254,7 @@ mod tests { AddSeriesHandler::new(SUBMIT_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesPrompt.into()); if active_sonarr_block == ActiveSonarrBlock::AddSeriesTagsInput { assert!(!app.ignore_special_keys_for_textbox_input); @@ -1332,9 +1323,10 @@ mod tests { use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::stateful_table::StatefulTable; - use crate::simple_stateful_iterable_vec; + use crate::{assert_navigation_popped, simple_stateful_iterable_vec}; use super::*; + use crate::assert_navigation_pushed; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -1356,7 +1348,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!(app.data.sonarr_data.add_series_search, None); } @@ -1378,10 +1370,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesPrompt.into()); } #[rstest] @@ -1405,11 +1394,8 @@ mod tests { AddSeriesHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesSearchInput.into() - ); - assert!(app.data.sonarr_data.add_searched_series.is_none()); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesSearchInput.into()); + assert_modal_absent!(app.data.sonarr_data.add_searched_series); assert!(app.ignore_special_keys_for_textbox_input); } @@ -1429,10 +1415,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesSearchResults.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesSearchResults.into()); } #[test] @@ -1447,11 +1430,8 @@ mod tests { AddSeriesHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::AddSeriesPrompt, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesSearchResults.into() - ); - assert!(app.data.sonarr_data.add_series_modal.is_none()); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesSearchResults.into()); + assert_modal_absent!(app.data.sonarr_data.add_series_modal); } #[test] @@ -1472,10 +1452,7 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesPrompt.into()); } #[rstest] @@ -1496,16 +1473,14 @@ mod tests { AddSeriesHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::AddSeriesPrompt.into()); } } mod test_handle_key_char { use super::*; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::sonarr::{modals::AddSeriesModal, sonarr_data::ADD_SERIES_SELECTION_BLOCKS}, @@ -1701,12 +1676,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::AddSeries(expected_add_series_body)) ); - assert!(app.data.sonarr_data.add_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.add_series_modal); } } @@ -1824,7 +1799,7 @@ mod tests { .build_add_series_body(); assert_eq!(add_series_body, expected_add_series_body); - assert!(app.data.sonarr_data.add_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.add_series_modal); } #[test] diff --git a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs index 665e285..341db95 100644 --- a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::delete_series_handler::DeleteSeriesHandler; @@ -91,6 +92,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -117,7 +119,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); assert!(!app.data.sonarr_data.prompt_confirm); assert!(!app.data.sonarr_data.delete_series_files); @@ -154,7 +156,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DeleteSeries(expected_delete_series_params)) @@ -228,6 +230,7 @@ mod tests { mod test_handle_esc { use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -251,7 +254,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert!(!app.data.sonarr_data.prompt_confirm); assert!(!app.data.sonarr_data.delete_series_files); assert!(!app.data.sonarr_data.add_list_exclusion); @@ -260,6 +263,7 @@ mod tests { mod test_handle_key_char { use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, }, @@ -298,7 +302,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DeleteSeries(expected_delete_series_params)) diff --git a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs index 211c2d2..838822a 100644 --- a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs @@ -7,6 +7,8 @@ mod tests { 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::sonarr_handlers::library::edit_series_handler::EditSeriesHandler; @@ -25,7 +27,7 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::EDIT_SERIES_SELECTION_BLOCKS; use super::*; - + #[rstest] fn test_edit_series_select_series_type_scroll( #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, @@ -663,13 +665,13 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_SERIES_SELECTION_BLOCKS; use crate::models::{BlockSelectionState, Route}; use crate::network::sonarr_network::SonarrEvent; + use pretty_assertions::assert_eq; + use rstest::rstest; use super::*; @@ -707,10 +709,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } #[test] @@ -745,10 +744,7 @@ mod tests { .text .is_empty() ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } #[test] @@ -772,7 +768,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); } @@ -834,12 +830,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::EditSeries(expected_edit_series_params)) ); - assert!(app.data.sonarr_data.edit_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_series_modal); assert!(app.should_refresh); } @@ -1006,8 +1002,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, (selected_block, Some(ActiveSonarrBlock::Series)).into() ); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); @@ -1082,10 +1078,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); if active_sonarr_block == ActiveSonarrBlock::EditSeriesPathInput || active_sonarr_block == ActiveSonarrBlock::EditSeriesTagsInput @@ -1096,11 +1089,11 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; - use rstest::rstest; - + use crate::assert_navigation_popped; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; + use pretty_assertions::assert_eq; + use rstest::rstest; use super::*; @@ -1124,10 +1117,7 @@ mod tests { EditSeriesHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EditSeriesPrompt.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } #[test] @@ -1140,9 +1130,9 @@ mod tests { EditSeriesHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::EditSeriesPrompt, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); - assert!(app.data.sonarr_data.edit_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_series_modal); assert!(!app.data.sonarr_data.prompt_confirm); } @@ -1164,13 +1154,14 @@ mod tests { EditSeriesHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } } mod test_handle_key_char { use super::*; use crate::{ + assert_navigation_popped, models::{ BlockSelectionState, servarr_data::sonarr::{ @@ -1352,12 +1343,12 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::EditSeries(expected_edit_series_params)) ); - assert!(app.data.sonarr_data.edit_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_series_modal); assert!(app.should_refresh); } } @@ -1442,7 +1433,7 @@ mod tests { .build_edit_series_params(); assert_eq!(edit_series_params, expected_edit_series_params); - assert!(app.data.sonarr_data.edit_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_series_modal); } #[test] diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs index 6303820..c8d676b 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs @@ -2,6 +2,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::episode_details_handler::EpisodeDetailsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::episode; @@ -103,7 +104,7 @@ mod tests { .episode_details_tabs .get_active_route() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); EpisodeDetailsHandler::new(DEFAULT_KEYBINDINGS.right.key, &mut app, left_block, None) .handle(); @@ -122,12 +123,13 @@ mod tests { .episode_details_tabs .get_active_route() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } } mod test_handle_submit { use super::*; + use crate::assert_navigation_popped; use crate::event::Key; use crate::models::stateful_table::StatefulTable; use crate::network::sonarr_network::SonarrEvent; @@ -148,10 +150,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EpisodeHistoryDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::EpisodeHistoryDetails.into()); } #[test] @@ -238,7 +237,7 @@ mod tests { EpisodeDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_pushed!(app, active_sonarr_block.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(expected_action) @@ -262,10 +261,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::ManualEpisodeSearch.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::ManualEpisodeSearch.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { @@ -293,10 +289,7 @@ mod tests { EpisodeDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EpisodeDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EpisodeDetails.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); } @@ -314,8 +307,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt.into() ); } @@ -344,6 +337,7 @@ mod tests { mod test_handle_esc { use super::*; + use crate::assert_navigation_popped; use crate::event::Key; use pretty_assertions::assert_eq; @@ -364,10 +358,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EpisodeHistory.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EpisodeHistory.into()); } #[rstest] @@ -389,10 +380,7 @@ mod tests { EpisodeDetailsHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EpisodeDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::EpisodeDetails.into()); } #[rstest] @@ -412,10 +400,7 @@ mod tests { EpisodeDetailsHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeasonDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeasonDetails.into()); assert!( app .data @@ -431,6 +416,7 @@ mod tests { mod test_handle_key_char { use super::*; + use crate::assert_navigation_popped; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::assert_eq; @@ -457,8 +443,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveSonarrBlock::AutomaticallySearchEpisodePrompt.into() ); } @@ -511,7 +497,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_pushed!(app, active_sonarr_block.into()); assert!(app.is_routing); } @@ -576,7 +562,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_popped!(app, active_sonarr_block.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::TriggerAutomaticEpisodeSearch(1)) @@ -600,10 +586,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::ManualEpisodeSearch.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::ManualEpisodeSearch.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { diff --git a/src/handlers/sonarr_handlers/library/library_handler_tests.rs b/src/handlers/sonarr_handlers/library/library_handler_tests.rs index 38c4c0f..b956cc0 100644 --- a/src/handlers/sonarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/library_handler_tests.rs @@ -7,6 +7,9 @@ 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::sonarr_handlers::library::{LibraryHandler, series_sorting_options}; @@ -71,6 +74,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_series_tab_left(#[values(true, false)] is_ready: bool) { @@ -90,7 +94,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::System.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::System.into()); } #[rstest] @@ -111,7 +115,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Downloads.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Downloads.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Downloads.into()); } #[rstest] @@ -144,9 +148,9 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::network::sonarr_network::SonarrEvent; + use pretty_assertions::assert_eq; use super::*; @@ -163,10 +167,7 @@ mod tests { LibraryHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::Series, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SeriesDetails.into()); } #[test] @@ -210,7 +211,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::UpdateAllSeries) ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } #[test] @@ -234,7 +235,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } } @@ -244,6 +245,7 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -262,7 +264,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert!(!app.data.sonarr_data.prompt_confirm); } @@ -277,7 +279,7 @@ mod tests { LibraryHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Series, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); assert!(app.error.text.is_empty()); } } @@ -292,7 +294,7 @@ mod tests { use crate::models::sonarr_models::SeriesType; use crate::network::sonarr_network::SonarrEvent; - use crate::test_edit_series_key; + use crate::{assert_navigation_popped, test_edit_series_key}; use super::*; @@ -313,12 +315,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddSeriesSearchInput.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::AddSeriesSearchInput.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.sonarr_data.add_series_search.is_some()); + assert_modal_present!(app.data.sonarr_data.add_series_search); } #[test] @@ -342,7 +341,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(app.data.sonarr_data.add_series_search.is_none()); + assert_modal_absent!(app.data.sonarr_data.add_series_search); } #[test] @@ -374,7 +373,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); - assert!(app.data.sonarr_data.edit_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_series_modal); } #[test] @@ -418,7 +417,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); assert!(!app.data.sonarr_data.prompt_confirm); - assert!(app.data.sonarr_data.prompt_confirm_action.is_none()); + assert_modal_absent!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.is_routing); } @@ -439,10 +438,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::UpdateAllSeriesPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::UpdateAllSeriesPrompt.into()); } #[test] @@ -485,7 +481,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Series.into()); assert!(app.should_refresh); } @@ -536,7 +532,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::UpdateAllSeries) ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } } diff --git a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs index dd31c7f..f35e15d 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs @@ -2,6 +2,8 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_modal_absent; + use crate::assert_navigation_pushed; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::season_details_handler::{ SeasonDetailsHandler, releases_sorting_options, @@ -37,10 +39,7 @@ mod tests { SeasonDetailsHandler::new(DELETE_KEY, &mut app, ActiveSonarrBlock::SeasonDetails, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::DeleteEpisodeFilePrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::DeleteEpisodeFilePrompt.into()); } #[test] @@ -139,7 +138,7 @@ mod tests { .season_details_tabs .get_active_route() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); SeasonDetailsHandler::new(DEFAULT_KEYBINDINGS.right.key, &mut app, left_block, None).handle(); @@ -154,12 +153,13 @@ mod tests { .season_details_tabs .get_active_route() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } } mod test_handle_submit { use super::*; + use crate::assert_navigation_popped; use crate::event::Key; use crate::models::stateful_table::StatefulTable; use crate::network::sonarr_network::SonarrEvent; @@ -176,10 +176,7 @@ mod tests { SeasonDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::SeasonDetails, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::EpisodeDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::EpisodeDetails.into()); } #[test] @@ -227,10 +224,7 @@ mod tests { SeasonDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::SeasonHistory, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeasonHistoryDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SeasonHistoryDetails.into()); } #[test] @@ -295,7 +289,7 @@ mod tests { SeasonDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_popped!(app, active_sonarr_block.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(expected_action) @@ -319,10 +313,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::ManualSeasonSearch.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::ManualSeasonSearch.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { @@ -352,10 +343,7 @@ mod tests { SeasonDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeasonDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeasonDetails.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); } @@ -373,8 +361,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt.into() ); } @@ -403,6 +391,7 @@ mod tests { mod test_handle_esc { use super::*; + use crate::assert_navigation_popped; use crate::event::Key; use crate::models::sonarr_models::SonarrHistoryItem; use crate::models::stateful_table::StatefulTable; @@ -426,10 +415,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeasonHistory.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeasonHistory.into()); } #[rstest] @@ -452,10 +438,7 @@ mod tests { SeasonDetailsHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeasonDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeasonDetails.into()); } #[test] @@ -536,16 +519,14 @@ mod tests { SeasonDetailsHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesDetails.into() - ); - assert!(app.data.sonarr_data.season_details_modal.is_none()); + assert_navigation_popped!(app, ActiveSonarrBlock::SeriesDetails.into()); + assert_modal_absent!(app.data.sonarr_data.season_details_modal); } } mod test_handle_key_char { use super::*; + use crate::assert_navigation_popped; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::assert_eq; @@ -605,7 +586,7 @@ mod tests { ActiveSonarrBlock::SeasonDetails.into() ); assert!(!app.data.sonarr_data.prompt_confirm); - assert!(app.data.sonarr_data.prompt_confirm_action.is_none()); + assert_modal_absent!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.is_routing); } @@ -630,8 +611,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveSonarrBlock::AutomaticallySearchSeasonPrompt.into() ); } @@ -682,7 +663,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_pushed!(app, active_sonarr_block.into()); assert!(app.is_routing); } @@ -743,7 +724,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_popped!(app, active_sonarr_block.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(expected_action) @@ -767,10 +748,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::ManualSeasonSearch.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::ManualSeasonSearch.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { diff --git a/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs index a6d7289..36342e8 100644 --- a/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs @@ -2,6 +2,8 @@ mod tests { 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::sonarr_handlers::library::series_details_handler::SeriesDetailsHandler; @@ -69,7 +71,7 @@ mod tests { app.get_current_route(), app.data.sonarr_data.series_info_tabs.get_active_route() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); SeriesDetailsHandler::new(DEFAULT_KEYBINDINGS.right.key, &mut app, left_block, None).handle(); @@ -77,15 +79,15 @@ mod tests { app.get_current_route(), app.data.sonarr_data.series_info_tabs.get_active_route() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } } mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::extended_stateful_iterable_vec; use crate::network::sonarr_network::SonarrEvent; + use crate::{assert_navigation_popped, extended_stateful_iterable_vec}; use super::*; @@ -103,10 +105,7 @@ mod tests { SeriesDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::SeriesDetails, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeasonDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SeasonDetails.into()); } #[test] @@ -145,10 +144,7 @@ mod tests { SeriesDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::SeriesHistory, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesHistoryDetails.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SeriesHistoryDetails.into()); } #[test] @@ -200,10 +196,7 @@ mod tests { SeriesDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeriesDetails.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(expected_action) @@ -225,16 +218,14 @@ mod tests { SeriesDetailsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeriesDetails.into()); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); } } mod test_handle_esc { use super::*; + use crate::assert_navigation_popped; use crate::models::stateful_table::StatefulTable; use pretty_assertions::assert_eq; use ratatui::widgets::TableState; @@ -255,10 +246,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesHistory.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeriesHistory.into()); } #[rstest] @@ -279,10 +267,7 @@ mod tests { SeriesDetailsHandler::new(ESC_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SeriesDetails.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SeriesDetails.into()); } #[test] @@ -343,7 +328,7 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::sonarr_models::{Series, SeriesType}; use crate::network::sonarr_network::SonarrEvent; - use crate::test_edit_series_key; + use crate::{assert_navigation_popped, test_edit_series_key}; use pretty_assertions::{assert_eq, assert_str_eq}; use serde_json::Number; use strum::IntoEnumIterator; @@ -378,7 +363,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), active_sonarr_block.into()); - assert!(app.data.sonarr_data.edit_series_modal.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_series_modal); } #[test] @@ -428,7 +413,7 @@ mod tests { ActiveSonarrBlock::SeriesDetails.into() ); assert!(!app.data.sonarr_data.prompt_confirm); - assert!(app.data.sonarr_data.prompt_confirm_action.is_none()); + assert_modal_absent!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.is_routing); } @@ -451,8 +436,8 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), + assert_navigation_pushed!( + app, ActiveSonarrBlock::AutomaticallySearchSeriesPrompt.into() ); } @@ -496,10 +481,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::UpdateAndScanSeriesPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::UpdateAndScanSeriesPrompt.into()); } #[rstest] @@ -542,7 +524,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_pushed!(app, active_sonarr_block.into()); assert!(app.is_routing); } @@ -598,7 +580,7 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_popped!(app, active_sonarr_block.into()); assert_eq!( app.data.sonarr_data.prompt_confirm_action, Some(expected_action) diff --git a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs index 9991131..a86e700 100644 --- a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs @@ -6,6 +6,9 @@ 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::sonarr_handlers::root_folders::RootFoldersHandler; @@ -94,10 +97,7 @@ mod tests { RootFoldersHandler::new(DELETE_KEY, &mut app, ActiveSonarrBlock::RootFolders, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::DeleteRootFolderPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::DeleteRootFolderPrompt.into()); } #[test] @@ -127,6 +127,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_root_folders_tab_left(#[values(true, false)] is_ready: bool) { @@ -147,7 +148,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::History.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::History.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::History.into()); } #[rstest] @@ -169,7 +170,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Indexers.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Indexers.into()); } #[rstest] @@ -254,6 +255,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use super::*; + use crate::{assert_modal_absent, assert_navigation_popped}; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -288,11 +290,8 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::AddRootFolder(expected_add_root_folder_body)) ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); - assert!(app.data.sonarr_data.edit_root_folder.is_none()); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); + assert_modal_absent!(app.data.sonarr_data.edit_root_folder); } #[test] @@ -314,7 +313,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.sonarr_data.prompt_confirm_action.is_none()); + assert_modal_absent!(app.data.sonarr_data.prompt_confirm_action); assert_eq!( app.get_current_route(), ActiveSonarrBlock::AddRootFolderPrompt.into() @@ -346,10 +345,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DeleteRootFolder(1)) ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); } #[test] @@ -373,15 +369,13 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); } } mod test_handle_esc { use super::*; + use crate::assert_navigation_popped; use pretty_assertions::assert_eq; use rstest::rstest; @@ -402,10 +396,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); assert!(!app.data.sonarr_data.prompt_confirm); } @@ -425,12 +416,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); - assert!(app.data.sonarr_data.edit_root_folder.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_root_folder); assert!(!app.data.sonarr_data.prompt_confirm); assert!(!app.ignore_special_keys_for_textbox_input); } @@ -445,18 +433,15 @@ mod tests { RootFoldersHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::RootFolders, None).handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); assert!(app.error.text.is_empty()); } } mod test_handle_key_char { - use pretty_assertions::{assert_eq, assert_str_eq}; - + use crate::assert_navigation_popped; use crate::network::sonarr_network::SonarrEvent; + use pretty_assertions::{assert_eq, assert_str_eq}; use super::*; @@ -478,12 +463,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::AddRootFolderPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::AddRootFolderPrompt.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.sonarr_data.edit_root_folder.is_some()); + assert_modal_present!(app.data.sonarr_data.edit_root_folder); } #[test] @@ -510,7 +492,7 @@ mod tests { ActiveSonarrBlock::RootFolders.into() ); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(app.data.sonarr_data.edit_root_folder.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_root_folder); } #[test] @@ -531,10 +513,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::RootFolders.into()); assert!(app.should_refresh); } @@ -638,10 +617,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::DeleteRootFolder(1)) ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::RootFolders.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); } } @@ -712,7 +688,7 @@ mod tests { .build_add_root_folder_body(); assert_eq!(root_folder, expected_add_root_folder_body); - assert!(app.data.sonarr_data.edit_root_folder.is_none()); + assert_modal_absent!(app.data.sonarr_data.edit_root_folder); } #[test] diff --git a/src/handlers/sonarr_handlers/sonarr_handler_tests.rs b/src/handlers/sonarr_handlers/sonarr_handler_tests.rs index ede3fb9..8cc007e 100644 --- a/src/handlers/sonarr_handlers/sonarr_handler_tests.rs +++ b/src/handlers/sonarr_handlers/sonarr_handler_tests.rs @@ -2,6 +2,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::SonarrHandler; use crate::handlers::sonarr_handlers::handle_change_tab_left_right_keys; @@ -33,7 +34,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), left_block.into() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); app.data.sonarr_data.main_tabs.set_index(index); @@ -43,7 +44,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), right_block.into() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } #[rstest] @@ -68,7 +69,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), left_block.into() ); - assert_eq!(app.get_current_route(), left_block.into()); + assert_navigation_pushed!(app, left_block.into()); app.data.sonarr_data.main_tabs.set_index(index); @@ -78,7 +79,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), right_block.into() ); - assert_eq!(app.get_current_route(), right_block.into()); + assert_navigation_pushed!(app, right_block.into()); } #[rstest] diff --git a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs index 15c0af0..ebbb96e 100644 --- a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs @@ -6,6 +6,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; @@ -652,9 +653,9 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; - + use crate::assert_navigation_popped; use crate::network::sonarr_network::SonarrEvent; + use pretty_assertions::assert_eq; use super::*; @@ -669,10 +670,7 @@ mod tests { SystemDetailsHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::SystemTasks, None) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemTaskStartConfirmPrompt.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SystemTaskStartConfirmPrompt.into()); } #[test] @@ -717,10 +715,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::StartTask(SonarrTaskName::default())) ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SystemTasks.into()); } #[test] @@ -740,10 +735,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SystemTasks.into()); } } @@ -753,6 +745,7 @@ mod tests { use rstest::rstest; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -775,7 +768,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::SystemLogs, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); assert!(app.data.sonarr_data.log_details.items.is_empty()); } @@ -793,7 +786,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::SystemTasks, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); } #[rstest] @@ -816,7 +809,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); } #[rstest] @@ -828,7 +821,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::SystemUpdates, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); } #[test] @@ -846,10 +839,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SystemTasks.into()); assert!(!app.data.sonarr_data.prompt_confirm); } } @@ -861,6 +851,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; #[rstest] fn test_refresh_key( @@ -885,7 +876,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), active_sonarr_block.into()); + assert_navigation_pushed!(app, active_sonarr_block.into()); assert!(app.should_refresh); } @@ -943,10 +934,7 @@ mod tests { app.data.sonarr_data.prompt_confirm_action, Some(SonarrEvent::StartTask(SonarrTaskName::default())) ); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemTasks.into() - ); + assert_navigation_popped!(app, ActiveSonarrBlock::SystemTasks.into()); } } diff --git a/src/handlers/sonarr_handlers/system/system_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_handler_tests.rs index a0dd688..b15a313 100644 --- a/src/handlers/sonarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_handler_tests.rs @@ -5,6 +5,7 @@ mod tests { use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::system::SystemHandler; @@ -19,6 +20,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::assert_navigation_pushed; #[rstest] fn test_system_tab_left(#[values(true, false)] is_ready: bool) { @@ -39,7 +41,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Indexers.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Indexers.into()); } #[rstest] @@ -61,7 +63,7 @@ mod tests { app.data.sonarr_data.main_tabs.get_active_route(), ActiveSonarrBlock::Series.into() ); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::Series.into()); } } @@ -69,6 +71,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -82,7 +85,7 @@ mod tests { SystemHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::System, None).handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); assert!(app.error.text.is_empty()); } } @@ -121,10 +124,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemUpdates.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SystemUpdates.into()); } #[test] @@ -185,10 +185,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemQueuedEvents.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SystemQueuedEvents.into()); } #[test] @@ -249,7 +246,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); + assert_navigation_pushed!(app, ActiveSonarrBlock::System.into()); assert!(app.should_refresh); } @@ -313,10 +310,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemLogs.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SystemLogs.into()); assert_eq!( app.data.sonarr_data.log_details.items, app.data.sonarr_data.logs.items @@ -386,10 +380,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveSonarrBlock::SystemTasks.into() - ); + assert_navigation_pushed!(app, ActiveSonarrBlock::SystemTasks.into()); } #[test] diff --git a/src/handlers/table_handler_tests.rs b/src/handlers/table_handler_tests.rs index 7e55eaa..0f627be 100644 --- a/src/handlers/table_handler_tests.rs +++ b/src/handlers/table_handler_tests.rs @@ -2,6 +2,9 @@ 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::table_handler::TableHandlingConfig; @@ -736,8 +739,8 @@ mod tests { mod test_handle_submit { use pretty_assertions::{assert_eq, assert_str_eq}; - use crate::extended_stateful_iterable_vec; use crate::models::HorizontallyScrollableText; + use crate::{assert_navigation_popped, extended_stateful_iterable_vec}; use super::*; @@ -764,7 +767,7 @@ mod tests { app.data.radarr_data.movies.current_selection().title.text, "Test 2" ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } #[test] @@ -788,10 +791,7 @@ mod tests { app.data.radarr_data.movies.current_selection().title.text, "Test 1" ); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SearchMovieError.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SearchMovieError.into()); } #[test] @@ -820,7 +820,7 @@ mod tests { app.data.radarr_data.movies.current_selection().title.text, "Test 2" ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } #[test] @@ -840,7 +840,7 @@ mod tests { TableHandlerUnit::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::FilterMovies, None).handle(); - assert!(app.data.radarr_data.movies.filtered_items.is_some()); + assert_modal_present!(app.data.radarr_data.movies.filtered_items); assert!(!app.ignore_special_keys_for_textbox_input); assert_eq!( app @@ -857,7 +857,7 @@ mod tests { app.data.radarr_data.movies.current_selection().title.text, "Test 1" ); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } #[test] @@ -878,11 +878,8 @@ mod tests { TableHandlerUnit::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::FilterMovies, None).handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.movies.filtered_items.is_none()); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::FilterMoviesError.into() - ); + assert_modal_absent!(app.data.radarr_data.movies.filtered_items); + assert_navigation_pushed!(app, ActiveRadarrBlock::FilterMoviesError.into()); } #[test] @@ -906,7 +903,7 @@ mod tests { ) .handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert_eq!(app.data.radarr_data.movies.items, expected_vec); } } @@ -919,6 +916,7 @@ mod tests { use crate::models::stateful_table::StatefulTable; use super::*; + use crate::{assert_navigation_popped, assert_navigation_pushed}; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -936,7 +934,7 @@ mod tests { TableHandlerUnit::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); assert_eq!(app.data.radarr_data.movies.search, None); } @@ -965,7 +963,7 @@ mod tests { TableHandlerUnit::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); assert_eq!(app.data.radarr_data.movies.filter, None); assert_eq!(app.data.radarr_data.movies.filtered_items, None); @@ -981,7 +979,7 @@ mod tests { TableHandlerUnit::new(ESC_KEY, &mut app, ActiveRadarrBlock::MoviesSortPrompt, None).handle(); - assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); + assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } #[test] @@ -1033,10 +1031,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::SearchMovie.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::SearchMovie.into()); assert!(app.ignore_special_keys_for_textbox_input); assert_eq!( app.data.radarr_data.movies.search, @@ -1107,12 +1102,9 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::FilterMovies.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::FilterMovies.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.movies.filter.is_some()); + assert_modal_present!(app.data.radarr_data.movies.filter); } #[test] @@ -1136,7 +1128,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(app.data.radarr_data.movies.filter.is_none()); + assert_modal_absent!(app.data.radarr_data.movies.filter); } #[test] @@ -1160,17 +1152,14 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::FilterMovies.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::FilterMovies.into()); assert!(app.ignore_special_keys_for_textbox_input); assert_eq!( app.data.radarr_data.movies.filter, Some(HorizontallyScrollableText::default()) ); - assert!(app.data.radarr_data.movies.filtered_items.is_none()); - assert!(app.data.radarr_data.movies.filtered_state.is_none()); + assert_modal_absent!(app.data.radarr_data.movies.filtered_items); + assert_modal_absent!(app.data.radarr_data.movies.filtered_state); } #[test] @@ -1312,10 +1301,7 @@ mod tests { ) .handle(); - assert_eq!( - app.get_current_route(), - ActiveRadarrBlock::MoviesSortPrompt.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::MoviesSortPrompt.into()); assert_eq!( app.data.radarr_data.movies.sort.as_ref().unwrap().items, sort_options() @@ -1343,7 +1329,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); - assert!(app.data.radarr_data.movies.sort.is_none()); + assert_modal_absent!(app.data.radarr_data.movies.sort); } #[test] @@ -1364,7 +1350,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); - assert!(app.data.radarr_data.movies.sort.is_none()); + assert_modal_absent!(app.data.radarr_data.movies.sort); } } From f6c4c1623f0cb73e2916114ac81e6c57e44bb297 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Thu, 4 Dec 2025 23:03:48 -0700 Subject: [PATCH 09/28] style: Removed unused imports after massive handler testing refactor --- src/handlers/keybinding_handler_tests.rs | 4 +- .../blocklist/blocklist_handler_tests.rs | 7 +- .../collection_details_handler_tests.rs | 69 +++--- .../collections/collections_handler_tests.rs | 19 +- .../edit_collection_handler_tests.rs | 29 +-- .../downloads/downloads_handler_tests.rs | 9 +- .../indexers/edit_indexer_handler_tests.rs | 222 ++++++++---------- .../edit_indexer_settings_handler_tests.rs | 38 ++- .../indexers/indexers_handler_tests.rs | 10 +- .../test_all_indexers_handler_tests.rs | 8 +- .../library/add_movie_handler_tests.rs | 75 +++--- .../library/delete_movie_handler_tests.rs | 16 +- .../library/edit_movie_handler_tests.rs | 49 ++-- .../library/library_handler_tests.rs | 13 +- .../library/movie_details_handler_tests.rs | 9 +- .../root_folders_handler_tests.rs | 7 +- .../system/system_details_handler_tests.rs | 7 +- .../system/system_handler_tests.rs | 7 +- .../blocklist/blocklist_handler_tests.rs | 7 +- .../downloads/downloads_handler_tests.rs | 9 +- .../history/history_handler_tests.rs | 6 +- .../indexers/edit_indexer_handler_tests.rs | 222 ++++++++---------- .../edit_indexer_settings_handler_tests.rs | 14 +- .../indexers/indexers_handler_tests.rs | 10 +- .../test_all_indexers_handler_tests.rs | 8 +- .../library/add_series_handler_tests.rs | 75 +++--- .../library/delete_series_handler_tests.rs | 16 +- .../library/edit_series_handler_tests.rs | 51 ++-- .../library/episode_details_handler_tests.rs | 23 +- .../library/library_handler_tests.rs | 13 +- .../root_folders_handler_tests.rs | 7 +- .../system/system_details_handler_tests.rs | 7 +- .../system/system_handler_tests.rs | 7 +- src/handlers/table_handler_tests.rs | 10 +- 34 files changed, 484 insertions(+), 599 deletions(-) diff --git a/src/handlers/keybinding_handler_tests.rs b/src/handlers/keybinding_handler_tests.rs index 0556d7e..f5e94eb 100644 --- a/src/handlers/keybinding_handler_tests.rs +++ b/src/handlers/keybinding_handler_tests.rs @@ -2,7 +2,6 @@ mod tests { use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::assert_navigation_pushed; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::KeybindingHandler; @@ -12,9 +11,8 @@ mod tests { mod test_handle_esc { use super::*; - use crate::assert_navigation_pushed; + use crate::assert_modal_absent; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::{assert_modal_absent, assert_navigation_popped}; use pretty_assertions::assert_eq; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs index 14576df..bac50b9 100644 --- a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs @@ -7,12 +7,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::radarr_handlers::blocklist::{blocklist_sorting_options, BlocklistHandler}; use crate::handlers::KeyEventHandler; - use crate::handlers::radarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; use crate::models::radarr_models::{BlocklistItem, BlocklistItemMovie}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; @@ -204,13 +204,12 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use crate::handlers::radarr_handlers::downloads::DownloadsHandler; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs index fb943c9..5d12e90 100644 --- a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::CollectionMovie; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, @@ -17,9 +17,9 @@ mod tests { mod test_handle_submit { use crate::assert_navigation_pushed; - use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use bimap::BiMap; use pretty_assertions::assert_eq; @@ -60,43 +60,37 @@ mod tests { ) .into() ); - assert!( - !app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty() - ); + assert!(!app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty()); assert_eq!( app.data.radarr_data.selected_block.get_active_block(), ActiveRadarrBlock::AddMovieSelectRootFolder ); - assert!( - !app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .minimum_availability_list - .items - .is_empty() - ); - assert!( - !app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty() - ); + assert!(!app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .minimum_availability_list + .items + .is_empty()); + assert!(!app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty()); assert_str_eq!( app .data @@ -165,7 +159,6 @@ mod tests { mod test_handle_esc { use super::*; use crate::assert_navigation_popped; - use pretty_assertions::assert_eq; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -220,7 +213,7 @@ mod tests { use crate::models::radarr_models::{Collection, MinimumAvailability}; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, + RadarrData, EDIT_COLLECTION_SELECTION_BLOCKS, }; use crate::test_edit_collection_key; diff --git a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs index fd7b683..2a0c028 100644 --- a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs @@ -7,18 +7,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::collections::{ - CollectionsHandler, collections_sorting_options, + collections_sorting_options, CollectionsHandler, }; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Collection, CollectionMovie}; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS, + ActiveRadarrBlock, COLLECTIONS_BLOCKS, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS, }; use crate::test_handler_delegation; @@ -197,7 +197,6 @@ mod tests { mod test_handle_esc { use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; - use pretty_assertions::assert_eq; use super::*; @@ -233,9 +232,7 @@ mod tests { CollectionsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Collections, None).handle(); - assert_navigation_popped!(app, - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); assert!(app.error.text.is_empty()); } } @@ -248,7 +245,7 @@ mod tests { use crate::models::radarr_models::MinimumAvailability; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, + RadarrData, EDIT_COLLECTION_SELECTION_BLOCKS, }; use crate::network::radarr_network::RadarrEvent; use crate::{assert_navigation_popped, test_edit_collection_key}; @@ -354,9 +351,7 @@ mod tests { ) .handle(); - assert_navigation_pushed!(app, - ActiveRadarrBlock::Collections.into() - ); + assert_navigation_pushed!(app, ActiveRadarrBlock::Collections.into()); assert!(app.should_refresh); } diff --git a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs index c771e31..a2d5153 100644 --- a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::collections::edit_collection_handler::EditCollectionHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::collection; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Collection, EditCollectionParams, MinimumAvailability}; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ @@ -24,9 +24,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -477,17 +477,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_collection_modal - .as_ref() - .unwrap() - .path - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_collection_modal + .as_ref() + .unwrap() + .path + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditCollectionPrompt.into()); } @@ -792,7 +790,6 @@ mod tests { mod test_handle_esc { use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; @@ -868,10 +865,10 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::radarr::{ modals::EditCollectionModal, radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS, }, + BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs index f539a4b..79244f0 100644 --- a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs @@ -4,13 +4,13 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::downloads::DownloadsHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::download_record; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; @@ -128,7 +128,7 @@ mod tests { use crate::network::radarr_network::RadarrEvent; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -193,11 +193,10 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs index e063370..94e7628 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::radarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -422,11 +422,11 @@ mod tests { use std::sync::atomic::Ordering; use crate::app::App; - use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; + use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -856,7 +856,7 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ - BlockSelectionState, servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, BlockSelectionState, }; use crate::network::radarr_network::RadarrEvent; @@ -1054,16 +1054,14 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!( - app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap() - ); + assert!(app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap()); EditIndexerHandler::new( SUBMIT_KEY, @@ -1077,16 +1075,14 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap()); } #[test] @@ -1111,16 +1107,14 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!( - app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap() - ); + assert!(app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap()); EditIndexerHandler::new( SUBMIT_KEY, @@ -1134,16 +1128,14 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap()); } #[test] @@ -1168,16 +1160,14 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!( - app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap() - ); + assert!(app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap()); EditIndexerHandler::new( SUBMIT_KEY, @@ -1191,16 +1181,14 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap()); } #[test] @@ -1224,17 +1212,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .name - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .name + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1259,17 +1245,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .url - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .url + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1294,17 +1278,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .api_key - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .api_key + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1329,17 +1311,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .seed_ratio - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .seed_ratio + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1364,17 +1344,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .tags - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .tags + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } } @@ -1382,9 +1360,9 @@ mod tests { mod test_handle_esc { use super::*; use crate::app::App; + use crate::assert_navigation_popped; use crate::event::Key; use crate::models::servarr_data::modals::EditIndexerModal; - use crate::{assert_navigation_popped, assert_navigation_pushed}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -1444,9 +1422,9 @@ mod tests { use super::*; use crate::app::App; use crate::assert_navigation_popped; - use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 482fa05..5f0f0e1 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -4,14 +4,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer_settings; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::BlockSelectionState; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -269,9 +269,9 @@ mod tests { mod test_handle_left_right_action { use std::sync::atomic::Ordering; - use crate::models::BlockSelectionState; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -428,8 +428,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, radarr_models::IndexerSettings, - servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, + radarr_models::IndexerSettings, + servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, }, network::radarr_network::RadarrEvent, }; @@ -739,17 +739,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .indexer_settings - .as_ref() - .unwrap() - .whitelisted_hardcoded_subs - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .indexer_settings + .as_ref() + .unwrap() + .whitelisted_hardcoded_subs + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::AllIndexerSettingsPrompt.into()); } @@ -782,7 +780,7 @@ mod tests { use crate::models::radarr_models::IndexerSettings; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -866,8 +864,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, radarr_models::IndexerSettings, - servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, + radarr_models::IndexerSettings, + servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs index 4fc3cc9..341279f 100644 --- a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs @@ -4,15 +4,15 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::IndexersHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, + ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, }; use crate::models::servarr_models::Indexer; use crate::test_handler_delegation; @@ -125,7 +125,7 @@ mod tests { use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ - EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, RadarrData, + RadarrData, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; use crate::models::servarr_models::{Indexer, IndexerField}; use crate::network::radarr_network::RadarrEvent; @@ -283,7 +283,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs index 179f7c1..0f4a6b6 100644 --- a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -1,11 +1,9 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::assert_modal_absent; - use crate::assert_navigation_pushed; - use crate::handlers::KeyEventHandler; + use crate::app::App; use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::stateful_table::StatefulTable; @@ -14,10 +12,8 @@ mod tests { mod test_handle_esc { use super::*; - use crate::assert_navigation_pushed; use crate::models::stateful_table::StatefulTable; use crate::{assert_modal_absent, assert_navigation_popped}; - use pretty_assertions::assert_eq; use rstest::rstest; #[rstest] diff --git a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs index e8a69a5..d4c6540 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs @@ -9,18 +9,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::add_movie_handler::AddMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::add_movie_body; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::collection_movie; - use crate::models::HorizontallyScrollableText; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{AddMovieSearchResult, MinimumAvailability, MovieMonitor}; use crate::models::servarr_data::radarr::modals::AddMovieModal; - use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; + use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; use crate::models::servarr_models::RootFolder; + use crate::models::HorizontallyScrollableText; use bimap::BiMap; mod test_handle_scroll_up_and_down { @@ -28,9 +28,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use crate::simple_stateful_iterable_vec; use super::*; @@ -768,11 +768,11 @@ mod tests { use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{ add_movie_body, add_movie_search_result, collection_movie, }; - use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; use crate::models::stateful_table::StatefulTable; + use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use bimap::BiMap; use pretty_assertions::{assert_eq, assert_str_eq}; @@ -851,39 +851,33 @@ mod tests { ActiveRadarrBlock::AddMovieSelectRootFolder ); assert_modal_present!(app.data.radarr_data.add_movie_modal); - assert!( - !app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty() - ); - assert!( - !app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .minimum_availability_list - .items - .is_empty() - ); - assert!( - !app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty() - ); + assert!(!app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty()); + assert!(!app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .minimum_availability_list + .items + .is_empty()); + assert!(!app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty()); assert_str_eq!( app .data @@ -1147,7 +1141,6 @@ mod tests { use crate::{assert_navigation_popped, simple_stateful_iterable_vec}; use super::*; - use crate::assert_navigation_pushed; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -1327,9 +1320,9 @@ mod tests { add_movie_body, add_movie_search_result, collection_movie, }, models::{ - BlockSelectionState, servarr_data::radarr::{modals::AddMovieModal, radarr_data::ADD_MOVIE_SELECTION_BLOCKS}, stateful_table::StatefulTable, + BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs index 579f01c..8ed4737 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs @@ -4,13 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::assert_navigation_pushed; + use crate::app::App; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::DeleteMovieParams; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; @@ -18,8 +17,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -84,12 +83,12 @@ mod tests { mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -224,8 +223,7 @@ mod tests { mod test_handle_esc { use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; - use pretty_assertions::assert_eq; + use crate::assert_navigation_popped; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -259,7 +257,7 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, + servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs index 2e0a9c6..7a6a706 100644 --- a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::edit_movie_handler::EditMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{EditMovieParams, MinimumAvailability, Movie}; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS}; @@ -22,9 +22,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_MOVIE_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -568,17 +568,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_movie_modal - .as_ref() - .unwrap() - .path - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_movie_modal + .as_ref() + .unwrap() + .path + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } @@ -602,17 +600,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .radarr_data - .edit_movie_modal - .as_mut() - .unwrap() - .tags - .text - .is_empty() - ); + assert!(!app + .data + .radarr_data + .edit_movie_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty()); assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } @@ -892,7 +888,6 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; @@ -959,8 +954,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::radarr::{modals::EditMovieModal, radarr_data::EDIT_MOVIE_SELECTION_BLOCKS}, + BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/library_handler_tests.rs b/src/handlers/radarr_handlers/library/library_handler_tests.rs index b21a52f..236c701 100644 --- a/src/handlers/radarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/library_handler_tests.rs @@ -5,18 +5,18 @@ mod tests { use std::cmp::Ordering; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::radarr_handlers::library::{LibraryHandler, movies_sorting_options}; + use crate::handlers::radarr_handlers::library::{movies_sorting_options, LibraryHandler}; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::{ - ADD_MOVIE_BLOCKS, ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, + ActiveRadarrBlock, ADD_MOVIE_BLOCKS, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, MOVIE_DETAILS_BLOCKS, }; use crate::models::servarr_models::Language; @@ -240,14 +240,13 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use ratatui::widgets::TableState; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::stateful_table::StatefulTable; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -302,7 +301,7 @@ mod tests { use crate::models::radarr_models::MinimumAvailability; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, + RadarrData, EDIT_MOVIE_SELECTION_BLOCKS, }; use crate::network::radarr_network::RadarrEvent; diff --git a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs index e2b6d37..eca2523 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -7,16 +7,16 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::movie_details_handler::{ - MovieDetailsHandler, releases_sorting_options, + releases_sorting_options, MovieDetailsHandler, }; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{movie, release}; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Credit, MovieHistoryItem}; use crate::models::radarr_models::{RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; @@ -432,7 +432,6 @@ mod tests { use crate::{assert_movie_info_tabs_reset, assert_navigation_popped}; use super::*; - use crate::assert_navigation_pushed; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -496,7 +495,7 @@ mod tests { use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, + RadarrData, EDIT_MOVIE_SELECTION_BLOCKS, }; use crate::network::radarr_network::RadarrEvent; use crate::{assert_navigation_popped, test_edit_movie_key}; diff --git a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs index 13353dd..7f8da78 100644 --- a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs @@ -4,18 +4,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::radarr_handlers::radarr_handler_test_utils::utils::root_folder; use crate::handlers::radarr_handlers::root_folders::RootFoldersHandler; - use crate::models::HorizontallyScrollableText; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; + use crate::models::HorizontallyScrollableText; mod test_handle_home_end { use pretty_assertions::assert_eq; @@ -367,7 +367,6 @@ mod tests { mod test_handle_esc { use super::*; use crate::assert_navigation_popped; - use pretty_assertions::assert_eq; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs index a6bf14b..55452c2 100644 --- a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{RadarrTask, RadarrTaskName}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, @@ -723,11 +723,10 @@ mod tests { mod test_handle_esc { use crate::models::HorizontallyScrollableText; - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/radarr_handlers/system/system_handler_tests.rs b/src/handlers/radarr_handlers/system/system_handler_tests.rs index 769145e..2f6ebd0 100644 --- a/src/handlers/radarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_handler_tests.rs @@ -3,12 +3,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::system::SystemHandler; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::RadarrTask; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, @@ -66,10 +66,9 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs index 726fe3e..258ea64 100644 --- a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs @@ -7,12 +7,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::sonarr_handlers::blocklist::{blocklist_sorting_options, BlocklistHandler}; use crate::handlers::KeyEventHandler; - use crate::handlers::sonarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::BlocklistItem; @@ -208,11 +208,10 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs index 19ad807..136710f 100644 --- a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs @@ -4,13 +4,13 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::downloads::DownloadsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::download_record; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; use crate::models::sonarr_models::DownloadRecord; @@ -133,7 +133,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -198,11 +198,10 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/history/history_handler_tests.rs b/src/handlers/sonarr_handlers/history/history_handler_tests.rs index 28fb236..7a32daa 100644 --- a/src/handlers/sonarr_handlers/history/history_handler_tests.rs +++ b/src/handlers/sonarr_handlers/history/history_handler_tests.rs @@ -7,12 +7,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::sonarr_handlers::history::{history_sorting_options, HistoryHandler}; use crate::handlers::KeyEventHandler; - use crate::handlers::sonarr_handlers::history::{HistoryHandler, history_sorting_options}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::{SonarrHistoryEventType, SonarrHistoryItem}; @@ -110,7 +110,7 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs index 16be928..7b97969 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::sonarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -422,11 +422,11 @@ mod tests { use std::sync::atomic::Ordering; use crate::app::App; - use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; + use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -856,7 +856,7 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ - BlockSelectionState, servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, BlockSelectionState, }; use crate::network::sonarr_network::SonarrEvent; @@ -1054,16 +1054,14 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!( - app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap() - ); + assert!(app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap()); EditIndexerHandler::new( SUBMIT_KEY, @@ -1077,16 +1075,14 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap()); } #[test] @@ -1111,16 +1107,14 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!( - app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap() - ); + assert!(app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap()); EditIndexerHandler::new( SUBMIT_KEY, @@ -1134,16 +1128,14 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap()); } #[test] @@ -1168,16 +1160,14 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!( - app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap() - ); + assert!(app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap()); EditIndexerHandler::new( SUBMIT_KEY, @@ -1191,16 +1181,14 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap()); } #[test] @@ -1224,17 +1212,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .name - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .name + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1259,17 +1245,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .url - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .url + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1294,17 +1278,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .api_key - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .api_key + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1329,17 +1311,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .seed_ratio - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .seed_ratio + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1364,17 +1344,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .tags - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .tags + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } } @@ -1382,9 +1360,9 @@ mod tests { mod test_handle_esc { use super::*; use crate::app::App; + use crate::assert_navigation_popped; use crate::event::Key; use crate::models::servarr_data::modals::EditIndexerModal; - use crate::{assert_navigation_popped, assert_navigation_pushed}; use pretty_assertions::assert_eq; use rstest::rstest; @@ -1444,9 +1422,9 @@ mod tests { use super::*; use crate::app::App; use crate::assert_navigation_popped; - use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index e85944c..29eaece 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -4,14 +4,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer_settings; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, }; @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; use crate::models::sonarr_models::IndexerSettings; + use crate::models::BlockSelectionState; use super::*; @@ -241,8 +241,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, - sonarr_models::IndexerSettings, + servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, + sonarr_models::IndexerSettings, BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; @@ -419,7 +419,7 @@ mod tests { use crate::models::sonarr_models::IndexerSettings; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -473,7 +473,7 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, + servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs index 7f59af5..a4fd5d5 100644 --- a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs @@ -4,15 +4,15 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::IndexersHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, + ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, }; use crate::models::servarr_models::Indexer; use crate::test_handler_delegation; @@ -127,7 +127,7 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ - EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, SonarrData, + SonarrData, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; use crate::models::servarr_models::{Indexer, IndexerField}; use crate::network::sonarr_network::SonarrEvent; @@ -289,7 +289,7 @@ mod tests { use pretty_assertions::assert_eq; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs index 7f81072..d184f18 100644 --- a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -1,11 +1,9 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::assert_modal_absent; - use crate::assert_navigation_pushed; - use crate::handlers::KeyEventHandler; + use crate::app::App; use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::stateful_table::StatefulTable; @@ -14,10 +12,8 @@ mod tests { mod test_handle_esc { use super::*; - use crate::assert_navigation_pushed; use crate::models::stateful_table::StatefulTable; use crate::{assert_modal_absent, assert_navigation_popped}; - use pretty_assertions::assert_eq; use rstest::rstest; #[rstest] diff --git a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs index 85827cb..594c13b 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs @@ -5,32 +5,32 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::sonarr_handlers::library::add_series_handler::AddSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::add_series_search_result; - use crate::models::HorizontallyScrollableText; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; - use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock}; + use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS}; use crate::models::servarr_models::RootFolder; use crate::models::sonarr_models::{ AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult, SeriesMonitor, SeriesType, }; use crate::models::stateful_table::StatefulTable; + use crate::models::HorizontallyScrollableText; 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::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use crate::simple_stateful_iterable_vec; use super::*; @@ -898,11 +898,11 @@ mod tests { mod test_handle_submit { use crate::assert_navigation_popped; - use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; use crate::models::sonarr_models::Series; use crate::models::stateful_table::StatefulTable; + use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use bimap::BiMap; use pretty_assertions::{assert_eq, assert_str_eq}; @@ -978,39 +978,33 @@ mod tests { ActiveSonarrBlock::AddSeriesSelectRootFolder ); assert_modal_present!(app.data.sonarr_data.add_series_modal); - assert!( - !app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty() - ); - assert!( - !app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .series_type_list - .items - .is_empty() - ); - assert!( - !app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty()); + assert!(!app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .series_type_list + .items + .is_empty()); + assert!(!app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty()); assert_str_eq!( app .data @@ -1326,7 +1320,6 @@ mod tests { use crate::{assert_navigation_popped, simple_stateful_iterable_vec}; use super::*; - use crate::assert_navigation_pushed; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -1482,8 +1475,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::sonarr::{modals::AddSeriesModal, sonarr_data::ADD_SERIES_SELECTION_BLOCKS}, + BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs index 341db95..81a6acb 100644 --- a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs @@ -4,13 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::assert_navigation_pushed; + use crate::app::App; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::delete_series_handler::DeleteSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; use crate::models::sonarr_models::DeleteSeriesParams; @@ -18,8 +17,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; @@ -87,12 +86,12 @@ mod tests { mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const SUBMIT_KEY: Key = DEFAULT_KEYBINDINGS.submit.key; @@ -230,8 +229,7 @@ mod tests { mod test_handle_esc { use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; - use pretty_assertions::assert_eq; + use crate::assert_navigation_popped; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -265,7 +263,7 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, + servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs index 838822a..e94a379 100644 --- a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_modal_absent; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::edit_series_handler::EditSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS}; use crate::models::sonarr_models::{EditSeriesParams, Series, SeriesType}; @@ -22,12 +22,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_SERIES_SELECTION_BLOCKS; + use crate::models::BlockSelectionState; use super::*; - + #[rstest] fn test_edit_series_select_series_type_scroll( #[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key, @@ -698,17 +698,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_series_modal - .as_ref() - .unwrap() - .path - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_series_modal + .as_ref() + .unwrap() + .path + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } @@ -733,17 +731,15 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!( - !app - .data - .sonarr_data - .edit_series_modal - .as_mut() - .unwrap() - .tags - .text - .is_empty() - ); + assert!(!app + .data + .sonarr_data + .edit_series_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty()); assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } @@ -1092,7 +1088,6 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; @@ -1163,10 +1158,10 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - BlockSelectionState, servarr_data::sonarr::{ modals::EditSeriesModal, sonarr_data::EDIT_SERIES_SELECTION_BLOCKS, }, + BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs index c8d676b..8cb5161 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::episode_details_handler::EpisodeDetailsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::episode; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::{ @@ -339,7 +339,6 @@ mod tests { use super::*; use crate::assert_navigation_popped; use crate::event::Key; - use pretty_assertions::assert_eq; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -401,16 +400,14 @@ mod tests { EpisodeDetailsHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::SeasonDetails.into()); - assert!( - app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_none() - ); + assert!(app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + .is_none()); } } diff --git a/src/handlers/sonarr_handlers/library/library_handler_tests.rs b/src/handlers/sonarr_handlers/library/library_handler_tests.rs index b956cc0..36e5aaf 100644 --- a/src/handlers/sonarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/library_handler_tests.rs @@ -5,17 +5,17 @@ mod tests { use std::cmp::Ordering; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::sonarr_handlers::library::{LibraryHandler, series_sorting_options}; + use crate::handlers::sonarr_handlers::library::{series_sorting_options, LibraryHandler}; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ - ADD_SERIES_BLOCKS, ActiveSonarrBlock, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, + ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; use crate::models::sonarr_models::{Series, SeriesStatistics, SeriesStatus, SeriesType}; @@ -240,12 +240,11 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -289,8 +288,8 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::models::servarr_data::sonarr::sonarr_data::SonarrData; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; + use crate::models::servarr_data::sonarr::sonarr_data::SonarrData; use crate::models::sonarr_models::SeriesType; use crate::network::sonarr_network::SonarrEvent; diff --git a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs index a86e700..76651f0 100644 --- a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs @@ -4,18 +4,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::sonarr_handlers::root_folders::RootFoldersHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::root_folder; - use crate::models::HorizontallyScrollableText; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; + use crate::models::HorizontallyScrollableText; mod test_handle_home_end { use crate::models::servarr_models::RootFolder; @@ -376,7 +376,6 @@ mod tests { mod test_handle_esc { use super::*; use crate::assert_navigation_popped; - use pretty_assertions::assert_eq; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs index ebbb96e..69d4b4b 100644 --- a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; @@ -741,11 +741,10 @@ mod tests { mod test_handle_esc { use crate::models::HorizontallyScrollableText; - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/sonarr_handlers/system/system_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_handler_tests.rs index b15a313..bef3388 100644 --- a/src/handlers/sonarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_handler_tests.rs @@ -3,12 +3,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::system::SystemHandler; + use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; @@ -68,10 +68,9 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; diff --git a/src/handlers/table_handler_tests.rs b/src/handlers/table_handler_tests.rs index 0f627be..e070113 100644 --- a/src/handlers/table_handler_tests.rs +++ b/src/handlers/table_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use crate::app::App; use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::App; 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::table_handler::TableHandlingConfig; use crate::handlers::table_handler::handle_table; + use crate::handlers::table_handler::TableHandlingConfig; + use crate::handlers::KeyEventHandler; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_models::Language; @@ -916,7 +916,7 @@ mod tests { use crate::models::stateful_table::StatefulTable; use super::*; - use crate::{assert_navigation_popped, assert_navigation_pushed}; + use crate::assert_navigation_popped; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -1008,8 +1008,8 @@ mod tests { } mod test_handle_key_char { - use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; + use crate::models::HorizontallyScrollableText; use pretty_assertions::{assert_eq, assert_str_eq}; use super::*; From ee1bee22eb662d965ce9f4b482ab91f743a3f0f7 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 8 Dec 2025 16:47:40 -0700 Subject: [PATCH 10/28] refactor: Improved test assertions in the app module --- Cargo.lock | 7 + Cargo.toml | 1 + src/app/app_tests.rs | 60 +- src/app/context_clues_tests.rs | 254 ++----- src/app/radarr/radarr_context_clues_tests.rs | 429 +++++------ src/app/sonarr/sonarr_context_clues_tests.rs | 742 +++++++++---------- src/main.rs | 4 + 7 files changed, 669 insertions(+), 828 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 52209fa..6982bea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,6 +135,12 @@ dependencies = [ "wait-timeout", ] +[[package]] +name = "assertables" +version = "9.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59051ec02907378a67b0ba1b8631121f5388c8dbbb3cec8c749d8f93c2c3c211" + [[package]] name = "async-trait" version = "0.1.89" @@ -1375,6 +1381,7 @@ version = "0.6.1" dependencies = [ "anyhow", "assert_cmd", + "assertables", "async-trait", "backtrace", "bimap", diff --git a/Cargo.toml b/Cargo.toml index 16b72b0..f076d6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -76,6 +76,7 @@ pretty_assertions = "1.3.0" proptest = "1.6.0" rstest = "0.25.0" serial_test = "3.2.0" +assertables = "9.8.2" [dev-dependencies.cargo-husky] version = "1" diff --git a/src/app/app_tests.rs b/src/app/app_tests.rs index 96a8e52..636b5b9 100644 --- a/src/app/app_tests.rs +++ b/src/app/app_tests.rs @@ -69,9 +69,9 @@ mod tests { CancellationToken::new(), ); - assert!(app.navigation_stack.is_empty()); + assert_is_empty!(app.navigation_stack); assert_eq!(app.get_current_route(), ActiveSonarrBlock::default().into()); - assert!(app.network_tx.is_some()); + assert_some!(app.network_tx); assert!(!app.cancellation_token.is_cancelled()); assert!(app.is_first_render); assert_eq!(app.error, HorizontallyScrollableText::default()); @@ -91,8 +91,8 @@ mod tests { fn test_app_default() { let app = App::default(); - assert!(app.navigation_stack.is_empty()); - assert!(app.network_tx.is_none()); + assert_is_empty!(app.navigation_stack); + assert_none!(app.network_tx); assert!(!app.cancellation_token.is_cancelled()); assert!(app.is_first_render); assert_eq!(app.error, HorizontallyScrollableText::default()); @@ -326,23 +326,23 @@ mod tests { fn test_app_config_default() { let app_config = AppConfig::default(); - assert!(app_config.radarr.is_none()); - assert!(app_config.sonarr.is_none()); + assert_none!(app_config.radarr); + assert_none!(app_config.sonarr); } #[test] fn test_servarr_config_default() { let servarr_config = ServarrConfig::default(); - assert_eq!(servarr_config.name, None); - assert_eq!(servarr_config.host, Some("localhost".to_string())); - assert_eq!(servarr_config.port, None); - assert_eq!(servarr_config.uri, None); - assert_eq!(servarr_config.weight, None); - assert_eq!(servarr_config.api_token, Some(String::new())); - assert_eq!(servarr_config.api_token_file, None); - assert_eq!(servarr_config.ssl_cert_path, None); - assert_eq!(servarr_config.custom_headers, None); + assert_none!(servarr_config.name); + assert_some_eq_x!(&servarr_config.host, "localhost"); + assert_none!(servarr_config.port); + assert_none!(servarr_config.uri); + assert_none!(servarr_config.weight); + assert_some_eq_x!(&servarr_config.api_token, ""); + assert_none!(servarr_config.api_token_file); + assert_none!(servarr_config.ssl_cert_path); + assert_none!(servarr_config.custom_headers); } #[test] @@ -367,11 +367,11 @@ mod tests { assert!(custom.is_object()); let obj = custom.as_object().unwrap(); - assert_eq!(obj.get("x-api-key").unwrap(), "abc123"); - assert_eq!(obj.get("header-1").unwrap(), "test"); + assert_some_eq_x!(obj.get("x-api-key"), "abc123"); + assert_some_eq_x!(obj.get("header-1"), "test"); - assert!(obj.get("X-Api-Key").is_none()); - assert!(obj.get("HEADER-1").is_none()); + assert_none!(obj.get("X-Api-Key")); + assert_none!(obj.get("HEADER-1")); } #[test] @@ -392,7 +392,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.host, Some("localhost".to_string())); + assert_some_eq_x!(&config.host, "localhost"); unsafe { std::env::remove_var("TEST_VAR_DESERIALIZE_OPTION") }; } @@ -407,7 +407,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.host, Some("www.example.com".to_string())); + assert_some_eq_x!(&config.host, "www.example.com"); unsafe { std::env::remove_var("TEST_VAR_DESERIALIZE_OPTION_NO_OVERWRITE") }; } @@ -419,7 +419,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.port, None); + assert_none!(config.port); } #[test] @@ -440,7 +440,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.custom_headers, Some(expected_custom_headers)); + assert_some_eq_x!(&config.custom_headers, &expected_custom_headers); unsafe { std::env::remove_var("TEST_VAR_DESERIALIZE_HEADER_OPTION") }; } @@ -467,7 +467,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.custom_headers, Some(expected_custom_headers)); + assert_some_eq_x!(&config.custom_headers, &expected_custom_headers); unsafe { std::env::remove_var("TEST_VAR_DESERIALIZE_HEADER_OPTION_NO_OVERWRITE") }; } @@ -479,7 +479,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.custom_headers, None); + assert_none!(config.custom_headers); } #[test] @@ -493,7 +493,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.port, Some(1)); + assert_some_eq_x!(config.port, 1); unsafe { std::env::remove_var("TEST_VAR_DESERIALIZE_OPTION_U16") }; } @@ -508,7 +508,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.port, Some(1234)); + assert_some_eq_x!(config.port, 1234); unsafe { std::env::remove_var("TEST_VAR_DESERIALIZE_OPTION_U16_UNUSED") }; } @@ -520,9 +520,9 @@ mod tests { "#; let result: Result = serde_yaml::from_str(yaml_data); - assert!(result.is_err()); + let result = assert_err_as_result!(result); let err = result.unwrap_err().to_string(); - assert!(err.contains("invalid digit found in string")); + assert_contains!(err, "invalid digit found in string"); } #[test] @@ -533,7 +533,7 @@ mod tests { let config: ServarrConfig = serde_yaml::from_str(yaml_data).unwrap(); - assert_eq!(config.port, None); + assert_none!(config.port); } #[test] diff --git a/src/app/context_clues_tests.rs b/src/app/context_clues_tests.rs index e55b9f0..a39f6be 100644 --- a/src/app/context_clues_tests.rs +++ b/src/app/context_clues_tests.rs @@ -1,239 +1,105 @@ #[cfg(test)] mod test { - use pretty_assertions::{assert_eq, assert_str_eq}; + use crate::app::context_clues::{ + ContextClueProvider, ServarrContextClueProvider, BARE_POPUP_CONTEXT_CLUES, + BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, + INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES, + SYSTEM_CONTEXT_CLUES, + }; + use crate::app::{key_binding::DEFAULT_KEYBINDINGS, App}; + use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; + use crate::models::servarr_data::ActiveKeybindingBlock; - use crate::app::context_clues::{ - BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, - ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, - ROOT_FOLDERS_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, - ServarrContextClueProvider, - }; - use crate::app::{App, key_binding::DEFAULT_KEYBINDINGS}; - use crate::models::servarr_data::ActiveKeybindingBlock; - use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - - #[test] + #[test] fn test_servarr_context_clues() { let mut servarr_context_clues_iter = SERVARR_CONTEXT_CLUES.iter(); - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.up); - assert_str_eq!(*description, "scroll up"); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.down); - assert_str_eq!(*description, "scroll down"); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.left); - assert_str_eq!(*description, "previous tab"); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.right); - assert_str_eq!(*description, "next tab"); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.pg_up); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.pg_up.desc); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.pg_down); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.pg_down.desc); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.next_servarr); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.next_servarr.desc); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.previous_servarr); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.previous_servarr.desc); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.quit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.quit.desc); - - let (key_binding, description) = servarr_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.help); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.help.desc); - assert_eq!(servarr_context_clues_iter.next(), None); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.up, "scroll up")); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.down, "scroll down")); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.left, "previous tab")); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.right, "next tab")); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.pg_up, DEFAULT_KEYBINDINGS.pg_up.desc)); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.pg_down, DEFAULT_KEYBINDINGS.pg_down.desc)); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.next_servarr, DEFAULT_KEYBINDINGS.next_servarr.desc)); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.previous_servarr, DEFAULT_KEYBINDINGS.previous_servarr.desc)); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc)); + assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.help, DEFAULT_KEYBINDINGS.help.desc)); + assert_none!(servarr_context_clues_iter.next()); } #[test] fn test_bare_popup_context_clues() { let mut bare_popup_context_clues_iter = BARE_POPUP_CONTEXT_CLUES.iter(); - let (key_binding, description) = bare_popup_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(bare_popup_context_clues_iter.next(), None); + assert_some_eq_x!(bare_popup_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc)); + assert_none!(bare_popup_context_clues_iter.next()); } #[test] fn test_downloads_context_clues() { let mut downloads_context_clues_iter = DOWNLOADS_CONTEXT_CLUES.iter(); - let (key_binding, description) = downloads_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = downloads_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); - - let (key_binding, description) = downloads_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, "update downloads"); - assert_eq!(downloads_context_clues_iter.next(), None); + assert_some_eq_x!(downloads_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_some_eq_x!(downloads_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); + assert_some_eq_x!(downloads_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.update, "update downloads")); + assert_none!(downloads_context_clues_iter.next()); } #[test] fn test_blocklist_context_clues() { let mut blocklist_context_clues_iter = BLOCKLIST_CONTEXT_CLUES.iter(); - let (key_binding, description) = blocklist_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = blocklist_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = blocklist_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = blocklist_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); - - let (key_binding, description) = blocklist_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.clear); - assert_str_eq!(*description, "clear blocklist"); - assert_eq!(blocklist_context_clues_iter.next(), None); + assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc)); + assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.submit, "details")); + assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); + assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.clear, "clear blocklist")); + assert_none!(blocklist_context_clues_iter.next()); } #[test] fn test_confirmation_prompt_context_clues() { let mut confirmation_prompt_context_clues_iter = CONFIRMATION_PROMPT_CONTEXT_CLUES.iter(); - let (key_binding, description) = confirmation_prompt_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.confirm); - assert_str_eq!(*description, "submit"); - - let (key_binding, description) = confirmation_prompt_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel"); - assert_eq!(confirmation_prompt_context_clues_iter.next(), None); + assert_some_eq_x!(confirmation_prompt_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.confirm, "submit")); + assert_some_eq_x!(confirmation_prompt_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.esc, "cancel")); + assert_none!(confirmation_prompt_context_clues_iter.next()); } #[test] fn test_root_folders_context_clues() { let mut root_folders_context_clues_iter = ROOT_FOLDERS_CONTEXT_CLUES.iter(); - let (key_binding, description) = root_folders_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.add); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.add.desc); - - let (key_binding, description) = root_folders_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); - - let (key_binding, description) = root_folders_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - assert_eq!(root_folders_context_clues_iter.next(), None); + assert_some_eq_x!(root_folders_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc)); + assert_some_eq_x!(root_folders_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); + assert_some_eq_x!(root_folders_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_none!(root_folders_context_clues_iter.next()); } #[test] fn test_indexers_context_clues() { let mut indexers_context_clues_iter = INDEXERS_CONTEXT_CLUES.iter(); - let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "edit indexer"); - - let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.settings); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.settings.desc); - - let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); - - let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.test); - assert_str_eq!(*description, "test indexer"); - - let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.test_all); - assert_str_eq!(*description, "test all indexers"); - - let (key_binding, description) = indexers_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - assert_eq!(indexers_context_clues_iter.next(), None); + assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.submit, "edit indexer")); + assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.settings, DEFAULT_KEYBINDINGS.settings.desc)); + assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); + assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.test, "test indexer")); + assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.test_all, "test all indexers")); + assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_none!(indexers_context_clues_iter.next()); } #[test] fn test_system_context_clues() { let mut system_context_clues_iter = SYSTEM_CONTEXT_CLUES.iter(); - let (key_binding, description) = system_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.tasks); - assert_str_eq!(*description, "open tasks"); - - let (key_binding, description) = system_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.events); - assert_str_eq!(*description, "open events"); - - let (key_binding, description) = system_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.logs); - assert_str_eq!(*description, "open logs"); - - let (key_binding, description) = system_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, "open updates"); - - let (key_binding, description) = system_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - assert_eq!(system_context_clues_iter.next(), None); + assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.tasks, "open tasks")); + assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.events, "open events")); + assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.logs, "open logs")); + assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.update, "open updates")); + assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_none!(system_context_clues_iter.next()); } #[test] @@ -243,10 +109,9 @@ mod test { let context_clues = ServarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!( + assert_some_eq_x!( + context_clues, &crate::app::radarr::radarr_context_clues::SYSTEM_TASKS_CONTEXT_CLUES, - context_clues.unwrap() ); } @@ -257,10 +122,9 @@ mod test { let context_clues = ServarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!( + assert_some_eq_x!( + context_clues, &crate::app::sonarr::sonarr_context_clues::SYSTEM_TASKS_CONTEXT_CLUES, - context_clues.unwrap() ); } @@ -271,6 +135,6 @@ mod test { let context_clues = ServarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_none()); + assert_none!(context_clues); } } diff --git a/src/app/radarr/radarr_context_clues_tests.rs b/src/app/radarr/radarr_context_clues_tests.rs index 3cc4769..f11656b 100644 --- a/src/app/radarr/radarr_context_clues_tests.rs +++ b/src/app/radarr/radarr_context_clues_tests.rs @@ -1,126 +1,118 @@ #[cfg(test)] mod tests { - use crate::app::App; - use crate::app::context_clues::{ - BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, - ContextClue, ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, - ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, - }; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::app::radarr::radarr_context_clues::{ - ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTION_DETAILS_CONTEXT_CLUES, - COLLECTIONS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, - MOVIE_DETAILS_CONTEXT_CLUES, RadarrContextClueProvider, SYSTEM_TASKS_CONTEXT_CLUES, - }; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; - use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - use pretty_assertions::{assert_eq, assert_str_eq}; - use rstest::rstest; + use crate::app::context_clues::{ + ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, + CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, + }; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::radarr::radarr_context_clues::{ + RadarrContextClueProvider, ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTIONS_CONTEXT_CLUES, + COLLECTION_DETAILS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, + MOVIE_DETAILS_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, + }; + use crate::app::App; + use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; + use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; + use pretty_assertions::assert_eq; + use rstest::rstest; - #[test] + #[test] fn test_library_context_clues() { let mut library_context_clues_iter = LIBRARY_CONTEXT_CLUES.iter(); - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.add); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.add.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.toggle_monitoring); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.toggle_monitoring.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, "update all"); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = library_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel filter"); - assert_eq!(library_context_clues_iter.next(), None); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.toggle_monitoring, + DEFAULT_KEYBINDINGS.toggle_monitoring.desc + ) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, "update all") + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + library_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel filter") + ); + assert_none!(library_context_clues_iter.next()); } #[test] fn test_collections_context_clues() { let mut collections_context_clues = COLLECTIONS_CONTEXT_CLUES.iter(); - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, "update all"); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = collections_context_clues.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel filter"); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc) + ); + assert_some_eq_x!( + collections_context_clues.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.update, "update all") + ); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + collections_context_clues.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel filter") + ); assert_eq!(collections_context_clues.next(), None); } @@ -128,30 +120,32 @@ mod tests { fn test_movie_details_context_clues() { let mut movie_details_context_clues_iter = MOVIE_DETAILS_CONTEXT_CLUES.iter(); - let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.update.desc); - - let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = movie_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_some_eq_x!( + movie_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + movie_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc) + ); + assert_some_eq_x!( + movie_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + movie_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + movie_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); assert_eq!(movie_details_context_clues_iter.next(), None); } @@ -159,41 +153,40 @@ mod tests { fn test_manual_movie_search_context_clues() { let mut manual_movie_search_context_clues_iter = MANUAL_MOVIE_SEARCH_CONTEXT_CLUES.iter(); - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.update.desc); - - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = manual_movie_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc) + ); + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + manual_movie_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); assert_eq!(manual_movie_search_context_clues_iter.next(), None); } @@ -202,15 +195,14 @@ mod tests { let mut add_movie_search_results_context_clues_iter = ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES.iter(); - let (key_binding, description) = add_movie_search_results_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = add_movie_search_results_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "edit search"); + assert_some_eq_x!( + add_movie_search_results_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + add_movie_search_results_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "edit search") + ); assert_eq!(add_movie_search_results_context_clues_iter.next(), None); } @@ -218,15 +210,14 @@ mod tests { fn test_system_tasks_context_clues() { let mut system_tasks_context_clues_iter = SYSTEM_TASKS_CONTEXT_CLUES.iter(); - let (key_binding, description) = system_tasks_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "start task"); - - let (key_binding, description) = system_tasks_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_some_eq_x!( + system_tasks_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "start task") + ); + assert_some_eq_x!( + system_tasks_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); assert_eq!(system_tasks_context_clues_iter.next(), None); } @@ -234,20 +225,18 @@ mod tests { fn test_collection_details_context_clues() { let mut collection_details_context_clues_iter = COLLECTION_DETAILS_CONTEXT_CLUES.iter(); - let (key_binding, description) = collection_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "show overview/add movie"); - - let (key_binding, description) = collection_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, "edit collection"); - - let (key_binding, description) = collection_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); + assert_some_eq_x!( + collection_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "show overview/add movie") + ); + assert_some_eq_x!( + collection_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, "edit collection") + ); + assert_some_eq_x!( + collection_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); assert_eq!(collection_details_context_clues_iter.next(), None); } @@ -283,8 +272,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&BARE_POPUP_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &BARE_POPUP_CONTEXT_CLUES); } #[rstest] @@ -306,8 +294,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(expected_context_clues, context_clues.unwrap()); + assert_some_eq_x!(context_clues, expected_context_clues); } #[rstest] @@ -329,8 +316,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&CONFIRMATION_PROMPT_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -352,8 +338,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&CONFIRMATION_PROMPT_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -379,8 +364,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&CONFIRMATION_PROMPT_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -405,8 +389,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&CONFIRMATION_PROMPT_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -428,8 +411,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&CONFIRMATION_PROMPT_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -446,11 +428,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!( - &ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, - context_clues.unwrap() - ); + assert_some_eq_x!(context_clues, &ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES); } #[test] @@ -461,8 +439,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&COLLECTION_DETAILS_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &COLLECTION_DETAILS_CONTEXT_CLUES); } #[test] @@ -474,8 +451,7 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(&SYSTEM_TASKS_CONTEXT_CLUES, context_clues.unwrap()); + assert_some_eq_x!(context_clues, &SYSTEM_TASKS_CONTEXT_CLUES); } #[rstest] @@ -498,7 +474,6 @@ mod tests { let context_clues = RadarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(expected_context_clues, context_clues.unwrap()); + assert_some_eq_x!(context_clues, expected_context_clues); } } diff --git a/src/app/sonarr/sonarr_context_clues_tests.rs b/src/app/sonarr/sonarr_context_clues_tests.rs index 2dac148..1c7b89b 100644 --- a/src/app/sonarr/sonarr_context_clues_tests.rs +++ b/src/app/sonarr/sonarr_context_clues_tests.rs @@ -1,15 +1,14 @@ #[cfg(test)] mod tests { use crate::app::context_clues::{ - BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, - ContextClue, ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, + CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, }; use crate::app::sonarr::sonarr_context_clues::{ - SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES, SonarrContextClueProvider, + SonarrContextClueProvider, SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES, }; use crate::app::{ - App, key_binding::DEFAULT_KEYBINDINGS, sonarr::sonarr_context_clues::{ ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES, @@ -18,11 +17,11 @@ mod tests { SEASON_HISTORY_CONTEXT_CLUES, SERIES_CONTEXT_CLUES, SERIES_DETAILS_CONTEXT_CLUES, SERIES_HISTORY_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, }, + App, }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData}; - use pretty_assertions::{assert_eq, assert_str_eq}; use rstest::rstest; #[test] @@ -30,417 +29,422 @@ mod tests { let mut add_series_search_results_context_clues_iter = ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES.iter(); - let (key_binding, description) = add_series_search_results_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = add_series_search_results_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "edit search"); - assert_eq!(add_series_search_results_context_clues_iter.next(), None); + assert_some_eq_x!( + add_series_search_results_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + add_series_search_results_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "edit search") + ); + assert_none!(add_series_search_results_context_clues_iter.next()); } #[test] fn test_series_context_clues() { let mut series_context_clues_iter = SERIES_CONTEXT_CLUES.iter(); - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.add); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.add.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.toggle_monitoring); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.toggle_monitoring.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.delete.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, "update all"); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = series_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel filter"); - assert_eq!(series_context_clues_iter.next(), None); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.toggle_monitoring, + DEFAULT_KEYBINDINGS.toggle_monitoring.desc + ) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, "update all") + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + series_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel filter") + ); + assert_none!(series_context_clues_iter.next()); } #[test] fn test_series_history_context_clues() { let mut series_history_context_clues_iter = SERIES_HISTORY_CONTEXT_CLUES.iter(); - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.update.desc); - - let (key_binding, description) = series_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel filter/close"); - assert_eq!(series_history_context_clues_iter.next(), None); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc) + ); + assert_some_eq_x!( + series_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel filter/close") + ); + assert_none!(series_history_context_clues_iter.next()); } #[test] fn test_history_context_clues() { let mut history_context_clues_iter = HISTORY_CONTEXT_CLUES.iter(); - let (key_binding, description) = history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); - - let (key_binding, description) = history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel filter"); - assert_eq!(history_context_clues_iter.next(), None); + assert_some_eq_x!( + history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc) + ); + assert_some_eq_x!( + history_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel filter") + ); + assert_none!(history_context_clues_iter.next()); } #[test] fn test_series_details_context_clues() { let mut series_details_context_clues_iter = SERIES_DETAILS_CONTEXT_CLUES.iter(); - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.edit); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.edit.desc); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.toggle_monitoring); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.toggle_monitoring.desc); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "season details"); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.update); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.update.desc); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = series_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(series_details_context_clues_iter.next(), None); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.edit, DEFAULT_KEYBINDINGS.edit.desc) + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.toggle_monitoring, + DEFAULT_KEYBINDINGS.toggle_monitoring.desc + ) + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "season details") + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, DEFAULT_KEYBINDINGS.update.desc) + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + series_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_none!(series_details_context_clues_iter.next()); } #[test] fn test_season_details_context_clues() { let mut season_details_context_clues_iter = SEASON_DETAILS_CONTEXT_CLUES.iter(); - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.toggle_monitoring); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.toggle_monitoring.desc); - - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "episode details"); - - let (key_binding, description) = season_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.delete); - assert_str_eq!(*description, "delete episode"); - - assert_eq!(season_details_context_clues_iter.next(), None); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.toggle_monitoring, + DEFAULT_KEYBINDINGS.toggle_monitoring.desc + ) + ); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "episode details") + ); + assert_some_eq_x!( + season_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, "delete episode") + ); + assert_none!(season_details_context_clues_iter.next()); } #[test] fn test_season_history_context_clues() { let mut season_history_context_clues_iter = SEASON_HISTORY_CONTEXT_CLUES.iter(); - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.search.desc); - - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.filter); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.filter.desc); - - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = season_history_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, "cancel filter/close"); - assert_eq!(season_history_context_clues_iter.next(), None); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.search, DEFAULT_KEYBINDINGS.search.desc) + ); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.filter, DEFAULT_KEYBINDINGS.filter.desc) + ); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + season_history_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel filter/close") + ); + assert_none!(season_history_context_clues_iter.next()); } #[test] fn test_manual_season_search_context_clues() { let mut manual_season_search_context_clues_iter = MANUAL_SEASON_SEARCH_CONTEXT_CLUES.iter(); - let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = manual_season_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(manual_season_search_context_clues_iter.next(), None); + assert_some_eq_x!( + manual_season_search_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + manual_season_search_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + manual_season_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + manual_season_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + manual_season_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_none!(manual_season_search_context_clues_iter.next()); } #[test] fn test_manual_episode_search_context_clues() { let mut manual_episode_search_context_clues_iter = MANUAL_EPISODE_SEARCH_CONTEXT_CLUES.iter(); - let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.sort); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.sort.desc); - - let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = manual_episode_search_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(manual_episode_search_context_clues_iter.next(), None); + assert_some_eq_x!( + manual_episode_search_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + manual_episode_search_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + manual_episode_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + manual_episode_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + manual_episode_search_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_none!(manual_episode_search_context_clues_iter.next()); } #[test] fn test_episode_details_context_clues() { let mut episode_details_context_clues_iter = EPISODE_DETAILS_CONTEXT_CLUES.iter(); - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(episode_details_context_clues_iter.next(), None); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_none!(episode_details_context_clues_iter.next()); } #[test] fn test_selectable_episode_details_context_clues() { let mut episode_details_context_clues_iter = SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES.iter(); - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.refresh); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.refresh.desc); - - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.auto_search); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.auto_search.desc); - - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "details"); - - let (key_binding, description) = episode_details_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(episode_details_context_clues_iter.next(), None); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.auto_search, + DEFAULT_KEYBINDINGS.auto_search.desc + ) + ); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + episode_details_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_none!(episode_details_context_clues_iter.next()); } #[test] fn test_system_tasks_context_clues() { let mut system_tasks_context_clues_iter = SYSTEM_TASKS_CONTEXT_CLUES.iter(); - let (key_binding, description) = system_tasks_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.submit); - assert_str_eq!(*description, "start task"); - - let (key_binding, description) = system_tasks_context_clues_iter.next().unwrap(); - - assert_eq!(*key_binding, DEFAULT_KEYBINDINGS.esc); - assert_str_eq!(*description, DEFAULT_KEYBINDINGS.esc.desc); - assert_eq!(system_tasks_context_clues_iter.next(), None); + assert_some_eq_x!( + system_tasks_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "start task") + ); + assert_some_eq_x!( + system_tasks_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); + assert_none!(system_tasks_context_clues_iter.next()); } #[test] @@ -470,8 +474,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(expected_context_clues, context_clues.unwrap()); + assert_some_eq_x!(context_clues, expected_context_clues); } #[rstest] @@ -495,8 +498,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(expected_context_clues, context_clues.unwrap()); + assert_some_eq_x!(context_clues, expected_context_clues); } #[rstest] @@ -524,8 +526,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(expected_context_clues, context_clues.unwrap()); + assert_some_eq_x!(context_clues, expected_context_clues); } #[rstest] @@ -544,8 +545,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(context_clues.unwrap(), &BARE_POPUP_CONTEXT_CLUES); + assert_some_eq_x!(context_clues, &BARE_POPUP_CONTEXT_CLUES); } #[rstest] @@ -567,8 +567,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(context_clues.unwrap(), &CONFIRMATION_PROMPT_CONTEXT_CLUES); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -593,8 +592,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(context_clues.unwrap(), &CONFIRMATION_PROMPT_CONTEXT_CLUES); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -614,8 +612,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(context_clues.unwrap(), &CONFIRMATION_PROMPT_CONTEXT_CLUES); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -638,8 +635,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(context_clues.unwrap(), &CONFIRMATION_PROMPT_CONTEXT_CLUES); + assert_some_eq_x!(context_clues, &CONFIRMATION_PROMPT_CONTEXT_CLUES); } #[rstest] @@ -655,11 +651,7 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!( - context_clues.unwrap(), - &ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES - ); + assert_some_eq_x!(context_clues, &ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES); } #[test] @@ -669,8 +661,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(context_clues.unwrap(), &SYSTEM_TASKS_CONTEXT_CLUES); + assert_some_eq_x!(context_clues, &SYSTEM_TASKS_CONTEXT_CLUES); } #[rstest] @@ -693,7 +684,6 @@ mod tests { let context_clues = SonarrContextClueProvider::get_context_clues(&mut app); - assert!(context_clues.is_some()); - assert_eq!(expected_context_clues, context_clues.unwrap()); + assert_some_eq_x!(context_clues, expected_context_clues); } } diff --git a/src/main.rs b/src/main.rs index 848b49a..02c8083 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,7 @@ +#[cfg(test)] +#[macro_use] +extern crate assertables; + use anyhow::Result; use clap::{CommandFactory, Parser, crate_authors, crate_description, crate_name, crate_version}; use clap_complete::generate; From b807904c6cc386dc814483923764965f18a443e5 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 8 Dec 2025 17:07:31 -0700 Subject: [PATCH 11/28] refactor: Refactored all cli tests to use purpose-built assertions --- src/app/app_tests.rs | 2 +- src/app/context_clues_tests.rs | 228 ++++++++++++++---- src/app/radarr/radarr_context_clues_tests.rs | 34 +-- src/app/sonarr/sonarr_context_clues_tests.rs | 8 +- src/cli/cli_tests.rs | 16 +- src/cli/radarr/add_command_handler_tests.rs | 71 +++--- .../radarr/delete_command_handler_tests.rs | 101 ++++---- src/cli/radarr/edit_command_handler_tests.rs | 160 ++++++------ src/cli/radarr/get_command_handler_tests.rs | 28 +-- src/cli/radarr/list_command_handler_tests.rs | 46 ++-- src/cli/radarr/radarr_command_tests.rs | 66 ++--- .../radarr/refresh_command_handler_tests.rs | 20 +- src/cli/sonarr/add_command_handler_tests.rs | 75 +++--- .../sonarr/delete_command_handler_tests.rs | 116 ++++----- .../sonarr/download_command_handler_tests.rs | 32 +-- src/cli/sonarr/edit_command_handler_tests.rs | 114 +++++---- src/cli/sonarr/get_command_handler_tests.rs | 28 +-- src/cli/sonarr/list_command_handler_tests.rs | 113 +++++---- .../manual_search_command_handler_tests.rs | 14 +- .../sonarr/refresh_command_handler_tests.rs | 20 +- src/cli/sonarr/sonarr_command_tests.rs | 70 +++--- ..._automatic_search_command_handler_tests.rs | 20 +- 22 files changed, 786 insertions(+), 596 deletions(-) diff --git a/src/app/app_tests.rs b/src/app/app_tests.rs index 636b5b9..b9a8a85 100644 --- a/src/app/app_tests.rs +++ b/src/app/app_tests.rs @@ -520,7 +520,7 @@ mod tests { "#; let result: Result = serde_yaml::from_str(yaml_data); - let result = assert_err_as_result!(result); + assert_err!(&result); let err = result.unwrap_err().to_string(); assert_contains!(err, "invalid digit found in string"); } diff --git a/src/app/context_clues_tests.rs b/src/app/context_clues_tests.rs index a39f6be..ff435ad 100644 --- a/src/app/context_clues_tests.rs +++ b/src/app/context_clues_tests.rs @@ -1,30 +1,69 @@ #[cfg(test)] mod test { - use crate::app::context_clues::{ - ContextClueProvider, ServarrContextClueProvider, BARE_POPUP_CONTEXT_CLUES, - BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, - INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES, - SYSTEM_CONTEXT_CLUES, - }; - use crate::app::{key_binding::DEFAULT_KEYBINDINGS, App}; - use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - use crate::models::servarr_data::ActiveKeybindingBlock; + use crate::app::context_clues::{ + BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + ROOT_FOLDERS_CONTEXT_CLUES, SERVARR_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, + ServarrContextClueProvider, + }; + use crate::app::{App, key_binding::DEFAULT_KEYBINDINGS}; + use crate::models::servarr_data::ActiveKeybindingBlock; + use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - #[test] + #[test] fn test_servarr_context_clues() { let mut servarr_context_clues_iter = SERVARR_CONTEXT_CLUES.iter(); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.up, "scroll up")); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.down, "scroll down")); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.left, "previous tab")); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.right, "next tab")); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.pg_up, DEFAULT_KEYBINDINGS.pg_up.desc)); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.pg_down, DEFAULT_KEYBINDINGS.pg_down.desc)); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.next_servarr, DEFAULT_KEYBINDINGS.next_servarr.desc)); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.previous_servarr, DEFAULT_KEYBINDINGS.previous_servarr.desc)); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc)); - assert_some_eq_x!(servarr_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.help, DEFAULT_KEYBINDINGS.help.desc)); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.up, "scroll up") + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.down, "scroll down") + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.left, "previous tab") + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.right, "next tab") + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.pg_up, DEFAULT_KEYBINDINGS.pg_up.desc) + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.pg_down, + DEFAULT_KEYBINDINGS.pg_down.desc + ) + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.next_servarr, + DEFAULT_KEYBINDINGS.next_servarr.desc + ) + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.previous_servarr, + DEFAULT_KEYBINDINGS.previous_servarr.desc + ) + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.quit, DEFAULT_KEYBINDINGS.quit.desc) + ); + assert_some_eq_x!( + servarr_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.help, DEFAULT_KEYBINDINGS.help.desc) + ); assert_none!(servarr_context_clues_iter.next()); } @@ -32,7 +71,10 @@ mod test { fn test_bare_popup_context_clues() { let mut bare_popup_context_clues_iter = BARE_POPUP_CONTEXT_CLUES.iter(); - assert_some_eq_x!(bare_popup_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc)); + assert_some_eq_x!( + bare_popup_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, DEFAULT_KEYBINDINGS.esc.desc) + ); assert_none!(bare_popup_context_clues_iter.next()); } @@ -40,9 +82,21 @@ mod test { fn test_downloads_context_clues() { let mut downloads_context_clues_iter = DOWNLOADS_CONTEXT_CLUES.iter(); - assert_some_eq_x!(downloads_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); - assert_some_eq_x!(downloads_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); - assert_some_eq_x!(downloads_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.update, "update downloads")); + assert_some_eq_x!( + downloads_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + downloads_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc) + ); + assert_some_eq_x!( + downloads_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, "update downloads") + ); assert_none!(downloads_context_clues_iter.next()); } @@ -50,11 +104,29 @@ mod test { fn test_blocklist_context_clues() { let mut blocklist_context_clues_iter = BLOCKLIST_CONTEXT_CLUES.iter(); - assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); - assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc)); - assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.submit, "details")); - assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); - assert_some_eq_x!(blocklist_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.clear, "clear blocklist")); + assert_some_eq_x!( + blocklist_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); + assert_some_eq_x!( + blocklist_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.sort, DEFAULT_KEYBINDINGS.sort.desc) + ); + assert_some_eq_x!( + blocklist_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "details") + ); + assert_some_eq_x!( + blocklist_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc) + ); + assert_some_eq_x!( + blocklist_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.clear, "clear blocklist") + ); assert_none!(blocklist_context_clues_iter.next()); } @@ -62,8 +134,14 @@ mod test { fn test_confirmation_prompt_context_clues() { let mut confirmation_prompt_context_clues_iter = CONFIRMATION_PROMPT_CONTEXT_CLUES.iter(); - assert_some_eq_x!(confirmation_prompt_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.confirm, "submit")); - assert_some_eq_x!(confirmation_prompt_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.esc, "cancel")); + assert_some_eq_x!( + confirmation_prompt_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.confirm, "submit") + ); + assert_some_eq_x!( + confirmation_prompt_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.esc, "cancel") + ); assert_none!(confirmation_prompt_context_clues_iter.next()); } @@ -71,9 +149,21 @@ mod test { fn test_root_folders_context_clues() { let mut root_folders_context_clues_iter = ROOT_FOLDERS_CONTEXT_CLUES.iter(); - assert_some_eq_x!(root_folders_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc)); - assert_some_eq_x!(root_folders_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); - assert_some_eq_x!(root_folders_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_some_eq_x!( + root_folders_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.add, DEFAULT_KEYBINDINGS.add.desc) + ); + assert_some_eq_x!( + root_folders_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc) + ); + assert_some_eq_x!( + root_folders_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); assert_none!(root_folders_context_clues_iter.next()); } @@ -81,12 +171,36 @@ mod test { fn test_indexers_context_clues() { let mut indexers_context_clues_iter = INDEXERS_CONTEXT_CLUES.iter(); - assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.submit, "edit indexer")); - assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.settings, DEFAULT_KEYBINDINGS.settings.desc)); - assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc)); - assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.test, "test indexer")); - assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.test_all, "test all indexers")); - assert_some_eq_x!(indexers_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_some_eq_x!( + indexers_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.submit, "edit indexer") + ); + assert_some_eq_x!( + indexers_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.settings, + DEFAULT_KEYBINDINGS.settings.desc + ) + ); + assert_some_eq_x!( + indexers_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.delete, DEFAULT_KEYBINDINGS.delete.desc) + ); + assert_some_eq_x!( + indexers_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.test, "test indexer") + ); + assert_some_eq_x!( + indexers_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.test_all, "test all indexers") + ); + assert_some_eq_x!( + indexers_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); assert_none!(indexers_context_clues_iter.next()); } @@ -94,11 +208,29 @@ mod test { fn test_system_context_clues() { let mut system_context_clues_iter = SYSTEM_CONTEXT_CLUES.iter(); - assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.tasks, "open tasks")); - assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.events, "open events")); - assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.logs, "open logs")); - assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.update, "open updates")); - assert_some_eq_x!(system_context_clues_iter.next(), &(DEFAULT_KEYBINDINGS.refresh, DEFAULT_KEYBINDINGS.refresh.desc)); + assert_some_eq_x!( + system_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.tasks, "open tasks") + ); + assert_some_eq_x!( + system_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.events, "open events") + ); + assert_some_eq_x!( + system_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.logs, "open logs") + ); + assert_some_eq_x!( + system_context_clues_iter.next(), + &(DEFAULT_KEYBINDINGS.update, "open updates") + ); + assert_some_eq_x!( + system_context_clues_iter.next(), + &( + DEFAULT_KEYBINDINGS.refresh, + DEFAULT_KEYBINDINGS.refresh.desc + ) + ); assert_none!(system_context_clues_iter.next()); } @@ -110,7 +242,7 @@ mod test { let context_clues = ServarrContextClueProvider::get_context_clues(&mut app); assert_some_eq_x!( - context_clues, + context_clues, &crate::app::radarr::radarr_context_clues::SYSTEM_TASKS_CONTEXT_CLUES, ); } @@ -123,7 +255,7 @@ mod test { let context_clues = ServarrContextClueProvider::get_context_clues(&mut app); assert_some_eq_x!( - context_clues, + context_clues, &crate::app::sonarr::sonarr_context_clues::SYSTEM_TASKS_CONTEXT_CLUES, ); } diff --git a/src/app/radarr/radarr_context_clues_tests.rs b/src/app/radarr/radarr_context_clues_tests.rs index f11656b..d5fbca9 100644 --- a/src/app/radarr/radarr_context_clues_tests.rs +++ b/src/app/radarr/radarr_context_clues_tests.rs @@ -1,23 +1,23 @@ #[cfg(test)] mod tests { - use crate::app::context_clues::{ - ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, - CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, - ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, - }; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; - use crate::app::radarr::radarr_context_clues::{ - RadarrContextClueProvider, ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTIONS_CONTEXT_CLUES, - COLLECTION_DETAILS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, - MOVIE_DETAILS_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, - }; - use crate::app::App; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; - use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; - use pretty_assertions::assert_eq; - use rstest::rstest; + use crate::app::App; + use crate::app::context_clues::{ + BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + ContextClue, ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, + }; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; + use crate::app::radarr::radarr_context_clues::{ + ADD_MOVIE_SEARCH_RESULTS_CONTEXT_CLUES, COLLECTION_DETAILS_CONTEXT_CLUES, + COLLECTIONS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES, + MOVIE_DETAILS_CONTEXT_CLUES, RadarrContextClueProvider, SYSTEM_TASKS_CONTEXT_CLUES, + }; + use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, RadarrData}; + use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; + use pretty_assertions::assert_eq; + use rstest::rstest; - #[test] + #[test] fn test_library_context_clues() { let mut library_context_clues_iter = LIBRARY_CONTEXT_CLUES.iter(); diff --git a/src/app/sonarr/sonarr_context_clues_tests.rs b/src/app/sonarr/sonarr_context_clues_tests.rs index 1c7b89b..30b953d 100644 --- a/src/app/sonarr/sonarr_context_clues_tests.rs +++ b/src/app/sonarr/sonarr_context_clues_tests.rs @@ -1,14 +1,15 @@ #[cfg(test)] mod tests { use crate::app::context_clues::{ - ContextClue, ContextClueProvider, BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, - CONFIRMATION_PROMPT_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, + BARE_POPUP_CONTEXT_CLUES, BLOCKLIST_CONTEXT_CLUES, CONFIRMATION_PROMPT_CONTEXT_CLUES, + ContextClue, ContextClueProvider, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES, ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES, }; use crate::app::sonarr::sonarr_context_clues::{ - SonarrContextClueProvider, SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES, + SELECTABLE_EPISODE_DETAILS_CONTEXT_CLUES, SonarrContextClueProvider, }; use crate::app::{ + App, key_binding::DEFAULT_KEYBINDINGS, sonarr::sonarr_context_clues::{ ADD_SERIES_SEARCH_RESULTS_CONTEXT_CLUES, EPISODE_DETAILS_CONTEXT_CLUES, @@ -17,7 +18,6 @@ mod tests { SEASON_HISTORY_CONTEXT_CLUES, SERIES_CONTEXT_CLUES, SERIES_DETAILS_CONTEXT_CLUES, SERIES_HISTORY_CONTEXT_CLUES, SYSTEM_TASKS_CONTEXT_CLUES, }, - App, }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; diff --git a/src/cli/cli_tests.rs b/src/cli/cli_tests.rs index 0db1fd3..7232497 100644 --- a/src/cli/cli_tests.rs +++ b/src/cli/cli_tests.rs @@ -33,7 +33,7 @@ mod tests { fn test_servarr_subcommand_requires_subcommand(#[values("radarr", "sonarr")] subcommand: &str) { let result = Cli::command().try_get_matches_from(["managarr", subcommand]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand @@ -45,21 +45,21 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "all-indexer-settings"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_sonarr_subcommand_delegates_to_sonarr() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "series"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_completions_requires_argument() { let result = Cli::command().try_get_matches_from(["managarr", "completions"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand @@ -70,7 +70,7 @@ mod tests { fn test_completions_invalid_argument() { let result = Cli::command().try_get_matches_from(["managarr", "completions", "test"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -78,7 +78,7 @@ mod tests { fn test_completions_satisfied_with_argument() { let result = Cli::command().try_get_matches_from(["managarr", "completions", "bash"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[rstest] @@ -141,7 +141,7 @@ mod tests { let result = handle_command(&app_arc, clear_blocklist_command, &mut mock_network).await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -172,6 +172,6 @@ mod tests { let result = handle_command(&app_arc, clear_blocklist_command, &mut mock_network).await; - assert!(result.is_ok()); + assert_ok!(&result); } } diff --git a/src/cli/radarr/add_command_handler_tests.rs b/src/cli/radarr/add_command_handler_tests.rs index b465a79..bf18652 100644 --- a/src/cli/radarr/add_command_handler_tests.rs +++ b/src/cli/radarr/add_command_handler_tests.rs @@ -32,7 +32,7 @@ mod tests { fn test_add_movie_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "add", "movie"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -52,7 +52,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -72,7 +72,7 @@ mod tests { "/test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -92,7 +92,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -117,7 +117,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -136,7 +136,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -156,7 +156,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -177,7 +177,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -207,10 +207,11 @@ mod tests { "1", ]); - assert!(result.is_ok()); - if let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + assert_ok!(&result); + let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type") + }; + assert_eq!(add_command, expected_args); } #[test] @@ -243,10 +244,11 @@ mod tests { "2", ]); - assert!(result.is_ok()); - if let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + assert_ok!(&result); + let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type") + }; + assert_eq!(add_command, expected_args); } #[test] @@ -285,10 +287,11 @@ mod tests { "--no-search-for-movie", ]); - assert!(result.is_ok()); - if let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + assert_ok!(&result); + let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type") + }; + assert_eq!(add_command, expected_args); } #[test] @@ -296,7 +299,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "add", "root-folder"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -318,18 +321,19 @@ mod tests { "/nfs/test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type") + }; + assert_eq!(add_command, expected_args); } #[test] fn test_add_tag_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "add", "tag"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -344,11 +348,12 @@ mod tests { let result = Cli::try_parse_from(["managarr", "radarr", "add", "tag", "--name", "test"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type") + }; + assert_eq!(add_command, expected_args); } } @@ -416,7 +421,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -447,7 +452,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -474,7 +479,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/radarr/delete_command_handler_tests.rs b/src/cli/radarr/delete_command_handler_tests.rs index 0b6a144..d50705c 100644 --- a/src/cli/radarr/delete_command_handler_tests.rs +++ b/src/cli/radarr/delete_command_handler_tests.rs @@ -30,7 +30,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "delete", "blocklist-item"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -52,12 +52,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -65,7 +66,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "delete", "download"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -85,19 +86,20 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] fn test_delete_indexer_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "delete", "indexer"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -117,19 +119,20 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] fn test_delete_movie_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "delete", "movie"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -147,12 +150,13 @@ mod tests { let result = Cli::try_parse_from(["managarr", "radarr", "delete", "movie", "--movie-id", "1"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -174,12 +178,13 @@ mod tests { "--add-list-exclusion", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -187,7 +192,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "delete", "root-folder"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -207,19 +212,20 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] fn test_delete_tag_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "delete", "tag"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -232,12 +238,13 @@ mod tests { let result = Cli::try_parse_from(["managarr", "radarr", "delete", "tag", "--tag-id", "1"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } } @@ -289,7 +296,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -315,7 +322,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -341,7 +348,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -375,7 +382,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -401,7 +408,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -427,7 +434,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/radarr/edit_command_handler_tests.rs b/src/cli/radarr/edit_command_handler_tests.rs index ed10b95..02a697a 100644 --- a/src/cli/radarr/edit_command_handler_tests.rs +++ b/src/cli/radarr/edit_command_handler_tests.rs @@ -42,7 +42,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "edit", "all-indexer-settings"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -60,7 +60,7 @@ mod tests { "--disable-allow-hardcoded-subs", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -75,7 +75,7 @@ mod tests { "--disable-prefer-indexer-flags", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -99,7 +99,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -126,11 +126,12 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -168,11 +169,12 @@ mod tests { "test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -180,7 +182,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "edit", "collection"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -198,7 +200,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -218,7 +220,7 @@ mod tests { "--disable-monitoring", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -235,7 +237,7 @@ mod tests { "--disable-search-on-add", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -252,7 +254,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -270,7 +272,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -298,11 +300,12 @@ mod tests { "/test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -334,18 +337,19 @@ mod tests { "--search-on-add", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] fn test_edit_indexer_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "edit", "indexer"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -363,7 +367,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -383,7 +387,7 @@ mod tests { "--disable-rss", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -400,7 +404,7 @@ mod tests { "--disable-automatic-search", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -417,7 +421,7 @@ mod tests { "--disable-interactive-search", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -435,7 +439,7 @@ mod tests { "--clear-tags", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -453,7 +457,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -487,11 +491,12 @@ mod tests { "Test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -526,11 +531,12 @@ mod tests { "2", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -578,18 +584,19 @@ mod tests { "25", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] fn test_edit_movie_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "edit", "movie"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -607,7 +614,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -627,7 +634,7 @@ mod tests { "--disable-monitoring", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -645,7 +652,7 @@ mod tests { "--clear-tags", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -669,7 +676,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -686,7 +693,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -714,11 +721,12 @@ mod tests { "/nfs/test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -747,11 +755,12 @@ mod tests { "2", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -787,11 +796,12 @@ mod tests { "2", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } } @@ -887,7 +897,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -958,7 +968,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1030,7 +1040,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1072,7 +1082,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1114,7 +1124,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1156,7 +1166,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1210,7 +1220,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1264,7 +1274,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1318,7 +1328,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1361,7 +1371,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1404,7 +1414,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -1447,7 +1457,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/radarr/get_command_handler_tests.rs b/src/cli/radarr/get_command_handler_tests.rs index 4492cc4..e0652fd 100644 --- a/src/cli/radarr/get_command_handler_tests.rs +++ b/src/cli/radarr/get_command_handler_tests.rs @@ -27,7 +27,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "all-indexer-settings"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -35,7 +35,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "host-config"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -43,7 +43,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "movie-details"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -61,7 +61,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -69,7 +69,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "movie-history"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -87,7 +87,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -95,7 +95,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "security-config"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -103,7 +103,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "get", "system-status"]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -149,7 +149,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -172,7 +172,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -198,7 +198,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -224,7 +224,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -247,7 +247,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -270,7 +270,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/radarr/list_command_handler_tests.rs b/src/cli/radarr/list_command_handler_tests.rs index cc0b093..ba5f810 100644 --- a/src/cli/radarr/list_command_handler_tests.rs +++ b/src/cli/radarr/list_command_handler_tests.rs @@ -43,7 +43,7 @@ mod tests { ) { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "list", subcommand]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -51,7 +51,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "list", "movie-credits"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -63,7 +63,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "list", "downloads", "--count"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -72,7 +72,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "list", "logs", "--events"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -88,11 +88,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::List(credits_command))) = result.unwrap().command { - assert_eq!(credits_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::List(credits_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(credits_command, expected_args); } #[test] @@ -100,11 +102,13 @@ mod tests { let expected_args = RadarrListCommand::Downloads { count: 500 }; let result = Cli::try_parse_from(["managarr", "radarr", "list", "downloads"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::List(refresh_command))) = result.unwrap().command { - assert_eq!(refresh_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::List(refresh_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(refresh_command, expected_args); } #[test] @@ -115,11 +119,13 @@ mod tests { }; let result = Cli::try_parse_from(["managarr", "radarr", "list", "logs"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::List(refresh_command))) = result.unwrap().command { - assert_eq!(refresh_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::List(refresh_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(refresh_command, expected_args); } } @@ -172,7 +178,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -198,7 +204,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -224,7 +230,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -252,7 +258,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/radarr/radarr_command_tests.rs b/src/cli/radarr/radarr_command_tests.rs index ca45835..af2f15f 100644 --- a/src/cli/radarr/radarr_command_tests.rs +++ b/src/cli/radarr/radarr_command_tests.rs @@ -28,7 +28,7 @@ mod tests { ) { let result = Cli::command().try_get_matches_from(["managarr", "radarr", subcommand]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -43,7 +43,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -62,7 +62,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -81,7 +81,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -102,14 +102,14 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_manual_search_requires_movie_id() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "manual-search"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -126,14 +126,14 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_search_new_movie_requires_query() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "search-new-movie"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -150,14 +150,14 @@ mod tests { "halo", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_start_task_requires_task_name() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "start-task"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -174,7 +174,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -188,14 +188,14 @@ mod tests { "application-check-update", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_test_indexer_requires_indexer_id() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "test-indexer"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -212,7 +212,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -220,7 +220,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "toggle-movie-monitoring"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -237,7 +237,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -245,7 +245,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "trigger-automatic-search"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -262,7 +262,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -324,7 +324,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -357,7 +357,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -382,7 +382,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -409,7 +409,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -436,7 +436,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -461,7 +461,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -483,7 +483,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -509,7 +509,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -538,7 +538,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -565,7 +565,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -594,7 +594,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -666,7 +666,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -695,7 +695,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -721,7 +721,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -747,7 +747,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/radarr/refresh_command_handler_tests.rs b/src/cli/radarr/refresh_command_handler_tests.rs index b722c32..9173138 100644 --- a/src/cli/radarr/refresh_command_handler_tests.rs +++ b/src/cli/radarr/refresh_command_handler_tests.rs @@ -31,14 +31,14 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "refresh", subcommand]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_refresh_movie_requires_movie_id() { let result = Cli::command().try_get_matches_from(["managarr", "radarr", "refresh", "movie"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -51,13 +51,13 @@ mod tests { let result = Cli::try_parse_from(["managarr", "radarr", "refresh", "movie", "--movie-id", "1"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Radarr(RadarrCommand::Refresh(refresh_command))) = - result.unwrap().command - { - assert_eq!(refresh_command, expected_args); - } + let Some(Command::Radarr(RadarrCommand::Refresh(refresh_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(refresh_command, expected_args); } } @@ -102,7 +102,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -128,7 +128,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/add_command_handler_tests.rs b/src/cli/sonarr/add_command_handler_tests.rs index e96c012..6558ea7 100644 --- a/src/cli/sonarr/add_command_handler_tests.rs +++ b/src/cli/sonarr/add_command_handler_tests.rs @@ -34,7 +34,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "add", "root-folder"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -56,18 +56,19 @@ mod tests { "/nfs/test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(add_command, expected_args); } #[test] fn test_add_series_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "add", "series"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -91,7 +92,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -115,7 +116,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -139,7 +140,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -163,7 +164,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -187,7 +188,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -216,7 +217,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -239,7 +240,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -263,7 +264,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -288,7 +289,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -325,10 +326,11 @@ mod tests { "1", ]); - assert!(result.is_ok()); - if let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + assert_ok!(&result); + let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(add_command, expected_args); } #[test] @@ -368,10 +370,11 @@ mod tests { "2", ]); - assert!(result.is_ok()); - if let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + assert_ok!(&result); + let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(add_command, expected_args); } #[test] @@ -418,17 +421,18 @@ mod tests { "--no-search-for-series", ]); - assert!(result.is_ok()); - if let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + assert_ok!(&result); + let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(add_command, expected_args); } #[test] fn test_add_tag_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "add", "tag"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -443,11 +447,12 @@ mod tests { let result = Cli::try_parse_from(["managarr", "sonarr", "add", "tag", "--name", "test"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command { - assert_eq!(add_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Add(add_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(add_command, expected_args); } } @@ -501,7 +506,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -554,7 +559,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -581,7 +586,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/delete_command_handler_tests.rs b/src/cli/sonarr/delete_command_handler_tests.rs index 514df6f..38a39d7 100644 --- a/src/cli/sonarr/delete_command_handler_tests.rs +++ b/src/cli/sonarr/delete_command_handler_tests.rs @@ -30,7 +30,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "blocklist-item"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -52,12 +52,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -65,7 +66,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "download"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -85,12 +86,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -98,7 +100,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "episode-file"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -118,19 +120,20 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] fn test_delete_indexer_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "indexer"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -150,12 +153,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -163,7 +167,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "root-folder"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -183,19 +187,20 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] fn test_delete_series_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "series"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -213,12 +218,13 @@ mod tests { let result = Cli::try_parse_from(["managarr", "sonarr", "delete", "series", "--series-id", "1"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] @@ -240,19 +246,20 @@ mod tests { "--add-list-exclusion", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } #[test] fn test_delete_tag_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "delete", "tag"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -265,12 +272,13 @@ mod tests { let result = Cli::try_parse_from(["managarr", "sonarr", "delete", "tag", "--tag-id", "1"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command - { - assert_eq!(delete_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Delete(delete_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(delete_command, expected_args); } } @@ -322,7 +330,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -348,7 +356,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -374,7 +382,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -400,7 +408,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -426,7 +434,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -460,7 +468,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -486,7 +494,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/download_command_handler_tests.rs b/src/cli/sonarr/download_command_handler_tests.rs index bb4cbd4..8ff625f 100644 --- a/src/cli/sonarr/download_command_handler_tests.rs +++ b/src/cli/sonarr/download_command_handler_tests.rs @@ -41,7 +41,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -61,7 +61,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -81,7 +81,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -103,7 +103,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -121,7 +121,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -143,7 +143,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -165,7 +165,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -187,7 +187,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -211,7 +211,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -227,7 +227,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -247,7 +247,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -267,7 +267,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -289,7 +289,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -345,7 +345,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -382,7 +382,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -417,7 +417,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/edit_command_handler_tests.rs b/src/cli/sonarr/edit_command_handler_tests.rs index efa2633..58cc2ac 100644 --- a/src/cli/sonarr/edit_command_handler_tests.rs +++ b/src/cli/sonarr/edit_command_handler_tests.rs @@ -32,7 +32,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "edit", "all-indexer-settings"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -57,7 +57,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -78,11 +78,12 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -108,18 +109,19 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] fn test_edit_indexer_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "edit", "indexer"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -137,7 +139,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -157,7 +159,7 @@ mod tests { "--disable-rss", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -174,7 +176,7 @@ mod tests { "--disable-automatic-search", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -191,7 +193,7 @@ mod tests { "--disable-interactive-search", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -209,7 +211,7 @@ mod tests { "--clear-tags", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -227,7 +229,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -261,11 +263,12 @@ mod tests { "Test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -300,11 +303,12 @@ mod tests { "2", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -352,18 +356,19 @@ mod tests { "25", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] fn test_edit_series_requires_arguments() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "edit", "series"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -381,7 +386,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -401,7 +406,7 @@ mod tests { "--disable-monitoring", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -418,7 +423,7 @@ mod tests { "--disable-season-folders", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -436,7 +441,7 @@ mod tests { "--clear-tags", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::ArgumentConflict); } @@ -461,7 +466,7 @@ mod tests { flag, ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -478,7 +483,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -509,11 +514,12 @@ mod tests { "/nfs/test", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -545,11 +551,12 @@ mod tests { "2", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } #[test] @@ -591,11 +598,12 @@ mod tests { "2", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command { - assert_eq!(edit_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Edit(edit_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(edit_command, expected_args); } } @@ -674,7 +682,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -728,7 +736,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -776,7 +784,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -824,7 +832,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -872,7 +880,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/get_command_handler_tests.rs b/src/cli/sonarr/get_command_handler_tests.rs index 5feae2c..b8e4a8a 100644 --- a/src/cli/sonarr/get_command_handler_tests.rs +++ b/src/cli/sonarr/get_command_handler_tests.rs @@ -28,7 +28,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "get", "all-indexer-settings"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -36,7 +36,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "get", "system-status"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -44,7 +44,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "get", "episode-details"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -62,7 +62,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -70,7 +70,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "get", "host-config"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -78,7 +78,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "get", "security-config"]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -86,7 +86,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "get", "series-details"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -104,7 +104,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -150,7 +150,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -176,7 +176,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -199,7 +199,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -222,7 +222,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -248,7 +248,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -271,7 +271,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/list_command_handler_tests.rs b/src/cli/sonarr/list_command_handler_tests.rs index b0be1a2..2c51b0f 100644 --- a/src/cli/sonarr/list_command_handler_tests.rs +++ b/src/cli/sonarr/list_command_handler_tests.rs @@ -42,14 +42,14 @@ mod tests { ) { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", subcommand]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_list_episodes_requires_series_id() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "episodes"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -61,7 +61,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "episode-files"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -73,7 +73,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "episode-history"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -92,13 +92,14 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(episode_history_command))) = + let Some(Command::Sonarr(SonarrCommand::List(episode_history_command))) = result.unwrap().command - { - assert_eq!(episode_history_command, expected_args); - } + else { + panic!("Unexpected command type"); + }; + assert_eq!(episode_history_command, expected_args); } #[test] @@ -106,7 +107,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "downloads", "--count"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -115,12 +116,13 @@ mod tests { let expected_args = SonarrListCommand::Downloads { count: 500 }; let result = Cli::try_parse_from(["managarr", "sonarr", "list", "downloads"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(downloads_command))) = result.unwrap().command - { - assert_eq!(downloads_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::List(downloads_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(downloads_command, expected_args); } #[test] @@ -128,7 +130,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "history", "--events"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -137,11 +139,13 @@ mod tests { let expected_args = SonarrListCommand::History { events: 500 }; let result = Cli::try_parse_from(["managarr", "sonarr", "list", "history"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(history_command))) = result.unwrap().command { - assert_eq!(history_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::List(history_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(history_command, expected_args); } #[test] @@ -149,7 +153,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "logs", "--events"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -161,11 +165,12 @@ mod tests { }; let result = Cli::try_parse_from(["managarr", "sonarr", "list", "logs"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(logs_command))) = result.unwrap().command { - assert_eq!(logs_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::List(logs_command))) = result.unwrap().command else { + panic!("Unexpected command type"); + }; + assert_eq!(logs_command, expected_args); } #[test] @@ -174,12 +179,13 @@ mod tests { let result = Cli::try_parse_from(["managarr", "sonarr", "list", "episodes", "--series-id", "1"]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(episodes_command))) = result.unwrap().command - { - assert_eq!(episodes_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::List(episodes_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(episodes_command, expected_args); } #[test] @@ -194,13 +200,14 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(episode_files_command))) = + let Some(Command::Sonarr(SonarrCommand::List(episode_files_command))) = result.unwrap().command - { - assert_eq!(episode_files_command, expected_args); - } + else { + panic!("Unexpected command type"); + }; + assert_eq!(episode_files_command, expected_args); } #[test] @@ -214,7 +221,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -232,7 +239,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -252,7 +259,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -260,7 +267,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "list", "series-history"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -279,11 +286,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::List(series_command))) = result.unwrap().command { - assert_eq!(series_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::List(series_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(series_command, expected_args); } } @@ -339,7 +348,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -365,7 +374,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -391,7 +400,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -417,7 +426,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -443,7 +452,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -471,7 +480,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -497,7 +506,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -523,7 +532,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -553,7 +562,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/manual_search_command_handler_tests.rs b/src/cli/sonarr/manual_search_command_handler_tests.rs index 0244f11..ddcb3fc 100644 --- a/src/cli/sonarr/manual_search_command_handler_tests.rs +++ b/src/cli/sonarr/manual_search_command_handler_tests.rs @@ -36,7 +36,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -54,7 +54,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -74,7 +74,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -82,7 +82,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "manual-search", "episode"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -100,7 +100,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -149,7 +149,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -182,7 +182,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/refresh_command_handler_tests.rs b/src/cli/sonarr/refresh_command_handler_tests.rs index 509009d..e861c51 100644 --- a/src/cli/sonarr/refresh_command_handler_tests.rs +++ b/src/cli/sonarr/refresh_command_handler_tests.rs @@ -31,14 +31,14 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "refresh", subcommand]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_refresh_series_requires_series_id() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "refresh", "series"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -57,13 +57,13 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); - if let Some(Command::Sonarr(SonarrCommand::Refresh(refresh_command))) = - result.unwrap().command - { - assert_eq!(refresh_command, expected_args); - } + let Some(Command::Sonarr(SonarrCommand::Refresh(refresh_command))) = result.unwrap().command + else { + panic!("Unexpected command type"); + }; + assert_eq!(refresh_command, expected_args); } } @@ -109,7 +109,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -135,7 +135,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/sonarr_command_tests.rs b/src/cli/sonarr/sonarr_command_tests.rs index 28320f5..ac48082 100644 --- a/src/cli/sonarr/sonarr_command_tests.rs +++ b/src/cli/sonarr/sonarr_command_tests.rs @@ -29,7 +29,7 @@ mod tests { ) { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", subcommand]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -37,7 +37,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "mark-history-item-as-failed"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -54,14 +54,14 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_search_new_series_requires_query() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "search-new-series"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -78,14 +78,14 @@ mod tests { "halo", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_start_task_requires_task_name() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "start-task"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -102,7 +102,7 @@ mod tests { "test", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!(result.unwrap_err().kind(), ErrorKind::InvalidValue); } @@ -116,14 +116,14 @@ mod tests { "application-update-check", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] fn test_test_indexer_requires_indexer_id() { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "test-indexer"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -140,7 +140,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -148,7 +148,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "toggle-episode-monitoring"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -165,7 +165,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -178,7 +178,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -195,7 +195,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -214,7 +214,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -222,7 +222,7 @@ mod tests { let result = Cli::command().try_get_matches_from(["managarr", "sonarr", "toggle-series-monitoring"]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -239,7 +239,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -304,7 +304,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -334,7 +334,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -361,7 +361,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -390,7 +390,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -426,7 +426,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -484,7 +484,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -512,7 +512,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -542,7 +542,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -564,7 +564,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -586,7 +586,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -612,7 +612,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -639,7 +639,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -666,7 +666,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -691,7 +691,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -713,7 +713,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -743,7 +743,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -776,7 +776,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -805,7 +805,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } diff --git a/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs b/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs index 7521d55..c0054af 100644 --- a/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs +++ b/src/cli/sonarr/trigger_automatic_search_command_handler_tests.rs @@ -36,7 +36,7 @@ mod tests { "series", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -54,7 +54,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -68,7 +68,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -86,7 +86,7 @@ mod tests { "1", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -106,7 +106,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } #[test] @@ -118,7 +118,7 @@ mod tests { "episode", ]); - assert!(result.is_err()); + assert_err!(&result); assert_eq!( result.unwrap_err().kind(), ErrorKind::MissingRequiredArgument @@ -136,7 +136,7 @@ mod tests { "1", ]); - assert!(result.is_ok()); + assert_ok!(&result); } } @@ -186,7 +186,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -220,7 +220,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } #[tokio::test] @@ -250,7 +250,7 @@ mod tests { .handle() .await; - assert!(result.is_ok()); + assert_ok!(&result); } } } From d47dadeb88203195346671ee9db57e121e4c1d2c Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 9 Dec 2025 14:28:09 -0700 Subject: [PATCH 12/28] refactor: Used is_multiple_of to make life easier and cleaner in the app module --- src/app/mod.rs | 5 ++++- src/app/radarr/mod.rs | 2 +- src/app/sonarr/mod.rs | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 894aac9..83e9aa3 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -161,7 +161,10 @@ impl App<'_> { } pub async fn on_tick(&mut self) { - if self.tick_count % self.tick_until_poll == 0 || self.is_routing || self.should_refresh { + if self.tick_count.is_multiple_of(self.tick_until_poll) + || self.is_routing + || self.should_refresh + { match self.get_current_route() { Route::Radarr(active_radarr_block, _) => self.radarr_on_tick(active_radarr_block).await, Route::Sonarr(active_sonarr_block, _) => self.sonarr_on_tick(active_sonarr_block).await, diff --git a/src/app/radarr/mod.rs b/src/app/radarr/mod.rs index b749d03..3e939ef 100644 --- a/src/app/radarr/mod.rs +++ b/src/app/radarr/mod.rs @@ -185,7 +185,7 @@ impl App<'_> { } } - if self.tick_count % self.tick_until_poll == 0 { + if self.tick_count.is_multiple_of(self.tick_until_poll) { self.refresh_radarr_metadata().await; } } diff --git a/src/app/sonarr/mod.rs b/src/app/sonarr/mod.rs index 44ee45f..e9c3de7 100644 --- a/src/app/sonarr/mod.rs +++ b/src/app/sonarr/mod.rs @@ -214,7 +214,7 @@ impl App<'_> { } } - if self.tick_count % self.tick_until_poll == 0 { + if self.tick_count.is_multiple_of(self.tick_until_poll) { self.refresh_sonarr_metadata().await; } } From d4bea9118631bd2e91d560da74724e534fc650bd Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 9 Dec 2025 14:28:47 -0700 Subject: [PATCH 13/28] refactor: Updated all handler tests to use purpose built assertions to improve readability and maintainability --- src/handlers/handlers_tests.rs | 2 +- src/handlers/keybinding_handler_tests.rs | 2 +- .../blocklist/blocklist_handler_tests.rs | 6 +- .../collection_details_handler_tests.rs | 70 +++--- .../collections/collections_handler_tests.rs | 16 +- .../edit_collection_handler_tests.rs | 50 ++-- .../downloads/downloads_handler_tests.rs | 8 +- .../indexers/edit_indexer_handler_tests.rs | 228 +++++++++-------- .../edit_indexer_settings_handler_tests.rs | 63 ++--- .../indexers/indexers_handler_tests.rs | 42 ++-- .../test_all_indexers_handler_tests.rs | 4 +- .../library/add_movie_handler_tests.rs | 94 +++---- .../library/delete_movie_handler_tests.rs | 14 +- .../library/edit_movie_handler_tests.rs | 64 ++--- .../library/library_handler_tests.rs | 32 +-- .../library/movie_details_handler_tests.rs | 22 +- .../radarr_handler_test_utils.rs | 4 +- .../root_folders_handler_tests.rs | 22 +- .../system/system_details_handler_tests.rs | 20 +- .../system/system_handler_tests.rs | 8 +- .../blocklist/blocklist_handler_tests.rs | 20 +- .../downloads/downloads_handler_tests.rs | 21 +- .../history/history_handler_tests.rs | 6 +- .../indexers/edit_indexer_handler_tests.rs | 235 ++++++++++-------- .../edit_indexer_settings_handler_tests.rs | 38 ++- .../indexers/indexers_handler_tests.rs | 41 ++- .../test_all_indexers_handler_tests.rs | 4 +- .../library/add_series_handler_tests.rs | 81 +++--- .../library/delete_series_handler_tests.rs | 14 +- .../library/edit_series_handler_tests.rs | 72 +++--- .../library/episode_details_handler_tests.rs | 51 ++-- .../library/library_handler_tests.rs | 32 +-- .../library/season_details_handler_tests.rs | 45 ++-- .../library/series_details_handler_tests.rs | 37 +-- .../root_folders_handler_tests.rs | 22 +- .../system/system_details_handler_tests.rs | 14 +- .../system/system_handler_tests.rs | 8 +- src/handlers/table_handler_tests.rs | 40 +-- 38 files changed, 801 insertions(+), 751 deletions(-) diff --git a/src/handlers/handlers_tests.rs b/src/handlers/handlers_tests.rs index f41a375..650511c 100644 --- a/src/handlers/handlers_tests.rs +++ b/src/handlers/handlers_tests.rs @@ -33,7 +33,7 @@ mod tests { handle_clear_errors(&mut app); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } #[rstest] diff --git a/src/handlers/keybinding_handler_tests.rs b/src/handlers/keybinding_handler_tests.rs index f5e94eb..49568a7 100644 --- a/src/handlers/keybinding_handler_tests.rs +++ b/src/handlers/keybinding_handler_tests.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; use crate::handlers::KeyEventHandler; use crate::handlers::KeybindingHandler; diff --git a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs index bac50b9..af27925 100644 --- a/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/radarr_handlers/blocklist/blocklist_handler_tests.rs @@ -7,12 +7,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::radarr_handlers::blocklist::{blocklist_sorting_options, BlocklistHandler}; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; use crate::models::radarr_models::{BlocklistItem, BlocklistItemMovie}; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; @@ -198,7 +198,7 @@ mod tests { BlocklistHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveRadarrBlock::Blocklist.into()); } } diff --git a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs index 5d12e90..2f5bdb8 100644 --- a/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collection_details_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_modal_absent; use crate::event::Key; - use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::collections::collection_details_handler::CollectionDetailsHandler; use crate::models::radarr_models::CollectionMovie; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, @@ -17,9 +17,9 @@ mod tests { mod test_handle_submit { use crate::assert_navigation_pushed; + use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use bimap::BiMap; use pretty_assertions::assert_eq; @@ -60,37 +60,43 @@ mod tests { ) .into() ); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty()); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty() + ); assert_eq!( app.data.radarr_data.selected_block.get_active_block(), ActiveRadarrBlock::AddMovieSelectRootFolder ); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .minimum_availability_list - .items - .is_empty()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty()); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .minimum_availability_list + .items + .is_empty() + ); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty() + ); assert_str_eq!( app .data @@ -184,7 +190,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); - assert!(app.data.radarr_data.collection_movies.items.is_empty()); + assert_is_empty!(app.data.radarr_data.collection_movies.items); } #[test] @@ -213,7 +219,7 @@ mod tests { use crate::models::radarr_models::{Collection, MinimumAvailability}; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_COLLECTION_SELECTION_BLOCKS, + EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, }; use crate::test_edit_collection_key; diff --git a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs index 2a0c028..2b15773 100644 --- a/src/handlers/radarr_handlers/collections/collections_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/collections_handler_tests.rs @@ -7,18 +7,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::collections::{ - collections_sorting_options, CollectionsHandler, - }; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::collections::{ + CollectionsHandler, collections_sorting_options, + }; use crate::models::radarr_models::{Collection, CollectionMovie}; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, COLLECTIONS_BLOCKS, COLLECTION_DETAILS_BLOCKS, EDIT_COLLECTION_BLOCKS, + ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS, }; use crate::test_handler_delegation; @@ -189,7 +189,7 @@ mod tests { .handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); } } @@ -233,7 +233,7 @@ mod tests { CollectionsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Collections, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -245,7 +245,7 @@ mod tests { use crate::models::radarr_models::MinimumAvailability; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_COLLECTION_SELECTION_BLOCKS, + EDIT_COLLECTION_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; use crate::{assert_navigation_popped, test_edit_collection_key}; diff --git a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs index a2d5153..ac355af 100644 --- a/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs +++ b/src/handlers/radarr_handlers/collections/edit_collection_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::collections::edit_collection_handler::EditCollectionHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::collection; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Collection, EditCollectionParams, MinimumAvailability}; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ @@ -24,9 +24,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -477,15 +477,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_collection_modal - .as_ref() - .unwrap() - .path - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_collection_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditCollectionPrompt.into()); } @@ -512,7 +514,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Collections.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); } #[test] @@ -602,7 +604,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditCollectionPrompt.into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.should_refresh); } @@ -627,7 +629,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .radarr_data @@ -635,7 +637,7 @@ mod tests { .as_ref() .unwrap() .monitored, - Some(true) + true ); EditCollectionHandler::new( @@ -647,7 +649,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .radarr_data @@ -655,7 +657,7 @@ mod tests { .as_ref() .unwrap() .monitored, - Some(false) + false ); } @@ -685,7 +687,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .radarr_data @@ -693,7 +695,7 @@ mod tests { .as_ref() .unwrap() .search_on_add, - Some(true) + true ); EditCollectionHandler::new( @@ -705,7 +707,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .radarr_data @@ -713,7 +715,7 @@ mod tests { .as_ref() .unwrap() .search_on_add, - Some(false) + false ); } @@ -750,7 +752,7 @@ mod tests { app, (selected_block, Some(ActiveRadarrBlock::Collections)).into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); if selected_block == ActiveRadarrBlock::EditCollectionRootFolderPathInput { assert!(app.ignore_special_keys_for_textbox_input); @@ -865,10 +867,10 @@ mod tests { use crate::{ assert_navigation_popped, models::{ + BlockSelectionState, servarr_data::radarr::{ modals::EditCollectionModal, radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS, }, - BlockSelectionState, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs index 79244f0..afc9805 100644 --- a/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/radarr_handlers/downloads/downloads_handler_tests.rs @@ -4,13 +4,13 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::downloads::DownloadsHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::download_record; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; @@ -187,7 +187,7 @@ mod tests { DownloadsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, base_route.into()); } } @@ -229,7 +229,7 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Downloads, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Downloads.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs index 94e7628..179e7fe 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -422,11 +422,11 @@ mod tests { use std::sync::atomic::Ordering; use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -856,7 +856,7 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ - servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; use crate::network::radarr_network::RadarrEvent; @@ -887,9 +887,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.should_refresh); - assert_eq!(app.data.radarr_data.edit_indexer_modal, None); + assert_none!(app.data.radarr_data.edit_indexer_modal); } #[test] @@ -972,7 +972,7 @@ mod tests { ); assert_modal_present!(app.data.radarr_data.edit_indexer_modal); assert!(!app.should_refresh); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); } #[rstest] @@ -1054,14 +1054,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1075,14 +1077,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); } #[test] @@ -1107,14 +1111,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1128,14 +1134,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); } #[test] @@ -1160,14 +1168,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1181,14 +1191,16 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); } #[test] @@ -1212,15 +1224,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .name - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .name + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1245,15 +1259,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .url - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .url + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1278,15 +1294,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .api_key - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .api_key + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1311,15 +1329,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .seed_ratio - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .seed_ratio + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } @@ -1344,15 +1364,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .tags + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); } } @@ -1386,7 +1408,7 @@ mod tests { assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.edit_indexer_modal, None); + assert_none!(app.data.radarr_data.edit_indexer_modal); } #[rstest] @@ -1422,9 +1444,9 @@ mod tests { use super::*; use crate::app::App; use crate::assert_navigation_popped; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 5f0f0e1..b9a219e 100644 --- a/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -4,14 +4,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer_settings; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -269,9 +269,9 @@ mod tests { mod test_handle_left_right_action { use std::sync::atomic::Ordering; + use crate::models::BlockSelectionState; use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -428,8 +428,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - radarr_models::IndexerSettings, - servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, radarr_models::IndexerSettings, + servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, network::radarr_network::RadarrEvent, }; @@ -461,9 +461,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.should_refresh); - assert_eq!(app.data.radarr_data.indexer_settings, None); + assert_none!(app.data.radarr_data.indexer_settings); } #[test] @@ -739,15 +739,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .indexer_settings - .as_ref() - .unwrap() - .whitelisted_hardcoded_subs - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .indexer_settings + .as_ref() + .unwrap() + .whitelisted_hardcoded_subs + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::AllIndexerSettingsPrompt.into()); } @@ -774,7 +776,6 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use crate::models::radarr_models::IndexerSettings; @@ -802,7 +803,7 @@ mod tests { assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.indexer_settings, None); + assert_none!(app.data.radarr_data.indexer_settings); } #[test] @@ -825,9 +826,9 @@ mod tests { assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.data.radarr_data.indexer_settings, - Some(IndexerSettings::default()) + assert_some_eq_x!( + &app.data.radarr_data.indexer_settings, + &IndexerSettings::default() ); } @@ -851,21 +852,21 @@ mod tests { IndexerSettingsHandler::new(ESC_KEY, &mut app, active_radarr_block, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); - assert_eq!( - app.data.radarr_data.indexer_settings, - Some(IndexerSettings::default()) + assert_some_eq_x!( + &app.data.radarr_data.indexer_settings, + &IndexerSettings::default() ); } } mod test_handle_key_char { - use pretty_assertions::{assert_eq, assert_str_eq}; + use pretty_assertions::assert_str_eq; use crate::{ assert_navigation_popped, models::{ - radarr_models::IndexerSettings, - servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, radarr_models::IndexerSettings, + servarr_data::radarr::radarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, network::radarr_network::RadarrEvent, }; @@ -950,9 +951,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::EditAllIndexerSettings(indexer_settings())) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::EditAllIndexerSettings(indexer_settings()) ); assert_modal_absent!(app.data.radarr_data.indexer_settings); assert!(app.should_refresh); diff --git a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs index 341279f..e25c24c 100644 --- a/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/indexers_handler_tests.rs @@ -4,15 +4,15 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::indexers::IndexersHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, + ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; use crate::test_handler_delegation; @@ -125,7 +125,7 @@ mod tests { use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::indexer; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, RadarrData, }; use crate::models::servarr_models::{Indexer, IndexerField}; use crate::network::radarr_network::RadarrEvent; @@ -192,13 +192,13 @@ mod tests { IndexersHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::Indexers, None).handle(); assert_navigation_pushed!(app, ActiveRadarrBlock::EditIndexerPrompt.into()); - assert_eq!( - app.data.radarr_data.edit_indexer_modal, - Some((&app.data.radarr_data).into()) + assert_some_eq_x!( + &app.data.radarr_data.edit_indexer_modal, + &EditIndexerModal::from(&app.data.radarr_data) ); - assert_eq!( - app.data.radarr_data.edit_indexer_modal, - Some(expected_edit_indexer_modal) + assert_some_eq_x!( + &app.data.radarr_data.edit_indexer_modal, + &expected_edit_indexer_modal ); if torrent_protocol { assert_eq!( @@ -227,7 +227,7 @@ mod tests { IndexersHandler::new(SUBMIT_KEY, &mut app, ActiveRadarrBlock::Indexers, None).handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into()); - assert_eq!(app.data.radarr_data.edit_indexer_modal, None); + assert_none!(app.data.radarr_data.edit_indexer_modal); } #[test] @@ -247,9 +247,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::DeleteIndexer(1)) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::DeleteIndexer(1) ); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); } @@ -274,14 +274,12 @@ mod tests { .handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); } } mod test_handle_esc { - use pretty_assertions::assert_eq; - use super::*; use crate::assert_navigation_popped; @@ -318,7 +316,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::TestIndexer, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); - assert_eq!(app.data.radarr_data.indexer_test_errors, None); + assert_none!(app.data.radarr_data.indexer_test_errors); } #[rstest] @@ -332,7 +330,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Indexers, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -538,9 +536,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::DeleteIndexer(1)) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::DeleteIndexer(1) ); assert_navigation_popped!(app, ActiveRadarrBlock::Indexers.into()); } diff --git a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs index 0f4a6b6..367d816 100644 --- a/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/radarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -1,9 +1,9 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::stateful_table::StatefulTable; diff --git a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs index d4c6540..b61d7ec 100644 --- a/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/add_movie_handler_tests.rs @@ -9,18 +9,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::add_movie_handler::AddMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::add_movie_body; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::collection_movie; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{AddMovieSearchResult, MinimumAvailability, MovieMonitor}; use crate::models::servarr_data::radarr::modals::AddMovieModal; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS}; + use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; use crate::models::servarr_models::RootFolder; - use crate::models::HorizontallyScrollableText; use bimap::BiMap; mod test_handle_scroll_up_and_down { @@ -28,9 +28,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::simple_stateful_iterable_vec; use super::*; @@ -768,11 +768,11 @@ mod tests { use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{ add_movie_body, add_movie_search_result, collection_movie, }; + use crate::models::BlockSelectionState; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; use crate::models::stateful_table::StatefulTable; - use crate::models::BlockSelectionState; use crate::network::radarr_network::RadarrEvent; use bimap::BiMap; use pretty_assertions::{assert_eq, assert_str_eq}; @@ -851,33 +851,39 @@ mod tests { ActiveRadarrBlock::AddMovieSelectRootFolder ); assert_modal_present!(app.data.radarr_data.add_movie_modal); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .minimum_availability_list - .items - .is_empty()); - assert!(!app - .data - .radarr_data - .add_movie_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty()); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty() + ); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .minimum_availability_list + .items + .is_empty() + ); + assert!( + !app + .data + .radarr_data + .add_movie_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty() + ); assert_str_eq!( app .data @@ -979,7 +985,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); } #[rstest] @@ -1053,9 +1059,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::AddMovie(add_movie_body())) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::AddMovie(add_movie_body()) ); assert_modal_absent!(app.data.radarr_data.add_movie_modal); } @@ -1093,7 +1099,7 @@ mod tests { app, (selected_block, Some(ActiveRadarrBlock::CollectionDetails)).into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); if selected_block == ActiveRadarrBlock::AddMovieTagsInput { assert!(app.ignore_special_keys_for_textbox_input); @@ -1132,7 +1138,6 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use crate::models::servarr_data::radarr::modals::AddMovieModal; @@ -1162,7 +1167,7 @@ mod tests { assert!(!app.ignore_special_keys_for_textbox_input); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert_eq!(app.data.radarr_data.add_movie_search, None); + assert_none!(app.data.radarr_data.add_movie_search); } #[test] @@ -1310,7 +1315,6 @@ mod tests { mod test_handle_key_char { use bimap::BiMap; - use pretty_assertions::assert_eq; use rstest::rstest; use super::*; @@ -1320,9 +1324,9 @@ mod tests { add_movie_body, add_movie_search_result, collection_movie, }, models::{ + BlockSelectionState, servarr_data::radarr::{modals::AddMovieModal, radarr_data::ADD_MOVIE_SELECTION_BLOCKS}, stateful_table::StatefulTable, - BlockSelectionState, }, network::radarr_network::RadarrEvent, }; @@ -1490,9 +1494,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::AddMovie(add_movie_body())) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::AddMovie(add_movie_body()) ); assert_modal_absent!(app.data.radarr_data.add_movie_modal); } diff --git a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs index 8ed4737..ca73c5a 100644 --- a/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/delete_movie_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::DeleteMovieParams; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; @@ -17,8 +17,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use super::*; @@ -83,8 +83,8 @@ mod tests { mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS; use crate::network::radarr_network::RadarrEvent; use super::*; @@ -115,7 +115,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.data.radarr_data.prompt_confirm); assert!(!app.data.radarr_data.delete_movie_files); assert!(!app.data.radarr_data.add_list_exclusion); @@ -183,7 +183,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::DeleteMoviePrompt.into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.should_refresh); assert!(app.data.radarr_data.prompt_confirm); assert!(app.data.radarr_data.delete_movie_files); @@ -257,7 +257,7 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs index 7a6a706..03bfc52 100644 --- a/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/edit_movie_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::library::edit_movie_handler::EditMovieHandler; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{EditMovieParams, MinimumAvailability, Movie}; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS}; @@ -22,9 +22,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::EDIT_MOVIE_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -568,15 +568,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_movie_modal - .as_ref() - .unwrap() - .path - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_movie_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } @@ -600,15 +602,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .radarr_data - .edit_movie_modal - .as_mut() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .radarr_data + .edit_movie_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveRadarrBlock::EditMoviePrompt.into()); } @@ -634,7 +638,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); } #[test] @@ -716,7 +720,7 @@ mod tests { app.get_current_route(), ActiveRadarrBlock::EditMoviePrompt.into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.should_refresh); } @@ -740,7 +744,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .radarr_data @@ -748,7 +752,7 @@ mod tests { .as_ref() .unwrap() .monitored, - Some(true) + true ); EditMovieHandler::new( @@ -760,7 +764,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .radarr_data @@ -768,7 +772,7 @@ mod tests { .as_ref() .unwrap() .monitored, - Some(false) + false ); } @@ -805,7 +809,7 @@ mod tests { app, (selected_block, Some(ActiveRadarrBlock::Movies)).into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); if selected_block == ActiveRadarrBlock::EditMoviePathInput || selected_block == ActiveRadarrBlock::EditMovieTagsInput @@ -847,7 +851,7 @@ mod tests { ) .into() ); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert!(!app.ignore_special_keys_for_textbox_input); } @@ -954,8 +958,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - servarr_data::radarr::{modals::EditMovieModal, radarr_data::EDIT_MOVIE_SELECTION_BLOCKS}, BlockSelectionState, + servarr_data::radarr::{modals::EditMovieModal, radarr_data::EDIT_MOVIE_SELECTION_BLOCKS}, }, network::radarr_network::RadarrEvent, }; diff --git a/src/handlers/radarr_handlers/library/library_handler_tests.rs b/src/handlers/radarr_handlers/library/library_handler_tests.rs index 236c701..5ac7b9a 100644 --- a/src/handlers/radarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/library_handler_tests.rs @@ -5,18 +5,18 @@ mod tests { use std::cmp::Ordering; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::library::{movies_sorting_options, LibraryHandler}; - use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::library::{LibraryHandler, movies_sorting_options}; + use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::movie; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, ADD_MOVIE_BLOCKS, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, + ADD_MOVIE_BLOCKS, ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, MOVIE_DETAILS_BLOCKS, }; use crate::models::servarr_models::Language; @@ -207,9 +207,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::UpdateAllMovies) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::UpdateAllMovies ); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } @@ -234,7 +234,7 @@ mod tests { .handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } } @@ -288,7 +288,7 @@ mod tests { LibraryHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::Movies, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -301,7 +301,7 @@ mod tests { use crate::models::radarr_models::MinimumAvailability; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_MOVIE_SELECTION_BLOCKS, + EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; @@ -405,9 +405,9 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(app.data.radarr_data.prompt_confirm); assert!(app.is_routing); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::ToggleMovieMonitoring(0)) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::ToggleMovieMonitoring(0) ); } @@ -539,9 +539,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::UpdateAllMovies) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::UpdateAllMovies ); assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); } diff --git a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs index eca2523..a5d8077 100644 --- a/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/movie_details_handler_tests.rs @@ -7,16 +7,16 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::library::movie_details_handler::{ - releases_sorting_options, MovieDetailsHandler, + MovieDetailsHandler, releases_sorting_options, }; use crate::handlers::radarr_handlers::radarr_handler_test_utils::utils::{movie, release}; - use crate::handlers::KeyEventHandler; use crate::models::radarr_models::{Credit, MovieHistoryItem}; use crate::models::radarr_models::{RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::servarr_data::radarr::modals::MovieDetailsModal; @@ -393,9 +393,9 @@ mod tests { assert!(app.data.radarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveRadarrBlock::MovieDetails.into()); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &expected_action ); } @@ -420,7 +420,7 @@ mod tests { assert!(!app.data.radarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveRadarrBlock::MovieDetails.into()); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); } } @@ -495,7 +495,7 @@ mod tests { use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::servarr_data::radarr::radarr_data::{ - RadarrData, EDIT_MOVIE_SELECTION_BLOCKS, + EDIT_MOVIE_SELECTION_BLOCKS, RadarrData, }; use crate::network::radarr_network::RadarrEvent; use crate::{assert_navigation_popped, test_edit_movie_key}; @@ -808,9 +808,9 @@ mod tests { assert!(app.data.radarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveRadarrBlock::MovieDetails.into()); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &expected_action ); } } diff --git a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs index 9b89981..b97b31e 100644 --- a/src/handlers/radarr_handlers/radarr_handler_test_utils.rs +++ b/src/handlers/radarr_handlers/radarr_handler_test_utils.rs @@ -1,6 +1,7 @@ #[cfg(test)] #[macro_use] pub(in crate::handlers::radarr_handlers) mod utils { + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{ AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie, DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, @@ -9,9 +10,8 @@ pub(in crate::handlers::radarr_handlers) mod utils { use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; - use crate::models::HorizontallyScrollableText; use chrono::DateTime; - use serde_json::{json, Number}; + use serde_json::{Number, json}; #[macro_export] macro_rules! test_edit_movie_key { diff --git a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs index 7f8da78..a032253 100644 --- a/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/radarr_handlers/root_folders/root_folders_handler_tests.rs @@ -4,18 +4,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::radarr_handlers::radarr_handler_test_utils::utils::root_folder; use crate::handlers::radarr_handlers::root_folders::RootFoldersHandler; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; - use crate::models::HorizontallyScrollableText; mod test_handle_home_end { use pretty_assertions::assert_eq; @@ -332,9 +332,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::DeleteRootFolder(1)) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::DeleteRootFolder(1) ); assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } @@ -359,7 +359,7 @@ mod tests { .handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } } @@ -424,7 +424,7 @@ mod tests { RootFoldersHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::RootFolders, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -600,9 +600,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::DeleteRootFolder(1)) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::DeleteRootFolder(1) ); assert_navigation_popped!(app, ActiveRadarrBlock::RootFolders.into()); } diff --git a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs index 55452c2..a2eed58 100644 --- a/src/handlers/radarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_details_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::models::radarr_models::{RadarrTask, RadarrTaskName}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, @@ -693,9 +693,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::StartTask(RadarrTaskName::default())) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::StartTask(RadarrTaskName::default()) ); assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); } @@ -716,7 +716,7 @@ mod tests { .handle(); assert!(!app.data.radarr_data.prompt_confirm); - assert_eq!(app.data.radarr_data.prompt_confirm_action, None); + assert_none!(app.data.radarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); } } @@ -750,7 +750,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::SystemLogs, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); - assert!(app.data.radarr_data.log_details.items.is_empty()); + assert_is_empty!(app.data.radarr_data.log_details.items); } #[rstest] @@ -907,9 +907,9 @@ mod tests { .handle(); assert!(app.data.radarr_data.prompt_confirm); - assert_eq!( - app.data.radarr_data.prompt_confirm_action, - Some(RadarrEvent::StartTask(RadarrTaskName::default())) + assert_some_eq_x!( + &app.data.radarr_data.prompt_confirm_action, + &RadarrEvent::StartTask(RadarrTaskName::default()) ); assert_navigation_popped!(app, ActiveRadarrBlock::SystemTasks.into()); } diff --git a/src/handlers/radarr_handlers/system/system_handler_tests.rs b/src/handlers/radarr_handlers/system/system_handler_tests.rs index 2f6ebd0..cd4ab61 100644 --- a/src/handlers/radarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/radarr_handlers/system/system_handler_tests.rs @@ -3,12 +3,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::radarr_handlers::system::SystemHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::radarr_handlers::system::SystemHandler; use crate::models::radarr_models::RadarrTask; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, @@ -83,7 +83,7 @@ mod tests { SystemHandler::new(ESC_KEY, &mut app, ActiveRadarrBlock::System, None).handle(); assert_navigation_popped!(app, ActiveRadarrBlock::System.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -344,7 +344,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::System.into()); - assert!(app.data.radarr_data.log_details.is_empty()); + assert_is_empty!(app.data.radarr_data.log_details); } #[test] diff --git a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs index 258ea64..2a89195 100644 --- a/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs +++ b/src/handlers/sonarr_handlers/blocklist/blocklist_handler_tests.rs @@ -7,12 +7,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::sonarr_handlers::blocklist::{blocklist_sorting_options, BlocklistHandler}; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::blocklist::{BlocklistHandler, blocklist_sorting_options}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::BlocklistItem; @@ -179,9 +179,9 @@ mod tests { BlocklistHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); assert_navigation_popped!(app, base_route.into()); } @@ -202,7 +202,7 @@ mod tests { BlocklistHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveSonarrBlock::Blocklist.into()); } } @@ -267,7 +267,7 @@ mod tests { BlocklistHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Blocklist, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Blocklist.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -382,9 +382,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); assert_navigation_popped!(app, base_route.into()); } diff --git a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs index 136710f..6792376 100644 --- a/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs +++ b/src/handlers/sonarr_handlers/downloads/downloads_handler_tests.rs @@ -4,13 +4,13 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::downloads::DownloadsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::download_record; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; use crate::models::sonarr_models::DownloadRecord; @@ -127,7 +127,6 @@ mod tests { } mod test_handle_submit { - use pretty_assertions::assert_eq; use rstest::rstest; use crate::network::sonarr_network::SonarrEvent; @@ -166,9 +165,9 @@ mod tests { DownloadsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); assert_navigation_popped!(app, base_route.into()); } @@ -192,7 +191,7 @@ mod tests { DownloadsHandler::new(SUBMIT_KEY, &mut app, prompt_block, None).handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert_navigation_popped!(app, base_route.into()); } } @@ -234,7 +233,7 @@ mod tests { DownloadsHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Downloads, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Downloads.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -368,9 +367,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); assert_navigation_popped!(app, base_route.into()); } diff --git a/src/handlers/sonarr_handlers/history/history_handler_tests.rs b/src/handlers/sonarr_handlers/history/history_handler_tests.rs index 7a32daa..c09d406 100644 --- a/src/handlers/sonarr_handlers/history/history_handler_tests.rs +++ b/src/handlers/sonarr_handlers/history/history_handler_tests.rs @@ -7,12 +7,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::sonarr_handlers::history::{history_sorting_options, HistoryHandler}; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::history::{HistoryHandler, history_sorting_options}; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; use crate::models::servarr_models::{Language, Quality, QualityWrapper}; use crate::models::sonarr_models::{SonarrHistoryEventType, SonarrHistoryItem}; @@ -153,7 +153,7 @@ mod tests { HistoryHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::History, None).handle(); assert_eq!(app.get_current_route(), ActiveSonarrBlock::History.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs index 7b97969..824ecae 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::sonarr_handlers::indexers::edit_indexer_handler::EditIndexerHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; use crate::models::servarr_models::EditIndexerParams; @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -422,11 +422,11 @@ mod tests { use std::sync::atomic::Ordering; use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::BlockSelectionState; use pretty_assertions::assert_eq; use rstest::rstest; @@ -856,7 +856,7 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::{ - servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; use crate::network::sonarr_network::SonarrEvent; @@ -887,9 +887,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.should_refresh); - assert_eq!(app.data.sonarr_data.edit_indexer_modal, None); + assert_none!(app.data.sonarr_data.edit_indexer_modal); } #[test] @@ -972,7 +972,7 @@ mod tests { ); assert_modal_present!(app.data.sonarr_data.edit_indexer_modal); assert!(!app.should_refresh); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); } #[rstest] @@ -1054,14 +1054,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1075,14 +1077,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_rss - .unwrap()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_rss + .unwrap() + ); } #[test] @@ -1107,14 +1111,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1128,14 +1134,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_automatic_search - .unwrap()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_automatic_search + .unwrap() + ); } #[test] @@ -1160,14 +1168,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); EditIndexerHandler::new( SUBMIT_KEY, @@ -1181,14 +1191,16 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditIndexerPrompt.into() ); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .enable_interactive_search - .unwrap()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .enable_interactive_search + .unwrap() + ); } #[test] @@ -1212,15 +1224,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .name - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .name + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1245,15 +1259,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .url - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .url + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1278,15 +1294,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .api_key - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .api_key + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1311,15 +1329,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .seed_ratio - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .seed_ratio + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } @@ -1344,15 +1364,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_indexer_modal - .as_ref() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_indexer_modal + .as_ref() + .unwrap() + .tags + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); } } @@ -1363,7 +1385,6 @@ mod tests { use crate::assert_navigation_popped; use crate::event::Key; use crate::models::servarr_data::modals::EditIndexerModal; - use pretty_assertions::assert_eq; use rstest::rstest; const ESC_KEY: Key = DEFAULT_KEYBINDINGS.esc.key; @@ -1386,7 +1407,7 @@ mod tests { assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.edit_indexer_modal, None); + assert_none!(app.data.sonarr_data.edit_indexer_modal); } #[rstest] @@ -1411,9 +1432,9 @@ mod tests { assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.data.sonarr_data.edit_indexer_modal, - Some(EditIndexerModal::default()) + assert_some_eq_x!( + &app.data.sonarr_data.edit_indexer_modal, + &EditIndexerModal::default() ); } } @@ -1422,9 +1443,9 @@ mod tests { use super::*; use crate::app::App; use crate::assert_navigation_popped; + use crate::models::BlockSelectionState; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_TORRENT_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use pretty_assertions::{assert_eq, assert_str_eq}; diff --git a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs index 29eaece..c8464f7 100644 --- a/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/edit_indexer_settings_handler_tests.rs @@ -4,14 +4,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::sonarr_handlers::indexers::edit_indexer_settings_handler::IndexerSettingsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer_settings; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, }; @@ -21,9 +21,9 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS; use crate::models::sonarr_models::IndexerSettings; - use crate::models::BlockSelectionState; use super::*; @@ -241,8 +241,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, - sonarr_models::IndexerSettings, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, + sonarr_models::IndexerSettings, }, network::sonarr_network::SonarrEvent, }; @@ -274,9 +274,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.should_refresh); - assert_eq!(app.data.sonarr_data.indexer_settings, None); + assert_none!(app.data.sonarr_data.indexer_settings); } #[test] @@ -303,9 +303,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::EditAllIndexerSettings(indexer_settings())) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::EditAllIndexerSettings(indexer_settings()) ); assert_modal_absent!(app.data.sonarr_data.indexer_settings); assert!(app.should_refresh); @@ -413,7 +413,6 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use crate::models::sonarr_models::IndexerSettings; @@ -441,7 +440,7 @@ mod tests { assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.indexer_settings, None); + assert_none!(app.data.sonarr_data.indexer_settings); } #[rstest] @@ -462,9 +461,9 @@ mod tests { IndexerSettingsHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert_eq!( - app.data.sonarr_data.indexer_settings, - Some(IndexerSettings::default()) + assert_some_eq_x!( + &app.data.sonarr_data.indexer_settings, + &IndexerSettings::default() ); } } @@ -473,11 +472,10 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::INDEXER_SETTINGS_SELECTION_BLOCKS, }, network::sonarr_network::SonarrEvent, }; - use pretty_assertions::assert_eq; use super::*; @@ -504,9 +502,9 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::EditAllIndexerSettings(indexer_settings())) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::EditAllIndexerSettings(indexer_settings()) ); assert_modal_absent!(app.data.sonarr_data.indexer_settings); assert!(app.should_refresh); diff --git a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs index a4fd5d5..81357dd 100644 --- a/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/indexers_handler_tests.rs @@ -4,15 +4,15 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::indexers::IndexersHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::indexer; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS, + ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; use crate::test_handler_delegation; @@ -127,7 +127,7 @@ mod tests { use crate::assert_navigation_popped; use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ - SonarrData, EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, SonarrData, }; use crate::models::servarr_models::{Indexer, IndexerField}; use crate::network::sonarr_network::SonarrEvent; @@ -197,13 +197,13 @@ mod tests { IndexersHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::Indexers, None).handle(); assert_navigation_pushed!(app, ActiveSonarrBlock::EditIndexerPrompt.into()); - assert_eq!( - app.data.sonarr_data.edit_indexer_modal, - Some((&app.data.sonarr_data).into()) + assert_some_eq_x!( + &app.data.sonarr_data.edit_indexer_modal, + &EditIndexerModal::from(&app.data.sonarr_data) ); - assert_eq!( - app.data.sonarr_data.edit_indexer_modal, - Some(expected_edit_indexer_modal) + assert_some_eq_x!( + &app.data.sonarr_data.edit_indexer_modal, + &expected_edit_indexer_modal ); if torrent_protocol { assert_eq!( @@ -233,7 +233,7 @@ mod tests { IndexersHandler::new(SUBMIT_KEY, &mut app, ActiveSonarrBlock::Indexers, None).handle(); assert_eq!(app.get_current_route(), ActiveSonarrBlock::Indexers.into()); - assert_eq!(app.data.sonarr_data.edit_indexer_modal, None); + assert_none!(app.data.sonarr_data.edit_indexer_modal); } #[test] @@ -253,9 +253,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DeleteIndexer(1)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DeleteIndexer(1) ); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); } @@ -280,13 +280,12 @@ mod tests { .handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); } } mod test_handle_esc { - use pretty_assertions::assert_eq; use super::*; use crate::assert_navigation_popped; @@ -324,7 +323,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::TestIndexer, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert_eq!(app.data.sonarr_data.indexer_test_errors, None); + assert_none!(app.data.sonarr_data.indexer_test_errors); } #[rstest] @@ -338,7 +337,7 @@ mod tests { IndexersHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Indexers, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -552,9 +551,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DeleteIndexer(1)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DeleteIndexer(1) ); assert_navigation_popped!(app, ActiveSonarrBlock::Indexers.into()); } diff --git a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs index d184f18..f1972f3 100644 --- a/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs +++ b/src/handlers/sonarr_handlers/indexers/test_all_indexers_handler_tests.rs @@ -1,9 +1,9 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; - use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::indexers::test_all_indexers_handler::TestAllIndexersHandler; use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::models::stateful_table::StatefulTable; diff --git a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs index 594c13b..e7a783a 100644 --- a/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/add_series_handler_tests.rs @@ -5,32 +5,32 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::sonarr_handlers::library::add_series_handler::AddSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::add_series_search_result; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ADD_SERIES_BLOCKS}; + use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock}; use crate::models::servarr_models::RootFolder; use crate::models::sonarr_models::{ AddSeriesBody, AddSeriesOptions, AddSeriesSearchResult, SeriesMonitor, SeriesType, }; use crate::models::stateful_table::StatefulTable; - use crate::models::HorizontallyScrollableText; 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::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use crate::simple_stateful_iterable_vec; use super::*; @@ -898,11 +898,11 @@ mod tests { mod test_handle_submit { use crate::assert_navigation_popped; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; use crate::models::sonarr_models::Series; use crate::models::stateful_table::StatefulTable; - use crate::models::BlockSelectionState; use crate::network::sonarr_network::SonarrEvent; use bimap::BiMap; use pretty_assertions::{assert_eq, assert_str_eq}; @@ -978,33 +978,39 @@ mod tests { ActiveSonarrBlock::AddSeriesSelectRootFolder ); assert_modal_present!(app.data.sonarr_data.add_series_modal); - assert!(!app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .monitor_list - .items - .is_empty()); - assert!(!app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .series_type_list - .items - .is_empty()); - assert!(!app - .data - .sonarr_data - .add_series_modal - .as_ref() - .unwrap() - .quality_profile_list - .items - .is_empty()); + assert!( + !app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .monitor_list + .items + .is_empty() + ); + assert!( + !app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .series_type_list + .items + .is_empty() + ); + assert!( + !app + .data + .sonarr_data + .add_series_modal + .as_ref() + .unwrap() + .quality_profile_list + .items + .is_empty() + ); assert_str_eq!( app .data @@ -1106,7 +1112,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); } #[test] @@ -1222,7 +1228,7 @@ mod tests { .handle(); assert_navigation_pushed!(app, selected_block.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); if selected_block == ActiveSonarrBlock::AddSeriesTagsInput { assert!(app.ignore_special_keys_for_textbox_input); @@ -1311,7 +1317,6 @@ mod tests { } mod test_handle_esc { - use pretty_assertions::assert_eq; use rstest::rstest; use crate::models::servarr_data::sonarr::modals::AddSeriesModal; @@ -1342,7 +1347,7 @@ mod tests { assert!(!app.ignore_special_keys_for_textbox_input); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); - assert_eq!(app.data.sonarr_data.add_series_search, None); + assert_none!(app.data.sonarr_data.add_series_search); } #[test] @@ -1475,8 +1480,8 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - servarr_data::sonarr::{modals::AddSeriesModal, sonarr_data::ADD_SERIES_SELECTION_BLOCKS}, BlockSelectionState, + servarr_data::sonarr::{modals::AddSeriesModal, sonarr_data::ADD_SERIES_SELECTION_BLOCKS}, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs index 81a6acb..50a6520 100644 --- a/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/delete_series_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::event::Key; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::delete_series_handler::DeleteSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; use crate::models::sonarr_models::DeleteSeriesParams; @@ -17,8 +17,8 @@ mod tests { use pretty_assertions::assert_eq; use rstest::rstest; - use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use super::*; @@ -86,8 +86,8 @@ mod tests { mod test_handle_submit { use pretty_assertions::assert_eq; - use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS; use crate::network::sonarr_network::SonarrEvent; use super::*; @@ -119,7 +119,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.data.sonarr_data.prompt_confirm); assert!(!app.data.sonarr_data.delete_series_files); assert!(!app.data.sonarr_data.add_list_exclusion); @@ -188,7 +188,7 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::DeleteSeriesPrompt.into() ); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.should_refresh); assert!(app.data.sonarr_data.prompt_confirm); assert!(app.data.sonarr_data.delete_series_files); @@ -263,7 +263,7 @@ mod tests { use crate::{ assert_navigation_popped, models::{ - servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, BlockSelectionState, + BlockSelectionState, servarr_data::sonarr::sonarr_data::DELETE_SERIES_SELECTION_BLOCKS, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs index e94a379..6eb48b7 100644 --- a/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/edit_series_handler_tests.rs @@ -5,14 +5,14 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::sonarr_handlers::library::edit_series_handler::EditSeriesHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS}; use crate::models::sonarr_models::{EditSeriesParams, Series, SeriesType}; @@ -22,9 +22,9 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::EDIT_SERIES_SELECTION_BLOCKS; - use crate::models::BlockSelectionState; use super::*; @@ -698,15 +698,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_series_modal - .as_ref() - .unwrap() - .path - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_series_modal + .as_ref() + .unwrap() + .path + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } @@ -731,15 +733,17 @@ mod tests { .handle(); assert!(!app.ignore_special_keys_for_textbox_input); - assert!(!app - .data - .sonarr_data - .edit_series_modal - .as_mut() - .unwrap() - .tags - .text - .is_empty()); + assert!( + !app + .data + .sonarr_data + .edit_series_modal + .as_mut() + .unwrap() + .tags + .text + .is_empty() + ); assert_navigation_popped!(app, ActiveSonarrBlock::EditSeriesPrompt.into()); } @@ -765,7 +769,7 @@ mod tests { .handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); } #[test] @@ -856,7 +860,7 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::EditSeriesPrompt.into() ); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.should_refresh); } @@ -881,7 +885,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .sonarr_data @@ -889,7 +893,7 @@ mod tests { .as_ref() .unwrap() .monitored, - Some(true) + true ); EditSeriesHandler::new( @@ -901,7 +905,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .sonarr_data @@ -909,7 +913,7 @@ mod tests { .as_ref() .unwrap() .monitored, - Some(false) + false ); } @@ -935,7 +939,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .sonarr_data @@ -943,7 +947,7 @@ mod tests { .as_ref() .unwrap() .use_season_folders, - Some(true) + true ); EditSeriesHandler::new( @@ -955,7 +959,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), current_route); - assert_eq!( + assert_some_eq_x!( app .data .sonarr_data @@ -963,7 +967,7 @@ mod tests { .as_ref() .unwrap() .use_season_folders, - Some(false) + false ); } @@ -1002,7 +1006,7 @@ mod tests { app, (selected_block, Some(ActiveSonarrBlock::Series)).into() ); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); if selected_block == ActiveSonarrBlock::EditSeriesPathInput || selected_block == ActiveSonarrBlock::EditSeriesTagsInput @@ -1045,7 +1049,7 @@ mod tests { ) .into() ); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert!(!app.ignore_special_keys_for_textbox_input); } @@ -1158,10 +1162,10 @@ mod tests { use crate::{ assert_navigation_popped, models::{ + BlockSelectionState, servarr_data::sonarr::{ modals::EditSeriesModal, sonarr_data::EDIT_SERIES_SELECTION_BLOCKS, }, - BlockSelectionState, }, network::sonarr_network::SonarrEvent, }; diff --git a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs index 8cb5161..1de4098 100644 --- a/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/episode_details_handler_tests.rs @@ -1,11 +1,11 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; + use crate::handlers::KeyEventHandler; use crate::handlers::sonarr_handlers::library::episode_details_handler::EpisodeDetailsHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::episode; - use crate::handlers::KeyEventHandler; use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::{ @@ -238,9 +238,9 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_pushed!(app, active_sonarr_block.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); } @@ -262,14 +262,14 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::ManualEpisodeSearch.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { guid: String::new(), indexer_id: 0, episode_id: Some(0), ..SonarrReleaseDownloadBody::default() - })) + }) ); } @@ -290,7 +290,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::EpisodeDetails.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); } #[test] @@ -400,14 +400,15 @@ mod tests { EpisodeDetailsHandler::new(ESC_KEY, &mut app, active_sonarr_block, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::SeasonDetails.into()); - assert!(app - .data - .sonarr_data - .season_details_modal - .as_ref() - .unwrap() - .episode_details_modal - .is_none()); + assert_none!( + app + .data + .sonarr_data + .season_details_modal + .as_ref() + .unwrap() + .episode_details_modal + ); } } @@ -560,9 +561,9 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, active_sonarr_block.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::TriggerAutomaticEpisodeSearch(1)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::TriggerAutomaticEpisodeSearch(1) ); } @@ -584,14 +585,14 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::ManualEpisodeSearch.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { guid: String::new(), indexer_id: 0, episode_id: Some(0), ..SonarrReleaseDownloadBody::default() - })) + }) ); } } diff --git a/src/handlers/sonarr_handlers/library/library_handler_tests.rs b/src/handlers/sonarr_handlers/library/library_handler_tests.rs index 36e5aaf..712168b 100644 --- a/src/handlers/sonarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/library_handler_tests.rs @@ -5,17 +5,17 @@ mod tests { use std::cmp::Ordering; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::sonarr_handlers::library::{series_sorting_options, LibraryHandler}; - use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::library::{LibraryHandler, series_sorting_options}; + use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::series; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, + ADD_SERIES_BLOCKS, ActiveSonarrBlock, DELETE_SERIES_BLOCKS, EDIT_SERIES_BLOCKS, EPISODE_DETAILS_BLOCKS, LIBRARY_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; use crate::models::sonarr_models::{Series, SeriesStatistics, SeriesStatus, SeriesType}; @@ -207,9 +207,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::UpdateAllSeries) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::UpdateAllSeries ); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } @@ -234,7 +234,7 @@ mod tests { .handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } } @@ -279,7 +279,7 @@ mod tests { LibraryHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::Series, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -288,8 +288,8 @@ mod tests { use serde_json::Number; use strum::IntoEnumIterator; - use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::servarr_data::sonarr::sonarr_data::SonarrData; + use crate::models::servarr_data::sonarr::sonarr_data::sonarr_test_utils::utils::create_test_sonarr_data; use crate::models::sonarr_models::SeriesType; use crate::network::sonarr_network::SonarrEvent; @@ -393,9 +393,9 @@ mod tests { assert_eq!(app.get_current_route(), ActiveSonarrBlock::Series.into()); assert!(app.data.sonarr_data.prompt_confirm); assert!(app.is_routing); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::ToggleSeriesMonitoring(0)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::ToggleSeriesMonitoring(0) ); } @@ -527,9 +527,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::UpdateAllSeries) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::UpdateAllSeries ); assert_navigation_popped!(app, ActiveSonarrBlock::Series.into()); } diff --git a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs index f35e15d..c2d54d3 100644 --- a/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/season_details_handler_tests.rs @@ -290,9 +290,9 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, active_sonarr_block.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); } @@ -314,15 +314,15 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::ManualSeasonSearch.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { guid: String::new(), indexer_id: 0, series_id: Some(0), season_number: Some(0), ..SonarrReleaseDownloadBody::default() - })) + }) ); } @@ -344,7 +344,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::SeasonDetails.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); } #[test] @@ -468,7 +468,7 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::SeasonHistory.into() ); - assert!( + assert_none!( app .data .sonarr_data @@ -477,9 +477,8 @@ mod tests { .unwrap() .season_history .filter - .is_none() ); - assert!( + assert_none!( app .data .sonarr_data @@ -488,9 +487,8 @@ mod tests { .unwrap() .season_history .filtered_items - .is_none() ); - assert!( + assert_none!( app .data .sonarr_data @@ -499,7 +497,6 @@ mod tests { .unwrap() .season_history .filtered_state - .is_none() ); } @@ -560,9 +557,9 @@ mod tests { ); assert!(app.data.sonarr_data.prompt_confirm); assert!(app.is_routing); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::ToggleEpisodeMonitoring(1)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::ToggleEpisodeMonitoring(1) ); } @@ -725,9 +722,9 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, active_sonarr_block.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); } @@ -749,15 +746,15 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::ManualSeasonSearch.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DownloadRelease(SonarrReleaseDownloadBody { guid: String::new(), indexer_id: 0, series_id: Some(0), season_number: Some(0), ..SonarrReleaseDownloadBody::default() - })) + }) ); } } diff --git a/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs b/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs index 36342e8..048f512 100644 --- a/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/library/series_details_handler_tests.rs @@ -197,9 +197,9 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::SeriesDetails.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); } @@ -219,7 +219,7 @@ mod tests { assert!(!app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, ActiveSonarrBlock::SeriesDetails.into()); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); } } @@ -289,17 +289,8 @@ mod tests { app.get_current_route(), ActiveSonarrBlock::SeriesHistory.into() ); - assert!( - app - .data - .sonarr_data - .series_history - .as_ref() - .unwrap() - .filter - .is_none() - ); - assert!( + assert_none!(app.data.sonarr_data.series_history.as_ref().unwrap().filter); + assert_none!( app .data .sonarr_data @@ -307,9 +298,8 @@ mod tests { .as_ref() .unwrap() .filtered_items - .is_none() ); - assert!( + assert_none!( app .data .sonarr_data @@ -317,7 +307,6 @@ mod tests { .as_ref() .unwrap() .filtered_state - .is_none() ); } } @@ -387,9 +376,9 @@ mod tests { ); assert!(app.data.sonarr_data.prompt_confirm); assert!(app.is_routing); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::ToggleSeasonMonitoring((0, 0))) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::ToggleSeasonMonitoring((0, 0)) ); } @@ -581,9 +570,9 @@ mod tests { assert!(app.data.sonarr_data.prompt_confirm); assert_navigation_popped!(app, active_sonarr_block.into()); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(expected_action) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &expected_action ); } } diff --git a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs index 76651f0..4710f67 100644 --- a/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs +++ b/src/handlers/sonarr_handlers/root_folders/root_folders_handler_tests.rs @@ -4,18 +4,18 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::sonarr_handlers::root_folders::RootFoldersHandler; use crate::handlers::sonarr_handlers::sonarr_handler_test_utils::utils::root_folder; - use crate::handlers::KeyEventHandler; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; use crate::models::servarr_models::{AddRootFolderBody, RootFolder}; - use crate::models::HorizontallyScrollableText; mod test_handle_home_end { use crate::models::servarr_models::RootFolder; @@ -341,9 +341,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DeleteRootFolder(1)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DeleteRootFolder(1) ); assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); } @@ -368,7 +368,7 @@ mod tests { .handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); } } @@ -433,7 +433,7 @@ mod tests { RootFoldersHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::RootFolders, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -612,9 +612,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::DeleteRootFolder(1)) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::DeleteRootFolder(1) ); assert_navigation_popped!(app, ActiveSonarrBlock::RootFolders.into()); } diff --git a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs index 69d4b4b..a7031da 100644 --- a/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_details_handler_tests.rs @@ -4,12 +4,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::system::system_details_handler::SystemDetailsHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; @@ -711,9 +711,9 @@ mod tests { .handle(); assert!(app.data.sonarr_data.prompt_confirm); - assert_eq!( - app.data.sonarr_data.prompt_confirm_action, - Some(SonarrEvent::StartTask(SonarrTaskName::default())) + assert_some_eq_x!( + &app.data.sonarr_data.prompt_confirm_action, + &SonarrEvent::StartTask(SonarrTaskName::default()) ); assert_navigation_popped!(app, ActiveSonarrBlock::SystemTasks.into()); } @@ -734,7 +734,7 @@ mod tests { .handle(); assert!(!app.data.sonarr_data.prompt_confirm); - assert_eq!(app.data.sonarr_data.prompt_confirm_action, None); + assert_none!(app.data.sonarr_data.prompt_confirm_action); assert_navigation_popped!(app, ActiveSonarrBlock::SystemTasks.into()); } } @@ -768,7 +768,7 @@ mod tests { SystemDetailsHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::SystemLogs, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); - assert!(app.data.sonarr_data.log_details.items.is_empty()); + assert_is_empty!(app.data.sonarr_data.log_details.items); } #[rstest] diff --git a/src/handlers/sonarr_handlers/system/system_handler_tests.rs b/src/handlers/sonarr_handlers/system/system_handler_tests.rs index bef3388..d9903f6 100644 --- a/src/handlers/sonarr_handlers/system/system_handler_tests.rs +++ b/src/handlers/sonarr_handlers/system/system_handler_tests.rs @@ -3,12 +3,12 @@ mod tests { use rstest::rstest; use strum::IntoEnumIterator; - use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::App; + use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::assert_navigation_pushed; use crate::event::Key; - use crate::handlers::sonarr_handlers::system::SystemHandler; use crate::handlers::KeyEventHandler; + use crate::handlers::sonarr_handlers::system::SystemHandler; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; @@ -85,7 +85,7 @@ mod tests { SystemHandler::new(ESC_KEY, &mut app, ActiveSonarrBlock::System, None).handle(); assert_navigation_popped!(app, ActiveSonarrBlock::System.into()); - assert!(app.error.text.is_empty()); + assert_is_empty!(app.error.text); } } @@ -349,7 +349,7 @@ mod tests { .handle(); assert_eq!(app.get_current_route(), ActiveSonarrBlock::System.into()); - assert!(app.data.sonarr_data.log_details.is_empty()); + assert_is_empty!(app.data.sonarr_data.log_details); } #[test] diff --git a/src/handlers/table_handler_tests.rs b/src/handlers/table_handler_tests.rs index e070113..4e5b9ab 100644 --- a/src/handlers/table_handler_tests.rs +++ b/src/handlers/table_handler_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { - use crate::app::key_binding::DEFAULT_KEYBINDINGS; 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::table_handler::handle_table; - use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::KeyEventHandler; + use crate::handlers::table_handler::TableHandlingConfig; + use crate::handlers::table_handler::handle_table; use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_models::Language; @@ -936,7 +936,7 @@ mod tests { assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.data.radarr_data.movies.search, None); + assert_none!(app.data.radarr_data.movies.search); } #[rstest] @@ -965,9 +965,9 @@ mod tests { assert_navigation_popped!(app, ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.data.radarr_data.movies.filter, None); - assert_eq!(app.data.radarr_data.movies.filtered_items, None); - assert_eq!(app.data.radarr_data.movies.filtered_state, None); + assert_none!(app.data.radarr_data.movies.filter); + assert_none!(app.data.radarr_data.movies.filtered_items); + assert_none!(app.data.radarr_data.movies.filtered_state); } #[test] @@ -1001,15 +1001,15 @@ mod tests { TableHandlerUnit::new(ESC_KEY, &mut app, ActiveRadarrBlock::Movies, None).handle(); assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); - assert_eq!(app.data.radarr_data.movies.filter, None); - assert_eq!(app.data.radarr_data.movies.filtered_items, None); - assert_eq!(app.data.radarr_data.movies.filtered_state, None); + assert_none!(app.data.radarr_data.movies.filter); + assert_none!(app.data.radarr_data.movies.filtered_items); + assert_none!(app.data.radarr_data.movies.filtered_state); } } mod test_handle_key_char { - use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use crate::models::HorizontallyScrollableText; + use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data; use pretty_assertions::{assert_eq, assert_str_eq}; use super::*; @@ -1033,9 +1033,9 @@ mod tests { assert_navigation_pushed!(app, ActiveRadarrBlock::SearchMovie.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.data.radarr_data.movies.search, - Some(HorizontallyScrollableText::default()) + assert_some_eq_x!( + &app.data.radarr_data.movies.search, + &HorizontallyScrollableText::default() ); } @@ -1060,7 +1060,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.data.radarr_data.movies.search, None); + assert_none!(app.data.radarr_data.movies.search); } #[test] @@ -1082,7 +1082,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.data.radarr_data.movies.search, None); + assert_none!(app.data.radarr_data.movies.search); } #[test] @@ -1154,9 +1154,9 @@ mod tests { assert_navigation_pushed!(app, ActiveRadarrBlock::FilterMovies.into()); assert!(app.ignore_special_keys_for_textbox_input); - assert_eq!( - app.data.radarr_data.movies.filter, - Some(HorizontallyScrollableText::default()) + assert_some_eq_x!( + &app.data.radarr_data.movies.filter, + &HorizontallyScrollableText::default() ); assert_modal_absent!(app.data.radarr_data.movies.filtered_items); assert_modal_absent!(app.data.radarr_data.movies.filtered_state); @@ -1181,7 +1181,7 @@ mod tests { assert_eq!(app.get_current_route(), ActiveRadarrBlock::Movies.into()); assert!(!app.ignore_special_keys_for_textbox_input); - assert_eq!(app.data.radarr_data.movies.filter, None); + assert_none!(app.data.radarr_data.movies.filter); } #[test] From b51e42b4b20572004f19194f705cd0110f75397c Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 9 Dec 2025 14:29:35 -0700 Subject: [PATCH 14/28] refactor: Updated all model tests to use purpose-built assertions to improve readability and maintainability --- src/models/mod.rs | 2 + src/models/model_tests.rs | 21 +-- src/models/servarr_data/sonarr/modals.rs | 1 + src/models/stateful_list.rs | 1 + src/models/stateful_list_tests.rs | 38 ++-- src/models/stateful_table.rs | 1 + src/models/stateful_table_tests.rs | 223 +++++++++++------------ 7 files changed, 140 insertions(+), 147 deletions(-) diff --git a/src/models/mod.rs b/src/models/mod.rs index 74022de..fc8d5b6 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -58,6 +58,7 @@ pub trait Paginated { } #[derive(Default)] +#[cfg_attr(test, derive(Debug))] pub struct ScrollableText { pub items: Vec, pub offset: u16, @@ -277,6 +278,7 @@ pub struct TabRoute { pub config: Option, } +#[cfg_attr(test, derive(Debug))] pub struct TabState { pub tabs: Vec, pub index: usize, diff --git a/src/models/model_tests.rs b/src/models/model_tests.rs index d659d4a..1b8dc3e 100644 --- a/src/models/model_tests.rs +++ b/src/models/model_tests.rs @@ -46,7 +46,7 @@ mod tests { fn test_scrollable_text_is_empty() { let scrollable_text = ScrollableText::default(); - assert!(scrollable_text.is_empty()); + assert_is_empty!(scrollable_text); let test_text = "Test \nString"; let scrollable_text = ScrollableText::with_string(test_text.to_owned()); @@ -151,7 +151,7 @@ mod tests { offset: AtomicUsize::new(test_text.len()), }; - assert!(horizontally_scrollable_text.to_string().is_empty()); + assert_is_empty!(horizontally_scrollable_text.to_string()); } #[test] @@ -228,7 +228,7 @@ mod tests { horizontally_scrollable_text.offset.load(Ordering::SeqCst), 2 ); - assert!(horizontally_scrollable_text.to_string().is_empty()); + assert_is_empty!(horizontally_scrollable_text.to_string()); } #[test] @@ -444,7 +444,7 @@ mod tests { horizontally_scrollable_text.pop(); - assert!(horizontally_scrollable_text.text.is_empty()); + assert_is_empty!(horizontally_scrollable_text.text); assert_eq!( horizontally_scrollable_text.offset.load(Ordering::SeqCst), 0 @@ -452,7 +452,7 @@ mod tests { horizontally_scrollable_text.pop(); - assert!(horizontally_scrollable_text.text.is_empty()); + assert_is_empty!(horizontally_scrollable_text.text); assert_eq!( horizontally_scrollable_text.offset.load(Ordering::SeqCst), 0 @@ -530,7 +530,7 @@ mod tests { let active_config = tab_state.get_active_config(); - assert!(active_config.is_some()); + assert_some!(active_config); assert_str_eq!(active_config.clone().unwrap().name.unwrap(), "Test"); } @@ -541,7 +541,7 @@ mod tests { let active_config = tab_state.get_active_config(); - assert!(active_config.is_none()); + assert_none!(active_config); } #[test] @@ -630,8 +630,7 @@ mod tests { let tab_help = tab_state.get_active_route_contextual_help(); - assert!(tab_help.is_some()); - assert_eq!(tab_help.unwrap(), second_tab_help.unwrap()); + assert_some_eq_x!(tab_help, second_tab_help.unwrap()); } #[test] @@ -784,7 +783,7 @@ mod tests { fn test_from_i64() { let deserializer: I64Deserializer = 1i64.into_deserializer(); - assert_eq!(from_i64(deserializer), Ok(1)); + assert_ok_eq_x!(from_i64(deserializer), 1); } #[test] @@ -801,7 +800,7 @@ mod tests { fn test_from_f64() { let deserializer: F64Deserializer = 1f64.into_deserializer(); - assert_eq!(from_f64(deserializer), Ok(1.0)); + assert_ok_eq_x!(from_f64(deserializer), 1.0); } #[test] diff --git a/src/models/servarr_data/sonarr/modals.rs b/src/models/servarr_data/sonarr/modals.rs index 91f1dde..026c974 100644 --- a/src/models/servarr_data/sonarr/modals.rs +++ b/src/models/servarr_data/sonarr/modals.rs @@ -210,6 +210,7 @@ impl From<&SonarrData<'_>> for EditSeriesModal { } } +#[cfg_attr(test, derive(Debug))] pub struct EpisodeDetailsModal { pub episode_details: ScrollableText, pub file_details: String, diff --git a/src/models/stateful_list.rs b/src/models/stateful_list.rs index d31d79f..ab41dcd 100644 --- a/src/models/stateful_list.rs +++ b/src/models/stateful_list.rs @@ -7,6 +7,7 @@ use std::fmt::Debug; mod stateful_list_tests; #[derive(Default)] +#[cfg_attr(test, derive(Debug))] pub struct StatefulList { pub state: ListState, pub items: Vec, diff --git a/src/models/stateful_list_tests.rs b/src/models/stateful_list_tests.rs index c709f97..a798d09 100644 --- a/src/models/stateful_list_tests.rs +++ b/src/models/stateful_list_tests.rs @@ -2,25 +2,25 @@ mod tests { use crate::models::Scrollable; use crate::models::stateful_list::StatefulList; - use pretty_assertions::{assert_eq, assert_str_eq}; + use pretty_assertions::assert_str_eq; #[test] fn test_stateful_list_scrolling_on_empty_list_performs_no_op() { let mut stateful_list: StatefulList = StatefulList::default(); - assert_eq!(stateful_list.state.selected(), None); + assert_none!(stateful_list.state.selected()); stateful_list.scroll_up(); - assert_eq!(stateful_list.state.selected(), None); + assert_none!(stateful_list.state.selected()); stateful_list.scroll_down(); - assert_eq!(stateful_list.state.selected(), None); + assert_none!(stateful_list.state.selected()); stateful_list.scroll_to_top(); - assert_eq!(stateful_list.state.selected(), None); + assert_none!(stateful_list.state.selected()); stateful_list.scroll_to_bottom(); } @@ -29,31 +29,31 @@ mod tests { fn test_stateful_list_scroll() { let mut stateful_list = create_test_stateful_list(); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); stateful_list.scroll_down(); - assert_eq!(stateful_list.state.selected(), Some(1)); + assert_some_eq_x!(stateful_list.state.selected(), 1); stateful_list.scroll_down(); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); stateful_list.scroll_up(); - assert_eq!(stateful_list.state.selected(), Some(1)); + assert_some_eq_x!(stateful_list.state.selected(), 1); stateful_list.scroll_up(); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); stateful_list.scroll_to_bottom(); - assert_eq!(stateful_list.state.selected(), Some(1)); + assert_some_eq_x!(stateful_list.state.selected(), 1); stateful_list.scroll_to_top(); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); } #[test] @@ -63,17 +63,17 @@ mod tests { stateful_list.set_items(items_vec.clone()); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); stateful_list.state.select(Some(1)); stateful_list.set_items(items_vec.clone()); - assert_eq!(stateful_list.state.selected(), Some(1)); + assert_some_eq_x!(stateful_list.state.selected(), 1); stateful_list.state.select(Some(3)); stateful_list.set_items(items_vec); - assert_eq!(stateful_list.state.selected(), Some(2)); + assert_some_eq_x!(stateful_list.state.selected(), 2); } #[test] @@ -91,15 +91,15 @@ mod tests { fn test_stateful_list_scroll_up() { let mut stateful_list = create_test_stateful_list(); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); stateful_list.scroll_up(); - assert_eq!(stateful_list.state.selected(), Some(1)); + assert_some_eq_x!(stateful_list.state.selected(), 1); stateful_list.scroll_up(); - assert_eq!(stateful_list.state.selected(), Some(0)); + assert_some_eq_x!(stateful_list.state.selected(), 0); } #[test] @@ -110,7 +110,7 @@ mod tests { stateful_list = StatefulList::default(); - assert!(stateful_list.is_empty()); + assert_is_empty!(stateful_list); } fn create_test_stateful_list() -> StatefulList<&'static str> { diff --git a/src/models/stateful_table.rs b/src/models/stateful_table.rs index ba90942..a029570 100644 --- a/src/models/stateful_table.rs +++ b/src/models/stateful_table.rs @@ -31,6 +31,7 @@ where impl Eq for SortOption where T: Clone + PartialEq + Eq + Debug {} #[derive(Default)] +#[cfg_attr(test, derive(Debug))] pub struct StatefulTable where T: Clone + PartialEq + Eq + Debug, diff --git a/src/models/stateful_table_tests.rs b/src/models/stateful_table_tests.rs index 924160b..4cb823e 100644 --- a/src/models/stateful_table_tests.rs +++ b/src/models/stateful_table_tests.rs @@ -10,19 +10,19 @@ mod tests { fn test_stateful_table_scrolling_on_empty_table_performs_no_op() { let mut stateful_table: StatefulTable = StatefulTable::default(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); stateful_table.scroll_up(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); stateful_table.scroll_down(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); stateful_table.scroll_to_top(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); stateful_table.scroll_to_bottom(); } @@ -35,46 +35,42 @@ mod tests { ..StatefulTable::default() }; - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); filtered_stateful_table.scroll_up(); - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); filtered_stateful_table.scroll_down(); - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); filtered_stateful_table.scroll_to_top(); - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); filtered_stateful_table.scroll_to_bottom(); @@ -84,110 +80,110 @@ mod tests { fn test_stateful_table_scroll() { let mut stateful_table = create_test_stateful_table(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.scroll_down(); - assert_eq!(stateful_table.state.selected(), Some(1)); + assert_some_eq_x!(stateful_table.state.selected(), 1); stateful_table.scroll_down(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.scroll_up(); - assert_eq!(stateful_table.state.selected(), Some(1)); + assert_some_eq_x!(stateful_table.state.selected(), 1); stateful_table.scroll_up(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.scroll_to_bottom(); - assert_eq!(stateful_table.state.selected(), Some(1)); + assert_some_eq_x!(stateful_table.state.selected(), 1); stateful_table.scroll_to_top(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); } #[test] fn test_stateful_table_filtered_items_scroll() { let mut filtered_stateful_table = create_test_filtered_stateful_table(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); filtered_stateful_table.scroll_down(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(1) + 1 ); filtered_stateful_table.scroll_down(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); filtered_stateful_table.scroll_up(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(1) + 1 ); filtered_stateful_table.scroll_up(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); filtered_stateful_table.scroll_to_bottom(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(1) + 1 ); filtered_stateful_table.scroll_to_top(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); } @@ -195,15 +191,15 @@ mod tests { fn test_stateful_table_pagination_on_empty_table_performs_no_op() { let mut stateful_table: StatefulTable = StatefulTable::default(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); stateful_table.page_down(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); stateful_table.page_up(); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); } #[test] @@ -214,35 +210,32 @@ mod tests { ..StatefulTable::default() }; - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); filtered_stateful_table.page_down(); - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); filtered_stateful_table.page_up(); - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); } @@ -260,53 +253,53 @@ mod tests { .collect(), ); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(0) + 0 ); stateful_table.page_down(); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(20) + 20 ); stateful_table.page_up(); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(0) + 0 ); stateful_table.page_up(); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(stateful_table.filtered_items.as_ref().unwrap().len() - 21) + stateful_table.filtered_items.as_ref().unwrap().len() - 21 ); stateful_table.page_down(); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(0) + 0 ); stateful_table.scroll_down(); stateful_table.page_up(); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(stateful_table.filtered_items.as_ref().unwrap().len() - 20) + stateful_table.filtered_items.as_ref().unwrap().len() - 20 ); stateful_table.scroll_down(); stateful_table.page_down(); - assert_eq!( + assert_some_eq_x!( stateful_table.filtered_state.as_ref().unwrap().selected(), - Some(2) + 2 ); } @@ -324,39 +317,39 @@ mod tests { .collect(), ); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.page_down(); - assert_eq!(stateful_table.state.selected(), Some(20)); + assert_some_eq_x!(stateful_table.state.selected(), 20); stateful_table.page_up(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.page_up(); - assert_eq!( + assert_some_eq_x!( stateful_table.state.selected(), - Some(stateful_table.items.len() - 21) + stateful_table.items.len() - 21 ); stateful_table.page_down(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.scroll_down(); stateful_table.page_up(); - assert_eq!( + assert_some_eq_x!( stateful_table.state.selected(), - Some(stateful_table.items.len() - 20) + stateful_table.items.len() - 20 ); stateful_table.scroll_down(); stateful_table.page_down(); - assert_eq!(stateful_table.state.selected(), Some(2)); + assert_some_eq_x!(stateful_table.state.selected(), 2); } #[test] @@ -366,17 +359,17 @@ mod tests { stateful_table.set_items(items_vec.clone()); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.state.select(Some(1)); stateful_table.set_items(items_vec.clone()); - assert_eq!(stateful_table.state.selected(), Some(1)); + assert_some_eq_x!(stateful_table.state.selected(), 1); stateful_table.state.select(Some(3)); stateful_table.set_items(items_vec); - assert_eq!(stateful_table.state.selected(), Some(2)); + assert_some_eq_x!(stateful_table.state.selected(), 2); } #[test] @@ -386,18 +379,15 @@ mod tests { filtered_stateful_table.set_filtered_items(filtered_items_vec.clone()); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) - ); - assert_eq!( - filtered_stateful_table.filtered_items, - Some(filtered_items_vec.clone()) + 0 ); + assert_some_eq_x!(&filtered_stateful_table.filtered_items, &filtered_items_vec); } #[test] @@ -602,50 +592,49 @@ mod tests { fn test_stateful_table_select_index() { let mut stateful_table = create_test_stateful_table(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.select_index(Some(1)); - assert_eq!(stateful_table.state.selected(), Some(1)); + assert_some_eq_x!(stateful_table.state.selected(), 1); stateful_table.select_index(None); - assert_eq!(stateful_table.state.selected(), None); + assert_none!(stateful_table.state.selected()); } #[test] fn test_filtered_stateful_table_select_index() { let mut filtered_stateful_table = create_test_filtered_stateful_table(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); filtered_stateful_table.select_index(Some(1)); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(1) + 1 ); filtered_stateful_table.select_index(None); - assert_eq!( + assert_none!( filtered_stateful_table .filtered_state .as_ref() .unwrap() - .selected(), - None + .selected() ); } @@ -653,50 +642,50 @@ mod tests { fn test_stateful_table_scroll_up() { let mut stateful_table = create_test_stateful_table(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); stateful_table.scroll_up(); - assert_eq!(stateful_table.state.selected(), Some(1)); + assert_some_eq_x!(stateful_table.state.selected(), 1); stateful_table.scroll_up(); - assert_eq!(stateful_table.state.selected(), Some(0)); + assert_some_eq_x!(stateful_table.state.selected(), 0); } #[test] fn test_filtered_stateful_table_scroll_up() { let mut filtered_stateful_table = create_test_filtered_stateful_table(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); filtered_stateful_table.scroll_up(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(1) + 1 ); filtered_stateful_table.scroll_up(); - assert_eq!( + assert_some_eq_x!( filtered_stateful_table .filtered_state .as_ref() .unwrap() .selected(), - Some(0) + 0 ); } @@ -711,9 +700,9 @@ mod tests { let has_matches = stateful_table.apply_filter(|&item| item); - assert_eq!(stateful_table.filter, None); - assert_eq!(stateful_table.filtered_items, Some(expected_items)); - assert_eq!(stateful_table.filtered_state, Some(expected_state)); + assert_none!(stateful_table.filter); + assert_some_eq_x!(&stateful_table.filtered_items, &expected_items); + assert_some_eq_x!(&stateful_table.filtered_state, &expected_state); assert!(has_matches); } @@ -725,9 +714,9 @@ mod tests { let has_matches = stateful_table.apply_filter(|&item| item); - assert_eq!(stateful_table.filter, None); - assert_eq!(stateful_table.filtered_items, None); - assert_eq!(stateful_table.filtered_state, None); + assert_none!(stateful_table.filter); + assert_none!(stateful_table.filtered_items); + assert_none!(stateful_table.filtered_state); assert!(!has_matches); } @@ -736,9 +725,9 @@ mod tests { let mut stateful_table = create_test_filtered_stateful_table(); stateful_table.reset_filter(); - assert_eq!(stateful_table.filter, None); - assert_eq!(stateful_table.filtered_items, None); - assert_eq!(stateful_table.filtered_state, None); + assert_none!(stateful_table.filter); + assert_none!(stateful_table.filtered_items); + assert_none!(stateful_table.filtered_state); } #[test] @@ -751,7 +740,7 @@ mod tests { let has_match = stateful_table.apply_search(|&item| item); - assert_eq!(stateful_table.search, None); + assert_none!(stateful_table.search); assert_eq!(stateful_table.state, expected_state); assert!(has_match); } @@ -764,7 +753,7 @@ mod tests { let has_match = stateful_table.apply_search(|&item| item); - assert_eq!(stateful_table.search, None); + assert_none!(stateful_table.search); assert!(!has_match); } @@ -778,8 +767,8 @@ mod tests { let has_match = stateful_table.apply_search(|&item| item); - assert_eq!(stateful_table.search, None); - assert_eq!(stateful_table.filtered_state, Some(expected_state)); + assert_none!(stateful_table.search); + assert_some_eq_x!(&stateful_table.filtered_state, &expected_state); assert!(has_match); } @@ -793,8 +782,8 @@ mod tests { let has_match = stateful_table.apply_search(|&item| item); - assert_eq!(stateful_table.search, None); - assert_eq!(stateful_table.filtered_state, Some(expected_state)); + assert_none!(stateful_table.search); + assert_some_eq_x!(&stateful_table.filtered_state, &expected_state); assert!(!has_match); } @@ -804,7 +793,7 @@ mod tests { stateful_table.search = Some("test".into()); stateful_table.reset_search(); - assert_eq!(stateful_table.search, None); + assert_none!(stateful_table.search); } #[test] @@ -815,7 +804,7 @@ mod tests { stateful_table = StatefulTable::default(); - assert!(stateful_table.is_empty()); + assert_is_empty!(stateful_table); } fn create_test_stateful_table() -> StatefulTable<&'static str> { From c3fa689617362520a5053b51df1442f8723bf720 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 9 Dec 2025 14:30:17 -0700 Subject: [PATCH 15/28] refactor: Use is_multiple_of for the tick counter in the UI module --- src/ui/mod.rs | 2 +- src/ui/radarr_ui/blocklist/mod.rs | 2 +- src/ui/radarr_ui/collections/collection_details_ui.rs | 2 +- src/ui/radarr_ui/collections/mod.rs | 2 +- src/ui/radarr_ui/downloads/mod.rs | 2 +- src/ui/radarr_ui/indexers/test_all_indexers_ui.rs | 2 +- src/ui/radarr_ui/library/add_movie_ui.rs | 2 +- src/ui/radarr_ui/library/mod.rs | 2 +- src/ui/radarr_ui/library/movie_details_ui.rs | 4 ++-- src/ui/sonarr_ui/downloads/mod.rs | 2 +- src/ui/sonarr_ui/history/mod.rs | 2 +- src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs | 2 +- src/ui/sonarr_ui/library/add_series_ui.rs | 2 +- src/ui/sonarr_ui/library/episode_details_ui.rs | 4 ++-- src/ui/sonarr_ui/library/mod.rs | 2 +- src/ui/sonarr_ui/library/season_details_ui.rs | 4 ++-- src/ui/sonarr_ui/library/series_details_ui.rs | 2 +- 17 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index b2ed9b3..75833bf 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -121,7 +121,7 @@ fn draw_error(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { app.error.scroll_left_or_reset( area.width as usize, true, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let paragraph = Paragraph::new(Text::from(app.error.to_string().failure())) diff --git a/src/ui/radarr_ui/blocklist/mod.rs b/src/ui/radarr_ui/blocklist/mod.rs index f547564..f4afeeb 100644 --- a/src/ui/radarr_ui/blocklist/mod.rs +++ b/src/ui/radarr_ui/blocklist/mod.rs @@ -96,7 +96,7 @@ fn draw_blocklist_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { movie.title.scroll_left_or_reset( get_width_from_percentage(area, 20), current_selection == *blocklist_item, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let languages_string = languages diff --git a/src/ui/radarr_ui/collections/collection_details_ui.rs b/src/ui/radarr_ui/collections/collection_details_ui.rs index a7718d4..c682c86 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui.rs @@ -90,7 +90,7 @@ pub fn draw_collection_details(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) movie.title.scroll_left_or_reset( get_width_from_percentage(table_area, 20), current_selection == *movie, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let (hours, minutes) = convert_runtime(movie.runtime); let imdb_rating = movie diff --git a/src/ui/radarr_ui/collections/mod.rs b/src/ui/radarr_ui/collections/mod.rs index 8112bd9..e70d7b1 100644 --- a/src/ui/radarr_ui/collections/mod.rs +++ b/src/ui/radarr_ui/collections/mod.rs @@ -70,7 +70,7 @@ pub(super) fn draw_collections(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) collection.title.scroll_left_or_reset( get_width_from_percentage(area, 25), *collection == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let monitored = if collection.monitored { "🏷" } else { "" }; let search_on_add = if collection.search_on_add { diff --git a/src/ui/radarr_ui/downloads/mod.rs b/src/ui/radarr_ui/downloads/mod.rs index e8d7973..30db8c2 100644 --- a/src/ui/radarr_ui/downloads/mod.rs +++ b/src/ui/radarr_ui/downloads/mod.rs @@ -87,7 +87,7 @@ fn draw_downloads(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { output_path.as_ref().unwrap().scroll_left_or_reset( get_width_from_percentage(area, 18), current_selection == *download_record, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); } diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs index 5536039..c4ec021 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui.rs @@ -45,7 +45,7 @@ fn draw_test_all_indexers_test_results(f: &mut Frame<'_>, app: &mut App<'_>, are result.validation_failures.scroll_left_or_reset( get_width_from_percentage(area, 86), *result == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let pass_fail = if result.is_valid { "✔" } else { "❌" }; let row = Row::new(vec![ diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index a046bc5..47984df 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -139,7 +139,7 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { movie.title.scroll_left_or_reset( get_width_from_percentage(area, 27), *movie == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ diff --git a/src/ui/radarr_ui/library/mod.rs b/src/ui/radarr_ui/library/mod.rs index 6e74e48..7260837 100644 --- a/src/ui/radarr_ui/library/mod.rs +++ b/src/ui/radarr_ui/library/mod.rs @@ -90,7 +90,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { movie.title.scroll_left_or_reset( get_width_from_percentage(area, 27), *movie == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let monitored = if movie.monitored { "🏷" } else { "" }; let studio = movie.studio.clone().unwrap_or_default(); diff --git a/src/ui/radarr_ui/library/movie_details_ui.rs b/src/ui/radarr_ui/library/movie_details_ui.rs index e479342..edc217c 100644 --- a/src/ui/radarr_ui/library/movie_details_ui.rs +++ b/src/ui/radarr_ui/library/movie_details_ui.rs @@ -246,7 +246,7 @@ fn draw_movie_history(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { movie_history_item.source_title.scroll_left_or_reset( get_width_from_percentage(area, 34), current_selection == *movie_history_item, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ @@ -398,7 +398,7 @@ fn draw_movie_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { get_width_from_percentage(area, 30), current_selection == *release && current_route != ActiveRadarrBlock::ManualSearchConfirmPrompt.into(), - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let size = convert_to_gb(*size); let rejected_str = if *rejected { "⛔" } else { "" }; diff --git a/src/ui/sonarr_ui/downloads/mod.rs b/src/ui/sonarr_ui/downloads/mod.rs index b9928e5..3064827 100644 --- a/src/ui/sonarr_ui/downloads/mod.rs +++ b/src/ui/sonarr_ui/downloads/mod.rs @@ -88,7 +88,7 @@ fn draw_downloads(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { output_path.as_ref().unwrap().scroll_left_or_reset( get_width_from_percentage(area, 18), current_selection == *download_record, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); } diff --git a/src/ui/sonarr_ui/history/mod.rs b/src/ui/sonarr_ui/history/mod.rs index f935df8..18fe23d 100644 --- a/src/ui/sonarr_ui/history/mod.rs +++ b/src/ui/sonarr_ui/history/mod.rs @@ -68,7 +68,7 @@ fn draw_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { source_title.scroll_left_or_reset( get_width_from_percentage(area, 40), current_selection == *history_item, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs index 2e5d9b8..f7256ec 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui.rs @@ -44,7 +44,7 @@ fn draw_test_all_indexers_test_results(f: &mut Frame<'_>, app: &mut App<'_>, are result.validation_failures.scroll_left_or_reset( get_width_from_percentage(area, 86), *result == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let pass_fail = if result.is_valid { "✔" } else { "❌" }; let row = Row::new(vec![ diff --git a/src/ui/sonarr_ui/library/add_series_ui.rs b/src/ui/sonarr_ui/library/add_series_ui.rs index 005fac1..a59e282 100644 --- a/src/ui/sonarr_ui/library/add_series_ui.rs +++ b/src/ui/sonarr_ui/library/add_series_ui.rs @@ -119,7 +119,7 @@ fn draw_add_series_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { series.title.scroll_left_or_reset( get_width_from_percentage(area, 27), *series == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ diff --git a/src/ui/sonarr_ui/library/episode_details_ui.rs b/src/ui/sonarr_ui/library/episode_details_ui.rs index 73369b5..aa6d4a4 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui.rs @@ -280,7 +280,7 @@ fn draw_episode_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) source_title.scroll_left_or_reset( get_width_from_percentage(area, 40), current_selection == *history_item, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ @@ -424,7 +424,7 @@ fn draw_episode_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { get_width_from_percentage(area, 30), current_selection == *release && active_sonarr_block != ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let size = convert_to_gb(*size); let rejected_str = if *rejected { "⛔" } else { "" }; diff --git a/src/ui/sonarr_ui/library/mod.rs b/src/ui/sonarr_ui/library/mod.rs index 0d91894..cb7c6a9 100644 --- a/src/ui/sonarr_ui/library/mod.rs +++ b/src/ui/sonarr_ui/library/mod.rs @@ -95,7 +95,7 @@ fn draw_library(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { series.title.scroll_left_or_reset( get_width_from_percentage(area, 23), *series == current_selection, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let monitored = if series.monitored { "🏷" } else { "" }; let certification = series.certification.clone().unwrap_or_default(); diff --git a/src/ui/sonarr_ui/library/season_details_ui.rs b/src/ui/sonarr_ui/library/season_details_ui.rs index fb0bb02..e5f47ee 100644 --- a/src/ui/sonarr_ui/library/season_details_ui.rs +++ b/src/ui/sonarr_ui/library/season_details_ui.rs @@ -271,7 +271,7 @@ fn draw_season_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { source_title.scroll_left_or_reset( get_width_from_percentage(area, 40), current_selection == *history_item, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ @@ -376,7 +376,7 @@ fn draw_season_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { get_width_from_percentage(area, 30), current_selection == *release && active_sonarr_block != ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); let size = convert_to_gb(*size); let rejected_str = if *rejected { "⛔" } else { "" }; diff --git a/src/ui/sonarr_ui/library/series_details_ui.rs b/src/ui/sonarr_ui/library/series_details_ui.rs index d62d7e1..de5aead 100644 --- a/src/ui/sonarr_ui/library/series_details_ui.rs +++ b/src/ui/sonarr_ui/library/series_details_ui.rs @@ -315,7 +315,7 @@ fn draw_series_history_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { source_title.scroll_left_or_reset( get_width_from_percentage(area, 40), current_selection == *history_item, - app.tick_count % app.ticks_until_scroll == 0, + app.tick_count.is_multiple_of(app.ticks_until_scroll), ); Row::new(vec![ From 82f30f126daaa75275b5ca9c5fa4dd7165a4de14 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Fri, 12 Dec 2025 15:44:11 -0700 Subject: [PATCH 16/28] test: Implemented UI snapshot tests --- Cargo.lock | 12 + Cargo.toml | 1 + proptest-regressions/ui/ui_property_tests.txt | 9 + src/handlers/mod.rs | 10 - src/network/network_tests.rs | 14 - src/ui/mod.rs | 4 + .../radarr_ui/blocklist/blocklist_ui_tests.rs | 58 +++- ..._blocklist_ui_renders_empty_blocklist.snap | 5 + ...s__blocklist_ui_renders_loading_state.snap | 8 + ...klist_ui_renders_with_blocklist_items.snap | 8 + .../collection_details_ui_tests.rs | 29 ++ .../collections/collections_ui_tests.rs | 30 ++ .../collections/edit_collection_ui_tests.rs | 34 ++- ...details_ui_renders_collection_details.snap | 30 ++ ...lections_ui_renders_empty_collections.snap | 8 + ..._collections_ui_renders_loading_state.snap | 8 + ...tion_ui_renders_edit_collection_modal.snap | 28 ++ .../radarr_ui/downloads/downloads_ui_tests.rs | 63 ++++ ..._downloads_ui_renders_empty_downloads.snap | 5 + ...s__downloads_ui_renders_loading_state.snap | 8 + ...__downloads_ui_renders_with_downloads.snap | 8 + .../indexers/edit_indexer_ui_tests.rs | 51 +++- .../indexers/indexer_settings_ui_tests.rs | 21 +- .../radarr_ui/indexers/indexers_ui_tests.rs | 60 ++++ ...indexer_ui_renders_edit_indexer_modal.snap | 27 ++ ..._settings_ui_renders_indexer_settings.snap | 27 ++ ...s__indexers_ui_renders_empty_indexers.snap | 5 + ...ts__indexers_ui_renders_loading_state.snap | 8 + ...ts__indexers_ui_renders_with_indexers.snap | 8 + ...all_indexers_ui_renders_loading_state.snap | 30 ++ .../indexers/test_all_indexers_ui_tests.rs | 19 ++ .../radarr_ui/library/add_movie_ui_tests.rs | 30 ++ .../library/delete_movie_ui_tests.rs | 31 +- .../radarr_ui/library/edit_movie_ui_tests.rs | 35 ++- .../library/movie_details_ui_tests.rs | 101 +++++++ ...s__add_movie_ui_renders_loading_state.snap | 29 ++ ...ts__add_movie_ui_renders_search_input.snap | 29 ++ ..._movie_ui_renders_delete_movie_prompt.snap | 24 ++ ...dit_movie_ui_renders_edit_movie_modal.snap | 28 ++ ...ovie_details_ui_renders_loading_state.snap | 30 ++ ..._details_ui_renders_manual_search_tab.snap | 30 ++ ..._details_ui_renders_movie_details_tab.snap | 30 ++ ..._details_ui_renders_movie_history_tab.snap | 30 ++ src/ui/radarr_ui/mod.rs | 4 + src/ui/radarr_ui/radarr_ui_tests.rs | 81 +++++- .../root_folders/root_folders_ui_tests.rs | 72 +++++ ...ot_folders_ui_renders_add_root_folder.snap | 20 ++ ...folders_ui_renders_empty_root_folders.snap | 5 + ...root_folders_ui_renders_loading_state.snap | 8 + ..._folders_ui_renders_with_root_folders.snap | 8 + ...ests__radarr_ui_renders_downloads_tab.snap | 34 +++ ...radarr_ui_renders_downloads_tab_empty.snap | 34 +++ ..._tests__radarr_ui_renders_library_tab.snap | 34 +++ ...stem_details_ui_renders_loading_tasks.snap | 30 ++ ...tests__system_details_ui_renders_logs.snap | 30 ++ ...ests__system_ui_renders_loading_state.snap | 34 +++ ..._tests__system_ui_renders_system_menu.snap | 34 +++ .../system/system_details_ui_tests.rs | 36 +++ src/ui/radarr_ui/system/system_ui_tests.rs | 27 ++ .../sonarr_ui/blocklist/blocklist_ui_tests.rs | 62 +++- ..._blocklist_ui_renders_empty_blocklist.snap | 5 + ...s__blocklist_ui_renders_loading_state.snap | 8 + ...klist_ui_renders_with_blocklist_items.snap | 8 + .../sonarr_ui/downloads/downloads_ui_tests.rs | 65 +++++ ..._downloads_ui_renders_empty_downloads.snap | 5 + ...s__downloads_ui_renders_loading_state.snap | 8 + ...__downloads_ui_renders_with_downloads.snap | 8 + src/ui/sonarr_ui/history/history_ui_tests.rs | 62 +++- ...sts__history_ui_renders_empty_history.snap | 5 + ...sts__history_ui_renders_loading_state.snap | 8 + ...history_ui_renders_with_history_items.snap | 8 + .../indexers/edit_indexer_ui_tests.rs | 55 +++- .../indexers/indexer_settings_ui_tests.rs | 25 +- .../sonarr_ui/indexers/indexers_ui_tests.rs | 64 +++++ ...indexer_ui_renders_edit_indexer_modal.snap | 27 ++ ..._settings_ui_renders_indexer_settings.snap | 26 ++ ...s__indexers_ui_renders_empty_indexers.snap | 5 + ...ts__indexers_ui_renders_loading_state.snap | 8 + ...ts__indexers_ui_renders_with_indexers.snap | 8 + ...all_indexers_ui_renders_loading_state.snap | 30 ++ .../indexers/test_all_indexers_ui_tests.rs | 19 ++ .../sonarr_ui/library/add_series_ui_tests.rs | 34 +++ .../library/delete_series_ui_tests.rs | 33 ++- .../sonarr_ui/library/edit_series_ui_tests.rs | 41 ++- .../library/episode_details_ui_tests.rs | 115 +++++++- src/ui/sonarr_ui/library/library_ui_tests.rs | 37 +++ .../library/season_details_ui_tests.rs | 123 ++++++++ .../library/series_details_ui_tests.rs | 34 +++ ...__add_series_ui_renders_loading_state.snap | 29 ++ ...s__add_series_ui_renders_search_input.snap | 29 ++ ...eries_ui_renders_delete_series_toggle.snap | 24 ++ ...t_series_ui_renders_edit_series_modal.snap | 30 ++ ...etails_ui_renders_episode_details_tab.snap | 30 ++ ...etails_ui_renders_episode_history_tab.snap | 30 ++ ...sode_details_ui_renders_loading_state.snap | 5 + ..._details_ui_renders_manual_search_tab.snap | 30 ++ ...ests__library_ui_renders_empty_series.snap | 5 + ...sts__library_ui_renders_loading_state.snap | 8 + ...eason_details_ui_renders_episodes_tab.snap | 5 + ...ason_details_ui_renders_loading_state.snap | 5 + ..._details_ui_renders_manual_search_tab.snap | 31 ++ ...details_ui_renders_season_history_tab.snap | 31 ++ ...ies_details_ui_renders_series_details.snap | 33 +++ .../root_folders/root_folders_ui_tests.rs | 76 +++++ ...ot_folders_ui_renders_add_root_folder.snap | 20 ++ ...folders_ui_renders_empty_root_folders.snap | 5 + ...root_folders_ui_renders_loading_state.snap | 8 + ..._folders_ui_renders_with_root_folders.snap | 8 + ...ests__sonarr_ui_renders_downloads_tab.snap | 34 +++ ..._tests__sonarr_ui_renders_history_tab.snap | 34 +++ ..._tests__sonarr_ui_renders_library_tab.snap | 34 +++ src/ui/sonarr_ui/sonarr_ui_tests.rs | 94 +++++- ...stem_details_ui_renders_loading_tasks.snap | 30 ++ ...tests__system_details_ui_renders_logs.snap | 30 ++ ...ests__system_details_ui_renders_tasks.snap | 30 ++ ...ests__system_ui_renders_loading_state.snap | 34 +++ ..._tests__system_ui_renders_system_menu.snap | 34 +++ .../system/system_details_ui_tests.rs | 52 ++++ src/ui/sonarr_ui/system/system_ui_tests.rs | 31 ++ src/ui/ui_property_tests.rs | 268 ++++++++++++++++++ src/ui/ui_test_utils.rs | 126 ++++++++ 121 files changed, 3720 insertions(+), 43 deletions(-) create mode 100644 proptest-regressions/ui/ui_property_tests.txt create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap create mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap create mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap create mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap create mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap create mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap create mode 100644 src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap create mode 100644 src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap create mode 100644 src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap create mode 100644 src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap create mode 100644 src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap create mode 100644 src/ui/ui_property_tests.rs create mode 100644 src/ui/ui_test_utils.rs diff --git a/Cargo.lock b/Cargo.lock index 6982bea..8f47762 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1199,6 +1199,17 @@ version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +[[package]] +name = "insta" +version = "1.44.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5c943d4415edd8153251b6f197de5eb1640e56d84e8d9159bea190421c73698" +dependencies = [ + "console", + "once_cell", + "similar", +] + [[package]] name = "instability" version = "0.3.9" @@ -1401,6 +1412,7 @@ dependencies = [ "human-panic", "indicatif", "indoc", + "insta", "itertools 0.14.0", "log", "log4rs", diff --git a/Cargo.toml b/Cargo.toml index f076d6a..774ad50 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -77,6 +77,7 @@ proptest = "1.6.0" rstest = "0.25.0" serial_test = "3.2.0" assertables = "9.8.2" +insta = "1.41.1" [dev-dependencies.cargo-husky] version = "1" diff --git a/proptest-regressions/ui/ui_property_tests.txt b/proptest-regressions/ui/ui_property_tests.txt new file mode 100644 index 0000000..621f11a --- /dev/null +++ b/proptest-regressions/ui/ui_property_tests.txt @@ -0,0 +1,9 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 24ae243412a324cb46c36cb4f629ddd4c9326b1479d1186d9b5545ac5e86dbba # shrinks to num_scroll_attempts = 0 +cc c06a1cc1e4740b2498c50d7be64715bf09ef3ac4cf3bb3642f960578a3e06c74 # shrinks to is_loading = false, num_items = 1 +cc 930207899afea2d389c7fa3974e31c2eb1803e71bcbd8179246c795903905ec7 # shrinks to parent_width = 20, parent_height = 12, percent_x = 1, percent_y = 1 diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 6cb0691..7e180c6 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -93,17 +93,7 @@ pub trait KeyEventHandler<'a, 'b, T: Into + Copy> { fn handle_submit(&mut self); fn handle_esc(&mut self); fn handle_char_key_event(&mut self); - - /// Returns a mutable reference to the application state. - /// - /// This method is used by the trait-based table handler to modify app state during - /// table operations (e.g., navigation stack, loading flags). fn app_mut(&mut self) -> &mut App<'b>; - - /// Returns the current navigation route. - /// - /// This method is used by the trait-based table handler to determine which screen - /// or mode is currently active, enabling context-aware event handling. fn current_route(&self) -> Route; } diff --git a/src/network/network_tests.rs b/src/network/network_tests.rs index 745ef9d..7b83b9c 100644 --- a/src/network/network_tests.rs +++ b/src/network/network_tests.rs @@ -730,17 +730,14 @@ pub(in crate::network) mod test_utils { network::{Network, NetworkEvent, NetworkResource, RequestMethod}, }; - /// Creates a test HTTP client pub fn test_client() -> Client { Client::new() } - /// Creates a test cancellation token pub fn test_cancellation_token() -> CancellationToken { CancellationToken::new() } - /// Creates a test network instance pub fn test_network<'a, 'b>(app: &'a Arc>>) -> Network<'a, 'b> { Network::new(app, test_cancellation_token(), test_client()) } @@ -755,28 +752,23 @@ pub(in crate::network) mod test_utils { } impl MockServarrApi { - /// Create a GET request builder pub fn get() -> Self { Self::new(RequestMethod::Get) } - /// Create a POST request builder pub fn post() -> Self { Self::new(RequestMethod::Post) } - /// Create a PUT request builder #[allow(dead_code)] pub fn put() -> Self { Self::new(RequestMethod::Put) } - /// Create a DELETE request builder pub fn delete() -> Self { Self::new(RequestMethod::Delete) } - /// Create a builder with a specific request method pub fn new(method: RequestMethod) -> Self { Self { method, @@ -788,37 +780,31 @@ pub(in crate::network) mod test_utils { } } - /// Set the expected request body pub fn with_request_body(mut self, body: Value) -> Self { self.request_body = Some(body); self } - /// Set the response body to return pub fn returns(mut self, body: Value) -> Self { self.response_body = Some(body); self } - /// Set the HTTP status code pub fn status(mut self, status: usize) -> Self { self.response_status = status; self } - /// Add a path suffix to the resource URL pub fn path(mut self, path: impl Into) -> Self { self.path = Some(path.into()); self } - /// Add query parameters pub fn query(mut self, params: impl Into) -> Self { self.query_params = Some(params.into()); self } - /// Build the mock for a specific network event pub async fn build_for( self, network_event: E, diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 75833bf..4968452 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -31,6 +31,10 @@ mod radarr_ui; mod sonarr_ui; mod styles; pub mod theme; +#[cfg(test)] +mod ui_property_tests; +#[cfg(test)] +pub mod ui_test_utils; mod utils; mod widgets; diff --git a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs index c476ec5..42d3bdf 100644 --- a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs @@ -1,9 +1,14 @@ #[cfg(test)] mod tests { + use strum::IntoEnumIterator; + + use crate::app::App; + use crate::models::radarr_models::BlocklistItem; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::blocklist::BlocklistUi; - use strum::IntoEnumIterator; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_blocklist_ui_accepts() { @@ -15,4 +20,55 @@ mod tests { } }); } + + #[test] + fn test_blocklist_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_blocklist_ui_renders_empty_blocklist() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); + app.data.radarr_data.blocklist = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_blocklist_ui_renders_with_blocklist_items() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); + app.data.radarr_data.blocklist = StatefulTable::default(); + app.data.radarr_data.blocklist.set_items(vec![ + BlocklistItem { + id: 1, + source_title: "Test.Movie.2023.1080p".to_owned(), + ..BlocklistItem::default() + }, + BlocklistItem { + id: 2, + source_title: "Another.Movie.2023.720p".to_owned(), + ..BlocklistItem::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap new file mode 100644 index 0000000..5be459a --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap new file mode 100644 index 0000000..0f40c50 --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap new file mode 100644 index 0000000..6553ab2 --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Movie Title Source Title Languages Quality Formats Date +=> Test.Movie.2023.1080p 1970-01-01 00:00:0 + Another.Movie.2023.720p 1970-01-01 00:00:0 diff --git a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs index fae0a22..23d1c7d 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs @@ -1,12 +1,17 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::radarr_models::{Collection, CollectionMovie}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, }; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_collection_details_ui_accepts() { @@ -33,4 +38,28 @@ mod tests { .into() )); } + + #[test] + fn test_collection_details_ui_renders_collection_details() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::CollectionDetails.into()); + app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD - 1080p".to_owned())]); + app.data.radarr_data.collections = StatefulTable::default(); + app.data.radarr_data.collections.set_items(vec![Collection { + id: 1, + title: "Test Collection".into(), + quality_profile_id: 1, + movies: Some(vec![CollectionMovie { + title: "Movie 1".into(), + ..CollectionMovie::default() + }]), + ..Collection::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + CollectionDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/collections/collections_ui_tests.rs b/src/ui/radarr_ui/collections/collections_ui_tests.rs index 09cde4a..e3f4437 100644 --- a/src/ui/radarr_ui/collections/collections_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collections_ui_tests.rs @@ -2,11 +2,15 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, COLLECTIONS_BLOCKS, EDIT_COLLECTION_BLOCKS, }; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::CollectionsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_collections_ui_accepts() { @@ -23,4 +27,30 @@ mod tests { } }); } + + #[test] + fn test_collections_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Collections.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + CollectionsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_collections_ui_renders_empty_collections() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Collections.into()); + app.data.radarr_data.collections = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + CollectionsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs index e458671..2dd05a6 100644 --- a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +++ b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs @@ -1,12 +1,19 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::radarr_models::Collection; + use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS, + ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, }; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_edit_collection_ui_accepts() { @@ -26,4 +33,29 @@ mod tests { .into() )); } + + #[test] + fn test_edit_collection_ui_renders_edit_collection_modal() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::EditCollectionRootFolderPathInput.into()); + app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD - 1080p".to_owned())]); + app.data.radarr_data.collections = StatefulTable::default(); + app.data.radarr_data.collections.set_items(vec![Collection { + id: 1, + title: "Test Collection".into(), + quality_profile_id: 1, + root_folder_path: Some("/movies".to_owned()), + ..Collection::default() + }]); + app.data.radarr_data.selected_block = + BlockSelectionState::new(EDIT_COLLECTION_SELECTION_BLOCKS); + app.data.radarr_data.edit_collection_modal = + Some(EditCollectionModal::from(&app.data.radarr_data)); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EditCollectionUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap new file mode 100644 index 0000000..776d581 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/collections/collection_details_ui_tests.rs +expression: output +--- + + + + + ╭ Test Collection ─────────────────────────────────────────────────────────────────────╮ + │Overview: │ + │Root Folder Path: │ + │Quality Profile: HD - 1080p │ + │Minimum Availability: Announced │ + │Monitored: No │ + │ Movies ──────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap new file mode 100644 index 0000000..7cbbe61 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap new file mode 100644 index 0000000..7cbbe61 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap new file mode 100644 index 0000000..0d53eb0 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────── Edit - Test Collection ──────────────────────╮ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: ╰───╯ │ + │ ╭───────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰───────────────────────────────╯ │ + │ ╭───────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰───────────────────────────────╯ │ + │ ╭───────────────────────────────╮ │ + │ Root Folder: ╰───────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ │ │ + │ ╰───╯ │ + ╰──────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs index a1c4d9c..6ada6c4 100644 --- a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs @@ -2,9 +2,13 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::downloads::DownloadsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_downloads_ui_accepts() { @@ -16,4 +20,63 @@ mod tests { } }); } + + #[test] + fn test_downloads_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_downloads_ui_renders_empty_downloads() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); + app.data.radarr_data.downloads = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_downloads_ui_renders_with_downloads() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); + app.data.radarr_data.downloads = StatefulTable::default(); + app.data.radarr_data.downloads.set_items(vec![ + DownloadRecord { + id: 1, + movie_id: 1, + title: "Test Movie Download".to_owned(), + status: "downloading".to_owned(), + size: 1024 * 1024 * 1024, + sizeleft: 512 * 1024 * 1024, + ..DownloadRecord::default() + }, + DownloadRecord { + id: 2, + movie_id: 2, + title: "Another Movie Download".to_owned(), + status: "completed".to_owned(), + size: 2048 * 1024 * 1024, + sizeleft: 0, + ..DownloadRecord::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap new file mode 100644 index 0000000..74c15cb --- /dev/null +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap new file mode 100644 index 0000000..9d9848b --- /dev/null +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap new file mode 100644 index 0000000..df3d304 --- /dev/null +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Compl Size Output Path Indexer Download Client +=> Test Movie Download 50% 1.00 GB + Another Movie Download 100% 2.00 GB diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs index bf89691..f2d6ef0 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs @@ -1,9 +1,19 @@ #[cfg(test)] mod tests { - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_INDEXER_BLOCKS}; + use strum::IntoEnumIterator; + + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::modals::EditIndexerModal; + use crate::models::servarr_data::radarr::radarr_data::{ + ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + }; + use crate::models::servarr_models::{Indexer, IndexerField}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; - use strum::IntoEnumIterator; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use serde_json::json; #[test] fn test_edit_indexer_ui_accepts() { @@ -15,4 +25,41 @@ mod tests { } }); } + + #[test] + fn test_edit_indexer_ui_renders_edit_indexer_modal() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::EditIndexerNameInput.into()); + app.data.radarr_data.indexers = StatefulTable::default(); + app.data.radarr_data.indexers.set_items(vec![Indexer { + id: 1, + name: Some("Test Indexer".to_owned()), + enable_rss: true, + priority: 25, + fields: Some(vec![ + IndexerField { + name: Some("baseUrl".to_owned()), + value: Some(json!("https://test.indexer.com")), + }, + IndexerField { + name: Some("apiKey".to_owned()), + value: Some(json!("test-api-key")), + }, + IndexerField { + name: Some("seedCriteria.seedRatio".to_owned()), + value: Some(json!(1.0)), + }, + ]), + ..Indexer::default() + }]); + app.data.radarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); + app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.radarr_data)); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EditIndexerUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs index e2cb89b..4c82258 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs @@ -2,11 +2,15 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ - ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, + ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, }; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_indexer_settings_ui_accepts() { @@ -18,4 +22,19 @@ mod tests { } }); } + + #[test] + fn test_indexer_settings_ui_renders_indexer_settings() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into()); + app.data.radarr_data.selected_block = + BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); + app.data.radarr_data.indexer_settings = Some(IndexerSettings::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexerSettingsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs index 214cded..bbb7480 100644 --- a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs @@ -2,11 +2,15 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; + use crate::models::servarr_models::Indexer; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::IndexersUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_indexers_ui_accepts() { @@ -24,4 +28,60 @@ mod tests { } }); } + + #[test] + fn test_indexers_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_empty_indexers() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); + app.data.radarr_data.indexers = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_with_indexers() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); + app.data.radarr_data.indexers = StatefulTable::default(); + app.data.radarr_data.indexers.set_items(vec![ + Indexer { + id: 1, + name: Some("Test Indexer 1".to_owned()), + enable_rss: true, + enable_automatic_search: true, + enable_interactive_search: true, + priority: 25, + ..Indexer::default() + }, + Indexer { + id: 2, + name: Some("Test Indexer 2".to_owned()), + enable_rss: false, + ..Indexer::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap new file mode 100644 index 0000000..1fb62de --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap @@ -0,0 +1,27 @@ +--- +source: src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +expression: output +--- + + + + + + + + + ╭───────────────────────────────── Edit Indexer ─────────────────────────────────╮ + │ │ + │ ╭─────────────────╮ ╭─────────────────╮ │ + │ Name: ╰─────────────────╯ URL: ╰─────────────────╯ │ + │ ╭───╮ ╭─────────────────╮ │ + │ ╭───╮ API Key: ╰─────────────────╯ │ + │ Enable Automatic Se╰───╯ ╭─────────────────╮ │ + │ ╭───╮ Tags: ╰─────────────────╯ │ + │ ╭─────────────────╮ │ + │ Indexer Priority ▴▾╰─────────────────╯ │ + │ │ + │ ╭──────────────────╮╭───────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰──────────────────╯╰───────────────────╯ │ + ╰──────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap new file mode 100644 index 0000000..e5aa9f5 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap @@ -0,0 +1,27 @@ +--- +source: src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs +expression: output +--- + + + + + + + + + ╭──────────────────────── Configure All Indexer Settings ────────────────────────╮ + │ │ + │ ╭─────────────────╮ ╭─────────────────╮ │ + │ Minimum Age (minute╰─────────────────╯ Availability Delay ╰─────────────────╯ │ + │ ╭─────────────────╮ ╭─────────────────╮ │ + │ Retention (days) ▴▾╰─────────────────╯ RSS Sync Interval (╰─────────────────╯ │ + │ ╭─────────────────╮ ╭─────────────────╮ │ + │ Maximum Size (MB) ▴╰─────────────────╯ Whitelisted Subtitl╰─────────────────╯ │ + │ ╭───╮ ╭───╮ │ + │ Prefer Indexer Flag╰───╯ Allow Hardcoded Sub╰───╯ │ + │ │ + │ ╭──────────────────╮╭───────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰──────────────────╯╰───────────────────╯ │ + ╰──────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap new file mode 100644 index 0000000..ee33805 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap new file mode 100644 index 0000000..9ac0562 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap new file mode 100644 index 0000000..c4038d1 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Sea Priority Tags +=> Test Indexer 1 Enabled Enabled Enabled 25 + Test Indexer 2 Disabled Disabled Disabled 0 diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap new file mode 100644 index 0000000..2ce3a04 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs +expression: output +--- + + + + + ╭ Test All Indexers ───────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs index 6b19994..d489b8a 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -2,9 +2,11 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_test_all_indexers_ui_accepts() { @@ -16,4 +18,21 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_test_all_indexers_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::TestAllIndexers.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + TestAllIndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/radarr_ui/library/add_movie_ui_tests.rs b/src/ui/radarr_ui/library/add_movie_ui_tests.rs index 417ffc5..9401a58 100644 --- a/src/ui/radarr_ui/library/add_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/add_movie_ui_tests.rs @@ -2,9 +2,12 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_add_movie_ui_accepts() { @@ -16,4 +19,31 @@ mod tests { } }); } + + #[test] + fn test_add_movie_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into()); + app.data.radarr_data.add_movie_search = Some(HorizontallyScrollableText::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + AddMovieUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_add_movie_ui_renders_search_input() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into()); + app.data.radarr_data.add_movie_search = Some(HorizontallyScrollableText::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + AddMovieUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs index 8fbd936..c9f17f2 100644 --- a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs @@ -1,10 +1,18 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS}; + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::radarr_models::Movie; + use crate::models::servarr_data::radarr::radarr_data::{ + ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS, + }; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_delete_movie_ui_accepts() { @@ -16,4 +24,25 @@ mod tests { } }); } + + #[test] + fn test_delete_movie_ui_renders_delete_movie_prompt() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()); + app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.radarr_data.selected_block = BlockSelectionState::new(DELETE_MOVIE_SELECTION_BLOCKS); + app.data.radarr_data.movies = StatefulTable::default(); + app.data.radarr_data.movies.set_items(vec![Movie { + id: 1, + title: "Test Movie".into(), + quality_profile_id: 0, + ..Movie::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DeleteMovieUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs index a2d802e..b076c82 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs @@ -1,10 +1,19 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; - use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS}; + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::radarr_models::Movie; + use crate::models::servarr_data::radarr::modals::EditMovieModal; + use crate::models::servarr_data::radarr::radarr_data::{ + ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, + }; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_edit_movie_ui_accepts() { @@ -16,4 +25,28 @@ mod tests { } }); } + + #[test] + fn test_edit_movie_ui_renders_edit_movie_modal() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::EditMoviePathInput.into()); + app.data.radarr_data.quality_profile_map = + BiMap::from_iter(vec![(1, "HD - 1080p".to_owned()), (2, "Any".to_owned())]); + app.data.radarr_data.selected_block = BlockSelectionState::new(EDIT_MOVIE_SELECTION_BLOCKS); + app.data.radarr_data.movies = StatefulTable::default(); + app.data.radarr_data.movies.set_items(vec![Movie { + id: 1, + title: "Test Movie".into(), + path: "/movies/test".into(), + quality_profile_id: 1, + ..Movie::default() + }]); + app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::from(&app.data.radarr_data)); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EditMovieUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/library/movie_details_ui_tests.rs b/src/ui/radarr_ui/library/movie_details_ui_tests.rs index 1eb204e..66d3b0f 100644 --- a/src/ui/radarr_ui/library/movie_details_ui_tests.rs +++ b/src/ui/radarr_ui/library/movie_details_ui_tests.rs @@ -1,16 +1,22 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use pretty_assertions::assert_eq; use ratatui::style::Style; use rstest::rstest; use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::radarr_models::{Movie, RadarrRelease}; + use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::movie_details_ui::{ MovieDetailsUi, style_from_download_status, }; use crate::ui::styles::ManagarrStyle; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_movie_details_ui_accepts() { @@ -42,4 +48,99 @@ mod tests { expected_style ); } + + #[test] + fn test_movie_details_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); + app.data.radarr_data.movies = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + MovieDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_movie_details_ui_renders_movie_details_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); + app.data.radarr_data.quality_profile_map = + BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]); + app.data.radarr_data.movies = StatefulTable::default(); + app.data.radarr_data.movies.set_items(vec![Movie { + id: 1, + title: "Test Movie".into(), + ..Movie::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + MovieDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_movie_details_ui_renders_movie_history_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); + app.data.radarr_data.quality_profile_map = + BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]); + app.data.radarr_data.movies = StatefulTable::default(); + app.data.radarr_data.movies.set_items(vec![Movie { + id: 1, + title: "Test Movie".into(), + ..Movie::default() + }]); + app.data.radarr_data.movie_info_tabs.set_index(1); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + MovieDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_movie_details_ui_renders_manual_search_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); + app.data.radarr_data.quality_profile_map = + BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]); + app.data.radarr_data.movies = StatefulTable::default(); + app.data.radarr_data.movies.set_items(vec![Movie { + id: 1, + title: "Test Movie".into(), + ..Movie::default() + }]); + app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); + app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_releases = StatefulTable::default(); + app + .data + .radarr_data + .movie_details_modal + .as_mut() + .unwrap() + .movie_releases + .set_items(vec![RadarrRelease { + title: "Test Release".into(), + ..RadarrRelease::default() + }]); + app.data.radarr_data.movie_info_tabs.set_index(2); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + MovieDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap new file mode 100644 index 0000000..76245ed --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap @@ -0,0 +1,29 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + ╭──────────────────────────────────── Add Movie ─────────────────────────────────────╮ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╭──────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap new file mode 100644 index 0000000..76245ed --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap @@ -0,0 +1,29 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + ╭──────────────────────────────────── Add Movie ─────────────────────────────────────╮ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╭──────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap new file mode 100644 index 0000000..0c58379 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap @@ -0,0 +1,24 @@ +--- +source: src/ui/radarr_ui/library/delete_movie_ui_tests.rs +expression: output +--- + + + + + + + + + + ╭───────────── Delete Movie ──────────────╮ + │ Do you really want to delete: │ + │ Test Movie? │ + │ │ + │ ╭───╮ │ + │ Delete Movie File: │ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Add List Exclusion: │ │ │ + │ ╰───╯ │ + ╰───────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap new file mode 100644 index 0000000..462693a --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭──────────────────────── Edit - Test Movie ─────────────────────────╮ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: ╰───╯ │ + │ ╭───────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰───────────────────────────────╯ │ + │ ╭───────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰───────────────────────────────╯ │ + │ ╭───────────────────────────────╮ │ + │ Path: ╰───────────────────────────────╯ │ + │ ╭───────────────────────────────╮ │ + │ Tags: │ │ │ + │ ╰───────────────────────────────╯ │ + ╰──────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap new file mode 100644 index 0000000..7711262 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap new file mode 100644 index 0000000..9229ad5 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap new file mode 100644 index 0000000..7711262 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap new file mode 100644 index 0000000..cae88b4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/mod.rs b/src/ui/radarr_ui/mod.rs index 4868bca..72a9b6f 100644 --- a/src/ui/radarr_ui/mod.rs +++ b/src/ui/radarr_ui/mod.rs @@ -248,3 +248,7 @@ fn draw_radarr_logo(f: &mut Frame<'_>, area: Rect) { .centered(); f.render_widget(logo, area); } + +#[cfg(test)] +#[path = "radarr_ui_tests.rs"] +mod radarr_ui_tests; diff --git a/src/ui/radarr_ui/radarr_ui_tests.rs b/src/ui/radarr_ui/radarr_ui_tests.rs index 44fd4eb..24b90a2 100644 --- a/src/ui/radarr_ui/radarr_ui_tests.rs +++ b/src/ui/radarr_ui/radarr_ui_tests.rs @@ -1,15 +1,19 @@ #[cfg(test)] mod tests { use crate::models::radarr_models::{DownloadRecord, Movie}; + use bimap::BiMap; use pretty_assertions::assert_eq; use ratatui::widgets::{Cell, Row}; use rstest::rstest; use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::ui::radarr_ui::{decorate_with_row_style, RadarrUi}; - use crate::ui::styles::ManagarrStyle; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; + use crate::ui::radarr_ui::{RadarrUi, decorate_with_row_style}; + use crate::ui::styles::ManagarrStyle; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_radarr_ui_accepts() { @@ -18,6 +22,79 @@ mod tests { }); } + mod snapshot_tests { + use super::*; + + #[test] + fn test_radarr_ui_renders_downloads_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.radarr_data.main_tabs.set_index(2); // Downloads tab + app.data.radarr_data.downloads = StatefulTable::default(); + app.data.radarr_data.downloads.set_items(vec![ + DownloadRecord { + id: 1, + title: "Test Movie 2024".to_owned(), + status: "downloading".to_owned(), + size: 2000000000, + sizeleft: 500000000, + ..DownloadRecord::default() + }, + DownloadRecord { + id: 2, + title: "Another Movie".to_owned(), + status: "downloading".to_owned(), + size: 1500000000, + sizeleft: 750000000, + ..DownloadRecord::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RadarrUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_downloads_tab_empty() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.radarr_data.main_tabs.set_index(2); // Downloads tab + app.data.radarr_data.downloads = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RadarrUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_library_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.radarr_data.main_tabs.set_index(0); // Library tab + app.data.radarr_data.movies = StatefulTable::default(); + app.data.radarr_data.movies.set_items(vec![Movie { + id: 1, + title: "Test Movie".into(), + quality_profile_id: 0, + ..Movie::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RadarrUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } + #[rstest] #[case(false, Some("downloading"), false, "", RowStyle::Downloading)] #[case(false, Some("completed"), false, "", RowStyle::AwaitingImport)] diff --git a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs index bed74ce..e0d699b 100644 --- a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs @@ -2,9 +2,14 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; + use crate::models::servarr_models::RootFolder; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::root_folders::RootFoldersUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_root_folders_ui_accepts() { @@ -16,4 +21,71 @@ mod tests { } }); } + + #[test] + fn test_root_folders_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_empty_root_folders() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); + app.data.radarr_data.root_folders = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_with_root_folders() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); + app.data.radarr_data.root_folders = StatefulTable::default(); + app.data.radarr_data.root_folders.set_items(vec![ + RootFolder { + path: "/movies".to_owned(), + accessible: true, + free_space: 1024 * 1024 * 1024 * 100, + ..RootFolder::default() + }, + RootFolder { + path: "/media/movies".to_owned(), + accessible: true, + free_space: 1024 * 1024 * 1024 * 50, + ..RootFolder::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_add_root_folder() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::AddRootFolderPrompt.into()); + app.data.radarr_data.root_folders = StatefulTable::default(); + app.data.radarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap new file mode 100644 index 0000000..92192db --- /dev/null +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap @@ -0,0 +1,20 @@ +--- +source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + + + + + + + + + + + + ╭────── Add Root Folder ───────╮ + cancel diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap new file mode 100644 index 0000000..0883c8a --- /dev/null +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap new file mode 100644 index 0000000..3571adb --- /dev/null +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap new file mode 100644 index 0000000..bffe454 --- /dev/null +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /movies 100.00 GB 0 + /media/movies 50.00 GB 0 diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap new file mode 100644 index 0000000..3a04387 --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap new file mode 100644 index 0000000..3a04387 --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap new file mode 100644 index 0000000..daff9d2 --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title Year Studio Runtime Rating Languag Size Quality Pro Monitor Tags │ +│=> Test Movie 0 0h 0m 0.00 GB Any │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap new file mode 100644 index 0000000..deb1ee9 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + ╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap new file mode 100644 index 0000000..7272e3c --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + ╭ Log Details ─────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap new file mode 100644 index 0000000..5e6d27d --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ +╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ Loading ... │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap new file mode 100644 index 0000000..07cb0f2 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ +╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/system_details_ui_tests.rs b/src/ui/radarr_ui/system/system_details_ui_tests.rs index ff77c51..771c933 100644 --- a/src/ui/radarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_details_ui_tests.rs @@ -2,11 +2,14 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, }; + use crate::ui::DrawUi; use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_system_details_ui_accepts() { @@ -18,4 +21,37 @@ mod tests { } }); } + + #[test] + fn test_system_details_ui_renders_loading_tasks() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::SystemTasks.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_details_ui_renders_logs() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::SystemLogs.into()); + app.data.radarr_data.logs.set_items(vec![ + "2023-01-01T12:00:00Z | Info | Test log message 1" + .to_owned() + .into(), + "2023-01-01T12:01:00Z | Warn | Test warning message" + .to_owned() + .into(), + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/radarr_ui/system/system_ui_tests.rs b/src/ui/radarr_ui/system/system_ui_tests.rs index d41ae77..29e8902 100644 --- a/src/ui/radarr_ui/system/system_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_ui_tests.rs @@ -2,11 +2,13 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, SYSTEM_DETAILS_BLOCKS, }; use crate::ui::DrawUi; use crate::ui::radarr_ui::system::SystemUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_system_ui_accepts() { @@ -22,4 +24,29 @@ mod tests { } }); } + + #[test] + fn test_system_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_ui_renders_system_menu() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } diff --git a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs index 4554804..24dca2a 100644 --- a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs @@ -1,9 +1,14 @@ #[cfg(test)] mod tests { + use strum::IntoEnumIterator; + + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; + use crate::models::sonarr_models::BlocklistItem; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::blocklist::BlocklistUi; - use strum::IntoEnumIterator; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_blocklist_ui_accepts() { @@ -15,4 +20,59 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_blocklist_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_blocklist_ui_renders_empty_blocklist() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); + app.data.sonarr_data.blocklist = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_blocklist_ui_renders_with_blocklist_items() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); + app.data.sonarr_data.blocklist = StatefulTable::default(); + app.data.sonarr_data.blocklist.set_items(vec![ + BlocklistItem { + id: 1, + source_title: "Test.Series.S01E01.1080p".to_owned(), + ..BlocklistItem::default() + }, + BlocklistItem { + id: 2, + source_title: "Another.Series.S02E05.720p".to_owned(), + ..BlocklistItem::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap new file mode 100644 index 0000000..c6e9881 --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap new file mode 100644 index 0000000..b9c1bf4 --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap new file mode 100644 index 0000000..80e2649 --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Series Title Source Title Language Quality Date +=> Test.Series.S01E01.1080p 1970-01-01 00:00:0 + Another.Series.S02E05.720p 1970-01-01 00:00:0 diff --git a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs index 8e0cfe5..1659ebd 100644 --- a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs @@ -2,9 +2,13 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; + use crate::models::sonarr_models::DownloadRecord; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::downloads::DownloadsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_downloads_ui_accepts() { @@ -16,4 +20,65 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_downloads_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_downloads_ui_renders_empty_downloads() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); + app.data.sonarr_data.downloads = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_downloads_ui_renders_with_downloads() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); + app.data.sonarr_data.downloads = StatefulTable::default(); + app.data.sonarr_data.downloads.set_items(vec![ + DownloadRecord { + id: 1, + title: "Test Series Download".to_owned(), + status: Default::default(), + size: 1024.0 * 1024.0 * 1024.0, + sizeleft: 512.0 * 1024.0 * 1024.0, + ..DownloadRecord::default() + }, + DownloadRecord { + id: 2, + title: "Another Series Download".to_owned(), + status: Default::default(), + size: 2048.0 * 1024.0 * 1024.0, + sizeleft: 0.0, + ..DownloadRecord::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap new file mode 100644 index 0000000..cfe9f6d --- /dev/null +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap new file mode 100644 index 0000000..7c27b2f --- /dev/null +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap new file mode 100644 index 0000000..3c6eafc --- /dev/null +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Compl Size Output Path Indexer Download Client +=> Test Series Download 50% 1.00 GB + Another Series Download 100% 2.00 GB diff --git a/src/ui/sonarr_ui/history/history_ui_tests.rs b/src/ui/sonarr_ui/history/history_ui_tests.rs index df15aef..fa1919c 100644 --- a/src/ui/sonarr_ui/history/history_ui_tests.rs +++ b/src/ui/sonarr_ui/history/history_ui_tests.rs @@ -1,9 +1,14 @@ #[cfg(test)] mod tests { + use strum::IntoEnumIterator; + + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; + use crate::models::sonarr_models::SonarrHistoryItem; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::history::HistoryUi; - use strum::IntoEnumIterator; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_history_ui_accepts() { @@ -15,4 +20,59 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_history_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::History.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + HistoryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_history_ui_renders_empty_history() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::History.into()); + app.data.sonarr_data.history = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + HistoryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_history_ui_renders_with_history_items() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::History.into()); + app.data.sonarr_data.history = StatefulTable::default(); + app.data.sonarr_data.history.set_items(vec![ + SonarrHistoryItem { + id: 1, + source_title: "Test.Series.S01E01".to_owned().into(), + ..SonarrHistoryItem::default() + }, + SonarrHistoryItem { + id: 2, + source_title: "Another.Series.S02E05".to_owned().into(), + ..SonarrHistoryItem::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + HistoryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap new file mode 100644 index 0000000..bb3846a --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap new file mode 100644 index 0000000..a7e7f8e --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap new file mode 100644 index 0000000..73bece9 --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title Event Type Language Quality Date +=> Test.Series.S01E01 unknown 1970-01-01 00:00:00 UTC + Another.Series.S02E05 unknown 1970-01-01 00:00:00 UTC diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs index 3b22177..7d7fe58 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs @@ -1,9 +1,19 @@ #[cfg(test)] mod tests { - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_INDEXER_BLOCKS}; + use strum::IntoEnumIterator; + + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::modals::EditIndexerModal; + use crate::models::servarr_data::sonarr::sonarr_data::{ + ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + }; + use crate::models::servarr_models::{Indexer, IndexerField}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi; - use strum::IntoEnumIterator; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use serde_json::json; #[test] fn test_edit_indexer_ui_accepts() { @@ -15,4 +25,45 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_edit_indexer_ui_renders_edit_indexer_modal() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::EditIndexerNameInput.into()); + app.data.sonarr_data.indexers = StatefulTable::default(); + app.data.sonarr_data.indexers.set_items(vec![Indexer { + id: 1, + name: Some("Test Indexer".to_owned()), + enable_rss: true, + priority: 25, + fields: Some(vec![ + IndexerField { + name: Some("baseUrl".to_owned()), + value: Some(json!("https://test.indexer.com")), + }, + IndexerField { + name: Some("apiKey".to_owned()), + value: Some(json!("test-api-key")), + }, + IndexerField { + name: Some("seedCriteria.seedRatio".to_owned()), + value: Some(json!(1.0)), + }, + ]), + ..Indexer::default() + }]); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); + app.data.sonarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.sonarr_data)); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EditIndexerUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs index d7d729d..bc86f32 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs @@ -2,11 +2,15 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::BlockSelectionState; use crate::models::servarr_data::sonarr::sonarr_data::{ - ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, + ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, }; + use crate::models::sonarr_models::IndexerSettings; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_indexer_settings_ui_accepts() { @@ -18,4 +22,23 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_indexer_settings_ui_renders_indexer_settings() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::IndexerSettingsMinimumAgeInput.into()); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); + app.data.sonarr_data.indexer_settings = Some(IndexerSettings::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexerSettingsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs index 725b19f..5a55253 100644 --- a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs @@ -2,11 +2,15 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; + use crate::models::servarr_models::Indexer; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::IndexersUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_indexers_ui_accepts() { @@ -24,4 +28,64 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_indexers_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_empty_indexers() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); + app.data.sonarr_data.indexers = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_with_indexers() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); + app.data.sonarr_data.indexers = StatefulTable::default(); + app.data.sonarr_data.indexers.set_items(vec![ + Indexer { + id: 1, + name: Some("Test Indexer 1".to_owned()), + enable_rss: true, + enable_automatic_search: true, + enable_interactive_search: true, + priority: 25, + ..Indexer::default() + }, + Indexer { + id: 2, + name: Some("Test Indexer 2".to_owned()), + enable_rss: false, + ..Indexer::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap new file mode 100644 index 0000000..4e928f8 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap @@ -0,0 +1,27 @@ +--- +source: src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +expression: output +--- + + + + + + + + + ╭───────────────────────────────── Edit Indexer ─────────────────────────────────╮ + │ │ + │ ╭─────────────────╮ ╭─────────────────╮ │ + │ Name: ╰─────────────────╯ URL: ╰─────────────────╯ │ + │ ╭───╮ ╭─────────────────╮ │ + │ ╭───╮ API Key: ╰─────────────────╯ │ + │ Enable Automatic Se╰───╯ ╭─────────────────╮ │ + │ ╭───╮ Tags: ╰─────────────────╯ │ + │ ╭─────────────────╮ │ + │ Indexer Priority ▴▾╰─────────────────╯ │ + │ │ + │ ╭──────────────────╮╭───────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰──────────────────╯╰───────────────────╯ │ + ╰──────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap new file mode 100644 index 0000000..157c634 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap @@ -0,0 +1,26 @@ +--- +source: src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs +expression: output +--- + + + + + + + + + ╭───────── Configure All Indexer Settings ─────────╮ + │ ╭───────────────────────╮ │ + │Minimum Age (minutes) ▴▾:│0 │ │ + │ ╰───────────────────────╯ │ + │ ╭───────────────────────╮ │ + │ Retention (days) ▴▾: │0 │ │ + │ ╰───────────────────────╯ │ + │ ╭───────────────────────╮ │ + │ Maximum Size (MB) ▴▾: │0 │ │ + │ ╰───────────────────────╯ │ + │ ╭───────────────────────╮ │ + │RSS Sync Interval (minute│0 │ │ + │ ╰───────────────────────╯ │ + ╰────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap new file mode 100644 index 0000000..df13382 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap new file mode 100644 index 0000000..cb64756 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap new file mode 100644 index 0000000..1af1435 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Sea Priority Tags +=> Test Indexer 1 Enabled Enabled Enabled 25 + Test Indexer 2 Disabled Disabled Disabled 0 diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap new file mode 100644 index 0000000..4e377fd --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs +expression: output +--- + + + + + ╭ Test All Indexers ───────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs index c221453..6629ebf 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -2,9 +2,11 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::test_all_indexers_ui::TestAllIndexersUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_test_all_indexers_ui_accepts() { @@ -16,4 +18,21 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_test_all_indexers_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::TestAllIndexers.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + TestAllIndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/add_series_ui_tests.rs b/src/ui/sonarr_ui/library/add_series_ui_tests.rs index cac470c..5a3eef0 100644 --- a/src/ui/sonarr_ui/library/add_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/add_series_ui_tests.rs @@ -2,9 +2,12 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ADD_SERIES_BLOCKS, ActiveSonarrBlock}; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::add_series_ui::AddSeriesUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_add_series_ui_accepts() { @@ -16,4 +19,35 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_add_series_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into()); + app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + AddSeriesUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_add_series_ui_renders_search_input() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into()); + app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + AddSeriesUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs index 5dfd620..57a904f 100644 --- a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs @@ -2,9 +2,16 @@ mod tests { use strum::IntoEnumIterator; - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DELETE_SERIES_BLOCKS}; + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::{ + ActiveSonarrBlock, DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, + }; + use crate::models::sonarr_models::Series; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::delete_series_ui::DeleteSeriesUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_delete_series_ui_accepts() { @@ -16,4 +23,28 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_delete_series_ui_renders_delete_series_toggle() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::DeleteSeriesPrompt.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + title: "Test Series".into(), + ..Series::default() + }]); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(DELETE_SERIES_SELECTION_BLOCKS); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + DeleteSeriesUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs index 938dde3..0961a0e 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs @@ -1,10 +1,19 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; - use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, EDIT_SERIES_BLOCKS}; + use crate::app::App; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::modals::EditSeriesModal; + use crate::models::servarr_data::sonarr::sonarr_data::{ + ActiveSonarrBlock, EDIT_SERIES_BLOCKS, EDIT_SERIES_SELECTION_BLOCKS, + }; + use crate::models::sonarr_models::Series; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::edit_series_ui::EditSeriesUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_edit_series_ui_accepts() { @@ -16,4 +25,34 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_edit_series_ui_renders_edit_series_modal() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::EditSeriesPathInput.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD-1080p".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(1, "English".to_owned())]); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + title: "Test Series".into(), + path: "/tv/test".to_owned(), + quality_profile_id: 1, + language_profile_id: 1, + ..Series::default() + }]); + app.data.sonarr_data.selected_block = BlockSelectionState::new(EDIT_SERIES_SELECTION_BLOCKS); + app.data.sonarr_data.edit_series_modal = Some(EditSeriesModal::from(&app.data.sonarr_data)); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EditSeriesUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs index 4246f53..699cef2 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs @@ -1,11 +1,17 @@ #[cfg(test)] mod tests { + use strum::IntoEnumIterator; + + use crate::app::App; + use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, }; + use crate::models::sonarr_models::{Episode, Season, Series}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; - use strum::IntoEnumIterator; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_episode_details_ui_accepts() { @@ -17,4 +23,111 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_episode_details_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season { + season_number: 1, + ..Season::default() + }]), + ..Series::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EpisodeDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_episode_details_ui_renders_episode_details_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season { + season_number: 1, + ..Season::default() + }]), + ..Series::default() + }]); + let mut season_details_modal = SeasonDetailsModal::default(); + season_details_modal + .episodes + .set_items(vec![Episode::default()]); + season_details_modal.episode_details_modal = Some(EpisodeDetailsModal::default()); + app.data.sonarr_data.season_details_modal = Some(season_details_modal); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EpisodeDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_episode_details_ui_renders_episode_history_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season { + season_number: 1, + ..Season::default() + }]), + ..Series::default() + }]); + let mut season_details_modal = SeasonDetailsModal::default(); + season_details_modal + .episodes + .set_items(vec![Episode::default()]); + let mut episode_details_modal = EpisodeDetailsModal::default(); + episode_details_modal.episode_details_tabs.set_index(1); + season_details_modal.episode_details_modal = Some(episode_details_modal); + app.data.sonarr_data.season_details_modal = Some(season_details_modal); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EpisodeDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_episode_details_ui_renders_manual_search_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season { + season_number: 1, + ..Season::default() + }]), + ..Series::default() + }]); + let mut season_details_modal = SeasonDetailsModal::default(); + season_details_modal + .episodes + .set_items(vec![Episode::default()]); + let mut episode_details_modal = EpisodeDetailsModal::default(); + episode_details_modal.episode_details_tabs.set_index(3); + season_details_modal.episode_details_modal = Some(episode_details_modal); + app.data.sonarr_data.season_details_modal = Some(season_details_modal); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + EpisodeDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/library_ui_tests.rs b/src/ui/sonarr_ui/library/library_ui_tests.rs index fd0c51b..98cf71b 100644 --- a/src/ui/sonarr_ui/library/library_ui_tests.rs +++ b/src/ui/sonarr_ui/library/library_ui_tests.rs @@ -245,4 +245,41 @@ mod tests { assert_eq!(style, row.indeterminate()); } + + mod snapshot_tests { + + use crate::app::App; + use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; + + use crate::models::stateful_table::StatefulTable; + use crate::ui::DrawUi; + use crate::ui::sonarr_ui::library::LibraryUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + + #[test] + fn test_library_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_empty_series() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + app.data.sonarr_data.series = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/season_details_ui_tests.rs b/src/ui/sonarr_ui/library/season_details_ui_tests.rs index cd987ca..1bb7569 100644 --- a/src/ui/sonarr_ui/library/season_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/season_details_ui_tests.rs @@ -1,12 +1,18 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::servarr_data::sonarr::modals::SeasonDetailsModal; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, }; + use crate::models::sonarr_models::{Season, Series}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_season_details_ui_accepts() { @@ -21,4 +27,121 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_season_details_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season::default()]), + ..Series::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SeasonDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_season_details_ui_renders_episodes_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season::default()]), + ..Series::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SeasonDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_season_details_ui_renders_manual_search_tab() { + use crate::models::sonarr_models::{Episode, EpisodeFile, SonarrRelease}; + + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(0, "English".to_owned())]); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season::default()]), + ..Series::default() + }]); + app + .data + .sonarr_data + .seasons + .set_items(vec![Season::default()]); + let mut season_details_modal = SeasonDetailsModal::default(); + season_details_modal.season_details_tabs.set_index(2); + season_details_modal + .episodes + .set_items(vec![Episode::default()]); + season_details_modal + .episode_files + .set_items(vec![EpisodeFile::default()]); + season_details_modal + .season_releases + .set_items(vec![SonarrRelease::default()]); + app.data.sonarr_data.season_details_modal = Some(season_details_modal); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SeasonDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_season_details_ui_renders_season_history_tab() { + use crate::models::sonarr_models::{Episode, EpisodeFile, SonarrHistoryItem}; + + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(0, "English".to_owned())]); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + seasons: Some(vec![Season::default()]), + ..Series::default() + }]); + app + .data + .sonarr_data + .seasons + .set_items(vec![Season::default()]); + let mut season_details_modal = SeasonDetailsModal::default(); + season_details_modal.season_details_tabs.set_index(1); + season_details_modal + .episodes + .set_items(vec![Episode::default()]); + season_details_modal + .episode_files + .set_items(vec![EpisodeFile::default()]); + season_details_modal + .season_history + .set_items(vec![SonarrHistoryItem::default()]); + app.data.sonarr_data.season_details_modal = Some(season_details_modal); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SeasonDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/series_details_ui_tests.rs b/src/ui/sonarr_ui/library/series_details_ui_tests.rs index a261dd7..69cd1a1 100644 --- a/src/ui/sonarr_ui/library/series_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/series_details_ui_tests.rs @@ -1,12 +1,17 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; + use crate::models::sonarr_models::{Season, Series}; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_series_details_ui_accepts() { @@ -22,4 +27,33 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_series_details_ui_renders_series_details() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::SeriesDetails.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD-1080p".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(1, "English".to_owned())]); + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + title: "Test Series".into(), + seasons: Some(vec![Season::default()]), + quality_profile_id: 1, + language_profile_id: 1, + ..Series::default() + }]); + app.data.sonarr_data.series_history = Some(StatefulTable::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SeriesDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap new file mode 100644 index 0000000..6253724 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap @@ -0,0 +1,29 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + ╭──────────────────────────────────── Add Series ────────────────────────────────────╮ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╭──────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap new file mode 100644 index 0000000..6253724 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap @@ -0,0 +1,29 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + ╭──────────────────────────────────── Add Series ────────────────────────────────────╮ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ + ╭──────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap new file mode 100644 index 0000000..87ec34a --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap @@ -0,0 +1,24 @@ +--- +source: src/ui/sonarr_ui/library/delete_series_ui_tests.rs +expression: output +--- + + + + + + + + + + ╭───────────── Delete Series ─────────────╮ + │ Do you really want to delete the series: │ + │ Test Series? │ + │ │ + │ ╭───╮ │ + │ Delete Series File: │ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Add List Exclusion: │ │ │ + │ ╰───╯ │ + ╰───────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap new file mode 100644 index 0000000..bc745af --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + + ╭─────────────────────────── Edit - Test Series ───────────────────────────╮ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ │ │ + │ ╰───╯ │ + │ ╭───────────────────────────────────╮ │ + │ Quality Profile: ╰───────────────────────────────────╯ │ + │ ╭───────────────────────────────────╮ │ + │ Language Profile: │English ▼ │ │ + │ ╰───────────────────────────────────╯ │ + │ ╭───────────────────────────────────╮ │ + │ Series Type: ╰───────────────────────────────────╯ │ + │ ╭───────────────────────────────────╮ │ + │ Path: │/tv/test │ │ + │ ╰───────────────────────────────────╯ │ + │ ╭───────────────────────────────────╮ │ + │ Tags: ╰───────────────────────────────────╯ │ + ╰────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap new file mode 100644 index 0000000..e00c67d --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + ╭ Episode Details ─────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap new file mode 100644 index 0000000..e00c67d --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + ╭ Episode Details ─────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap new file mode 100644 index 0000000..f112e11 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap new file mode 100644 index 0000000..7e37133 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + ╭ Episode Details ─────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap new file mode 100644 index 0000000..efada52 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap new file mode 100644 index 0000000..7d08204 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap new file mode 100644 index 0000000..67b9605 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap new file mode 100644 index 0000000..67b9605 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap new file mode 100644 index 0000000..9b59779 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + ╭ Season 0 Details ─────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │─────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Age ⛔ Title Indexer Size Peers Languag Quality│ + │=> 0 days 0.0 GB │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap new file mode 100644 index 0000000..abfe70d --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + ╭ Season 0 Details ─────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │─────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Language Quality Date │ + │=> unknown 1970-01-01 00:00:00│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap new file mode 100644 index 0000000..1e405e4 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap @@ -0,0 +1,33 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + ╭ Test Series ───────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test Series │ + │Overview: │ + │Network: │ + │Status: Continuing │ + │Genres: │ + │Rating: 0% │ + │Year: 0 │ + │Runtime: 0 minutes │ + │Path: │ + │╭ Series Details ──────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs index 0313bd1..c26d0eb 100644 --- a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs @@ -2,9 +2,14 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; + use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; + use crate::models::servarr_models::RootFolder; + use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::root_folders::RootFoldersUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_root_folders_ui_accepts() { @@ -16,4 +21,75 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_root_folders_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_empty_root_folders() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); + app.data.sonarr_data.root_folders = StatefulTable::default(); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_with_root_folders() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); + app.data.sonarr_data.root_folders = StatefulTable::default(); + app.data.sonarr_data.root_folders.set_items(vec![ + RootFolder { + path: "/tv".to_owned(), + accessible: true, + free_space: 1024 * 1024 * 1024 * 100, + ..RootFolder::default() + }, + RootFolder { + path: "/media/tv".to_owned(), + accessible: true, + free_space: 1024 * 1024 * 1024 * 50, + ..RootFolder::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_add_root_folder() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::AddRootFolderPrompt.into()); + app.data.sonarr_data.root_folders = StatefulTable::default(); + app.data.sonarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap new file mode 100644 index 0000000..7ac5efc --- /dev/null +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap @@ -0,0 +1,20 @@ +--- +source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + + + + + + + + + + + + ╭────── Add Root Folder ───────╮ + cancel diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap new file mode 100644 index 0000000..4b473dd --- /dev/null +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap new file mode 100644 index 0000000..fc3627f --- /dev/null +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap new file mode 100644 index 0000000..460ffcd --- /dev/null +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /tv 100.00 GB 0 + /media/tv 50.00 GB 0 diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap new file mode 100644 index 0000000..058ce75 --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap new file mode 100644 index 0000000..058ce75 --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap new file mode 100644 index 0000000..89b03f7 --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title Year Network Status Rating Type Quality Prof Language Size Monitor Tags │ +│=> Test Series 0 Contin Standar Any English 0.00 GB │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/sonarr_ui_tests.rs b/src/ui/sonarr_ui/sonarr_ui_tests.rs index be3aaa6..8e14050 100644 --- a/src/ui/sonarr_ui/sonarr_ui_tests.rs +++ b/src/ui/sonarr_ui/sonarr_ui_tests.rs @@ -1,10 +1,16 @@ #[cfg(test)] mod tests { + use bimap::BiMap; use strum::IntoEnumIterator; use crate::{ - models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock, - ui::{DrawUi, sonarr_ui::SonarrUi}, + app::App, + models::{ + servarr_data::sonarr::sonarr_data::ActiveSonarrBlock, + sonarr_models::{DownloadRecord, DownloadStatus, Series, SonarrHistoryItem}, + stateful_table::StatefulTable, + }, + ui::{DrawUi, sonarr_ui::SonarrUi, ui_test_utils::test_utils::render_to_string_with_app}, }; #[test] @@ -13,4 +19,88 @@ mod tests { assert!(SonarrUi::accepts(active_sonarr_block.into())); }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_sonarr_ui_renders_downloads_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(0, "English".to_owned())]); + app.data.sonarr_data.main_tabs.set_index(1); // Downloads tab + app.data.sonarr_data.downloads = StatefulTable::default(); + app.data.sonarr_data.downloads.set_items(vec![ + DownloadRecord { + id: 1, + title: "Test Series S01E01".to_owned(), + status: DownloadStatus::Downloading, + size: 1500000000.0, + sizeleft: 500000000.0, + ..DownloadRecord::default() + }, + DownloadRecord { + id: 2, + title: "Another Series S02E05".to_owned(), + status: DownloadStatus::Downloading, + size: 1200000000.0, + sizeleft: 400000000.0, + ..DownloadRecord::default() + }, + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SonarrUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_sonarr_ui_renders_history_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(0, "English".to_owned())]); + app.data.sonarr_data.main_tabs.set_index(2); // History tab + app.data.sonarr_data.history = StatefulTable::default(); + app + .data + .sonarr_data + .history + .set_items(vec![SonarrHistoryItem::default()]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SonarrUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_sonarr_ui_renders_library_tab() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); + app.data.sonarr_data.language_profiles_map = + BiMap::from_iter(vec![(0, "English".to_owned())]); + app.data.sonarr_data.main_tabs.set_index(0); // Library tab + app.data.sonarr_data.series = StatefulTable::default(); + app.data.sonarr_data.series.set_items(vec![Series { + id: 1, + title: "Test Series".into(), + quality_profile_id: 0, + ..Series::default() + }]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SonarrUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap new file mode 100644 index 0000000..2434403 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + ╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap new file mode 100644 index 0000000..44f2238 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + ╭ Log Details ─────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap new file mode 100644 index 0000000..2c7c537 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap @@ -0,0 +1,30 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + ╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap new file mode 100644 index 0000000..643dfb2 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ +╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ Loading ... │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap new file mode 100644 index 0000000..e98cdea --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ +╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/system_details_ui_tests.rs b/src/ui/sonarr_ui/system/system_details_ui_tests.rs index cf6af3d..d270e37 100644 --- a/src/ui/sonarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_details_ui_tests.rs @@ -2,11 +2,14 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; + use crate::ui::DrawUi; use crate::ui::sonarr_ui::system::system_details_ui::SystemDetailsUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_system_details_ui_accepts() { @@ -18,4 +21,53 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_system_details_ui_renders_loading_tasks() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_details_ui_renders_logs() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::SystemLogs.into()); + app.data.sonarr_data.logs.set_items(vec![ + "2023-01-01T12:00:00Z | Info | Test log message 1" + .to_owned() + .into(), + "2023-01-01T12:01:00Z | Warn | Test warning message" + .to_owned() + .into(), + ]); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_details_ui_renders_tasks() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/sonarr_ui/system/system_ui_tests.rs b/src/ui/sonarr_ui/system/system_ui_tests.rs index 9f6fd54..6234e1d 100644 --- a/src/ui/sonarr_ui/system/system_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_ui_tests.rs @@ -2,11 +2,13 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, SYSTEM_DETAILS_BLOCKS, }; use crate::ui::DrawUi; use crate::ui::sonarr_ui::system::SystemUi; + use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; #[test] fn test_system_ui_accepts() { @@ -22,4 +24,33 @@ mod tests { } }); } + + mod snapshot_tests { + use super::*; + + #[test] + fn test_system_ui_renders_loading_state() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::System.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_ui_renders_system_menu() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::System.into()); + + let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } } diff --git a/src/ui/ui_property_tests.rs b/src/ui/ui_property_tests.rs new file mode 100644 index 0000000..03431e2 --- /dev/null +++ b/src/ui/ui_property_tests.rs @@ -0,0 +1,268 @@ +#[cfg(test)] +mod ui_invariant_tests { + use proptest::prelude::*; + use ratatui::Terminal; + use ratatui::backend::TestBackend; + use ratatui::layout::Rect; + + use crate::app::App; + use crate::models::radarr_models::Movie; + use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::models::sonarr_models::Series; + use crate::models::{Scrollable, stateful_table::StatefulTable}; + use crate::ui::DrawUi; + use crate::ui::radarr_ui::RadarrUi; + use crate::ui::sonarr_ui::SonarrUi; + use prop::bool::ANY; + + proptest! { + #[test] + fn test_radarr_library_never_panics_on_large_datasets( + num_movies in 0usize..500, + viewport_height in 10u16..100, + ) { + let backend = TestBackend::new(120, viewport_height); + let mut terminal = Terminal::new(backend).unwrap(); + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + + let mut quality_profile_map = bimap::BiMap::new(); + quality_profile_map.insert(0, "Any".to_string()); + app.data.radarr_data.quality_profile_map = quality_profile_map; + + let movies: Vec = (0..num_movies) + .map(|i| Movie { + id: i as i64, + title: format!("Movie {}", i).into(), + ..Movie::default() + }) + .collect(); + + let mut table = StatefulTable::default(); + table.set_items(movies); + app.data.radarr_data.movies = table; + + terminal + .draw(|f| { + RadarrUi::draw(f, &mut app, f.area()); + }) + .unwrap(); + + let buffer = terminal.backend().buffer(); + prop_assert!(buffer.area().height <= viewport_height); + prop_assert!(buffer.area().width <= 120); + } + + #[test] + fn test_sonarr_library_never_panics_on_large_datasets( + num_series in 0usize..500, + viewport_height in 10u16..100, + ) { + let backend = TestBackend::new(120, viewport_height); + let mut terminal = Terminal::new(backend).unwrap(); + let mut app = App::test_default(); + app.push_navigation_stack( + crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock::Series.into() + ); + + let mut language_profiles_map = bimap::BiMap::new(); + language_profiles_map.insert(0, "English".to_string()); + app.data.sonarr_data.language_profiles_map = language_profiles_map; + + let mut quality_profile_map = bimap::BiMap::new(); + quality_profile_map.insert(0, "Any".to_string()); + app.data.sonarr_data.quality_profile_map = quality_profile_map; + + let series: Vec = (0..num_series) + .map(|i| Series { + id: i as i64, + title: format!("Series {}", i).into(), + ..Series::default() + }) + .collect(); + + let mut table = StatefulTable::default(); + table.set_items(series); + app.data.sonarr_data.series = table; + + terminal + .draw(|f| { + SonarrUi::draw(f, &mut app, f.area()); + }) + .unwrap(); + + let buffer = terminal.backend().buffer(); + prop_assert!(buffer.area().height <= viewport_height); + prop_assert!(buffer.area().width <= 120); + } + + #[test] + fn test_ui_respects_viewport_boundaries( + viewport_width in 40u16..200, + viewport_height in 10u16..100, + ) { + let backend = TestBackend::new(viewport_width, viewport_height); + let mut terminal = Terminal::new(backend).unwrap(); + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + + let mut quality_profile_map = bimap::BiMap::new(); + quality_profile_map.insert(0, "Any".to_string()); + app.data.radarr_data.quality_profile_map = quality_profile_map; + + let movies = vec![Movie { + id: 1, + title: "Very Long Movie Title That Should Be Scrollable And Not Overflow".into(), + ..Movie::default() + }]; + + let mut table = StatefulTable::default(); + table.set_items(movies); + app.data.radarr_data.movies = table; + + terminal + .draw(|f| { + RadarrUi::draw(f, &mut app, f.area()); + }) + .unwrap(); + + let buffer = terminal.backend().buffer(); + prop_assert_eq!(buffer.area().width, viewport_width); + prop_assert_eq!(buffer.area().height, viewport_height); + } + + #[test] + fn test_centered_rect_never_exceeds_parent( + parent_width in 20u16..200, + parent_height in 10u16..100, + percent_x in 1u16..=100, + percent_y in 1u16..=100, + ) { + use crate::ui::utils::centered_rect; + + let parent = Rect { + x: 0, + y: 0, + width: parent_width, + height: parent_height, + }; + + let centered = centered_rect(percent_x, percent_y, parent); + + prop_assert!(centered.x >= parent.x); + prop_assert!(centered.y >= parent.y); + prop_assert!(centered.x + centered.width <= parent.x + parent.width); + prop_assert!(centered.y + centered.height <= parent.y + parent.height); + } + + #[test] + fn test_table_navigation_stays_in_bounds( + num_items in 1usize..100, + num_scrolls in 0usize..200, + ) { + let mut table = StatefulTable::default(); + let movies: Vec = (0..num_items) + .map(|i| Movie { + id: i as i64, + title: format!("Movie {}", i).into(), + ..Movie::default() + }) + .collect(); + + table.set_items(movies); + + for _ in 0..num_scrolls { + table.scroll_down(); + } + + let current_item = table.current_selection(); + prop_assert!(current_item.id >= 0 && (current_item.id as usize) < num_items); + + for _ in 0..num_scrolls { + table.scroll_up(); + } + + let current_item_after = table.current_selection(); + prop_assert!(current_item_after.id >= 0 && (current_item_after.id as usize) < num_items); + } + + #[test] + fn test_empty_tables_handle_navigation_gracefully( + num_scroll_attempts in 0usize..50, + ) { + let mut table = StatefulTable::::default(); + + for _ in 0..num_scroll_attempts { + table.scroll_down(); + table.scroll_up(); + } + + prop_assert!(true); + } + + #[test] + fn test_loading_state_never_panics( + is_loading in ANY, + num_items in 0usize..100, + ) { + let backend = TestBackend::new(120, 30); + let mut terminal = Terminal::new(backend).unwrap(); + let mut app = App::test_default(); + app.is_loading = is_loading; + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + + let mut quality_profile_map = bimap::BiMap::new(); + quality_profile_map.insert(0, "Any".to_string()); + app.data.radarr_data.quality_profile_map = quality_profile_map; + + let movies: Vec = (0..num_items) + .map(|i| Movie { + id: i as i64, + title: format!("Movie {}", i).into(), + ..Movie::default() + }) + .collect(); + + let mut table = StatefulTable::default(); + table.set_items(movies); + app.data.radarr_data.movies = table; + + terminal + .draw(|f| { + RadarrUi::draw(f, &mut app, f.area()); + }) + .unwrap(); + + prop_assert!(true); + } + + #[test] + fn test_navigation_stack_maintains_route_integrity( + stack_depth in 1usize..10, + ) { + let mut app = App::test_default(); + + let blocks = [ActiveRadarrBlock::Movies, + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::Downloads, + ActiveRadarrBlock::Blocklist, + ActiveRadarrBlock::RootFolders]; + + for i in 0..stack_depth { + let block = blocks[i % blocks.len()]; + app.push_navigation_stack(block.into()); + } + + let current_route = app.get_current_route(); + let expected_block = blocks[(stack_depth - 1) % blocks.len()]; + prop_assert!(matches!(current_route, crate::models::Route::Radarr(block, _) if block == expected_block)); + + for _ in 0..stack_depth { + app.pop_navigation_stack(); + } + + let final_route = app.get_current_route(); + prop_assert!(matches!(final_route, crate::models::Route::Radarr(_, _))); + } + } +} diff --git a/src/ui/ui_test_utils.rs b/src/ui/ui_test_utils.rs new file mode 100644 index 0000000..6e950a1 --- /dev/null +++ b/src/ui/ui_test_utils.rs @@ -0,0 +1,126 @@ +#[cfg(test)] +#[allow(dead_code)] +pub mod test_utils { + use ratatui::Frame; + use ratatui::Terminal; + use ratatui::backend::TestBackend; + use ratatui::buffer::Buffer; + + use crate::app::App; + + pub fn create_test_backend(width: u16, height: u16) -> TestBackend { + TestBackend::new(width, height) + } + + pub fn create_test_terminal(width: u16, height: u16) -> Terminal { + let backend = create_test_backend(width, height); + Terminal::new(backend).unwrap() + } + + /// Renders a UI component and returns the output as a string + /// + /// # Arguments + /// * `width` - Terminal width in columns + /// * `height` - Terminal height in rows + /// * `render_fn` - Function that renders to the frame + /// + /// # Example + /// ```rust + /// let output = render_to_string(120, 30, |f| { + /// Block::default().title("Test").render(f.area(), f.buffer_mut()); + /// }); + /// ``` + pub fn render_to_string(width: u16, height: u16, mut render_fn: F) -> String + where + F: FnMut(&mut Frame), + { + let mut terminal = create_test_terminal(width, height); + + terminal + .draw(|f| { + render_fn(f); + }) + .unwrap(); + + buffer_to_string(terminal.backend().buffer(), width, height) + } + + /// Renders a UI component with an App instance and returns the output as a string + /// + /// This is the primary helper for testing UI components that need app state. + /// + /// # Arguments + /// * `width` - Terminal width in columns (typically 120) + /// * `height` - Terminal height in rows (typically 30) + /// * `app` - Mutable reference to App instance + /// * `render_fn` - Function that renders to the frame with app + /// + /// # Example + /// ```rust + /// let mut app = App::test_default(); + /// app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + /// + /// let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + /// LibraryUi::draw(f, app, f.area()); + /// }); + /// + /// insta::assert_snapshot!(output); + /// ``` + pub fn render_to_string_with_app( + width: u16, + height: u16, + app: &mut App, + mut render_fn: F, + ) -> String + where + F: FnMut(&mut Frame, &mut App), + { + let mut terminal = create_test_terminal(width, height); + + terminal + .draw(|f| { + render_fn(f, app); + }) + .unwrap(); + + buffer_to_string(terminal.backend().buffer(), width, height) + } + + fn buffer_to_string(buffer: &Buffer, width: u16, height: u16) -> String { + let mut result = String::new(); + + for y in 0..height { + for x in 0..width { + let cell = buffer.cell((x, y)).expect("Cell should exist"); + result.push_str(cell.symbol()); + } + if y < height - 1 { + result.push('\n'); + } + } + + result + } + + pub fn output_contains(output: &str, text: &str) -> bool { + output.contains(text) + } + + pub fn output_contains_all(output: &str, texts: &[&str]) -> bool { + texts.iter().all(|text| output.contains(text)) + } + + pub fn count_lines(output: &str) -> usize { + output.lines().count() + } + + pub fn verify_dimensions(output: &str, max_width: usize, max_height: usize) -> bool { + let lines: Vec<&str> = output.lines().collect(); + + if lines.len() > max_height { + return false; + } + + lines.iter().all(|line| line.chars().count() <= max_width) + } +} From 5da741f3a9e3631b765d0d8d4a27d09202f19ff7 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 08:37:28 -0700 Subject: [PATCH 17/28] ci: Updated Cargo.lock after main merge --- Cargo.lock | 1134 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 648 insertions(+), 486 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f47762..ccbfb24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -19,9 +19,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] @@ -32,12 +32,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -49,9 +43,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -64,9 +58,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -79,29 +73,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arc-swap" @@ -121,13 +115,12 @@ dependencies = [ [[package]] name = "assert_cmd" -version = "2.0.17" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" +checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85" dependencies = [ "anstyle", "bstr", - "doc-comment", "libc", "predicates", "predicates-core", @@ -149,7 +142,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -166,9 +159,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -176,7 +169,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -211,15 +204,24 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] [[package]] name = "bstr" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" dependencies = [ "memchr", "regex-automata", @@ -234,9 +236,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] name = "cargo-husky" @@ -261,9 +263,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.35" +version = "1.2.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" dependencies = [ "find-msvc-tools", "shlex", @@ -271,9 +273,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -283,11 +285,10 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", @@ -298,9 +299,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.47" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" +checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" dependencies = [ "clap_builder", "clap_derive", @@ -308,9 +309,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.47" +version = "4.5.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" +checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" dependencies = [ "anstream", "anstyle", @@ -321,30 +322,30 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.5.57" +version = "4.5.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d9501bd3f5f09f7bbee01da9a511073ed30a80cd7a509f1214bb74eadea71ad" +checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.5.47" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "colorchoice" @@ -384,7 +385,7 @@ dependencies = [ "directories", "serde", "serde_yaml", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -443,12 +444,13 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.7" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ + "dispatch2", "nix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -472,7 +474,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -483,14 +485,14 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "deranged" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", ] @@ -506,6 +508,28 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_more" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.111", + "unicode-xid", +] + [[package]] name = "derive_setters" version = "0.1.8" @@ -515,7 +539,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -584,6 +608,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -592,15 +628,9 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - [[package]] name = "downcast" version = "0.11.0" @@ -636,7 +666,7 @@ checksum = "583f1f514d2754010ff71ed6853068cacbe43cc142cc076aa1b871d9754efc48" dependencies = [ "darling", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -645,7 +675,7 @@ version = "0.6.1" dependencies = [ "darling", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -656,12 +686,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -672,9 +702,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" -version = "0.1.0" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fnv" @@ -774,7 +804,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -821,26 +851,26 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.3+wasi-0.2.4", + "wasip2", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" @@ -878,6 +908,12 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + [[package]] name = "heck" version = "0.5.0" @@ -886,12 +922,11 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "http" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ "bytes", - "fnv", "itoa", ] @@ -932,9 +967,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "human-panic" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac63a746b187e95d51fe16850eb04d1cfef203f6af98e6c405a6f262ad3df00a" +checksum = "9a8a07a0957cd4a3cad4a1e4ca7cd5ea07fcacef6ebe2e5d0c7935bfc95120d8" dependencies = [ "anstream", "anstyle", @@ -948,15 +983,15 @@ dependencies = [ [[package]] name = "humantime" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ "atomic-waker", "bytes", @@ -1009,9 +1044,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64", "bytes", @@ -1035,9 +1070,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1059,9 +1094,9 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -1072,9 +1107,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -1085,11 +1120,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -1100,42 +1134,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -1172,12 +1202,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", ] [[package]] @@ -1195,9 +1225,12 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] [[package]] name = "insta" @@ -1212,26 +1245,15 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +checksum = "6778b0196eefee7df739db78758e5cf9b37412268bfa5650bfeed028aed20d9c" dependencies = [ "darling", "indoc", "proc-macro2", "quote", - "syn 2.0.106", -] - -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags", - "cfg-if", - "libc", + "syn 2.0.111", ] [[package]] @@ -1242,9 +1264,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "iri-string" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" dependencies = [ "memchr", "serde", @@ -1252,9 +1274,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -1282,9 +1304,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" dependencies = [ "once_cell", "wasm-bindgen", @@ -1292,15 +1314,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.175" +version = "0.2.178" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" [[package]] name = "libredox" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ "bitflags", "libc", @@ -1314,33 +1336,32 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -1351,29 +1372,30 @@ checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" [[package]] name = "log4rs" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0816135ae15bd0391cf284eab37e6e3ee0a6ee63d2ceeb659862bd8d0a984ca6" +checksum = "3e947bb896e702c711fccc2bf02ab2abb6072910693818d1d6b07ee2b9dfd86c" dependencies = [ "anyhow", "arc-swap", "chrono", - "derivative", + "derive_more", "fnv", "humantime", "libc", "log", "log-mdc", - "once_cell", + "mock_instant", "parking_lot", - "rand 0.8.5", + "rand", "serde", "serde-value", "serde_json", "serde_yaml", - "thiserror", + "thiserror 2.0.17", "thread-id", "typemap-ors", + "unicode-segmentation", "winapi", ] @@ -1383,12 +1405,12 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown", + "hashbrown 0.15.5", ] [[package]] name = "managarr" -version = "0.6.1" +version = "0.6.3" dependencies = [ "anyhow", "assert_cmd", @@ -1451,9 +1473,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mime" @@ -1472,16 +1494,22 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] +[[package]] +name = "mock_instant" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" + [[package]] name = "mockall" version = "0.13.1" @@ -1505,26 +1533,27 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "mockito" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7760e0e418d9b7e5777c0374009ca4c93861b9066f18cb334a20ce50ab63aa48" +checksum = "7e0603425789b4a70fcc4ac4f5a46a566c116ee3e2a6b768dc623f7719c611de" dependencies = [ "assert-json-diff", "bytes", "colored", - "futures-util", + "futures-core", "http", "http-body", "http-body-util", "hyper", "hyper-util", "log", - "rand 0.9.2", + "pin-project-lite", + "rand", "regex", "serde_json", "serde_urlencoded", @@ -1592,10 +1621,169 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] -name = "object" -version = "0.36.7" +name = "objc2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags", + "block2", + "libc", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "object" +version = "0.37.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -1608,15 +1796,15 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ "bitflags", "cfg-if", @@ -1635,7 +1823,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -1646,18 +1834,18 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" -version = "300.5.2+3.5.2" +version = "300.5.4+3.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d270b79e2926f5150189d475bc7e9d2c69f9c4697b185fa917d5a32b792d21b4" +checksum = "a507b3792995dae9b0df8a1c1e3771e8418b7c2d9f0baeba32e6fe8b06c7cb72" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ "cc", "libc", @@ -1683,21 +1871,25 @@ dependencies = [ [[package]] name = "os_info" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" +checksum = "e4022a17595a00d6a369236fdae483f0de7f0a339960a53118b818238e132224" dependencies = [ + "android_system_properties", "log", - "plist", + "nix", + "objc2", + "objc2-foundation", + "objc2-ui-kit", "serde", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1705,15 +1897,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -1746,19 +1938,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" -[[package]] -name = "plist" -version = "1.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" -dependencies = [ - "base64", - "indexmap", - "quick-xml", - "serde", - "time", -] - [[package]] name = "portable-atomic" version = "1.11.1" @@ -1767,9 +1946,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -1828,18 +2007,18 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -1854,8 +2033,8 @@ dependencies = [ "bit-vec", "bitflags", "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax", "rusty-fork", @@ -1869,20 +2048,11 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-xml" -version = "0.38.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" -dependencies = [ - "memchr", -] - [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -1893,35 +2063,14 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - [[package]] name = "rand" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "rand_chacha", + "rand_core", ] [[package]] @@ -1931,16 +2080,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", + "rand_core", ] [[package]] @@ -1949,7 +2089,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] @@ -1958,7 +2098,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core", ] [[package]] @@ -1985,9 +2125,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] @@ -2000,14 +2140,14 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -2017,9 +2157,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -2028,9 +2168,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "relative-path" @@ -2040,9 +2180,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "b6eff9328d40131d43bd911d42d79eb6a47312002a4daefc9e37f17e74a7701a" dependencies = [ "base64", "bytes", @@ -2118,7 +2258,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.106", + "syn 2.0.111", "unicode-ident", ] @@ -2152,22 +2292,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "once_cell", "rustls-pki-types", @@ -2178,18 +2318,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "ring", "rustls-pki-types", @@ -2231,11 +2371,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2265,9 +2405,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -2275,16 +2415,17 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -2299,35 +2440,45 @@ dependencies = [ ] [[package]] -name = "serde_derive" -version = "1.0.219" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2377,7 +2528,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2398,9 +2549,9 @@ dependencies = [ [[package]] name = "signal-hook-mio" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" dependencies = [ "libc", "mio", @@ -2409,9 +2560,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" dependencies = [ "libc", ] @@ -2436,19 +2587,19 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -2481,7 +2632,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2503,9 +2654,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -2529,7 +2680,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2555,15 +2706,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.21.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -2572,7 +2723,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.8", + "rustix 1.1.2", "windows-sys 0.60.2", ] @@ -2588,7 +2739,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", ] [[package]] @@ -2599,24 +2759,35 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] name = "thread-id" -version = "4.2.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" +checksum = "99043e46c5a15af379c06add30d9c93a6c0e8849de00d244c4a2c417da128d80" dependencies = [ "libc", - "winapi", + "windows-sys 0.59.0", ] [[package]] name = "time" -version = "0.3.43" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bde6f1ec10e72d583d91623c939f623002284ef622b87de38cfd546cbf2031" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "libc", @@ -2625,7 +2796,6 @@ dependencies = [ "powerfmt", "serde", "time-core", - "time-macros", ] [[package]] @@ -2634,21 +2804,11 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" -[[package]] -name = "time-macros" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -2656,33 +2816,30 @@ dependencies = [ [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2697,9 +2854,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -2707,9 +2864,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" dependencies = [ "bytes", "futures-core", @@ -2720,47 +2877,51 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "serde", + "serde_core", "serde_spanned", - "toml_datetime 0.7.0", + "toml_datetime", "toml_writer", ] [[package]] name = "toml_datetime" -version = "0.6.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" - -[[package]] -name = "toml_datetime" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "5d7cbc3b4b49633d57a0509303158ca50de80ae32c265093b24c414705807832" dependencies = [ "indexmap", - "toml_datetime 0.6.11", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "tower" @@ -2779,9 +2940,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "bitflags", "bytes", @@ -2809,9 +2970,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "pin-project-lite", "tracing-core", @@ -2819,9 +2980,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", ] @@ -2849,9 +3010,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-segmentation" @@ -2882,6 +3043,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "unsafe-any-ors" version = "1.0.0" @@ -2935,11 +3102,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.1" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] @@ -2949,7 +3116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40630259c022600210096da9538abcb992b801e30b464cb9d19f19ef0e0d09b9" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2958,7 +3125,7 @@ version = "0.6.1" dependencies = [ "log", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -2985,7 +3152,7 @@ checksum = "5b2d5567b6fbd34e8f0488d56b648e67c0d999535f4af2060d14f9074b43e833" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -3013,45 +3180,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.3+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" dependencies = [ "cfg-if", "js-sys", @@ -3062,9 +3216,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3072,31 +3226,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.106", - "wasm-bindgen-backend", + "syn 2.0.111", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" dependencies = [ "js-sys", "wasm-bindgen", @@ -3136,9 +3290,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", @@ -3149,37 +3303,37 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] name = "windows-link" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" -version = "0.5.3" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ "windows-link", "windows-result", @@ -3188,18 +3342,18 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] @@ -3237,7 +3391,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", ] [[package]] @@ -3273,19 +3436,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -3302,9 +3465,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -3320,9 +3483,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -3338,9 +3501,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -3350,9 +3513,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -3368,9 +3531,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -3386,9 +3549,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -3404,9 +3567,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -3422,30 +3585,30 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.45.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "yansi" @@ -3455,11 +3618,10 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -3467,34 +3629,34 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] [[package]] @@ -3514,21 +3676,21 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -3537,9 +3699,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -3548,11 +3710,11 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.111", ] From e2c44583e8dd9e1bfaa30cc921200269d1b439c4 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 08:37:54 -0700 Subject: [PATCH 18/28] style: Applied formatting to recently merged in files --- src/cli/mod.rs | 2 +- src/cli/radarr/add_command_handler.rs | 2 +- src/cli/radarr/get_command_handler.rs | 4 ++-- src/cli/radarr/list_command_handler.rs | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 5eb9c37..8d0c6d2 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use anyhow::Result; -use clap::{command, Subcommand}; +use clap::{Subcommand, command}; use clap_complete::Shell; use radarr::{RadarrCliHandler, RadarrCommand}; use sonarr::{SonarrCliHandler, SonarrCommand}; diff --git a/src/cli/radarr/add_command_handler.rs b/src/cli/radarr/add_command_handler.rs index ac1596d..f0e73bf 100644 --- a/src/cli/radarr/add_command_handler.rs +++ b/src/cli/radarr/add_command_handler.rs @@ -10,7 +10,7 @@ use crate::{ app::App, cli::{CliCommandHandler, Command}, models::radarr_models::{AddMovieBody, AddMovieOptions, MinimumAvailability, MovieMonitor}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; #[cfg(test)] diff --git a/src/cli/radarr/get_command_handler.rs b/src/cli/radarr/get_command_handler.rs index 08016ea..7233146 100644 --- a/src/cli/radarr/get_command_handler.rs +++ b/src/cli/radarr/get_command_handler.rs @@ -1,13 +1,13 @@ use std::sync::Arc; use anyhow::Result; -use clap::{command, Subcommand}; +use clap::{Subcommand, command}; use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; diff --git a/src/cli/radarr/list_command_handler.rs b/src/cli/radarr/list_command_handler.rs index 3fd1575..4e613c9 100644 --- a/src/cli/radarr/list_command_handler.rs +++ b/src/cli/radarr/list_command_handler.rs @@ -1,13 +1,13 @@ use std::sync::Arc; use anyhow::Result; -use clap::{command, Subcommand}; +use clap::{Subcommand, command}; use tokio::sync::Mutex; use crate::{ app::App, cli::{CliCommandHandler, Command}, - network::{radarr_network::RadarrEvent, NetworkTrait}, + network::{NetworkTrait, radarr_network::RadarrEvent}, }; use super::RadarrCommand; From f0e5ecd5def4d129cbf101419426a6524f6b0b53 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 13:16:16 -0700 Subject: [PATCH 19/28] ci: Migrated to using Just instead of using Makefiles and included a helix config --- .helix/config.toml | 5 +++ Makefile | 47 --------------------------- justfile | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 47 deletions(-) create mode 100644 .helix/config.toml delete mode 100644 Makefile create mode 100644 justfile diff --git a/.helix/config.toml b/.helix/config.toml new file mode 100644 index 0000000..68c2069 --- /dev/null +++ b/.helix/config.toml @@ -0,0 +1,5 @@ +[keys.normal.backspace] +b = ":sh zellij run -x '4%%' --width '92%%' -f -n Build -- just build" +r = ":sh zellij run -x '3%%' -y '8%%' --width '95%%' --height '90%%' -fc -n 'Run' -- just run" +t = ":sh zellij run -x '4%%' --width '92%%' -f -n Tests -- just test" +l = ":sh zellij run -x '4%%' --width '92%%' -f -n Lint -- just lint" diff --git a/Makefile b/Makefile deleted file mode 100644 index 31fce58..0000000 --- a/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -#!make -VERSION := latest -IMG_NAME := darkalex17/managarr -IMAGE := ${IMG_NAME}:${VERSION} - -default: run - -.PHONY: test test-cov build run lint lint-fix fmt analyze sonar release delete-tag - -test: - @cargo test --all - -## Run all tests with coverage - `cargo install cargo-tarpaulin` -test-cov: - @cargo tarpaulin - -build: test - @cargo build --release - -docker: - @DOCKER_BUILDKIT=1 docker build --rm -t ${IMAGE} . - -run: - @CARGO_INCREMENTAL=1 cargo fmt && make lint && cargo run - -lint: - @find . | grep '\.\/src\/.*\.rs$$' | xargs touch && CARGO_INCREMENTAL=0 cargo clippy --all-targets --workspace - -lint-fix: - @cargo fix - -fmt: - @cargo fmt - -minimal-versions: - @cargo +nightly update -Zdirect-minimal-versions - -## Analyze for unsafe usage - `cargo install cargo-geiger` -analyze: - @cargo geiger - -release: - @git tag -a ${V} -m "Release ${V}" && git push origin ${V} - -delete-tag: - @git tag -d ${V} && git push --delete origin ${V} - diff --git a/justfile b/justfile new file mode 100644 index 0000000..b56d3e8 --- /dev/null +++ b/justfile @@ -0,0 +1,81 @@ +VERSION := "latest" +IMG_NAME := "darkalex17/managarr" +IMAGE := "{{IMG_NAME}}:{{VERSION}}" + + +# List all recipes +default: + @just --list + +# Format all files +[group: 'style'] +fmt: + @cargo fmt --all + +alias clippy := lint +# Run Clippy to inspect all files +[group: 'style'] +lint: + @cargo clippy --all + +alias clippy-fix := lint-fix +# Automatically fix clippy issues where possible +[group: 'style'] +lint-fix: + @cargo fix + +# Analyze the project for unsafe usage +[group: 'style'] +analyze: + #!/usr/bin/env bash + @cargo geiger -h > /dev/null 2>&1 | cargo install cargo-geiger + @cargo geiger + +# Run all tests +[group: 'test'] +test: + @cargo test --all + +# Run all tests with coverage +[group:'test'] +test-cov: + #!/usr/bin/env bash + @cargo tarpaulin -h > /dev/null 2>&1 || cargo install cargo-tarpaulin + @cargo tarpaulin + +# Run all doc tests +[group: 'test'] +doctest: + @cargo test --all --doc + +# Run all proptests +[group: 'test'] +proptest: + @cargo test proptest + +# Run all snapshot tests +[group: 'test'] +snapshot-tests: + @cargo test snapshot + +# Review snapshot test changes +[group: 'test'] +snapshot-review: + #!/usr/bin/env bash + @cargo insta -h > /dev/null 2>&1 || cargo install cargo-insta + @cargo insta review + +# Build and run the binary for the current system +run: + @cargo run + +# Build the project for the current system architecture +[group: 'build'] +[arg('build_type', pattern="debug|release")] +build build_type='debug': + @cargo build {{ if build_type == "release" { "--release" } else { "" } }} + +# Build the docker image +[group: 'build'] +build-docker: + @DOCKER_BUILDKIT=1 docker build --rm -t {{IMAGE}} From 92be9c50bfc576ae2090dff0831a1ad8067c7cd9 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 13:18:54 -0700 Subject: [PATCH 20/28] docs: Updated contributing docs to mention how to use Just --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 729d9b5..b10dbe0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,8 @@ cz commit 1. Clone this repo 2. Run `cargo test` to set up hooks 3. Make changes -4. Run the application using `make run` or `cargo run` +4. Run the application using `just run` or `just run` + - Install `just` (`cargo install just`) if you haven't already to use the [justfile](./justfile) in this project. 5. Commit changes. This will trigger pre-commit hooks that will run format, test and lint. If there are errors or warnings from Clippy, please fix them. 6. Push your code to a new branch named after the feature/bug/etc. you're adding. This will trigger pre-push hooks that will run lint and test. 7. Create a PR From 8ef291efd8ab6db9801b421c145f47662dfce3ed Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 13:22:00 -0700 Subject: [PATCH 21/28] ci: Fixed some typos in the justfile --- justfile | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/justfile b/justfile index b56d3e8..8394fed 100644 --- a/justfile +++ b/justfile @@ -26,10 +26,10 @@ lint-fix: # Analyze the project for unsafe usage [group: 'style'] -analyze: +@analyze: #!/usr/bin/env bash - @cargo geiger -h > /dev/null 2>&1 | cargo install cargo-geiger - @cargo geiger + cargo geiger -h > /dev/null 2>&1 | cargo install cargo-geiger + cargo geiger # Run all tests [group: 'test'] @@ -38,10 +38,10 @@ test: # Run all tests with coverage [group:'test'] -test-cov: +@test-cov: #!/usr/bin/env bash - @cargo tarpaulin -h > /dev/null 2>&1 || cargo install cargo-tarpaulin - @cargo tarpaulin + cargo tarpaulin -h > /dev/null 2>&1 || cargo install cargo-tarpaulin + cargo tarpaulin # Run all doc tests [group: 'test'] @@ -60,10 +60,10 @@ snapshot-tests: # Review snapshot test changes [group: 'test'] -snapshot-review: +@snapshot-review: #!/usr/bin/env bash - @cargo insta -h > /dev/null 2>&1 || cargo install cargo-insta - @cargo insta review + cargo insta -h > /dev/null 2>&1 || cargo install cargo-insta + cargo insta review # Build and run the binary for the current system run: From 317daddb8e787f515cd4ae4300422baf934ee47b Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 20:15:52 -0700 Subject: [PATCH 22/28] fix: Fixed a bug where the edit collection popup would not display when opening it from collection details --- src/ui/radarr_ui/collections/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/radarr_ui/collections/mod.rs b/src/ui/radarr_ui/collections/mod.rs index e70d7b1..db16492 100644 --- a/src/ui/radarr_ui/collections/mod.rs +++ b/src/ui/radarr_ui/collections/mod.rs @@ -38,8 +38,8 @@ impl DrawUi for CollectionsUi { draw_collections(f, app, area); match route { - _ if CollectionDetailsUi::accepts(route) => CollectionDetailsUi::draw(f, app, area), _ if EditCollectionUi::accepts(route) => EditCollectionUi::draw(f, app, area), + _ if CollectionDetailsUi::accepts(route) => CollectionDetailsUi::draw(f, app, area), Route::Radarr(ActiveRadarrBlock::UpdateAllCollectionsPrompt, _) => { let confirmation_prompt = ConfirmationPrompt::new() .title("Update All Collections") @@ -98,7 +98,7 @@ pub(super) fn draw_collections(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) Cell::from(search_on_add), Cell::from(monitored), ]) - .primary() + .primary() }; let collections_table = ManagarrTable::new(content, collection_row_mapping) .loading( @@ -137,7 +137,7 @@ pub(super) fn draw_collections(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) ActiveRadarrBlock::SearchCollection, ActiveRadarrBlock::FilterCollections, ] - .contains(&active_radarr_block) + .contains(&active_radarr_block) { collections_table.show_cursor(f, area); } From 7084ca1be2c14e850e68707d253890adb9b8a37d Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 20:16:10 -0700 Subject: [PATCH 23/28] ci: Added more aliases and commands to the Justfile for snapshot tests --- justfile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/justfile b/justfile index 8394fed..c64cf55 100644 --- a/justfile +++ b/justfile @@ -53,11 +53,13 @@ doctest: proptest: @cargo test proptest +alias test-snapshots := snapshot-tests # Run all snapshot tests [group: 'test'] snapshot-tests: @cargo test snapshot +alias review := snapshot-review # Review snapshot test changes [group: 'test'] @snapshot-review: @@ -65,6 +67,14 @@ snapshot-tests: cargo insta -h > /dev/null 2>&1 || cargo install cargo-insta cargo insta review +alias clean-orphaned-snapshots := snapshot-delete-unreferenced +# Delete any unreferenced snapshots +[group: 'test'] +@snapshot-delete-unreferenced: + #!/usr/bin/env bash + cargo insta -h > /dev/null 2>&1 || cargo install cargo-insta + cargo insta test --unreferenced=delete + # Build and run the binary for the current system run: @cargo run From 316ed643159592fe29d2f12a1906e5a0bb7af651 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 20:17:09 -0700 Subject: [PATCH 24/28] test: Created snapshot tests for all Radarr UI modules --- src/app/mod.rs | 195 +++++++++++++++++- src/handlers/mod.rs | 2 +- src/models/servarr_data/radarr/radarr_data.rs | 3 + .../radarr_collections_network_tests.rs | 12 +- .../library/radarr_library_network_tests.rs | 4 +- src/network/radarr_network/mod.rs | 4 +- .../radarr_network_test_utils.rs | 159 +++++++++++++- src/network/radarr_network/system/mod.rs | 6 +- .../system/radarr_system_network_tests.rs | 31 +-- src/ui/mod.rs | 2 + .../radarr_ui/blocklist/blocklist_ui_tests.rs | 84 ++++---- ...klist_ui_renders_with_blocklist_items.snap | 8 - ...sts__tests__snapshot_tests__Blocklist.snap | 7 + ...t_tests__BlocklistClearAllItemsPrompt.snap | 34 +++ ...__snapshot_tests__BlocklistSortPrompt.snap | 42 ++++ ...shot_tests__DeleteBlocklistItemPrompt.snap | 38 ++++ ...ist_ui_renders_blocklist_tab_loading.snap} | 6 +- ...blocklist_ui_renders_empty_blocklist.snap} | 2 +- .../collections/collection_details_ui.rs | 4 +- .../collection_details_ui_tests.rs | 59 +++--- .../collections/collections_ui_tests.rs | 106 ++++++++-- .../collections/edit_collection_ui_tests.rs | 61 +++--- ...details_ui_renders_collection_details.snap | 30 --- ...ts__snapshot_tests__CollectionDetails.snap | 48 +++++ ...ts__snapshot_tests__ViewMovieOverview.snap | 48 +++++ ...s_ui_renders_collection_details_empty.snap | 48 +++++ ...s__tests__snapshot_tests__Collections.snap | 7 + ...snapshot_tests__CollectionsSortPrompt.snap | 42 ++++ ...ectionConfirmPrompt_CollectionDetails.snap | 48 +++++ ...ditCollectionPrompt_CollectionDetails.snap | 48 +++++ ...RootFolderPathInput_CollectionDetails.snap | 48 +++++ ...MinimumAvailability_CollectionDetails.snap | 48 +++++ ...electQualityProfile_CollectionDetails.snap | 48 +++++ ...tionToggleMonitored_CollectionDetails.snap | 48 +++++ ...onToggleSearchOnAdd_CollectionDetails.snap | 48 +++++ ...ts__snapshot_tests__FilterCollections.snap | 28 +++ ...napshot_tests__FilterCollectionsError.snap | 31 +++ ...sts__snapshot_tests__SearchCollection.snap | 28 +++ ...snapshot_tests__SearchCollectionError.snap | 31 +++ ...hot_tests__UpdateAllCollectionsPrompt.snap | 38 ++++ ...darr_ui_renders_collections_tab_empty.snap | 5 + ...ui_renders_collections_tab_loading-2.snap} | 6 +- ...ui_renders_collections_tab_loading-3.snap} | 6 +- ...rr_ui_renders_collections_tab_loading.snap | 8 + ...tion_ui_renders_edit_collection_modal.snap | 28 --- ...onDetails_EditCollectionConfirmPrompt.snap | 44 ++++ ...ollectionDetails_EditCollectionPrompt.snap | 44 ++++ ...ils_EditCollectionRootFolderPathInput.snap | 44 ++++ ...itCollectionSelectMinimumAvailability.snap | 44 ++++ ...ls_EditCollectionSelectQualityProfile.snap | 44 ++++ ...Details_EditCollectionToggleMonitored.snap | 44 ++++ ...tails_EditCollectionToggleSearchOnAdd.snap | 44 ++++ ...llections_EditCollectionConfirmPrompt.snap | 44 ++++ ...sts__Collections_EditCollectionPrompt.snap | 44 ++++ ...ons_EditCollectionRootFolderPathInput.snap | 44 ++++ ...itCollectionSelectMinimumAvailability.snap | 44 ++++ ...ns_EditCollectionSelectQualityProfile.snap | 44 ++++ ...ections_EditCollectionToggleMonitored.snap | 44 ++++ ...tions_EditCollectionToggleSearchOnAdd.snap | 44 ++++ .../radarr_ui/downloads/downloads_ui_tests.rs | 91 ++++---- ...__downloads_ui_renders_with_downloads.snap | 8 - ..._snapshot_tests__DeleteDownloadPrompt.snap | 38 ++++ ...sts__tests__snapshot_tests__Downloads.snap | 7 + ...snapshot_tests__UpdateDownloadsPrompt.snap | 38 ++++ ...adarr_ui_renders_downloads_tab_empty.snap} | 2 +- ...arr_ui_renders_downloads_tab_loading.snap} | 6 +- .../indexers/edit_indexer_ui_tests.rs | 76 ++++--- .../indexers/indexer_settings_ui_tests.rs | 29 +-- .../radarr_ui/indexers/indexers_ui_tests.rs | 147 ++++++++----- ...indexer_ui_renders_edit_indexer_modal.snap | 27 --- ...ui_renders_edit_indexer_modal_torrent.snap | 42 ++++ ..._ui_renders_edit_indexer_modal_usenet.snap | 42 ++++ ..._settings_ui_renders_indexer_settings.snap | 27 --- ..._settings_ui_renders_indexer_settings.snap | 42 ++++ ...ts__indexers_ui_renders_with_indexers.snap | 8 - ...xers_ui_renders_delete_indexer_prompt.snap | 38 ++++ ...sts__indexers_ui_renders_indexers_tab.snap | 7 + ..._renders_indexers_tab_empty_indexers.snap} | 2 +- ...xers_ui_renders_indexers_tab_loading.snap} | 6 +- ...ndexers_ui_renders_test_indexer_error.snap | 35 ++++ ...exers_ui_renders_test_indexer_loading.snap | 35 ++++ ...exers_ui_renders_test_indexer_success.snap | 35 ++++ ...all_indexers_ui_renders_loading_state.snap | 70 ++++--- .../indexers/test_all_indexers_ui_tests.rs | 4 +- src/ui/radarr_ui/library/add_movie_ui.rs | 4 +- .../radarr_ui/library/add_movie_ui_tests.rs | 80 ++++--- .../library/delete_movie_ui_tests.rs | 37 ++-- .../radarr_ui/library/edit_movie_ui_tests.rs | 60 +++--- src/ui/radarr_ui/library/library_ui_tests.rs | 97 ++++++++- src/ui/radarr_ui/library/movie_details_ui.rs | 4 +- .../library/movie_details_ui_tests.rs | 162 ++++++--------- ...s__add_movie_ui_renders_loading_state.snap | 29 --- ...ts__add_movie_ui_renders_search_input.snap | 29 --- ...pshot_tests__AddMovieAlreadyInLibrary.snap | 47 +++++ ...hot_tests__AddMovieEmptySearchResults.snap | 47 +++++ ...tests__snapshot_tests__AddMoviePrompt.snap | 47 +++++ ...sts__AddMoviePrompt_CollectionDetails.snap | 48 +++++ ...__snapshot_tests__AddMovieSearchInput.snap | 47 +++++ ...snapshot_tests__AddMovieSearchResults.snap | 47 +++++ ...ts__AddMovieSelectMinimumAvailability.snap | 47 +++++ ...MinimumAvailability_CollectionDetails.snap | 48 +++++ ...snapshot_tests__AddMovieSelectMonitor.snap | 47 +++++ ...dMovieSelectMonitor_CollectionDetails.snap | 48 +++++ ...t_tests__AddMovieSelectQualityProfile.snap | 47 +++++ ...electQualityProfile_CollectionDetails.snap | 48 +++++ ...pshot_tests__AddMovieSelectRootFolder.snap | 47 +++++ ...vieSelectRootFolder_CollectionDetails.snap | 48 +++++ ...ts__snapshot_tests__AddMovieTagsInput.snap | 47 +++++ ...__AddMovieTagsInput_CollectionDetails.snap | 48 +++++ ...d_movie_ui_renders_loading_for_search.snap | 47 +++++ ..._movie_ui_renders_delete_movie_prompt.snap | 24 --- ..._movie_ui_renders_delete_movie_prompt.snap | 38 ++++ ...dit_movie_ui_renders_edit_movie_modal.snap | 28 --- ...ests__snapshot_tests__EditMoviePrompt.snap | 44 ++++ ..._snapshot_tests__EditMoviePrompt_Cast.snap | 48 +++++ ..._snapshot_tests__EditMoviePrompt_Crew.snap | 48 +++++ ...pshot_tests__EditMoviePrompt_FileInfo.snap | 48 +++++ ...t_tests__EditMoviePrompt_ManualSearch.snap | 48 +++++ ...t_tests__EditMoviePrompt_MovieDetails.snap | 48 +++++ ...t_tests__EditMoviePrompt_MovieHistory.snap | 48 +++++ ...pshot_tests__AddMovieAlreadyInLibrary.snap | 47 +++++ ...hot_tests__AddMovieEmptySearchResults.snap | 47 +++++ ...tests__snapshot_tests__AddMoviePrompt.snap | 47 +++++ ...__snapshot_tests__AddMovieSearchInput.snap | 47 +++++ ...snapshot_tests__AddMovieSearchResults.snap | 47 +++++ ...ts__AddMovieSelectMinimumAvailability.snap | 47 +++++ ...snapshot_tests__AddMovieSelectMonitor.snap | 47 +++++ ...t_tests__AddMovieSelectQualityProfile.snap | 47 +++++ ...pshot_tests__AddMovieSelectRootFolder.snap | 47 +++++ ...ts__snapshot_tests__AddMovieTagsInput.snap | 47 +++++ ...__tests__snapshot_tests__FilterMovies.snap | 28 +++ ...ts__snapshot_tests__FilterMoviesError.snap | 31 +++ ..._tests__tests__snapshot_tests__Movies.snap | 7 + ...sts__snapshot_tests__MoviesSortPrompt.snap | 42 ++++ ...s__tests__snapshot_tests__SearchMovie.snap | 28 +++ ...sts__snapshot_tests__SearchMovieError.snap | 31 +++ ...snapshot_tests__UpdateAllMoviesPrompt.snap | 38 ++++ ...dit_movie_ui_renders_edit_movie_modal.snap | 44 ++++ ...y_ui_renders_library_tab_empty_movies.snap | 5 + ...ibrary_ui_renders_library_tab_loading.snap | 8 + ...ovie_details_ui_renders_loading_state.snap | 30 --- ..._details_ui_renders_manual_search_tab.snap | 30 --- ..._details_ui_renders_movie_details_tab.snap | 30 --- ..._details_ui_renders_movie_history_tab.snap | 30 --- ...hot_tests__movie_details_loading_Cast.snap | 48 +++++ ...hot_tests__movie_details_loading_Crew.snap | 48 +++++ ...tests__movie_details_loading_FileInfo.snap | 48 +++++ ...s__movie_details_loading_ManualSearch.snap | 48 +++++ ...s__movie_details_loading_MovieDetails.snap | 48 +++++ ...s__movie_details_loading_MovieHistory.snap | 48 +++++ ...shot_tests__movie_details_render_Cast.snap | 48 +++++ ...r_Cast_AutomaticallySearchMoviePrompt.snap | 48 +++++ ...tails_render_Cast_UpdateAndScanPrompt.snap | 48 +++++ ...shot_tests__movie_details_render_Crew.snap | 48 +++++ ...r_Crew_AutomaticallySearchMoviePrompt.snap | 48 +++++ ...tails_render_Crew_UpdateAndScanPrompt.snap | 48 +++++ ..._tests__movie_details_render_FileInfo.snap | 48 +++++ ...leInfo_AutomaticallySearchMoviePrompt.snap | 48 +++++ ...s_render_FileInfo_UpdateAndScanPrompt.snap | 48 +++++ ...ts__movie_details_render_ManualSearch.snap | 48 +++++ ...ails_render_ManualSearchConfirmPrompt.snap | 48 +++++ ...details_render_ManualSearchSortPrompt.snap | 48 +++++ ...Search_AutomaticallySearchMoviePrompt.snap | 48 +++++ ...nder_ManualSearch_UpdateAndScanPrompt.snap | 48 +++++ ...ts__movie_details_render_MovieDetails.snap | 48 +++++ ...etails_AutomaticallySearchMoviePrompt.snap | 48 +++++ ...nder_MovieDetails_UpdateAndScanPrompt.snap | 48 +++++ ...ts__movie_details_render_MovieHistory.snap | 48 +++++ ...istory_AutomaticallySearchMoviePrompt.snap | 48 +++++ ...nder_MovieHistory_UpdateAndScanPrompt.snap | 48 +++++ src/ui/radarr_ui/mod.rs | 13 +- src/ui/radarr_ui/radarr_ui_tests.rs | 83 ++------ .../root_folders/root_folders_ui_tests.rs | 114 +++++----- ...ot_folders_ui_renders_add_root_folder.snap | 20 -- ...__snapshot_tests__AddRootFolderPrompt.snap | 31 +++ ...napshot_tests__DeleteRootFolderPrompt.snap | 38 ++++ ...__tests__snapshot_tests__RootFolders.snap} | 7 +- ...olders_ui_renders_empty_root_folders.snap} | 2 +- ...sts__root_folders_ui_renders_loading.snap} | 6 +- ...sts__tests__snapshot_tests__Blocklist.snap | 54 +++++ ...s__tests__snapshot_tests__Collections.snap | 54 +++++ ...sts__tests__snapshot_tests__Downloads.snap | 54 +++++ ...ests__tests__snapshot_tests__Indexers.snap | 54 +++++ ..._tests__tests__snapshot_tests__Movies.snap | 54 +++++ ...s__tests__snapshot_tests__RootFolders.snap | 54 +++++ ..._tests__tests__snapshot_tests__System.snap | 54 +++++ ...ests__radarr_ui_renders_downloads_tab.snap | 34 --- ...radarr_ui_renders_downloads_tab_empty.snap | 34 --- ..._tests__radarr_ui_renders_library_tab.snap | 34 --- src/ui/radarr_ui/system/mod.rs | 5 +- ...ts__tests__snapshot_tests__SystemLogs.snap | 48 +++++ ...s__snapshot_tests__SystemQueuedEvents.snap | 44 ++++ ...t_tests__SystemTaskStartConfirmPrompt.snap | 48 +++++ ...s__tests__snapshot_tests__SystemTasks.snap | 48 +++++ ..._tests__snapshot_tests__SystemUpdates.snap | 48 +++++ ...ystem_details_ui_renders_logs_loading.snap | 48 +++++ ...ails_ui_renders_queued_events_loading.snap | 44 ++++ ...stem_details_ui_renders_tasks_loading.snap | 48 +++++ ...stem_details_ui_renders_loading_tasks.snap | 30 --- ...tests__system_details_ui_renders_logs.snap | 30 --- ...t_tests__radarr_ui_renders_system_tab.snap | 54 +++++ ...s__radarr_ui_renders_system_tab_empty.snap | 54 +++++ ..._radarr_ui_renders_system_tab_loading.snap | 54 +++++ ...s_system_tab_loading_events_and_tasks.snap | 54 +++++ ...rr_ui_renders_system_tab_loading_logs.snap | 54 +++++ ...ests__system_ui_renders_loading_state.snap | 34 --- ..._tests__system_ui_renders_system_menu.snap | 34 --- .../system/system_details_ui_tests.rs | 85 +++++--- src/ui/radarr_ui/system/system_ui_tests.rs | 88 ++++++-- ..._tests__radarr_ui_renders_library_tab.snap | 54 +++++ ...rr_ui_renders_library_tab_error_popup.snap | 54 +++++ ...arr_ui_renders_library_tab_with_error.snap | 54 +++++ .../sonarr_ui/blocklist/blocklist_ui_tests.rs | 8 +- ..._blocklist_ui_renders_empty_blocklist.snap | 2 +- ...s__blocklist_ui_renders_loading_state.snap | 6 +- ...klist_ui_renders_with_blocklist_items.snap | 8 +- .../sonarr_ui/downloads/downloads_ui_tests.rs | 8 +- ..._downloads_ui_renders_empty_downloads.snap | 2 +- ...s__downloads_ui_renders_loading_state.snap | 6 +- ...__downloads_ui_renders_with_downloads.snap | 8 +- src/ui/sonarr_ui/history/history_ui_tests.rs | 8 +- ...sts__history_ui_renders_empty_history.snap | 2 +- ...sts__history_ui_renders_loading_state.snap | 6 +- ...history_ui_renders_with_history_items.snap | 8 +- .../indexers/edit_indexer_ui_tests.rs | 4 +- .../indexers/indexer_settings_ui_tests.rs | 4 +- .../sonarr_ui/indexers/indexers_ui_tests.rs | 8 +- ...indexer_ui_renders_edit_indexer_modal.snap | 61 +++--- ..._settings_ui_renders_indexer_settings.snap | 58 ++++-- ...s__indexers_ui_renders_empty_indexers.snap | 2 +- ...ts__indexers_ui_renders_loading_state.snap | 6 +- ...ts__indexers_ui_renders_with_indexers.snap | 8 +- ...all_indexers_ui_renders_loading_state.snap | 70 ++++--- .../indexers/test_all_indexers_ui_tests.rs | 4 +- .../sonarr_ui/library/add_series_ui_tests.rs | 6 +- .../library/delete_series_ui_tests.rs | 4 +- .../sonarr_ui/library/edit_series_ui_tests.rs | 4 +- .../library/episode_details_ui_tests.rs | 10 +- src/ui/sonarr_ui/library/library_ui_tests.rs | 79 ++++++- .../library/season_details_ui_tests.rs | 10 +- .../library/series_details_ui_tests.rs | 4 +- ...__add_series_ui_renders_loading_state.snap | 68 +++--- ...s__add_series_ui_renders_search_input.snap | 68 +++--- ...eries_ui_renders_delete_series_toggle.snap | 54 +++-- ...t_series_ui_renders_edit_series_modal.snap | 70 ++++--- ...etails_ui_renders_episode_details_tab.snap | 70 ++++--- ...etails_ui_renders_episode_history_tab.snap | 70 ++++--- ..._details_ui_renders_manual_search_tab.snap | 70 ++++--- ...ests__library_ui_renders_empty_series.snap | 2 +- ...sts__library_ui_renders_loading_state.snap | 6 +- ...y_ui_renders_update_all_series_prompt.snap | 38 ++++ ...tests__library_ui_renders_with_series.snap | 8 + ..._details_ui_renders_manual_search_tab.snap | 73 ++++--- ...details_ui_renders_season_history_tab.snap | 73 ++++--- ...ies_details_ui_renders_series_details.snap | 77 ++++--- .../root_folders/root_folders_ui_tests.rs | 10 +- ...ot_folders_ui_renders_add_root_folder.snap | 43 ++-- ...folders_ui_renders_empty_root_folders.snap | 2 +- ...root_folders_ui_renders_loading_state.snap | 6 +- ..._folders_ui_renders_with_root_folders.snap | 8 +- ...ests__sonarr_ui_renders_downloads_tab.snap | 80 ++++--- ..._tests__sonarr_ui_renders_history_tab.snap | 80 ++++--- ..._tests__sonarr_ui_renders_library_tab.snap | 80 ++++--- src/ui/sonarr_ui/sonarr_ui_tests.rs | 8 +- ...stem_details_ui_renders_loading_tasks.snap | 70 ++++--- ...tests__system_details_ui_renders_logs.snap | 70 ++++--- ...ests__system_details_ui_renders_tasks.snap | 70 ++++--- ...ests__system_ui_renders_loading_state.snap | 80 ++++--- ..._tests__system_ui_renders_system_menu.snap | 80 ++++--- .../system/system_details_ui_tests.rs | 37 +++- src/ui/sonarr_ui/system/system_ui_tests.rs | 6 +- src/ui/ui_test_utils.rs | 62 ++++-- src/ui/ui_tests.rs | 85 ++++++++ 273 files changed, 8859 insertions(+), 2031 deletions(-) delete mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__Blocklist.snap create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistClearAllItemsPrompt.snap create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistSortPrompt.snap create mode 100644 src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__DeleteBlocklistItemPrompt.snap rename src/ui/radarr_ui/blocklist/snapshots/{managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap => managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_blocklist_tab_loading.snap} (58%) rename src/ui/radarr_ui/blocklist/snapshots/{managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap => managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap} (69%) delete mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__ViewMovieOverview.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__collection_details_ui_renders_collection_details_empty.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_empty.snap rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap} (59%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap} (59%) create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap delete mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionConfirmPrompt.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionPrompt.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionRootFolderPathInput.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectMinimumAvailability.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectQualityProfile.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleMonitored.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleSearchOnAdd.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionConfirmPrompt.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionPrompt.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionRootFolderPathInput.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectMinimumAvailability.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectQualityProfile.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleMonitored.snap create mode 100644 src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleSearchOnAdd.snap delete mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap create mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__DeleteDownloadPrompt.snap create mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__Downloads.snap create mode 100644 src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__UpdateDownloadsPrompt.snap rename src/ui/radarr_ui/downloads/snapshots/{managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap => managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap} (69%) rename src/ui/radarr_ui/downloads/snapshots/{managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap => managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_loading.snap} (58%) delete mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_torrent.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_usenet.snap delete mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap delete mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_delete_indexer_prompt.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab.snap rename src/ui/radarr_ui/indexers/snapshots/{managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap => managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_empty_indexers.snap} (69%) rename src/ui/radarr_ui/indexers/snapshots/{managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap => managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_loading.snap} (58%) create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_error.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_loading.snap create mode 100644 src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_success.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput_CollectionDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__add_movie_ui_renders_loading_for_search.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__snapshot_tests__delete_movie_ui_renders_delete_movie_prompt.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Cast.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Crew.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_FileInfo.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_ManualSearch.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieHistory.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__edit_movie_ui_renders_edit_movie_modal.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_empty_movies.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_loading.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap delete mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Cast.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Crew.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_FileInfo.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_ManualSearch.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieHistory.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_AutomaticallySearchMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_UpdateAndScanPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_AutomaticallySearchMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_UpdateAndScanPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_AutomaticallySearchMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_UpdateAndScanPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchConfirmPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchSortPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_AutomaticallySearchMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_UpdateAndScanPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_AutomaticallySearchMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_UpdateAndScanPrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_AutomaticallySearchMoviePrompt.snap create mode 100644 src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_UpdateAndScanPrompt.snap delete mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap create mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap create mode 100644 src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap rename src/ui/radarr_ui/root_folders/snapshots/{managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap => managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap} (53%) rename src/ui/radarr_ui/root_folders/snapshots/{managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap => managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap} (69%) rename src/ui/radarr_ui/root_folders/snapshots/{managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap => managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap} (59%) create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Blocklist.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Collections.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Downloads.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Indexers.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Movies.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__RootFolders.snap create mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__System.snap delete mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap delete mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap delete mode 100644 src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemLogs.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemQueuedEvents.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTaskStartConfirmPrompt.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTasks.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemUpdates.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs_loading.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_queued_events_loading.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks_loading.snap delete mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap delete mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_empty.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_events_and_tasks.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_logs.snap delete mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap delete mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap create mode 100644 src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab.snap create mode 100644 src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_error_popup.snap create mode 100644 src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_with_error.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap create mode 100644 src/ui/ui_tests.rs diff --git a/src/app/mod.rs b/src/app/mod.rs index 83e9aa3..04295ce 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -19,9 +19,25 @@ use crate::models::servarr_models::KeybindingItem; use crate::models::stateful_table::StatefulTable; use crate::models::{HorizontallyScrollableText, Route, TabRoute, TabState}; use crate::network::NetworkEvent; +#[cfg(test)] +use { + crate::models::ScrollableText, + crate::models::radarr_models, + crate::models::radarr_models::MinimumAvailability, + crate::models::radarr_models::MovieMonitor, + crate::models::servarr_data::modals::EditIndexerModal, + crate::models::servarr_data::radarr::modals::AddMovieModal, + crate::models::servarr_data::radarr::modals::{ + EditCollectionModal, EditMovieModal, MovieDetailsModal, + }, + crate::network::radarr_network::radarr_network_test_utils::test_utils::*, + chrono::DateTime, + strum::IntoEnumIterator, + std::fmt::Debug, + crate::models::stateful_table::SortOption +}; #[cfg(test)] -#[path = "app_tests.rs"] mod app_tests; pub mod context_clues; pub mod key_binding; @@ -29,6 +45,16 @@ mod key_binding_tests; pub mod radarr; pub mod sonarr; +#[cfg(test)] +macro_rules! sort_option { + ($field:ident) => { + SortOption { + name: "Something", + cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)) + } + } +} + pub struct App<'a> { navigation_stack: Vec, network_tx: Option>, @@ -259,6 +285,173 @@ impl App<'_> { ..App::default() } } + + pub fn test_default_fully_populated() -> Self { + let quality_profile_name = "HD - 1080p".to_owned(); + let mut add_movie_modal = AddMovieModal { + tags: "alex".into(), + ..AddMovieModal::default() + }; + add_movie_modal + .root_folder_list + .set_items(vec![root_folder()]); + add_movie_modal + .monitor_list + .set_items(MovieMonitor::iter().collect()); + add_movie_modal + .minimum_availability_list + .set_items(MinimumAvailability::iter().collect()); + add_movie_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + + let mut add_movie_search_result_table = StatefulTable::default(); + add_movie_search_result_table.set_items(vec![add_movie_search_result()]); + add_movie_search_result_table.sorting(vec![sort_option!(tmdb_id)]); + add_movie_search_result_table.search = Some("something".into()); + add_movie_search_result_table.filter = Some("something".into()); + + let mut edit_movie_modal = EditMovieModal { + monitored: Some(true), + path: "/nfs/movies".into(), + tags: "alex".into(), + ..EditMovieModal::default() + }; + edit_movie_modal + .minimum_availability_list + .set_items(MinimumAvailability::iter().collect()); + edit_movie_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + + let mut edit_collection_modal = EditCollectionModal { + monitored: Some(true), + path: "/nfs/movies".into(), + search_on_add: Some(true), + ..EditCollectionModal::default() + }; + edit_collection_modal + .minimum_availability_list + .set_items(MinimumAvailability::iter().collect()); + edit_collection_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + + let edit_indexer_modal = EditIndexerModal { + name: "DrunkenSlug".into(), + enable_rss: Some(true), + enable_automatic_search: Some(true), + enable_interactive_search: Some(true), + url: "http://127.0.0.1:9696/1/".into(), + api_key: "someApiKey".into(), + seed_ratio: "ratio".into(), + tags: "25".into(), + priority: 1, + }; + + let indexer_settings = radarr_models::IndexerSettings { + allow_hardcoded_subs: true, + availability_delay: 0, + id: 1, + maximum_size: 1234, + minimum_age: 12, + prefer_indexer_flags: true, + retention: 30, + rss_sync_interval: 60, + whitelisted_hardcoded_subs: "eng".into(), + }; + + let mut indexer_test_results = StatefulTable::default(); + indexer_test_results.set_items(vec![indexer_test_result()]); + indexer_test_results.sorting(vec![sort_option!(name)]); + indexer_test_results.search = Some("something".into()); + indexer_test_results.filter = Some("something".into()); + + let mut movie_details_modal = MovieDetailsModal { + movie_details: ScrollableText::with_string("Some information".to_owned()), + file_details: "Some file info".to_owned(), + audio_details: "Some audio info".to_owned(), + video_details: "Some video info".to_owned(), + ..MovieDetailsModal::default() + }; + movie_details_modal + .movie_history + .set_items(vec![movie_history_item()]); + movie_details_modal + .movie_cast + .set_items(vec![cast_credit()]); + movie_details_modal + .movie_crew + .set_items(vec![crew_credit()]); + movie_details_modal + .movie_releases + .set_items(vec![torrent_release(), usenet_release()]); + movie_details_modal.movie_releases.sorting(vec![sort_option!(indexer_id)]); + + let mut radarr_data = RadarrData { + disk_space_vec: vec![diskspace()], + version: "1.2.3.4".to_owned(), + quality_profile_map: quality_profile_map(), + tags_map: tags_map(), + updates: updates(), + start_time: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), + add_movie_search: Some("test".into()), + add_movie_modal: Some(add_movie_modal), + add_searched_movies: Some(add_movie_search_result_table), + edit_movie_modal: Some(edit_movie_modal), + edit_collection_modal: Some(edit_collection_modal), + edit_indexer_modal: Some(edit_indexer_modal), + edit_root_folder: Some("/nfs/movies".into()), + indexer_settings: Some(indexer_settings), + indexer_test_errors: Some("error".into()), + indexer_test_all_results: Some(indexer_test_results), + movie_details_modal: Some(movie_details_modal), + delete_movie_files: true, + ..RadarrData::default() + }; + radarr_data.root_folders.set_items(vec![root_folder()]); + radarr_data.movies.set_items(vec![movie()]); + radarr_data.movies.sorting(vec![sort_option!(id)]); + radarr_data.movies.search = Some("Something".into()); + radarr_data.movies.filter = Some("Something".into()); + radarr_data.collections.set_items(vec![collection()]); + radarr_data.collections.sorting(vec![sort_option!(id)]); + radarr_data.collections.search = Some("Something".into()); + radarr_data.collections.filter = Some("Something".into()); + radarr_data.collection_movies.set_items(vec![collection_movie()]); + radarr_data.downloads.set_items(vec![download_record()]); + radarr_data.blocklist.set_items(vec![blocklist_item()]); + radarr_data.blocklist.sorting(vec![sort_option!(id)]); + radarr_data.indexers.set_items(vec![indexer()]); + radarr_data.indexers.sorting(vec![sort_option!(id)]); + radarr_data.indexers.search = Some("Something".into()); + radarr_data.indexers.filter = Some("Something".into()); + radarr_data.logs.set_items(vec![log_line().into()]); + radarr_data.log_details.set_items(vec![log_line().into()]); + radarr_data.tasks.set_items(vec![task()]); + radarr_data.queued_events.set_items(vec![queued_event()]); + App { + data: Data { + radarr_data, + sonarr_data: SonarrData::default(), + }, + server_tabs: TabState::new(vec![ + TabRoute { + title: "Radarr".to_owned(), + route: ActiveRadarrBlock::Movies.into(), + contextual_help: None, + config: Some(ServarrConfig::default()), + }, + TabRoute { + title: "Sonarr".to_owned(), + route: ActiveSonarrBlock::Series.into(), + contextual_help: None, + config: Some(ServarrConfig::default()), + }, + ]), + ..App::default() + } + } } #[derive(Default)] diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 7e180c6..c64ef20 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -130,7 +130,7 @@ pub fn handle_events(key: Key, app: &mut App<'_>) { } } -fn populate_keymapping_table(app: &mut App<'_>) { +pub fn populate_keymapping_table(app: &mut App<'_>) { let context_clue_to_keybinding_item = |key: &KeyBinding, desc: &&str| { let (key, alt_key) = if key.alt.is_some() { (key.key.to_string(), key.alt.as_ref().unwrap().to_string()) diff --git a/src/models/servarr_data/radarr/radarr_data.rs b/src/models/servarr_data/radarr/radarr_data.rs index dad6b68..f5d81f7 100644 --- a/src/models/servarr_data/radarr/radarr_data.rs +++ b/src/models/servarr_data/radarr/radarr_data.rs @@ -25,6 +25,8 @@ use bimap::BiMap; use chrono::{DateTime, Utc}; use serde_json::Number; use strum::EnumIter; +#[cfg(test)] +use strum_macros::{Display, EnumString}; #[cfg(test)] #[path = "radarr_data_tests.rs"] @@ -224,6 +226,7 @@ impl<'a> Default for RadarrData<'a> { } #[derive(Clone, Copy, PartialEq, Eq, Debug, Default, EnumIter)] +#[cfg_attr(test, derive(Display, EnumString))] pub enum ActiveRadarrBlock { AddMovieAlreadyInLibrary, AddMovieSearchInput, diff --git a/src/network/radarr_network/collections/radarr_collections_network_tests.rs b/src/network/radarr_network/collections/radarr_collections_network_tests.rs index 6409f80..903cc51 100644 --- a/src/network/radarr_network/collections/radarr_collections_network_tests.rs +++ b/src/network/radarr_network/collections/radarr_collections_network_tests.rs @@ -41,7 +41,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } } @@ -122,7 +122,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } } @@ -202,7 +202,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } }], @@ -231,7 +231,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } }], @@ -319,7 +319,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } }], @@ -348,7 +348,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } }], diff --git a/src/network/radarr_network/library/radarr_library_network_tests.rs b/src/network/radarr_network/library/radarr_library_network_tests.rs index d56806e..24288c2 100644 --- a/src/network/radarr_network/library/radarr_library_network_tests.rs +++ b/src/network/radarr_network/library/radarr_library_network_tests.rs @@ -604,7 +604,7 @@ mod tests { Description: Blah blah blah TMDB: 99% IMDB: 9.9 - Rotten Tomatoes: + Rotten Tomatoes: 99% Quality Profile: HD - 1080p Size: 3.30 GB Path: /nfs/movies @@ -921,7 +921,7 @@ mod tests { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } }]); diff --git a/src/network/radarr_network/mod.rs b/src/network/radarr_network/mod.rs index 892de58..72ff7d9 100644 --- a/src/network/radarr_network/mod.rs +++ b/src/network/radarr_network/mod.rs @@ -22,12 +22,10 @@ mod root_folders; mod system; #[cfg(test)] -#[path = "radarr_network_tests.rs"] mod radarr_network_tests; #[cfg(test)] -#[path = "radarr_network_test_utils.rs"] -mod radarr_network_test_utils; +pub mod radarr_network_test_utils; #[derive(Debug, Eq, PartialEq, Clone)] pub enum RadarrEvent { diff --git a/src/network/radarr_network/radarr_network_test_utils.rs b/src/network/radarr_network/radarr_network_test_utils.rs index 30e66ae..8fd4893 100644 --- a/src/network/radarr_network/radarr_network_test_utils.rs +++ b/src/network/radarr_network/radarr_network_test_utils.rs @@ -1,15 +1,19 @@ #[cfg(test)] -pub(in crate::network::radarr_network) mod test_utils { - use crate::models::HorizontallyScrollableText; +pub mod test_utils { use crate::models::radarr_models::{ AddMovieSearchResult, BlocklistItem, BlocklistItemMovie, Collection, CollectionMovie, Credit, CreditType, DownloadRecord, DownloadsResponse, IndexerSettings, MediaInfo, MinimumAvailability, - Movie, MovieCollection, MovieFile, MovieHistoryItem, RadarrRelease, Rating, RatingsList, + Movie, MovieCollection, MovieFile, MovieHistoryItem, RadarrRelease, RadarrTask, RadarrTaskName, + Rating, RatingsList, }; + use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_models::{ - Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, + DiskSpace, Indexer, IndexerField, Language, Quality, QualityWrapper, QueueEvent, RootFolder, }; + use crate::models::{HorizontallyScrollableText, ScrollableText}; + use bimap::BiMap; use chrono::DateTime; + use indoc::formatdoc; use serde_json::{Number, Value, json}; pub const MOVIE_JSON: &str = r#"{ @@ -42,7 +46,7 @@ pub(in crate::network::radarr_network) mod test_utils { "value": 9.9 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } }, "movieFile": { @@ -86,10 +90,10 @@ pub(in crate::network::radarr_network) mod test_utils { "value": 9.9 }, "tmdb": { - "value": 9.9 + "value": 99 }, "rottenTomatoes": { - "value": 9.9 + "value": 99 } } } @@ -104,6 +108,49 @@ pub(in crate::network::radarr_network) mod test_utils { } } + pub fn diskspace() -> DiskSpace { + DiskSpace { + free_space: 6500, + total_space: 8675309, + } + } + + pub fn log_line() -> &'static str { + "2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases" + } + + pub fn task() -> RadarrTask { + RadarrTask { + name: "Backup".to_string(), + task_name: RadarrTaskName::Backup, + interval: 60, + last_execution: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), + last_duration: "00:00:17".to_string(), + next_execution: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T22:29:16Z").unwrap()), + } + } + + pub fn queued_event() -> QueueEvent { + QueueEvent { + trigger: "manual".to_string(), + name: "Refresh Monitored Downloads".to_string(), + command_name: "Refresh Monitored Downloads".to_string(), + status: "completed".to_string(), + queued: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:25:16Z").unwrap()), + started: Some(DateTime::from( + DateTime::parse_from_rfc3339("2023-05-20T21:25:30Z").unwrap(), + )), + ended: Some(DateTime::from( + DateTime::parse_from_rfc3339("2023-05-20T21:28:33Z").unwrap(), + )), + duration: Some("00:03:03".to_owned()), + } + } + + pub fn tags_map() -> BiMap { + BiMap::from_iter([(1, "alex".to_owned())]) + } + pub fn genres() -> Vec { vec!["cool".to_owned(), "family".to_owned(), "fun".to_owned()] } @@ -114,11 +161,17 @@ pub(in crate::network::radarr_network) mod test_utils { } } + pub fn percentage_rating() -> Rating { + Rating { + value: 99.into(), + } + } + pub fn ratings_list() -> RatingsList { RatingsList { imdb: Some(rating()), tmdb: Some(rating()), - rotten_tomatoes: Some(rating()), + rotten_tomatoes: Some(percentage_rating()), } } @@ -392,4 +445,94 @@ pub(in crate::network::radarr_network) mod test_utils { "name": "HD - 1080p" }) } + + pub fn quality_profile_map() -> BiMap { + let quality_profile = quality_profile(); + let id = quality_profile + .get("id") + .expect("A id must be set on a quality profile") + .as_i64() + .expect("'id' must be a string"); + let name = quality_profile + .get("name") + .expect("A name must be set on a quality profile") + .as_str() + .expect("'name' must be a string") + .to_owned(); + + BiMap::from_iter(vec![(id, name)]) + } + + pub fn updates() -> ScrollableText { + let line_break = "-".repeat(200); + ScrollableText::with_string(formatdoc!( + " + The latest version of Radarr is already installed + + 4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) + {line_break} + New: + * Cool new thing + Fixed: + * Some bugs killed + + + 3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) + {line_break} + New: + * Cool new thing (old) + * Other cool new thing (old) + + + 2.1.0 - 2023-04-15 02:02:53 UTC + {line_break} + Fixed: + * Killed bug 1 + * Fixed bug 2" + )) + } + + pub fn indexer_test_result() -> IndexerTestResultModalItem { + IndexerTestResultModalItem { + name: "DrunkenSlug".to_owned(), + is_valid: false, + validation_failures: "Some failure".into(), + } + } + + pub fn torrent_release() -> RadarrRelease { + RadarrRelease { + guid: "1234".to_string(), + protocol: "torrent".to_string(), + age: 12, + title: "Some movie release".into(), + indexer: "The Pirate Bay".to_string(), + indexer_id: 1, + size: 2468, + rejected: true, + rejections: Some(vec!["something interesting".into()]), + seeders: Some(25.into()), + leechers: Some(3.into()), + languages: Some(vec![language()]), + quality: quality_wrapper(), + } + } + + pub fn usenet_release() -> RadarrRelease { + RadarrRelease { + guid: "1234".to_string(), + protocol: "usenet".to_string(), + age: 22, + title: "Some Other movie release".into(), + indexer: "The Pirate Bay".to_string(), + indexer_id: 2, + size: 1512, + rejected: true, + rejections: Some(vec!["Bad stuff happens in the middle of nowhere".into()]), + seeders: None, + leechers: None, + languages: Some(vec![language()]), + quality: quality_wrapper(), + } + } } diff --git a/src/network/radarr_network/system/mod.rs b/src/network/radarr_network/system/mod.rs index 16383dd..6091a55 100644 --- a/src/network/radarr_network/system/mod.rs +++ b/src/network/radarr_network/system/mod.rs @@ -185,9 +185,9 @@ impl Network<'_, '_> { .map(|update| { let install_status = if update.installed_on.is_some() { if update.installed { - "(Currently Installed)".to_owned() + " (Currently Installed)".to_owned() } else { - "(Previously Installed)".to_owned() + " (Previously Installed)".to_owned() } } else { String::new() @@ -201,7 +201,7 @@ impl Network<'_, '_> { }; let mut update_info = formatdoc!( - "{} - {} {install_status} + "{} - {}{install_status} {}", update.version, update.release_date, diff --git a/src/network/radarr_network/system/radarr_system_network_tests.rs b/src/network/radarr_network/system/radarr_system_network_tests.rs index c6a9cfd..bc07454 100644 --- a/src/network/radarr_network/system/radarr_system_network_tests.rs +++ b/src/network/radarr_network/system/radarr_system_network_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { + use crate::models::HorizontallyScrollableText; use crate::models::radarr_models::{RadarrSerdeable, RadarrTask, RadarrTaskName, SystemStatus}; use crate::models::servarr_models::{ DiskSpace, HostConfig, LogResponse, QueueEvent, SecurityConfig, Update, }; - use crate::models::{HorizontallyScrollableText, ScrollableText}; use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::radarr_network::RadarrEvent; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::updates; use chrono::DateTime; - use indoc::formatdoc; use pretty_assertions::{assert_eq, assert_str_eq}; use serde_json::json; @@ -297,32 +297,7 @@ mod tests { }, }]); let response: Vec = serde_json::from_value(updates_json.clone()).unwrap(); - let line_break = "-".repeat(200); - let expected_text = ScrollableText::with_string(formatdoc!( - " - The latest version of Radarr is already installed - - 4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) - {line_break} - New: - * Cool new thing - Fixed: - * Some bugs killed - - - 3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) - {line_break} - New: - * Cool new thing (old) - * Other cool new thing (old) - - - 2.1.0 - 2023-04-15 02:02:53 UTC - {line_break} - Fixed: - * Killed bug 1 - * Fixed bug 2" - )); + let expected_text = updates(); let (async_server, app, _server) = MockServarrApi::get() .returns(updates_json) .build_for(RadarrEvent::GetUpdates) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 4968452..58f88dc 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -35,6 +35,8 @@ pub mod theme; mod ui_property_tests; #[cfg(test)] pub mod ui_test_utils; +#[cfg(test)] +mod ui_tests; mod utils; mod widgets; diff --git a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs index 42d3bdf..9e36ee9 100644 --- a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs @@ -3,9 +3,7 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::radarr_models::BlocklistItem; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, BLOCKLIST_BLOCKS}; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::blocklist::BlocklistUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -21,54 +19,54 @@ mod tests { }); } - #[test] - fn test_blocklist_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); + mod snapshot_tests { + use rstest::rstest; + use crate::ui::ui_test_utils::test_utils::TerminalSize; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - BlocklistUi::draw(f, app, f.area()); - }); + use super::*; - insta::assert_snapshot!(output); - } + #[test] + fn test_blocklist_ui_renders_blocklist_tab_loading() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); - #[test] - fn test_blocklist_ui_renders_empty_blocklist() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); - app.data.radarr_data.blocklist = StatefulTable::default(); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - BlocklistUi::draw(f, app, f.area()); - }); + insta::assert_snapshot!(output); + } - insta::assert_snapshot!(output); - } + #[test] + fn test_blocklist_ui_renders_empty_blocklist() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); - #[test] - fn test_blocklist_ui_renders_with_blocklist_items() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Blocklist.into()); - app.data.radarr_data.blocklist = StatefulTable::default(); - app.data.radarr_data.blocklist.set_items(vec![ - BlocklistItem { - id: 1, - source_title: "Test.Movie.2023.1080p".to_owned(), - ..BlocklistItem::default() - }, - BlocklistItem { - id: 2, - source_title: "Another.Movie.2023.720p".to_owned(), - ..BlocklistItem::default() - }, - ]); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - BlocklistUi::draw(f, app, f.area()); - }); + insta::assert_snapshot!(output); + } - insta::assert_snapshot!(output); + #[rstest] + fn test_blocklist_ui_renders_blocklist_tab( + #[values( + ActiveRadarrBlock::Blocklist, + ActiveRadarrBlock::BlocklistSortPrompt, + ActiveRadarrBlock::DeleteBlocklistItemPrompt, + ActiveRadarrBlock::BlocklistClearAllItemsPrompt, + )] active_radarr_block: ActiveRadarrBlock + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + BlocklistUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } } } diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap deleted file mode 100644 index 6553ab2..0000000 --- a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_with_blocklist_items.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs -expression: output ---- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Movie Title Source Title Languages Quality Formats Date -=> Test.Movie.2023.1080p 1970-01-01 00:00:0 - Another.Movie.2023.720p 1970-01-01 00:00:0 diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__Blocklist.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__Blocklist.snap new file mode 100644 index 0000000..1d3898a --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__Blocklist.snap @@ -0,0 +1,7 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Movie Title ▼ Source Title Languages Quality Formats Date +=> Test z movie English HD - 1080p English 2024-02-10 07:28:45 UTC diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistClearAllItemsPrompt.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistClearAllItemsPrompt.snap new file mode 100644 index 0000000..22d813f --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistClearAllItemsPrompt.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Movie Title ▼ Source Title Languages Quality Formats Date +=> Test z movie English HD - 1080p English 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + ╭────── Clear Blocklist ──────╮ + │ Do you want to clear your │ + │ blocklist? │ + │ │ + │ │ + │ │ + │╭──────────────╮╭─────────────╮│ + ││ Yes ││ No ││ + │╰──────────────╯╰─────────────╯│ + ╰───────────────────────────────╯ diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistSortPrompt.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistSortPrompt.snap new file mode 100644 index 0000000..d0ab7ed --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__BlocklistSortPrompt.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Movie Title Source Title Languages Quality Formats Date +=> Test z movie English HD - 1080p English 2024-02-10 07:28:45 UTC + + + + + + + + + + + ╭───────────────────────────────╮ + │Something │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────╯ diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__DeleteBlocklistItemPrompt.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__DeleteBlocklistItemPrompt.snap new file mode 100644 index 0000000..c90b41f --- /dev/null +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__DeleteBlocklistItemPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Movie Title ▼ Source Title Languages Quality Formats Date +=> Test z movie English HD - 1080p English 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + ╭────────────── Remove Item from Blocklist ───────────────╮ + │ Do you want to remove this item from your blocklist: │ + │ z movie? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_blocklist_tab_loading.snap similarity index 58% rename from src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap rename to src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_blocklist_tab_loading.snap index 0f40c50..0672cee 100644 --- a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_loading_state.snap +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_blocklist_tab_loading.snap @@ -2,7 +2,7 @@ source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap similarity index 69% rename from src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap rename to src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap index 5be459a..1bfa784 100644 --- a/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__blocklist_ui_renders_empty_blocklist.snap +++ b/src/ui/radarr_ui/blocklist/snapshots/managarr__ui__radarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap @@ -2,4 +2,4 @@ source: src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/collections/collection_details_ui.rs b/src/ui/radarr_ui/collections/collection_details_ui.rs index c682c86..f794e43 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui.rs @@ -100,7 +100,7 @@ pub fn draw_collection_details(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) .unwrap_or_default() .value .as_f64() - .unwrap(); + .unwrap_or_default(); let rotten_tomatoes_rating = movie .ratings .rotten_tomatoes @@ -108,7 +108,7 @@ pub fn draw_collection_details(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) .unwrap_or_default() .value .as_u64() - .unwrap(); + .unwrap_or_default(); let imdb_rating = if imdb_rating == 0.0 { String::new() } else { diff --git a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs index 23d1c7d..0950701 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs @@ -1,17 +1,14 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; - use crate::models::radarr_models::{Collection, CollectionMovie}; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, COLLECTION_DETAILS_BLOCKS, }; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::collection_details_ui::CollectionDetailsUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_collection_details_ui_accepts() { @@ -39,27 +36,39 @@ mod tests { )); } - #[test] - fn test_collection_details_ui_renders_collection_details() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::CollectionDetails.into()); - app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD - 1080p".to_owned())]); - app.data.radarr_data.collections = StatefulTable::default(); - app.data.radarr_data.collections.set_items(vec![Collection { - id: 1, - title: "Test Collection".into(), - quality_profile_id: 1, - movies: Some(vec![CollectionMovie { - title: "Movie 1".into(), - ..CollectionMovie::default() - }]), - ..Collection::default() - }]); + mod snapshot_tests { + use rstest::rstest; + use crate::models::stateful_table::StatefulTable; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - CollectionDetailsUi::draw(f, app, f.area()); - }); + #[rstest] + fn test_collection_details_ui_renders_collection_details( + #[values( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::ViewMovieOverview + )] active_radarr_block: ActiveRadarrBlock + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + CollectionDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } + + #[test] + fn test_collection_details_ui_renders_collection_details_empty() { + let mut app = App::test_default_fully_populated(); + app.data.radarr_data.collection_movies = StatefulTable::default(); + app.push_navigation_stack(ActiveRadarrBlock::CollectionDetails.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + CollectionDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/collections/collections_ui_tests.rs b/src/ui/radarr_ui/collections/collections_ui_tests.rs index e3f4437..fde4733 100644 --- a/src/ui/radarr_ui/collections/collections_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collections_ui_tests.rs @@ -10,7 +10,7 @@ mod tests { use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::CollectionsUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_collections_ui_accepts() { @@ -28,29 +28,95 @@ mod tests { }); } - #[test] - fn test_collections_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::Collections.into()); + mod snapshot_tests { + use super::*; + use rstest::rstest; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - CollectionsUi::draw(f, app, f.area()); - }); + #[rstest] + #[case(true, false, false)] + #[case(false, true, false)] + #[case(false, false, true)] + fn test_radarr_ui_renders_collections_tab_loading( + #[case] is_loading: bool, + #[case] empty_movies: bool, + #[case] empty_profile_map: bool, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::Collections.into()); + app.is_loading = is_loading; + if empty_movies { + app.data.radarr_data.movies = StatefulTable::default(); + } - insta::assert_snapshot!(output); - } + if empty_profile_map { + app.data.radarr_data.quality_profile_map = Default::default(); + } - #[test] - fn test_collections_ui_renders_empty_collections() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Collections.into()); - app.data.radarr_data.collections = StatefulTable::default(); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + CollectionsUi::draw(f, app, f.area()); + }); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - CollectionsUi::draw(f, app, f.area()); - }); + insta::assert_snapshot!(output); + } - insta::assert_snapshot!(output); + #[rstest] + fn test_radarr_ui_renders_collections_tab( + #[values( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::CollectionsSortPrompt, + ActiveRadarrBlock::FilterCollections, + ActiveRadarrBlock::FilterCollectionsError, + ActiveRadarrBlock::SearchCollection, + ActiveRadarrBlock::SearchCollectionError, + ActiveRadarrBlock::UpdateAllCollectionsPrompt, + )] active_radarr_block: ActiveRadarrBlock) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + CollectionsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } + + #[test] + fn test_radarr_ui_renders_collections_tab_empty() { + let mut app = App::test_default_fully_populated(); + app.data.radarr_data.collections = StatefulTable::default(); + app.push_navigation_stack(ActiveRadarrBlock::Collections.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + CollectionsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[rstest] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionPrompt)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionConfirmPrompt)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleMonitored)] + fn test_edit_collection_ui_renders_edit_collection_modal( + #[case] context_block: ActiveRadarrBlock, + #[case] active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack((active_radarr_block, Some(context_block)).into()); + app.data.radarr_data.selected_block = + BlockSelectionState::new(EDIT_COLLECTION_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + CollectionsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context_block.to_string()), output); + } } } diff --git a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs index 2dd05a6..65a7eb8 100644 --- a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +++ b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs @@ -1,19 +1,15 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::radarr_models::Collection; - use crate::models::servarr_data::radarr::modals::EditCollectionModal; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_COLLECTION_BLOCKS, EDIT_COLLECTION_SELECTION_BLOCKS, }; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::collections::edit_collection_ui::EditCollectionUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_edit_collection_ui_accepts() { @@ -34,28 +30,39 @@ mod tests { )); } - #[test] - fn test_edit_collection_ui_renders_edit_collection_modal() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::EditCollectionRootFolderPathInput.into()); - app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD - 1080p".to_owned())]); - app.data.radarr_data.collections = StatefulTable::default(); - app.data.radarr_data.collections.set_items(vec![Collection { - id: 1, - title: "Test Collection".into(), - quality_profile_id: 1, - root_folder_path: Some("/movies".to_owned()), - ..Collection::default() - }]); - app.data.radarr_data.selected_block = - BlockSelectionState::new(EDIT_COLLECTION_SELECTION_BLOCKS); - app.data.radarr_data.edit_collection_modal = - Some(EditCollectionModal::from(&app.data.radarr_data)); + mod snapshot_tests { + use rstest::rstest; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - EditCollectionUi::draw(f, app, f.area()); - }); + #[rstest] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionPrompt)] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionConfirmPrompt)] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] + #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionToggleMonitored)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionPrompt)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionConfirmPrompt)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] + #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleMonitored)] + fn test_edit_collection_ui_renders_edit_collection_modal( + #[case] active_radarr_block: ActiveRadarrBlock, + #[case] context_block: ActiveRadarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack((active_radarr_block, Some(context_block)).into()); + app.data.radarr_data.selected_block = + BlockSelectionState::new(EDIT_COLLECTION_SELECTION_BLOCKS); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EditCollectionUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context_block.to_string()), output); + } } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap deleted file mode 100644 index 776d581..0000000 --- a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__collection_details_ui_renders_collection_details.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/collections/collection_details_ui_tests.rs -expression: output ---- - - - - - ╭ Test Collection ─────────────────────────────────────────────────────────────────────╮ - │Overview: │ - │Root Folder Path: │ - │Quality Profile: HD - 1080p │ - │Minimum Availability: Announced │ - │Monitored: No │ - │ Movies ──────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__CollectionDetails.snap new file mode 100644 index 0000000..f5e36f1 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collection_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Availability: Released │ + │Monitored: Yes │ + │Search on Add: Yes │ + │ │ + │ │ + │ │ + │ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ ✔ Title Year Runtime IMDB Rating Rotten Tomatoes Rating Genres │ + │=> ✔ Test 2023 2h 0m 9.9 99% cool, family, fun │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__ViewMovieOverview.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__ViewMovieOverview.snap new file mode 100644 index 0000000..f129468 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__ViewMovieOverview.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collection_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Availability: Released │ + │Monitored: Yes │ + │Search on Add: Yes │ + │ │ + │ │ + │ ╭ Overview ────────────────────────────────────────────────────╮ │ + │ Movies ───────────────────│Collection blah blah blah │───────────────────────────│ + │ ✔ Title │ │ │ + │=> ✔ Test │ │family, fun │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__collection_details_ui_renders_collection_details_empty.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__collection_details_ui_renders_collection_details_empty.snap new file mode 100644 index 0000000..5d926d8 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collection_details_ui__collection_details_ui_tests__tests__snapshot_tests__collection_details_ui_renders_collection_details_empty.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collection_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Availability: Released │ + │Monitored: Yes │ + │Search on Add: Yes │ + │ │ + │ │ + │ │ + │ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap new file mode 100644 index 0000000..b63c8c7 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap @@ -0,0 +1,7 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap new file mode 100644 index 0000000..8d270f1 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + + + + + + + + ╭───────────────────────────────╮ + │Something │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap new file mode 100644 index 0000000..47b203b --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Search on Add: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap new file mode 100644 index 0000000..47b203b --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Search on Add: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap new file mode 100644 index 0000000..47b203b --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Search on Add: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap new file mode 100644 index 0000000..5cf8254 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ ╭───────────────────────────────╮ │ │ + │ │ │Announced │ │ │ + │ │ │In Cinemas │───────────────────────────╮ │ │ + │ │ Minimum│Released │ ▼ │ │ │ + │ │ │TBA │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap new file mode 100644 index 0000000..ee34413 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ ╭───────────────────────────────╮ │ │ + │ │ │HD - 1080p │ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap new file mode 100644 index 0000000..47b203b --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Search on Add: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap new file mode 100644 index 0000000..47b203b --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭───╮ │ │ + │=> ✔ Test │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Search on Add: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap new file mode 100644 index 0000000..32bec1f --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + + + + + + + + + + + + + + + + ╭───────────────── Filter ──────────────────╮ + │Something │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap new file mode 100644 index 0000000..86a684b --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │The given filter produced empty results│ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap new file mode 100644 index 0000000..b023d51 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + + + + + + + + + + + + + + + + ╭───────────────── Search ──────────────────╮ + │Something │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap new file mode 100644 index 0000000..eef3209 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ No items found matching search │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap new file mode 100644 index 0000000..0a60964 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + + + + + + + + + + + ╭──────────────── Update All Collections ─────────────────╮ + │ Do you want to update all of your collections? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_empty.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_empty.snap new file mode 100644 index 0000000..cf90617 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_empty.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap similarity index 59% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap index 7cbbe61..998f70c 100644 --- a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_empty_collections.snap +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap @@ -2,7 +2,7 @@ source: src/ui/radarr_ui/collections/collections_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap similarity index 59% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap index 7cbbe61..998f70c 100644 --- a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__collections_ui_renders_loading_state.snap +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap @@ -2,7 +2,7 @@ source: src/ui/radarr_ui/collections/collections_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap new file mode 100644 index 0000000..998f70c --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/collections/collections_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap deleted file mode 100644 index 0d53eb0..0000000 --- a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__edit_collection_ui_renders_edit_collection_modal.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs -expression: output ---- - - - - - - - ╭────────────────────── Edit - Test Collection ──────────────────────╮ - │ │ - │ │ - │ │ - │ ╭───╮ │ - │ Monitored: ╰───╯ │ - │ ╭───────────────────────────────╮ │ - │ Minimum Availability: │Announced ▼ │ │ - │ ╰───────────────────────────────╯ │ - │ ╭───────────────────────────────╮ │ - │ Quality Profile: │HD - 1080p ▼ │ │ - │ ╰───────────────────────────────╯ │ - │ ╭───────────────────────────────╮ │ - │ Root Folder: ╰───────────────────────────────╯ │ - │ ╭───╮ │ - │ Search on Add: │ │ │ - │ ╰───╯ │ - ╰──────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionConfirmPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionConfirmPrompt.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionConfirmPrompt.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionPrompt.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionPrompt.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionRootFolderPathInput.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionRootFolderPathInput.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionRootFolderPathInput.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectMinimumAvailability.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectMinimumAvailability.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectMinimumAvailability.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectQualityProfile.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectQualityProfile.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionSelectQualityProfile.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleMonitored.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleMonitored.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleMonitored.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleSearchOnAdd.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleSearchOnAdd.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__CollectionDetails_EditCollectionToggleSearchOnAdd.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionConfirmPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionConfirmPrompt.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionConfirmPrompt.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionPrompt.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionPrompt.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionRootFolderPathInput.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionRootFolderPathInput.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionRootFolderPathInput.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectMinimumAvailability.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectMinimumAvailability.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectMinimumAvailability.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectQualityProfile.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectQualityProfile.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionSelectQualityProfile.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleMonitored.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleMonitored.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleMonitored.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleSearchOnAdd.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleSearchOnAdd.snap new file mode 100644 index 0000000..6ddcb02 --- /dev/null +++ b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__edit_collection_ui__edit_collection_ui_tests__tests__snapshot_tests__Collections_EditCollectionToggleSearchOnAdd.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭─────────────────────────────────── Edit - Test Collection ────────────────────────────────────╮ + │ Collection blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Root Folder: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭───╮ │ + │ Search on Add: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs index 6ada6c4..33f39ea 100644 --- a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs @@ -3,12 +3,10 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::radarr_models::DownloadRecord; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DOWNLOADS_BLOCKS}; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::downloads::DownloadsUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_downloads_ui_accepts() { @@ -21,62 +19,51 @@ mod tests { }); } - #[test] - fn test_downloads_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); + mod snapshot_tests { + use rstest::rstest; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - DownloadsUi::draw(f, app, f.area()); - }); + #[test] + fn test_radarr_ui_renders_downloads_tab_loading() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); + app.is_loading = true; - insta::assert_snapshot!(output); - } + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); - #[test] - fn test_downloads_ui_renders_empty_downloads() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); - app.data.radarr_data.downloads = StatefulTable::default(); + insta::assert_snapshot!(output); + } - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - DownloadsUi::draw(f, app, f.area()); - }); + #[rstest] + fn test_radarr_ui_renders_downloads_tab( + #[values( + ActiveRadarrBlock::Downloads, + ActiveRadarrBlock::DeleteDownloadPrompt, + ActiveRadarrBlock::UpdateDownloadsPrompt, + )] active_radarr_block: ActiveRadarrBlock + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); - insta::assert_snapshot!(output); - } + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); - #[test] - fn test_downloads_ui_renders_with_downloads() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); - app.data.radarr_data.downloads = StatefulTable::default(); - app.data.radarr_data.downloads.set_items(vec![ - DownloadRecord { - id: 1, - movie_id: 1, - title: "Test Movie Download".to_owned(), - status: "downloading".to_owned(), - size: 1024 * 1024 * 1024, - sizeleft: 512 * 1024 * 1024, - ..DownloadRecord::default() - }, - DownloadRecord { - id: 2, - movie_id: 2, - title: "Another Movie Download".to_owned(), - status: "completed".to_owned(), - size: 2048 * 1024 * 1024, - sizeleft: 0, - ..DownloadRecord::default() - }, - ]); + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - DownloadsUi::draw(f, app, f.area()); - }); + #[test] + fn test_radarr_ui_renders_downloads_tab_empty() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Downloads.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + DownloadsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } } diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap deleted file mode 100644 index df3d304..0000000 --- a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_with_downloads.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs -expression: output ---- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Title Percent Compl Size Output Path Indexer Download Client -=> Test Movie Download 50% 1.00 GB - Another Movie Download 100% 2.00 GB diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__DeleteDownloadPrompt.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__DeleteDownloadPrompt.snap new file mode 100644 index 0000000..6296a15 --- /dev/null +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__DeleteDownloadPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Complete Size Output Path Indexer Download Client +=> Test Download Title 50% 3.30 GB /nfs/movies/Test kickass torrents transmission + + + + + + + + + + + + + + ╭──────────────────── Cancel Download ────────────────────╮ + │ Do you really want to delete this download: │ + │ Test Download Title? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__Downloads.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__Downloads.snap new file mode 100644 index 0000000..e459f73 --- /dev/null +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__Downloads.snap @@ -0,0 +1,7 @@ +--- +source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Complete Size Output Path Indexer Download Client +=> Test Download Title 50% 3.30 GB /nfs/movies/Test kickass torrents transmission diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__UpdateDownloadsPrompt.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__UpdateDownloadsPrompt.snap new file mode 100644 index 0000000..11084ba --- /dev/null +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__UpdateDownloadsPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Complete Size Output Path Indexer Download Client +=> Test Download Title 50% 3.30 GB /nfs/movies/Test kickass torrents transmission + + + + + + + + + + + + + + ╭─────────────────── Update Downloads ────────────────────╮ + │ Do you want to update your downloads? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap similarity index 69% rename from src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap rename to src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap index 74c15cb..98a5dca 100644 --- a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_empty_downloads.snap +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap @@ -2,4 +2,4 @@ source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_loading.snap similarity index 58% rename from src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap rename to src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_loading.snap index 9d9848b..a84c6d5 100644 --- a/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__downloads_ui_renders_loading_state.snap +++ b/src/ui/radarr_ui/downloads/snapshots/managarr__ui__radarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_loading.snap @@ -2,7 +2,7 @@ source: src/ui/radarr_ui/downloads/downloads_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs index f2d6ef0..cc0b7b6 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs @@ -4,16 +4,13 @@ mod tests { use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::servarr_models::{Indexer, IndexerField}; - use crate::models::stateful_table::StatefulTable; + use crate::models::servarr_models::{Indexer}; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; - use serde_json::json; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_edit_indexer_ui_accepts() { @@ -26,40 +23,41 @@ mod tests { }); } - #[test] - fn test_edit_indexer_ui_renders_edit_indexer_modal() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::EditIndexerNameInput.into()); - app.data.radarr_data.indexers = StatefulTable::default(); - app.data.radarr_data.indexers.set_items(vec![Indexer { - id: 1, - name: Some("Test Indexer".to_owned()), - enable_rss: true, - priority: 25, - fields: Some(vec![ - IndexerField { - name: Some("baseUrl".to_owned()), - value: Some(json!("https://test.indexer.com")), - }, - IndexerField { - name: Some("apiKey".to_owned()), - value: Some(json!("test-api-key")), - }, - IndexerField { - name: Some("seedCriteria.seedRatio".to_owned()), - value: Some(json!(1.0)), - }, - ]), - ..Indexer::default() - }]); - app.data.radarr_data.selected_block = - BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); - app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.radarr_data)); + mod snapshot_tests { + use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_NZB_SELECTION_BLOCKS; + use crate::network::radarr_network::radarr_network_test_utils::test_utils::indexer; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - EditIndexerUi::draw(f, app, f.area()); - }); + #[test] + fn test_edit_indexer_ui_renders_edit_indexer_modal_torrent() { + let mut app = App::test_default_fully_populated(); + app.data.radarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); + app.push_navigation_stack(ActiveRadarrBlock::EditIndexerPrompt.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EditIndexerUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_edit_indexer_ui_renders_edit_indexer_modal_usenet() { + let mut app = App::test_default_fully_populated(); + app.data.radarr_data.indexers.set_items(vec![Indexer { + protocol: "usenet".to_owned(), + ..indexer() + }]); + app.data.radarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_NZB_SELECTION_BLOCKS); + app.push_navigation_stack(ActiveRadarrBlock::EditIndexerPrompt.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EditIndexerUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs index 4c82258..b85ef67 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs @@ -4,13 +4,12 @@ mod tests { use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::radarr_models::IndexerSettings; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, }; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_indexer_settings_ui_accepts() { @@ -23,18 +22,20 @@ mod tests { }); } - #[test] - fn test_indexer_settings_ui_renders_indexer_settings() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into()); - app.data.radarr_data.selected_block = - BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); - app.data.radarr_data.indexer_settings = Some(IndexerSettings::default()); + mod snapshot_tests { + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - IndexerSettingsUi::draw(f, app, f.area()); - }); + #[test] + fn test_indexer_settings_ui_renders_indexer_settings() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into()); + app.data.radarr_data.selected_block = BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexerSettingsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs index bbb7480..46595ae 100644 --- a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs @@ -6,11 +6,10 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; - use crate::models::servarr_models::Indexer; use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::IndexersUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_indexers_ui_accepts() { @@ -29,59 +28,97 @@ mod tests { }); } - #[test] - fn test_indexers_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); + mod snapshot_tests { + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - IndexersUi::draw(f, app, f.area()); - }); + #[test] + fn test_indexers_ui_renders_indexers_tab_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_indexers_tab_empty_indexers() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); + app.data.radarr_data.indexers = StatefulTable::default(); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_indexers_tab() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_test_indexer_loading() { + let mut app = App::test_default_fully_populated(); + app.data.radarr_data.indexer_test_errors = None; + app.push_navigation_stack(ActiveRadarrBlock::TestIndexer.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_test_indexer_success() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::TestIndexer.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_test_indexer_error() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::TestIndexer.into()); + + app.data.radarr_data.indexer_test_errors = + Some("Connection timeout: Unable to reach indexer".to_owned()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_delete_indexer_prompt() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::DeleteIndexerPrompt.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } - - #[test] - fn test_indexers_ui_renders_empty_indexers() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); - app.data.radarr_data.indexers = StatefulTable::default(); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - IndexersUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_indexers_ui_renders_with_indexers() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); - app.data.radarr_data.indexers = StatefulTable::default(); - app.data.radarr_data.indexers.set_items(vec![ - Indexer { - id: 1, - name: Some("Test Indexer 1".to_owned()), - enable_rss: true, - enable_automatic_search: true, - enable_interactive_search: true, - priority: 25, - ..Indexer::default() - }, - Indexer { - id: 2, - name: Some("Test Indexer 2".to_owned()), - enable_rss: false, - ..Indexer::default() - }, - ]); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - IndexersUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap deleted file mode 100644 index 1fb62de..0000000 --- a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__edit_indexer_ui_renders_edit_indexer_modal.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs -expression: output ---- - - - - - - - - - ╭───────────────────────────────── Edit Indexer ─────────────────────────────────╮ - │ │ - │ ╭─────────────────╮ ╭─────────────────╮ │ - │ Name: ╰─────────────────╯ URL: ╰─────────────────╯ │ - │ ╭───╮ ╭─────────────────╮ │ - │ ╭───╮ API Key: ╰─────────────────╯ │ - │ Enable Automatic Se╰───╯ ╭─────────────────╮ │ - │ ╭───╮ Tags: ╰─────────────────╯ │ - │ ╭─────────────────╮ │ - │ Indexer Priority ▴▾╰─────────────────╯ │ - │ │ - │ ╭──────────────────╮╭───────────────────╮ │ - │ │ Save ││ Cancel │ │ - │ ╰──────────────────╯╰───────────────────╯ │ - ╰──────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_torrent.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_torrent.snap new file mode 100644 index 0000000..b0b91ef --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_torrent.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +expression: output +--- + + + + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Name: │DrunkenSlug │ URL: │http://127.0.0.1:9696/1/ │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable RSS: │ ✔ │ API Key: │someApiKey │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Automatic Search: │ ✔ │ Seed Ratio: │ratio │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Interactive Search: │ ✔ │ Tags: │25 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭─────────────────────────╮ │ + │ Indexer Priority ▴▾: │1 │ │ + │ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_usenet.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_usenet.snap new file mode 100644 index 0000000..19ff9dc --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal_usenet.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +expression: output +--- + + + + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Name: │DrunkenSlug │ URL: │http://127.0.0.1:9696/1/ │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable RSS: │ ✔ │ API Key: │someApiKey │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Automatic Search: │ ✔ │ Tags: │25 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Interactive Search: │ ✔ │ Indexer Priority ▴▾: │1 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap deleted file mode 100644 index e5aa9f5..0000000 --- a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__indexer_settings_ui_renders_indexer_settings.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs -expression: output ---- - - - - - - - - - ╭──────────────────────── Configure All Indexer Settings ────────────────────────╮ - │ │ - │ ╭─────────────────╮ ╭─────────────────╮ │ - │ Minimum Age (minute╰─────────────────╯ Availability Delay ╰─────────────────╯ │ - │ ╭─────────────────╮ ╭─────────────────╮ │ - │ Retention (days) ▴▾╰─────────────────╯ RSS Sync Interval (╰─────────────────╯ │ - │ ╭─────────────────╮ ╭─────────────────╮ │ - │ Maximum Size (MB) ▴╰─────────────────╯ Whitelisted Subtitl╰─────────────────╯ │ - │ ╭───╮ ╭───╮ │ - │ Prefer Indexer Flag╰───╯ Allow Hardcoded Sub╰───╯ │ - │ │ - │ ╭──────────────────╮╭───────────────────╮ │ - │ │ Save ││ Cancel │ │ - │ ╰──────────────────╯╰───────────────────╯ │ - ╰──────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap new file mode 100644 index 0000000..99424f6 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs +expression: output +--- + + + + + + + + + + + + + + ╭─────────────────────────────────────── Configure All Indexer Settings ────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Minimum Age (minutes) ▴▾: │12 │ Availability Delay (days) │0 │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Retention (days) ▴▾: │30 │ RSS Sync Interval (minutes│60 │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Maximum Size (MB) ▴▾: │1234 │ Whitelisted Subtitle Tags:│eng │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭───╮ │ + │ Prefer Indexer Flags: │ ✔ │ Allow Hardcoded Subs: │ ✔ │ │ + │ ╰───╯ ╰───╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap deleted file mode 100644 index c4038d1..0000000 --- a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_with_indexers.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs -expression: output ---- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Indexer RSS Automatic Search Interactive Sea Priority Tags -=> Test Indexer 1 Enabled Enabled Enabled 25 - Test Indexer 2 Disabled Disabled Disabled 0 diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_delete_indexer_prompt.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_delete_indexer_prompt.snap new file mode 100644 index 0000000..55337d7 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_delete_indexer_prompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer ▼ RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + ╭──────────────────── Delete Indexer ─────────────────────╮ + │ Do you really want to delete this indexer: │ + │ Test Indexer? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab.snap new file mode 100644 index 0000000..73ea7b5 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab.snap @@ -0,0 +1,7 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer ▼ RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_empty_indexers.snap similarity index 69% rename from src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap rename to src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_empty_indexers.snap index ee33805..5581166 100644 --- a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_empty_indexers.snap +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_empty_indexers.snap @@ -2,4 +2,4 @@ source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_loading.snap similarity index 58% rename from src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap rename to src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_loading.snap index 9ac0562..3ee5788 100644 --- a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__indexers_ui_renders_loading_state.snap +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_indexers_tab_loading.snap @@ -2,7 +2,7 @@ source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_error.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_error.snap new file mode 100644 index 0000000..de58ca2 --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_error.snap @@ -0,0 +1,35 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer ▼ RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ Connection timeout: Unable to reach │ + │ indexer │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_loading.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_loading.snap new file mode 100644 index 0000000..ef6e02b --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_loading.snap @@ -0,0 +1,35 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer ▼ RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + + + + ╭ Testing Indexer ────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_success.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_success.snap new file mode 100644 index 0000000..ff3a0bd --- /dev/null +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_indexer_success.snap @@ -0,0 +1,35 @@ +--- +source: src/ui/radarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer ▼ RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ error │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap index 2ce3a04..6048c73 100644 --- a/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap +++ b/src/ui/radarr_ui/indexers/snapshots/managarr__ui__radarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap @@ -2,29 +2,47 @@ source: src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs expression: output --- - - - - - ╭ Test All Indexers ───────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Test All Indexers ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs index d489b8a..0c0c80e 100644 --- a/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -20,6 +20,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -28,7 +30,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveRadarrBlock::TestAllIndexers.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { TestAllIndexersUi::draw(f, app, f.area()); }); diff --git a/src/ui/radarr_ui/library/add_movie_ui.rs b/src/ui/radarr_ui/library/add_movie_ui.rs index 47984df..65f27e4 100644 --- a/src/ui/radarr_ui/library/add_movie_ui.rs +++ b/src/ui/radarr_ui/library/add_movie_ui.rs @@ -104,7 +104,7 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .unwrap_or_default() .value .as_f64() - .unwrap(); + .unwrap_or_default(); let rotten_tomatoes_rating = movie .ratings .rotten_tomatoes @@ -112,7 +112,7 @@ fn draw_add_movie_search(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .unwrap_or_default() .value .as_u64() - .unwrap(); + .unwrap_or_default(); let imdb_rating = if imdb_rating == 0.0 { String::new() } else { diff --git a/src/ui/radarr_ui/library/add_movie_ui_tests.rs b/src/ui/radarr_ui/library/add_movie_ui_tests.rs index 9401a58..4148797 100644 --- a/src/ui/radarr_ui/library/add_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/add_movie_ui_tests.rs @@ -3,11 +3,10 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_BLOCKS, ActiveRadarrBlock}; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::add_movie_ui::AddMovieUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_add_movie_ui_accepts() { @@ -20,30 +19,59 @@ mod tests { }); } - #[test] - fn test_add_movie_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into()); - app.data.radarr_data.add_movie_search = Some(HorizontallyScrollableText::default()); + mod snapshot_tests { + use rstest::rstest; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - AddMovieUi::draw(f, app, f.area()); - }); + #[test] + fn test_add_movie_ui_renders_loading_for_search() { + let mut app = App::test_default_fully_populated(); + app.data.radarr_data.add_searched_movies = None; + app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchResults.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + AddMovieUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[rstest] + #[case(ActiveRadarrBlock::AddMovieSearchInput, None)] + #[case(ActiveRadarrBlock::AddMovieSearchResults, None)] + #[case(ActiveRadarrBlock::AddMovieEmptySearchResults, None)] + #[case(ActiveRadarrBlock::AddMoviePrompt, None)] + #[case(ActiveRadarrBlock::AddMovieSelectMinimumAvailability, None)] + #[case(ActiveRadarrBlock::AddMovieSelectMonitor, None)] + #[case(ActiveRadarrBlock::AddMovieSelectQualityProfile, None)] + #[case(ActiveRadarrBlock::AddMovieSelectRootFolder, None)] + #[case(ActiveRadarrBlock::AddMovieAlreadyInLibrary, None)] + #[case(ActiveRadarrBlock::AddMovieTagsInput, None)] + #[case(ActiveRadarrBlock::AddMoviePrompt, Some(ActiveRadarrBlock::CollectionDetails))] + #[case(ActiveRadarrBlock::AddMovieSelectMinimumAvailability, Some(ActiveRadarrBlock::CollectionDetails))] + #[case(ActiveRadarrBlock::AddMovieSelectMonitor, Some(ActiveRadarrBlock::CollectionDetails))] + #[case(ActiveRadarrBlock::AddMovieSelectQualityProfile, Some(ActiveRadarrBlock::CollectionDetails))] + #[case(ActiveRadarrBlock::AddMovieSelectRootFolder, Some(ActiveRadarrBlock::CollectionDetails))] + #[case(ActiveRadarrBlock::AddMovieTagsInput, Some(ActiveRadarrBlock::CollectionDetails))] + fn test_add_movie_ui_renders( + #[case] active_radarr_block: ActiveRadarrBlock, + #[case] context: Option + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack((active_radarr_block, context).into()); + app.data.radarr_data.selected_block = BlockSelectionState::new(ADD_MOVIE_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + AddMovieUi::draw(f, app, f.area()); + }); + + if let Some(context) = context { + insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context.to_string()), output); + } else { + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } + } } - - #[test] - fn test_add_movie_ui_renders_search_input() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into()); - app.data.radarr_data.add_movie_search = Some(HorizontallyScrollableText::default()); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - AddMovieUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs index c9f17f2..155c374 100644 --- a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs @@ -1,18 +1,15 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::radarr_models::Movie; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, DELETE_MOVIE_SELECTION_BLOCKS, }; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::delete_movie_ui::DeleteMovieUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_delete_movie_ui_accepts() { @@ -25,24 +22,20 @@ mod tests { }); } - #[test] - fn test_delete_movie_ui_renders_delete_movie_prompt() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()); - app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.radarr_data.selected_block = BlockSelectionState::new(DELETE_MOVIE_SELECTION_BLOCKS); - app.data.radarr_data.movies = StatefulTable::default(); - app.data.radarr_data.movies.set_items(vec![Movie { - id: 1, - title: "Test Movie".into(), - quality_profile_id: 0, - ..Movie::default() - }]); + mod snapshot_tests { + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - DeleteMovieUi::draw(f, app, f.area()); - }); + #[test] + fn test_delete_movie_ui_renders_delete_movie_prompt() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::DeleteMoviePrompt.into()); + app.data.radarr_data.selected_block = BlockSelectionState::new(DELETE_MOVIE_SELECTION_BLOCKS); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + DeleteMovieUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs index b076c82..f045b99 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs @@ -1,19 +1,15 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::radarr_models::Movie; - use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_MOVIE_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, }; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::edit_movie_ui::EditMovieUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_edit_movie_ui_accepts() { @@ -26,27 +22,39 @@ mod tests { }); } - #[test] - fn test_edit_movie_ui_renders_edit_movie_modal() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::EditMoviePathInput.into()); - app.data.radarr_data.quality_profile_map = - BiMap::from_iter(vec![(1, "HD - 1080p".to_owned()), (2, "Any".to_owned())]); - app.data.radarr_data.selected_block = BlockSelectionState::new(EDIT_MOVIE_SELECTION_BLOCKS); - app.data.radarr_data.movies = StatefulTable::default(); - app.data.radarr_data.movies.set_items(vec![Movie { - id: 1, - title: "Test Movie".into(), - path: "/movies/test".into(), - quality_profile_id: 1, - ..Movie::default() - }]); - app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::from(&app.data.radarr_data)); + mod snapshot_tests { + use rstest::rstest; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - EditMovieUi::draw(f, app, f.area()); - }); + #[rstest] + #[case(ActiveRadarrBlock::EditMoviePrompt, None, 0)] + #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::MovieDetails), 0)] + #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::MovieHistory), 1)] + #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::FileInfo), 2)] + #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Cast), 3)] + #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Crew), 4)] + #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::ManualSearch), 5)] + fn test_edit_movie_ui_renders_edit_movie_modal( + #[case] active_radarr_block: ActiveRadarrBlock, + #[case] context: Option, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack((active_radarr_block, context).into()); + if context.is_some() { + app.data.radarr_data.movie_info_tabs.set_index(index); + } + app.data.radarr_data.selected_block = BlockSelectionState::new(EDIT_MOVIE_SELECTION_BLOCKS); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EditMovieUi::draw(f, app, f.area()); + }); + + if let Some(context) = context { + insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context.to_string()), output); + } else { + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } + } } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/library/library_ui_tests.rs b/src/ui/radarr_ui/library/library_ui_tests.rs index e1a91b1..b68a44f 100644 --- a/src/ui/radarr_ui/library/library_ui_tests.rs +++ b/src/ui/radarr_ui/library/library_ui_tests.rs @@ -2,12 +2,14 @@ mod tests { use strum::IntoEnumIterator; + use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::{ ADD_MOVIE_BLOCKS, ActiveRadarrBlock, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS, MOVIE_DETAILS_BLOCKS, }; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::LibraryUi; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_library_ui_accepts() { @@ -26,4 +28,97 @@ mod tests { } }); } -} + + mod snapshot_tests { + use rstest::rstest; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS}; + use super::*; + + #[test] + fn test_library_ui_renders_library_tab_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_library_tab_empty_movies() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[rstest] + fn test_library_ui_renders_library_tab( + #[values( + ActiveRadarrBlock::Movies, + ActiveRadarrBlock::MoviesSortPrompt, + ActiveRadarrBlock::SearchMovie, + ActiveRadarrBlock::SearchMovieError, + ActiveRadarrBlock::FilterMovies, + ActiveRadarrBlock::FilterMoviesError, + ActiveRadarrBlock::UpdateAllMoviesPrompt, + )] active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } + + #[rstest] + fn test_library_movie_ui_renders_add_movie_ui( + #[values( + ActiveRadarrBlock::AddMovieSearchInput, + ActiveRadarrBlock::AddMovieSearchResults, + ActiveRadarrBlock::AddMovieEmptySearchResults, + ActiveRadarrBlock::AddMoviePrompt, + ActiveRadarrBlock::AddMovieSelectMinimumAvailability, + ActiveRadarrBlock::AddMovieSelectMonitor, + ActiveRadarrBlock::AddMovieSelectQualityProfile, + ActiveRadarrBlock::AddMovieSelectRootFolder, + ActiveRadarrBlock::AddMovieAlreadyInLibrary, + ActiveRadarrBlock::AddMovieTagsInput, + )] active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); + app.data.radarr_data.selected_block = BlockSelectionState::new(ADD_MOVIE_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } + + #[test] + fn test_edit_movie_ui_renders_edit_movie_modal() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into()); + app.data.radarr_data.selected_block = BlockSelectionState::new(EDIT_MOVIE_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + } +} \ No newline at end of file diff --git a/src/ui/radarr_ui/library/movie_details_ui.rs b/src/ui/radarr_ui/library/movie_details_ui.rs index edc217c..bdc2566 100644 --- a/src/ui/radarr_ui/library/movie_details_ui.rs +++ b/src/ui/radarr_ui/library/movie_details_ui.rs @@ -409,12 +409,12 @@ fn draw_movie_releases(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { .clone() .unwrap_or(Number::from(0u64)) .as_u64() - .unwrap(); + .unwrap_or_default(); let leechers = leechers .clone() .unwrap_or(Number::from(0u64)) .as_u64() - .unwrap(); + .unwrap_or_default(); decorate_peer_style( seeders, diff --git a/src/ui/radarr_ui/library/movie_details_ui_tests.rs b/src/ui/radarr_ui/library/movie_details_ui_tests.rs index 66d3b0f..6b2b108 100644 --- a/src/ui/radarr_ui/library/movie_details_ui_tests.rs +++ b/src/ui/radarr_ui/library/movie_details_ui_tests.rs @@ -1,22 +1,18 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use pretty_assertions::assert_eq; use ratatui::style::Style; use rstest::rstest; use strum::IntoEnumIterator; use crate::app::App; - use crate::models::radarr_models::{Movie, RadarrRelease}; - use crate::models::servarr_data::radarr::modals::MovieDetailsModal; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS}; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::library::movie_details_ui::{ MovieDetailsUi, style_from_download_status, }; use crate::ui::styles::ManagarrStyle; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_movie_details_ui_accepts() { @@ -49,98 +45,70 @@ mod tests { ); } - #[test] - fn test_movie_details_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); - app.data.radarr_data.movies = StatefulTable::default(); + mod snapshot_tests { + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - MovieDetailsUi::draw(f, app, f.area()); - }); + #[rstest] + #[case(ActiveRadarrBlock::MovieDetails, None, 0)] + #[case(ActiveRadarrBlock::MovieDetails, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 0)] + #[case(ActiveRadarrBlock::MovieDetails, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 0)] + #[case(ActiveRadarrBlock::MovieHistory, None, 1)] + #[case(ActiveRadarrBlock::MovieHistory, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 1)] + #[case(ActiveRadarrBlock::MovieHistory, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 1)] + #[case(ActiveRadarrBlock::FileInfo, None, 2)] + #[case(ActiveRadarrBlock::FileInfo, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 2)] + #[case(ActiveRadarrBlock::FileInfo, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 2)] + #[case(ActiveRadarrBlock::Cast, None, 3)] + #[case(ActiveRadarrBlock::Cast, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 3)] + #[case(ActiveRadarrBlock::Cast, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 3)] + #[case(ActiveRadarrBlock::Crew, None, 4)] + #[case(ActiveRadarrBlock::Crew, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 4)] + #[case(ActiveRadarrBlock::Crew, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 4)] + #[case(ActiveRadarrBlock::ManualSearch, None, 5)] + #[case(ActiveRadarrBlock::ManualSearch, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 5)] + #[case(ActiveRadarrBlock::ManualSearch, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 5)] + #[case(ActiveRadarrBlock::ManualSearchSortPrompt, None, 5)] + #[case(ActiveRadarrBlock::ManualSearchConfirmPrompt, None, 5)] + fn test_movie_details_ui_renders_movie_details_tab( + #[case] active_radarr_block: ActiveRadarrBlock, + #[case] context: Option, + #[case] index: usize + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack((active_radarr_block, context).into()); + app.data.radarr_data.movie_info_tabs.set_index(index); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + MovieDetailsUi::draw(f, app, f.area()); + }); + + if let Some(context) = context { + insta::assert_snapshot!(format!("movie_details_render_{active_radarr_block}_{context}"), output); + } else { + insta::assert_snapshot!(format!("movie_details_render_{active_radarr_block}"), output); + } + } + + #[rstest] + fn test_movie_details_ui_renders_movie_details_tabs_loading( + #[values( + ActiveRadarrBlock::MovieDetails, + ActiveRadarrBlock::MovieHistory, + ActiveRadarrBlock::FileInfo, + ActiveRadarrBlock::Cast, + ActiveRadarrBlock::Crew, + ActiveRadarrBlock::ManualSearch, + )] active_radarr_block: ActiveRadarrBlock + ) { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(active_radarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + MovieDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("movie_details_loading_{active_radarr_block}"), output); + } } - - #[test] - fn test_movie_details_ui_renders_movie_details_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); - app.data.radarr_data.quality_profile_map = - BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]); - app.data.radarr_data.movies = StatefulTable::default(); - app.data.radarr_data.movies.set_items(vec![Movie { - id: 1, - title: "Test Movie".into(), - ..Movie::default() - }]); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - MovieDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_movie_details_ui_renders_movie_history_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); - app.data.radarr_data.quality_profile_map = - BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]); - app.data.radarr_data.movies = StatefulTable::default(); - app.data.radarr_data.movies.set_items(vec![Movie { - id: 1, - title: "Test Movie".into(), - ..Movie::default() - }]); - app.data.radarr_data.movie_info_tabs.set_index(1); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - MovieDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_movie_details_ui_renders_manual_search_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); - app.data.radarr_data.quality_profile_map = - BiMap::from_iter(vec![(2222, "HD - 1080p".to_owned())]); - app.data.radarr_data.movies = StatefulTable::default(); - app.data.radarr_data.movies.set_items(vec![Movie { - id: 1, - title: "Test Movie".into(), - ..Movie::default() - }]); - app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default()); - app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases = StatefulTable::default(); - app - .data - .radarr_data - .movie_details_modal - .as_mut() - .unwrap() - .movie_releases - .set_items(vec![RadarrRelease { - title: "Test Release".into(), - ..RadarrRelease::default() - }]); - app.data.radarr_data.movie_info_tabs.set_index(2); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - MovieDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap deleted file mode 100644 index 76245ed..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_loading_state.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: src/ui/radarr_ui/library/add_movie_ui_tests.rs -expression: output ---- - - - - - - ╭──────────────────────────────────── Add Movie ─────────────────────────────────────╮ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╭──────────────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap deleted file mode 100644 index 76245ed..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__add_movie_ui_renders_search_input.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: src/ui/radarr_ui/library/add_movie_ui_tests.rs -expression: output ---- - - - - - - ╭──────────────────────────────────── Add Movie ─────────────────────────────────────╮ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╭──────────────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap new file mode 100644 index 0000000..b6af07b --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ ✔ Title Year Runtime IMDB Rotten Tomatoes Genres │ + │=> ✔ Test 2023 2h 0m 9.9 99% cool, family, fun │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Error ───────────────╮ │ + │ │ This film is already in your library │ │ + │ │ │ │ + │ ╰───────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap new file mode 100644 index 0000000..4a28d65 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Error ───────────────╮ │ + │ │ No movies found matching your query! │ │ + │ │ │ │ + │ ╰───────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap new file mode 100644 index 0000000..f83fa58 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Monitor: │Movie only ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt_CollectionDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt_CollectionDetails.snap new file mode 100644 index 0000000..ae1d243 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMoviePrompt_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭────────────────────────────────────────────╮ │ │ + │=> ✔ Test │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Monitor: │Movie only ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap new file mode 100644 index 0000000..8428963 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap new file mode 100644 index 0000000..7671ced --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ ✔ Title Year Runtime IMDB Rotten Tomatoes Genres │ + │=> ✔ Test 2023 2h 0m 9.9 99% cool, family, fun │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap new file mode 100644 index 0000000..595503e --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │Announced │───────────────────────────╯ │ │ + │ │ │In Cinemas │───────────────────────────╮ │ │ + │ │ │Released │ ▼ │ │ │ + │ │ │TBA │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability_CollectionDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability_CollectionDetails.snap new file mode 100644 index 0000000..dfb9281 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭────────────────────────────────────────────╮ │ │ + │=> ✔ Test │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │Announced │───────────────────────────╯ │ │ + │ │ │In Cinemas │───────────────────────────╮ │ │ + │ │ │Released │ ▼ │ │ │ + │ │ │TBA │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap new file mode 100644 index 0000000..c04622f --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │Movie only │───────────────────────────╯ │ │ + │ │ │Movie and Collection │───────────────────────────╮ │ │ + │ │ │None │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor_CollectionDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor_CollectionDetails.snap new file mode 100644 index 0000000..50f15fe --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭────────────────────────────────────────────╮ │ │ + │=> ✔ Test │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │Movie only │───────────────────────────╯ │ │ + │ │ │Movie and Collection │───────────────────────────╮ │ │ + │ │ │None │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap new file mode 100644 index 0000000..0080f13 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │HD - 1080p │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile_CollectionDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile_CollectionDetails.snap new file mode 100644 index 0000000..4c3ee66 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭────────────────────────────────────────────╮ │ │ + │=> ✔ Test │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │HD - 1080p │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap new file mode 100644 index 0000000..b77bab8 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │/nfs │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder_CollectionDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder_CollectionDetails.snap new file mode 100644 index 0000000..23dfbaa --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭────────────────────────────────────────────╮ │ │ + │=> ✔ Test │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │/nfs │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap new file mode 100644 index 0000000..f83fa58 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Monitor: │Movie only ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput_CollectionDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput_CollectionDetails.snap new file mode 100644 index 0000000..ae1d243 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__AddMovieTagsInput_CollectionDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored +=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 + + + + ╭ Test Collection ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Overview: Collection blah blah blah │ + │Root Folder Path: /nfs/movies │ + │Quality Profile: HD - 1080p │ + │Minimum Avai╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮ │ + │Monitored: Y│ Collection blah blah blah │ │ + │Search on Ad│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ Movies ──│ │───────────│ + │ ✔ Title │ ╭────────────────────────────────────────────╮ │ │ + │=> ✔ Test │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Monitor: │Movie only ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__add_movie_ui_renders_loading_for_search.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__add_movie_ui_renders_loading_for_search.snap new file mode 100644 index 0000000..6320160 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__add_movie_ui__add_movie_ui_tests__tests__snapshot_tests__add_movie_ui_renders_loading_for_search.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/add_movie_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap deleted file mode 100644 index 0c58379..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__delete_movie_ui_renders_delete_movie_prompt.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: src/ui/radarr_ui/library/delete_movie_ui_tests.rs -expression: output ---- - - - - - - - - - - ╭───────────── Delete Movie ──────────────╮ - │ Do you really want to delete: │ - │ Test Movie? │ - │ │ - │ ╭───╮ │ - │ Delete Movie File: │ │ │ - │ ╰───╯ │ - │ ╭───╮ │ - │ Add List Exclusion: │ │ │ - │ ╰───╯ │ - ╰───────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__snapshot_tests__delete_movie_ui_renders_delete_movie_prompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__snapshot_tests__delete_movie_ui_renders_delete_movie_prompt.snap new file mode 100644 index 0000000..3ba597b --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__delete_movie_ui__delete_movie_ui_tests__tests__snapshot_tests__delete_movie_ui_renders_delete_movie_prompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/library/delete_movie_ui_tests.rs +expression: output +--- + + + + + + + + + + + + + + + + + ╭───────────────────── Delete Movie ──────────────────────╮ + │ Do you really want to delete: │ + │ Test? │ + │ │ + │ │ + │ ╭───╮ │ + │ Delete Movie File: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Add List Exclusion: │ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap deleted file mode 100644 index 462693a..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__edit_movie_ui_renders_edit_movie_modal.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs -expression: output ---- - - - - - - - ╭──────────────────────── Edit - Test Movie ─────────────────────────╮ - │ │ - │ │ - │ │ - │ ╭───╮ │ - │ Monitored: ╰───╯ │ - │ ╭───────────────────────────────╮ │ - │ Minimum Availability: │Announced ▼ │ │ - │ ╰───────────────────────────────╯ │ - │ ╭───────────────────────────────╮ │ - │ Quality Profile: │HD - 1080p ▼ │ │ - │ ╰───────────────────────────────╯ │ - │ ╭───────────────────────────────╮ │ - │ Path: ╰───────────────────────────────╯ │ - │ ╭───────────────────────────────╮ │ - │ Tags: │ │ │ - │ ╰───────────────────────────────╯ │ - ╰──────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt.snap new file mode 100644 index 0000000..8874f88 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Path: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Tags: │alex │ │ + │ ╰────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Cast.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Cast.snap new file mode 100644 index 0000000..06800a3 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Cast.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Cast Member Character │ + │=> Madison C╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮ │ + │ │ Blah blah blah │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭───╮ │ │ + │ │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Path: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Crew.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Crew.snap new file mode 100644 index 0000000..0c332b8 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_Crew.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Crew Member Job Department │ + │=> Alex Clar╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮ │ + │ │ Blah blah blah │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭───╮ │ │ + │ │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Path: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_FileInfo.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_FileInfo.snap new file mode 100644 index 0000000..ce57b14 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_FileInfo.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │File Details │ + │Some file in╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮ │ + │ │ Blah blah blah │ │ + │ │ │ │ + │ │ │ │ + │────────────│ │───────────│ + │Audio Detail│ │ │ + │Some audio i│ │ │ + │ │ ╭───╮ │ │ + │ │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │────────────│ Minimum Availability: │Announced ▼ │ │───────────│ + │Video Detail│ ╰────────────────────────────────────────────╯ │ │ + │Some video i│ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Path: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_ManualSearch.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_ManualSearch.snap new file mode 100644 index 0000000..af0e450 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_ManualSearch.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent ╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮D - 1080p │ + │ usenet │ Blah blah blah │D - 1080p │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭───╮ │ │ + │ │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Path: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieDetails.snap new file mode 100644 index 0000000..435e0a1 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Some information: │ + │ ╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮ │ + │ │ Blah blah blah │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭───╮ │ │ + │ │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Path: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieHistory.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieHistory.snap new file mode 100644 index 0000000..2c38e79 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__edit_movie_ui__edit_movie_ui_tests__tests__snapshot_tests__EditMoviePrompt_MovieHistory.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/edit_movie_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Languages Quality Date │ + │=> Test ╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮37:56 UTC │ + │ │ Blah blah blah │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭───╮ │ │ + │ │ Monitored: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Path: │/nfs/movies │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Save ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap new file mode 100644 index 0000000..8bd5d6f --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ ✔ Title Year Runtime IMDB Rotten Tomatoes Genres │ + │=> ✔ Test 2023 2h 0m 9.9 99% cool, family, fun │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Error ───────────────╮ │ + │ │ This film is already in your library │ │ + │ │ │ │ + │ ╰───────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap new file mode 100644 index 0000000..ac375b8 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Error ───────────────╮ │ + │ │ No movies found matching your query! │ │ + │ │ │ │ + │ ╰───────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap new file mode 100644 index 0000000..208d025 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Monitor: │Movie only ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap new file mode 100644 index 0000000..2229ca0 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap new file mode 100644 index 0000000..c2e106c --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ ✔ Title Year Runtime IMDB Rotten Tomatoes Genres │ + │=> ✔ Test 2023 2h 0m 9.9 99% cool, family, fun │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap new file mode 100644 index 0000000..b472953 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │Announced │───────────────────────────╯ │ │ + │ │ │In Cinemas │───────────────────────────╮ │ │ + │ │ │Released │ ▼ │ │ │ + │ │ │TBA │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap new file mode 100644 index 0000000..5a454f3 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │Movie only │───────────────────────────╯ │ │ + │ │ │Movie and Collection │───────────────────────────╮ │ │ + │ │ │None │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap new file mode 100644 index 0000000..c4963ff --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │HD - 1080p │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap new file mode 100644 index 0000000..5bacaa4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ ╭───────────────────────────────╮ ▼ │ │ │ + │ │ │/nfs │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Minimum│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ Qu│ │ ▼ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ │ │───────────────────────────╮ │ │ + │ │ │ │ │ │ │ + │ │ │ │───────────────────────────╯ │ │ + │ │ ╰───────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap new file mode 100644 index 0000000..208d025 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + ╭───────────────────────────────────────────────────── Add Movie ──────────────────────────────────────────────────────╮ + │test │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭───────────╭────────────────────────────────────── Add Movie - Test ───────────────────────────────────────╮──────────╮ + │ ✔ Title│ New movie blah blah blah │ │ + │=> ✔ Test │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Monitor: │Movie only ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Minimum Availability: │Announced ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │HD - 1080p ▼ │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ ╭────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + │ │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ │ + │ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap new file mode 100644 index 0000000..aa620d1 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + + + + + + + + + + + + ╭───────────────── Filter ──────────────────╮ + │Something │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap new file mode 100644 index 0000000..c2d8b10 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │The given filter produced empty results│ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap new file mode 100644 index 0000000..850efb6 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap @@ -0,0 +1,7 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap new file mode 100644 index 0000000..9ac5508 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + + + + ╭───────────────────────────────╮ + │Something │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap new file mode 100644 index 0000000..487fd86 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + + + + + + + + + + + + ╭───────────────── Search ──────────────────╮ + │Something │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap new file mode 100644 index 0000000..9948477 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ No items found matching search │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap new file mode 100644 index 0000000..6c1632f --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + + + + + + + ╭─────────────────── Update All Movies ───────────────────╮ + │ Do you want to update info and scan your disks for all of │ + │ your movies? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__edit_movie_ui_renders_edit_movie_modal.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__edit_movie_ui_renders_edit_movie_modal.snap new file mode 100644 index 0000000..d2e591e --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__edit_movie_ui_renders_edit_movie_modal.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags +=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex + + + + + + + + ╭───────────────────────────────────────── Edit - Test ─────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Minimum Availability: │Announced ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Quality Profile: │HD - 1080p ▼ │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Path: │/nfs/movies │ │ + │ ╰────────────────────────────────────────────╯ │ + │ ╭────────────────────────────────────────────╮ │ + │ Tags: │alex │ │ + │ ╰────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────╮╭──────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────╯╰──────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_empty_movies.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_empty_movies.snap new file mode 100644 index 0000000..e54ebef --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_empty_movies.snap @@ -0,0 +1,5 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_loading.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_loading.snap new file mode 100644 index 0000000..3c01f11 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_library_tab_loading.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/radarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap deleted file mode 100644 index 7711262..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_loading_state.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/library/movie_details_ui_tests.rs -expression: output ---- - - - - - ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Cast │ Crew │ Manual Search │ - │────────────────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap deleted file mode 100644 index 9229ad5..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_manual_search_tab.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/library/movie_details_ui_tests.rs -expression: output ---- - - - - - ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Cast │ Crew │ Manual Search │ - │────────────────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap deleted file mode 100644 index 7711262..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_details_tab.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/library/movie_details_ui_tests.rs -expression: output ---- - - - - - ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Cast │ Crew │ Manual Search │ - │────────────────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap deleted file mode 100644 index cae88b4..0000000 --- a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__movie_details_ui_renders_movie_history_tab.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/library/movie_details_ui_tests.rs -expression: output ---- - - - - - ╭ Movie Info ──────────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Cast │ Crew │ Manual Search │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Cast.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Cast.snap new file mode 100644 index 0000000..d385ec4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Cast.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Crew.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Crew.snap new file mode 100644 index 0000000..d385ec4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_Crew.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_FileInfo.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_FileInfo.snap new file mode 100644 index 0000000..d385ec4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_FileInfo.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_ManualSearch.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_ManualSearch.snap new file mode 100644 index 0000000..d385ec4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_ManualSearch.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieDetails.snap new file mode 100644 index 0000000..d385ec4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieHistory.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieHistory.snap new file mode 100644 index 0000000..d385ec4 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_loading_MovieHistory.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast.snap new file mode 100644 index 0000000..4885012 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Cast Member Character │ + │=> Madison Clarke Johnny Blaze │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_AutomaticallySearchMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_AutomaticallySearchMoviePrompt.snap new file mode 100644 index 0000000..e0b6a1d --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_AutomaticallySearchMoviePrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Cast Member Character │ + │=> Madison Clarke Johnny Blaze │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Movie Search ─────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_UpdateAndScanPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_UpdateAndScanPrompt.snap new file mode 100644 index 0000000..ff7fce1 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Cast_UpdateAndScanPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Cast Member Character │ + │=> Madison Clarke Johnny Blaze │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew.snap new file mode 100644 index 0000000..807de9b --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Crew Member Job Department │ + │=> Alex Clarke Composition Music │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_AutomaticallySearchMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_AutomaticallySearchMoviePrompt.snap new file mode 100644 index 0000000..8c6518d --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_AutomaticallySearchMoviePrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Crew Member Job Department │ + │=> Alex Clarke Composition Music │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Movie Search ─────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_UpdateAndScanPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_UpdateAndScanPrompt.snap new file mode 100644 index 0000000..76c813d --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_Crew_UpdateAndScanPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Crew Member Job Department │ + │=> Alex Clarke Composition Music │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo.snap new file mode 100644 index 0000000..6a2f353 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │File Details │ + │Some file info │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Audio Details │ + │Some audio info │ + │ │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Video Details │ + │Some video info │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_AutomaticallySearchMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_AutomaticallySearchMoviePrompt.snap new file mode 100644 index 0000000..cef3089 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_AutomaticallySearchMoviePrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │File Details │ + │Some file info │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Audio Details │ + │Some audio info ╭──────────────── Automatic Movie Search ─────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │──────────────────────────────│ │───────────────────────────────│ + │Video Details │ │ │ + │Some video info │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_UpdateAndScanPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_UpdateAndScanPrompt.snap new file mode 100644 index 0000000..90fb172 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_FileInfo_UpdateAndScanPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │File Details │ + │Some file info │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Audio Details │ + │Some audio info ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │──────────────────────────────│ │───────────────────────────────│ + │Video Details │ │ │ + │Some video info │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch.snap new file mode 100644 index 0000000..b66682e --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 12 days ⛔ Some movie release The Pirate Bay 0.0 GB 25 / 3 English HD - 1080p │ + │ usenet 22 days ⛔ Some Other movie rele The Pirate Bay 0.0 GB English HD - 1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchConfirmPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchConfirmPrompt.snap new file mode 100644 index 0000000..e94e5dd --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchConfirmPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 12 days ⛔ Some movie release The Pirate Bay 0.0 GB 25 / 3 English HD - 1080p │ + │ usenet 22 days ⛔ Some Other movie rele The Pirate Bay 0.0 GB English HD - 1080p │ + │ │ + │ │ + │ │ + │ ╭───────────────── Download Rejected Release ──────────────────╮ │ + │ │ Do you really want to download the rejected release: Some movie│ │ + │ │ release? │ │ + │ │ │ │ + │ │ │ │ + │ │Rejection reasons: │ │ + │ │• something interesting │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭──────────────────────────────╮╭──────────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰──────────────────────────────╯╰──────────────────────────────╯│ │ + │ ╰────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchSortPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchSortPrompt.snap new file mode 100644 index 0000000..faf0a48 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearchSortPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 12 days ⛔ Some movie release The Pirate Bay 0.0 GB 25 / 3 English HD - 1080p │ + │ usenet 22 days ⛔ Some Other movie rele The Pirate Bay 0.0 GB English HD - 1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────╮ │ + │ │Something │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰──────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_AutomaticallySearchMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_AutomaticallySearchMoviePrompt.snap new file mode 100644 index 0000000..9d72a3f --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_AutomaticallySearchMoviePrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 12 days ⛔ Some movie release The Pirate Bay 0.0 GB 25 / 3 English HD - 1080p │ + │ usenet 22 days ⛔ Some Other movie rele The Pirate Bay 0.0 GB English HD - 1080p │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Movie Search ─────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_UpdateAndScanPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_UpdateAndScanPrompt.snap new file mode 100644 index 0000000..8be4353 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_ManualSearch_UpdateAndScanPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 12 days ⛔ Some movie release The Pirate Bay 0.0 GB 25 / 3 English HD - 1080p │ + │ usenet 22 days ⛔ Some Other movie rele The Pirate Bay 0.0 GB English HD - 1080p │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails.snap new file mode 100644 index 0000000..7f7ec72 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Some information: │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_AutomaticallySearchMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_AutomaticallySearchMoviePrompt.snap new file mode 100644 index 0000000..8086e86 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_AutomaticallySearchMoviePrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Some information: │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Movie Search ─────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_UpdateAndScanPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_UpdateAndScanPrompt.snap new file mode 100644 index 0000000..3e751ff --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieDetails_UpdateAndScanPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Some information: │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory.snap new file mode 100644 index 0000000..faea751 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Languages Quality Date │ + │=> Test grabbed English HD - 1080p 2022-12-30 07:37:56 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_AutomaticallySearchMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_AutomaticallySearchMoviePrompt.snap new file mode 100644 index 0000000..2b720c6 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_AutomaticallySearchMoviePrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Languages Quality Date │ + │=> Test grabbed English HD - 1080p 2022-12-30 07:37:56 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Movie Search ─────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_UpdateAndScanPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_UpdateAndScanPrompt.snap new file mode 100644 index 0000000..05be306 --- /dev/null +++ b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__movie_details_ui__movie_details_ui_tests__tests__snapshot_tests__movie_details_render_MovieHistory_UpdateAndScanPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/library/movie_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Movie Info ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Cast │ Crew │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Languages Quality Date │ + │=> Test grabbed English HD - 1080p 2022-12-30 07:37:56 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ movie: Test? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/mod.rs b/src/ui/radarr_ui/mod.rs index 72a9b6f..32f56b8 100644 --- a/src/ui/radarr_ui/mod.rs +++ b/src/ui/radarr_ui/mod.rs @@ -1,6 +1,9 @@ use std::{cmp, iter}; - -use chrono::{Duration, Utc}; +#[cfg(test)] +use crate::ui::ui_test_utils::test_utils::Utc; +#[cfg(not(test))] +use chrono::Utc; +use chrono::{Duration}; use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::prelude::Stylize; @@ -34,6 +37,8 @@ mod collections; mod downloads; mod indexers; mod library; +#[cfg(test)] +mod radarr_ui_tests; mod root_folders; mod system; @@ -248,7 +253,3 @@ fn draw_radarr_logo(f: &mut Frame<'_>, area: Rect) { .centered(); f.render_widget(logo, area); } - -#[cfg(test)] -#[path = "radarr_ui_tests.rs"] -mod radarr_ui_tests; diff --git a/src/ui/radarr_ui/radarr_ui_tests.rs b/src/ui/radarr_ui/radarr_ui_tests.rs index 24b90a2..5cbe9d3 100644 --- a/src/ui/radarr_ui/radarr_ui_tests.rs +++ b/src/ui/radarr_ui/radarr_ui_tests.rs @@ -1,7 +1,6 @@ #[cfg(test)] mod tests { use crate::models::radarr_models::{DownloadRecord, Movie}; - use bimap::BiMap; use pretty_assertions::assert_eq; use ratatui::widgets::{Cell, Row}; use rstest::rstest; @@ -9,7 +8,6 @@ mod tests { use crate::app::App; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::{RadarrUi, decorate_with_row_style}; use crate::ui::styles::ManagarrStyle; @@ -24,74 +22,29 @@ mod tests { mod snapshot_tests { use super::*; + use crate::ui::ui_test_utils::test_utils::{TerminalSize}; - #[test] - fn test_radarr_ui_renders_downloads_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); - app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.radarr_data.main_tabs.set_index(2); // Downloads tab - app.data.radarr_data.downloads = StatefulTable::default(); - app.data.radarr_data.downloads.set_items(vec![ - DownloadRecord { - id: 1, - title: "Test Movie 2024".to_owned(), - status: "downloading".to_owned(), - size: 2000000000, - sizeleft: 500000000, - ..DownloadRecord::default() - }, - DownloadRecord { - id: 2, - title: "Another Movie".to_owned(), - status: "downloading".to_owned(), - size: 1500000000, - sizeleft: 750000000, - ..DownloadRecord::default() - }, - ]); + #[rstest] + #[case(ActiveRadarrBlock::Movies, 0)] + #[case(ActiveRadarrBlock::Collections, 1)] + #[case(ActiveRadarrBlock::Downloads, 2)] + #[case(ActiveRadarrBlock::Blocklist, 3)] + #[case(ActiveRadarrBlock::RootFolders, 4)] + #[case(ActiveRadarrBlock::Indexers, 5)] + #[case(ActiveRadarrBlock::System, 6)] + fn test_radarr_ui_renders_radarr_tabs( + #[case] active_radarr_block: ActiveRadarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); + app.data.radarr_data.main_tabs.set_index(index); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RadarrUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); - } - - #[test] - fn test_radarr_ui_renders_downloads_tab_empty() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); - app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.radarr_data.main_tabs.set_index(2); // Downloads tab - app.data.radarr_data.downloads = StatefulTable::default(); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - RadarrUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_radarr_ui_renders_library_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); - app.data.radarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.radarr_data.main_tabs.set_index(0); // Library tab - app.data.radarr_data.movies = StatefulTable::default(); - app.data.radarr_data.movies.set_items(vec![Movie { - id: 1, - title: "Test Movie".into(), - quality_profile_id: 0, - ..Movie::default() - }]); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - RadarrUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); + insta::assert_snapshot!(active_radarr_block.to_string(), output); } } diff --git a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs index e0d699b..cf97b15 100644 --- a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs @@ -3,13 +3,11 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ROOT_FOLDERS_BLOCKS}; - use crate::models::servarr_models::RootFolder; use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::radarr_ui::root_folders::RootFoldersUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_root_folders_ui_accepts() { @@ -22,70 +20,52 @@ mod tests { }); } - #[test] - fn test_root_folders_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); + mod snapshot_tests { + use rstest::rstest; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - RootFoldersUi::draw(f, app, f.area()); - }); + #[test] + fn test_root_folders_ui_renders_loading() { + let mut app = App::test_default(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_root_folders_ui_renders_empty_root_folders() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); + app.data.radarr_data.root_folders = StatefulTable::default(); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + RootFoldersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[rstest] + fn test_root_folders_ui_renders_root_folders_tab( + #[values( + ActiveRadarrBlock::RootFolders, + ActiveRadarrBlock::AddRootFolderPrompt, + ActiveRadarrBlock::DeleteRootFolderPrompt, + )] active_radarr_block: ActiveRadarrBlock + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_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_radarr_block.to_string(), output); + } } - - #[test] - fn test_root_folders_ui_renders_empty_root_folders() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); - app.data.radarr_data.root_folders = StatefulTable::default(); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - RootFoldersUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_root_folders_ui_renders_with_root_folders() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::RootFolders.into()); - app.data.radarr_data.root_folders = StatefulTable::default(); - app.data.radarr_data.root_folders.set_items(vec![ - RootFolder { - path: "/movies".to_owned(), - accessible: true, - free_space: 1024 * 1024 * 1024 * 100, - ..RootFolder::default() - }, - RootFolder { - path: "/media/movies".to_owned(), - accessible: true, - free_space: 1024 * 1024 * 1024 * 50, - ..RootFolder::default() - }, - ]); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - RootFoldersUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_root_folders_ui_renders_add_root_folder() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::AddRootFolderPrompt.into()); - app.data.radarr_data.root_folders = StatefulTable::default(); - app.data.radarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); - - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - RootFoldersUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } -} +} \ No newline at end of file diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap deleted file mode 100644 index 92192db..0000000 --- a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_add_root_folder.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs -expression: output ---- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - - - - - - - - - - - - - ╭────── Add Root Folder ───────╮ - cancel diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap new file mode 100644 index 0000000..5d84aa1 --- /dev/null +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + + + + + + + + + + + + + + + + + + ╭───────────── Add Root Folder ─────────────╮ + │/nfs/movies │ + ╰─────────────────────────────────────────────╯ + cancel diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap new file mode 100644 index 0000000..41c0ad6 --- /dev/null +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + + + + + + + + + + + ╭────────────────── Delete Root Folder ───────────────────╮ + │ Do you really want to delete this root folder: │ + │ /nfs? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap similarity index 53% rename from src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap rename to src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap index bffe454..7d3c619 100644 --- a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_with_root_folders.snap +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap @@ -2,7 +2,6 @@ source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Path Free Space Unmapped Folders -=> /movies 100.00 GB 0 - /media/movies 50.00 GB 0 +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap similarity index 69% rename from src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap rename to src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap index 0883c8a..9464787 100644 --- a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_empty_root_folders.snap +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap @@ -2,4 +2,4 @@ source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap similarity index 59% rename from src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap rename to src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap index 3571adb..e4bc2d4 100644 --- a/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__root_folders_ui_renders_loading_state.snap +++ b/src/ui/radarr_ui/root_folders/snapshots/managarr__ui__radarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap @@ -2,7 +2,7 @@ source: src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Blocklist.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Blocklist.snap new file mode 100644 index 0000000..c502692 --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Blocklist.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Movie Title ▼ Source Title Languages Quality Formats Date │ +│=> Test z movie English HD - 1080p English 2024-02-10 07:28:45 UTC │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Collections.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Collections.snap new file mode 100644 index 0000000..983cf62 --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Collections.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Collection ▼ Number of Movies Root Folder Path Quality Profile Search on Add Monitored │ +│=> Test Collection 1 /nfs/movies HD - 1080p Yes 🏷 │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Downloads.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Downloads.snap new file mode 100644 index 0000000..16641df --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Downloads.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title Percent Complete Size Output Path Indexer Download Client │ +│=> Test Download Title 50% 3.30 GB /nfs/movies/Test kickass torrents transmission │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Indexers.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Indexers.snap new file mode 100644 index 0000000..0576c5c --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Indexers.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Indexer ▼ RSS Automatic Search Interactive Search Priority Tags │ +│=> Test Indexer Enabled Enabled Enabled 25 alex │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Movies.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Movies.snap new file mode 100644 index 0000000..82fca3e --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__Movies.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags │ +│=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__RootFolders.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__RootFolders.snap new file mode 100644 index 0000000..10d0cfe --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__RootFolders.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Path Free Space Unmapped Folders │ +│=> /nfs 204800.00 GB 0 │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__System.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__System.snap new file mode 100644 index 0000000..5f3c163 --- /dev/null +++ b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__System.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/radarr_ui_tests.rs +expression: output +--- +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│╭ Tasks ───────────────────────────────────────────────────────────────────────╮╭ Queued Events ──────────────────────────────────────────────────────────────╮│ +││Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration ││ +││Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored 4 minutes ago 4 minutes a 00:03:03 ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +│╰────────────────────────────────────────────────────────────────────────────────╯╰───────────────────────────────────────────────────────────────────────────────╯│ +│╭ Logs ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ +││2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +│╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap deleted file mode 100644 index 3a04387..0000000 --- a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: src/ui/radarr_ui/radarr_ui_tests.rs -expression: output ---- -╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ -│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap deleted file mode 100644 index 3a04387..0000000 --- a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_downloads_tab_empty.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: src/ui/radarr_ui/radarr_ui_tests.rs -expression: output ---- -╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ -│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap b/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap deleted file mode 100644 index daff9d2..0000000 --- a/src/ui/radarr_ui/snapshots/managarr__ui__radarr_ui__radarr_ui_tests__tests__snapshot_tests__radarr_ui_renders_library_tab.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: src/ui/radarr_ui/radarr_ui_tests.rs -expression: output ---- -╭ Movies ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ -│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ Title Year Studio Runtime Rating Languag Size Quality Pro Monitor Tags │ -│=> Test Movie 0 0h 0m 0.00 GB Any │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/mod.rs b/src/ui/radarr_ui/system/mod.rs index f876ee1..8e3966f 100644 --- a/src/ui/radarr_ui/system/mod.rs +++ b/src/ui/radarr_ui/system/mod.rs @@ -1,6 +1,9 @@ use std::ops::Sub; +#[cfg(not(test))] use chrono::Utc; +#[cfg(test)] +use crate::ui::ui_test_utils::test_utils::Utc; use ratatui::layout::Layout; use ratatui::style::Style; use ratatui::text::{Span, Text}; @@ -125,7 +128,7 @@ pub(super) fn draw_queued_events(f: &mut Frame<'_>, app: &mut App<'_>, area: Rec }; let duration = if event.duration.is_some() { - &event.duration.as_ref().unwrap()[..8] + event.duration.as_ref().map_or("", |it| &it[..8]) } else { "" }; diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemLogs.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemLogs.snap new file mode 100644 index 0000000..8ed88ae --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemLogs.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemQueuedEvents.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemQueuedEvents.snap new file mode 100644 index 0000000..095883f --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemQueuedEvents.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ + │Trigger Status Name Queued Started Duration │ + │manual completed Refresh Monitored Downlo 4 minutes ago 4 minutes ago 00:03:03 │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTaskStartConfirmPrompt.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTaskStartConfirmPrompt.snap new file mode 100644 index 0000000..b81d727 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTaskStartConfirmPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Name Interval Last Execution Last Duration Next Execution │ + │=> Backup 1 hour now 00:00:17 59 minutes │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭────────────────────── Start Task ───────────────────────╮ │ + │ │ Do you want to manually start this task: Backup? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTasks.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTasks.snap new file mode 100644 index 0000000..86c0513 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemTasks.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Name Interval Last Execution Last Duration Next Execution │ + │=> Backup 1 hour now 00:00:17 59 minutes │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemUpdates.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemUpdates.snap new file mode 100644 index 0000000..ecc5145 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__SystemUpdates.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Updates ───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │The latest version of Radarr is already installed │ + │ │ + │4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) │ + │--------------------------------------------------------------------------------------------------------------------------│ + │New: │ + │ * Cool new thing │ + │Fixed: │ + │ * Some bugs killed │ + │ │ + │ │ + │3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) │ + │--------------------------------------------------------------------------------------------------------------------------│ + │New: │ + │ * Cool new thing (old) │ + │ * Other cool new thing (old) │ + │ │ + │ │ + │2.1.0 - 2023-04-15 02:02:53 UTC │ + │--------------------------------------------------------------------------------------------------------------------------│ + │Fixed: │ + │ * Killed bug 1 │ + │ * Fixed bug 2 │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs_loading.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs_loading.snap new file mode 100644 index 0000000..8ed88ae --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs_loading.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_queued_events_loading.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_queued_events_loading.snap new file mode 100644 index 0000000..93ce129 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_queued_events_loading.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks_loading.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks_loading.snap new file mode 100644 index 0000000..28acfeb --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks_loading.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/radarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap deleted file mode 100644 index deb1ee9..0000000 --- a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_loading_tasks.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/system/system_details_ui_tests.rs -expression: output ---- - - - - - ╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap deleted file mode 100644 index 7272e3c..0000000 --- a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_details_ui__system_details_ui_tests__tests__system_details_ui_renders_logs.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: src/ui/radarr_ui/system/system_details_ui_tests.rs -expression: output ---- - - - - - ╭ Log Details ─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab.snap new file mode 100644 index 0000000..b6347ad --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_empty.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_empty.snap new file mode 100644 index 0000000..aaa3add --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_empty.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading.snap new file mode 100644 index 0000000..006d829 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ Loading ... │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_events_and_tasks.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_events_and_tasks.snap new file mode 100644 index 0000000..cdcf0a2 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_events_and_tasks.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_logs.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_logs.snap new file mode 100644 index 0000000..a790318 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__radarr_ui_renders_system_tab_loading_logs.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap deleted file mode 100644 index 5e6d27d..0000000 --- a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_loading_state.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: src/ui/radarr_ui/system/system_ui_tests.rs -expression: output ---- -╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ -│ ││ │ -│ ││ │ -│ Loading ... ││ Loading ... │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ -╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ -│ │ -│ Loading ... │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap deleted file mode 100644 index 07cb0f2..0000000 --- a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__system_ui_renders_system_menu.snap +++ /dev/null @@ -1,34 +0,0 @@ ---- -source: src/ui/radarr_ui/system/system_ui_tests.rs -expression: output ---- -╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ -╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/system_details_ui_tests.rs b/src/ui/radarr_ui/system/system_details_ui_tests.rs index 771c933..f012196 100644 --- a/src/ui/radarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_details_ui_tests.rs @@ -9,7 +9,7 @@ mod tests { use crate::ui::DrawUi; use crate::ui::radarr_ui::system::system_details_ui::SystemDetailsUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_system_details_ui_accepts() { @@ -22,36 +22,67 @@ mod tests { }); } - #[test] - fn test_system_details_ui_renders_loading_tasks() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::SystemTasks.into()); + mod snapshot_tests { + use rstest::rstest; + use super::*; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - SystemDetailsUi::draw(f, app, f.area()); - }); + #[rstest] + fn test_system_details_ui_renders_tasks( + #[values( + ActiveRadarrBlock::SystemLogs, + ActiveRadarrBlock::SystemQueuedEvents, + ActiveRadarrBlock::SystemTasks, + ActiveRadarrBlock::SystemTaskStartConfirmPrompt, + ActiveRadarrBlock::SystemUpdates, + )] active_radarr_block: ActiveRadarrBlock + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); - insta::assert_snapshot!(output); - } + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); - #[test] - fn test_system_details_ui_renders_logs() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::SystemLogs.into()); - app.data.radarr_data.logs.set_items(vec![ - "2023-01-01T12:00:00Z | Info | Test log message 1" - .to_owned() - .into(), - "2023-01-01T12:01:00Z | Warn | Test warning message" - .to_owned() - .into(), - ]); + insta::assert_snapshot!(active_radarr_block.to_string(), output); + } - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - SystemDetailsUi::draw(f, app, f.area()); - }); + #[test] + fn test_system_details_ui_renders_tasks_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::SystemTasks.into()); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_details_ui_renders_queued_events_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::SystemQueuedEvents.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_details_ui_renders_logs_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveRadarrBlock::SystemLogs.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } } diff --git a/src/ui/radarr_ui/system/system_ui_tests.rs b/src/ui/radarr_ui/system/system_ui_tests.rs index 29e8902..52ea30e 100644 --- a/src/ui/radarr_ui/system/system_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_ui_tests.rs @@ -8,7 +8,7 @@ mod tests { }; use crate::ui::DrawUi; use crate::ui::radarr_ui::system::SystemUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_system_ui_accepts() { @@ -25,28 +25,78 @@ mod tests { }); } - #[test] - fn test_system_ui_renders_loading_state() { - let mut app = App::test_default(); - app.is_loading = true; - app.push_navigation_stack(ActiveRadarrBlock::System.into()); + mod snapshot_tests { + use super::*; + use crate::models::stateful_list::StatefulList; + use crate::models::stateful_table::StatefulTable; - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - SystemUi::draw(f, app, f.area()); - }); + #[test] + fn test_radarr_ui_renders_system_tab_loading() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + app.is_loading = true; - insta::assert_snapshot!(output); - } + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); - #[test] - fn test_system_ui_renders_system_menu() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveRadarrBlock::System.into()); + insta::assert_snapshot!(output); + } - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { - SystemUi::draw(f, app, f.area()); - }); + #[test] + fn test_radarr_ui_renders_system_tab_loading_logs() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + app.data.radarr_data.logs = StatefulList::default(); - insta::assert_snapshot!(output); + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_system_tab_loading_events_and_tasks() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + app.is_loading = true; + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_system_tab() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_system_tab_empty() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::System.into()); + { + let radarr_data = &mut app.data.radarr_data; + radarr_data.logs = StatefulList::default(); + radarr_data.tasks = StatefulTable::default(); + radarr_data.queued_events = StatefulTable::default(); + } + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } } diff --git a/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab.snap b/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab.snap new file mode 100644 index 0000000..8f537b7 --- /dev/null +++ b/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/ui_tests.rs +expression: output +--- +╭ Managarr - A Servarr management TUI ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Radarr │ Sonarr to open help│ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Stats ──────────────────────────────────────────────────────────────╮╭ Downloads ─────────────────────────────────────────────────────────╮╭──────────────────╮ +│Radarr Version: 1.2.3.4 ││Test Download Title ││ ⠀⣠⣶⢶⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀ │ +│Uptime: 0d 00:00:44 ││50% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━││ ⠀⣿⡇⠀⠈⠙⠻⢿⣶⣤⡀⠀⠀⠀⠀ │ +│Storage: ││ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⠈⠙⠻⢷⣦⡄⠀ │ +│Disk 1: 100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━││ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢉⠻⠀ │ +│Root Folders: ││ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⢀⣠⣴⣾⠿⠀⠀ │ +│/nfs: 204800.00 GB free ││ ││ ⠀⢿⡇⠀⠀⣀⣤⣶⡿⠛⠉⠀⠀⠀⠀ │ +│ ││ ││ ⠀⠀⠰⠶⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀ │ +│ ││ ││ │ +╰───────────────────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────────────────╯╰──────────────────╯ +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags │ +│=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_error_popup.snap b/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_error_popup.snap new file mode 100644 index 0000000..72a40f2 --- /dev/null +++ b/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_error_popup.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/ui_tests.rs +expression: output +--- +╭ Managarr - A Servarr management TUI ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Radarr │ Sonarr to open help│ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Stats ──────────────────────────────────────────────────────────────╮╭ Downloads ─────────────────────────────────────────────────────────╮╭──────────────────╮ +│Radarr Version: 1.2.3.4 ╭ Keybindings ──────────────────────────────────────────────────────────────────────────╮ ││ ⠀⣠⣶⢶⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀ │ +│Uptime: 0d 00:00:44 │ Key Alt Key Description │━━━━━━━━━━━━━━━━━││ ⠀⣿⡇⠀⠈⠙⠻⢿⣶⣤⡀⠀⠀⠀⠀ │ +│Storage: │=> a add │ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⠈⠙⠻⢷⣦⡄⠀ │ +│Disk 1: 100% ━━━━━━━━━━━━━━━━━━━━━━│ e edit │ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢉⠻⠀ │ +│Root Folders: │ m toggle monitoring │ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⢀⣠⣴⣾⠿⠀⠀ │ +│/nfs: 204800.00 GB free │ o sort │ ││ ⠀⢿⡇⠀⠀⣀⣤⣶⡿⠛⠉⠀⠀⠀⠀ │ +│ │ del delete │ ││ ⠀⠀⠰⠶⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀ │ +│ │ s search │ ││ │ +╰───────────────────────────────────│ f filter │─────────────────╯╰──────────────────╯ +╭ Movies ─────────────────────────│ ctrl-r refresh │─────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ u update all │ │ +│───────────────────────────────────│ enter details │─────────────────────────────────────│ +│ Title ▼ │ esc cancel filter │ofile Monitored Tags │ +│=> Test │ ↑ k scroll up │ 🏷 alex │ +│ │ ↓ j scroll down │ │ +│ │ ← h previous tab │ │ +│ │ → l next tab │ │ +│ │ pgUp ctrl-u page up │ │ +│ │ pgDown ctrl-d page down │ │ +│ │ tab next servarr │ │ +│ │ shift-tab previous servarr │ │ +│ │ q quit │ │ +│ │ ? show/hide keybindings │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰─────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_with_error.snap b/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_with_error.snap new file mode 100644 index 0000000..17602d3 --- /dev/null +++ b/src/ui/snapshots/managarr__ui__ui_tests__snapshot_tests__radarr_ui_renders_library_tab_with_error.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/ui_tests.rs +expression: output +--- +╭ Managarr - A Servarr management TUI ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Radarr │ Sonarr to open help│ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Error | to close ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│Some error │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Stats ──────────────────────────────────────────────────────────────╮╭ Downloads ─────────────────────────────────────────────────────────╮╭──────────────────╮ +│Radarr Version: 1.2.3.4 ││Test Download Title ││ ⠀⣠⣶⢶⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀ │ +│Uptime: 0d 00:00:44 ││50% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━││ ⠀⣿⡇⠀⠈⠙⠻⢿⣶⣤⡀⠀⠀⠀⠀ │ +│Storage: ││ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⠈⠙⠻⢷⣦⡄⠀ │ +│Disk 1: 100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━││ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⢉⠻⠀ │ +│Root Folders: ││ ││ ⠀⣿⡇⠀⠀⠀⠀⠀⢀⣠⣴⣾⠿⠀⠀ │ +│/nfs: 204800.00 GB free ││ ││ ⠀⢿⡇⠀⠀⣀⣤⣶⡿⠛⠉⠀⠀⠀⠀ │ +│ ││ ││ ⠀⠀⠰⠶⡿⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀ │ +│ ││ ││ │ +╰───────────────────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────────────────╯╰──────────────────╯ +╭ Movies ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Collections │ Downloads │ Blocklist │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title ▼ Year Studio Runtime Rating Language Size Quality Profile Monitored Tags │ +│=> Test 2023 21st Century Alex 2h 0m R English 3.30 GB HD - 1080p 🏷 alex │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs index 24dca2a..d04e2ef 100644 --- a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs @@ -22,6 +22,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -30,7 +32,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { BlocklistUi::draw(f, app, f.area()); }); @@ -43,7 +45,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); app.data.sonarr_data.blocklist = StatefulTable::default(); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { BlocklistUi::draw(f, app, f.area()); }); @@ -68,7 +70,7 @@ mod tests { }, ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { BlocklistUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap index c6e9881..c19fb22 100644 --- a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap @@ -2,4 +2,4 @@ source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap index b9c1bf4..1d93026 100644 --- a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap index 80e2649..42522b0 100644 --- a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Series Title Source Title Language Quality Date -=> Test.Series.S01E01.1080p 1970-01-01 00:00:0 - Another.Series.S02E05.720p 1970-01-01 00:00:0 +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Series Title Source Title Language Quality Date +=> Test.Series.S01E01.1080p 1970-01-01 00:00:00 UTC + Another.Series.S02E05.720p 1970-01-01 00:00:00 UTC diff --git a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs index 1659ebd..b6a7b82 100644 --- a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs @@ -22,6 +22,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -30,7 +32,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { DownloadsUi::draw(f, app, f.area()); }); @@ -43,7 +45,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); app.data.sonarr_data.downloads = StatefulTable::default(); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { DownloadsUi::draw(f, app, f.area()); }); @@ -74,7 +76,7 @@ mod tests { }, ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { DownloadsUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap index cfe9f6d..c42cac3 100644 --- a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_empty_downloads.snap @@ -2,4 +2,4 @@ source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap index 7c27b2f..080e4fa 100644 --- a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap index 3c6eafc..06fb5ed 100644 --- a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Title Percent Compl Size Output Path Indexer Download Client -=> Test Series Download 50% 1.00 GB - Another Series Download 100% 2.00 GB +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Complete Size Output Path Indexer Download Client +=> Test Series Download 50% 1.00 GB + Another Series Download 100% 2.00 GB diff --git a/src/ui/sonarr_ui/history/history_ui_tests.rs b/src/ui/sonarr_ui/history/history_ui_tests.rs index fa1919c..9c519d1 100644 --- a/src/ui/sonarr_ui/history/history_ui_tests.rs +++ b/src/ui/sonarr_ui/history/history_ui_tests.rs @@ -22,6 +22,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -30,7 +32,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::History.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { HistoryUi::draw(f, app, f.area()); }); @@ -43,7 +45,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::History.into()); app.data.sonarr_data.history = StatefulTable::default(); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { HistoryUi::draw(f, app, f.area()); }); @@ -68,7 +70,7 @@ mod tests { }, ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { HistoryUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap index bb3846a..3cc6564 100644 --- a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap @@ -2,4 +2,4 @@ source: src/ui/sonarr_ui/history/history_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap index a7e7f8e..7d88e78 100644 --- a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/history/history_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap index 73bece9..ff6f39f 100644 --- a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/history/history_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Source Title Event Type Language Quality Date -=> Test.Series.S01E01 unknown 1970-01-01 00:00:00 UTC - Another.Series.S02E05 unknown 1970-01-01 00:00:00 UTC +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title Event Type Language Quality Date +=> Test.Series.S01E01 unknown 1970-01-01 00:00:00 UTC + Another.Series.S02E05 unknown 1970-01-01 00:00:00 UTC diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs index 7d7fe58..e53fbf0 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs @@ -27,6 +27,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -59,7 +61,7 @@ mod tests { BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); app.data.sonarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.sonarr_data)); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EditIndexerUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs index bc86f32..26b0e08 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs @@ -24,6 +24,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -34,7 +36,7 @@ mod tests { BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); app.data.sonarr_data.indexer_settings = Some(IndexerSettings::default()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexerSettingsUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs index 5a55253..72c3bf6 100644 --- a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs @@ -30,6 +30,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -38,7 +40,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexersUi::draw(f, app, f.area()); }); @@ -51,7 +53,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); app.data.sonarr_data.indexers = StatefulTable::default(); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexersUi::draw(f, app, f.area()); }); @@ -81,7 +83,7 @@ mod tests { }, ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexersUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap index 4e928f8..2491012 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap @@ -2,26 +2,41 @@ source: src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs expression: output --- - - - - - - - - - ╭───────────────────────────────── Edit Indexer ─────────────────────────────────╮ - │ │ - │ ╭─────────────────╮ ╭─────────────────╮ │ - │ Name: ╰─────────────────╯ URL: ╰─────────────────╯ │ - │ ╭───╮ ╭─────────────────╮ │ - │ ╭───╮ API Key: ╰─────────────────╯ │ - │ Enable Automatic Se╰───╯ ╭─────────────────╮ │ - │ ╭───╮ Tags: ╰─────────────────╯ │ - │ ╭─────────────────╮ │ - │ Indexer Priority ▴▾╰─────────────────╯ │ - │ │ - │ ╭──────────────────╮╭───────────────────╮ │ - │ │ Save ││ Cancel │ │ - │ ╰──────────────────╯╰───────────────────╯ │ - ╰──────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Name: │Test Indexer │ URL: │https://test.indexer.com │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable RSS: │ ✔ │ API Key: │test-api-key │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Automatic Search: │ │ Tags: │ │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Interactive Search: │ │ Indexer Priority ▴▾: │25 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap index 157c634..f2cf85f 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap @@ -2,25 +2,39 @@ source: src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs expression: output --- - - - - - - - - - ╭───────── Configure All Indexer Settings ─────────╮ - │ ╭───────────────────────╮ │ - │Minimum Age (minutes) ▴▾:│0 │ │ - │ ╰───────────────────────╯ │ - │ ╭───────────────────────╮ │ - │ Retention (days) ▴▾: │0 │ │ - │ ╰───────────────────────╯ │ - │ ╭───────────────────────╮ │ - │ Maximum Size (MB) ▴▾: │0 │ │ - │ ╰───────────────────────╯ │ - │ ╭───────────────────────╮ │ - │RSS Sync Interval (minute│0 │ │ - │ ╰───────────────────────╯ │ - ╰────────────────────────────────────────────────────╯ + + + + + + + + + + + + + + + ╭─────────────────── Configure All Indexer Settings ───────────────────╮ + │ │ + │ │ + │ │ + │ ╭────────────────────────────────╮ │ + │ Minimum Age (minutes) ▴▾: │0 │ │ + │ ╰────────────────────────────────╯ │ + │ ╭────────────────────────────────╮ │ + │ Retention (days) ▴▾: │0 │ │ + │ ╰────────────────────────────────╯ │ + │ ╭────────────────────────────────╮ │ + │ Maximum Size (MB) ▴▾: │0 │ │ + │ ╰────────────────────────────────╯ │ + │ ╭────────────────────────────────╮ │ + │ RSS Sync Interval (minutes) ▴▾: │0 │ │ + │ ╰────────────────────────────────╯ │ + │ │ + │ │ + │ ╭────────────────╮╭────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰────────────────╯╰────────────────╯ │ + ╰────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap index df13382..fc61280 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_empty_indexers.snap @@ -2,4 +2,4 @@ source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap index cb64756..7a8ba71 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap index 1af1435..e07f3a5 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Indexer RSS Automatic Search Interactive Sea Priority Tags -=> Test Indexer 1 Enabled Enabled Enabled 25 - Test Indexer 2 Disabled Disabled Disabled 0 +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer 1 Enabled Enabled Enabled 25 + Test Indexer 2 Disabled Disabled Disabled 0 diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap index 4e377fd..25b7593 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs expression: output --- - - - - - ╭ Test All Indexers ───────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Test All Indexers ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs index 6629ebf..f8152da 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -20,6 +20,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -28,7 +30,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::TestAllIndexers.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { TestAllIndexersUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/add_series_ui_tests.rs b/src/ui/sonarr_ui/library/add_series_ui_tests.rs index 5a3eef0..f907de4 100644 --- a/src/ui/sonarr_ui/library/add_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/add_series_ui_tests.rs @@ -21,6 +21,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -30,7 +32,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into()); app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { AddSeriesUi::draw(f, app, f.area()); }); @@ -43,7 +45,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into()); app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { AddSeriesUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs index 57a904f..18243bd 100644 --- a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs @@ -25,6 +25,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -40,7 +42,7 @@ mod tests { app.data.sonarr_data.selected_block = BlockSelectionState::new(DELETE_SERIES_SELECTION_BLOCKS); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { DeleteSeriesUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs index 0961a0e..1bc62f3 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs @@ -27,6 +27,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -48,7 +50,7 @@ mod tests { app.data.sonarr_data.selected_block = BlockSelectionState::new(EDIT_SERIES_SELECTION_BLOCKS); app.data.sonarr_data.edit_series_modal = Some(EditSeriesModal::from(&app.data.sonarr_data)); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EditSeriesUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs index 699cef2..d74f2fb 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs @@ -25,6 +25,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -41,7 +43,7 @@ mod tests { ..Series::default() }]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EpisodeDetailsUi::draw(f, app, f.area()); }); @@ -67,7 +69,7 @@ mod tests { season_details_modal.episode_details_modal = Some(EpisodeDetailsModal::default()); app.data.sonarr_data.season_details_modal = Some(season_details_modal); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EpisodeDetailsUi::draw(f, app, f.area()); }); @@ -95,7 +97,7 @@ mod tests { season_details_modal.episode_details_modal = Some(episode_details_modal); app.data.sonarr_data.season_details_modal = Some(season_details_modal); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EpisodeDetailsUi::draw(f, app, f.area()); }); @@ -123,7 +125,7 @@ mod tests { season_details_modal.episode_details_modal = Some(episode_details_modal); app.data.sonarr_data.season_details_modal = Some(season_details_modal); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EpisodeDetailsUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/library_ui_tests.rs b/src/ui/sonarr_ui/library/library_ui_tests.rs index 98cf71b..5d5cc2a 100644 --- a/src/ui/sonarr_ui/library/library_ui_tests.rs +++ b/src/ui/sonarr_ui/library/library_ui_tests.rs @@ -254,7 +254,7 @@ mod tests { use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::LibraryUi; - use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; #[test] fn test_library_ui_renders_loading_state() { @@ -262,7 +262,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { LibraryUi::draw(f, app, f.area()); }); @@ -275,7 +275,80 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::Series.into()); app.data.sonarr_data.series = StatefulTable::default(); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_with_series() { + use crate::models::sonarr_models::{Series, SeriesStatus, SeriesType}; + use crate::models::stateful_table::StatefulTable; + use bimap::BiMap; + + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + + // Set up quality profile and language profile maps + let mut quality_profile_map = BiMap::new(); + quality_profile_map.insert(1, "HD-1080p".to_owned()); + quality_profile_map.insert(2, "Any".to_owned()); + app.data.sonarr_data.quality_profile_map = quality_profile_map; + + let mut language_profiles_map = BiMap::new(); + language_profiles_map.insert(1, "English".to_owned()); + language_profiles_map.insert(2, "Any".to_owned()); + app.data.sonarr_data.language_profiles_map = language_profiles_map; + + // Create series with data + let mut series_table = StatefulTable::default(); + series_table.set_items(vec![ + Series { + id: 1, + title: "Breaking Bad".into(), + year: 2008, + network: Some("AMC".to_owned()), + status: SeriesStatus::Ended, + monitored: true, + series_type: SeriesType::Standard, + quality_profile_id: 1, + language_profile_id: 1, + seasons: Some(vec![]), + ..Series::default() + }, + Series { + id: 2, + title: "The Wire".into(), + year: 2002, + network: Some("HBO".to_owned()), + status: SeriesStatus::Continuing, + monitored: true, + series_type: SeriesType::Standard, + quality_profile_id: 2, + language_profile_id: 1, + seasons: Some(vec![]), + ..Series::default() + }, + ]); + app.data.sonarr_data.series = series_table; + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_update_all_series_prompt() { + let mut app = App::test_default(); + app.push_navigation_stack(ActiveSonarrBlock::Series.into()); + app.push_navigation_stack(ActiveSonarrBlock::UpdateAllSeriesPrompt.into()); + app.data.sonarr_data.series = StatefulTable::default(); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { LibraryUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/season_details_ui_tests.rs b/src/ui/sonarr_ui/library/season_details_ui_tests.rs index 1bb7569..c0a5ad9 100644 --- a/src/ui/sonarr_ui/library/season_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/season_details_ui_tests.rs @@ -29,6 +29,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -42,7 +44,7 @@ mod tests { ..Series::default() }]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); }); @@ -59,7 +61,7 @@ mod tests { ..Series::default() }]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); }); @@ -98,7 +100,7 @@ mod tests { .set_items(vec![SonarrRelease::default()]); app.data.sonarr_data.season_details_modal = Some(season_details_modal); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); }); @@ -137,7 +139,7 @@ mod tests { .set_items(vec![SonarrHistoryItem::default()]); app.data.sonarr_data.season_details_modal = Some(season_details_modal); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/series_details_ui_tests.rs b/src/ui/sonarr_ui/library/series_details_ui_tests.rs index 69cd1a1..16de0b8 100644 --- a/src/ui/sonarr_ui/library/series_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/series_details_ui_tests.rs @@ -29,6 +29,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -49,7 +51,7 @@ mod tests { }]); app.data.sonarr_data.series_history = Some(StatefulTable::default()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeriesDetailsUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap index 6253724..747e047 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap @@ -2,28 +2,46 @@ source: src/ui/sonarr_ui/library/add_series_ui_tests.rs expression: output --- - - - - - - ╭──────────────────────────────────── Add Series ────────────────────────────────────╮ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╭──────────────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + + ╭───────────────────────────────────────────────────── Add Series ─────────────────────────────────────────────────────╮ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap index 6253724..747e047 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap @@ -2,28 +2,46 @@ source: src/ui/sonarr_ui/library/add_series_ui_tests.rs expression: output --- - - - - - - ╭──────────────────────────────────── Add Series ────────────────────────────────────╮ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ - ╭──────────────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰──────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + + ╭───────────────────────────────────────────────────── Add Series ─────────────────────────────────────────────────────╮ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap index 87ec34a..e75cc87 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap @@ -2,23 +2,37 @@ source: src/ui/sonarr_ui/library/delete_series_ui_tests.rs expression: output --- - - - - - - - - - - ╭───────────── Delete Series ─────────────╮ - │ Do you really want to delete the series: │ - │ Test Series? │ - │ │ - │ ╭───╮ │ - │ Delete Series File: │ │ │ - │ ╰───╯ │ - │ ╭───╮ │ - │ Add List Exclusion: │ │ │ - │ ╰───╯ │ - ╰───────────────────────────────────────────╯ + + + + + + + + + + + + + + + + + ╭───────────────────── Delete Series ─────────────────────╮ + │ Do you really want to delete the series: │ + │ Test Series? │ + │ │ + │ │ + │ ╭───╮ │ + │ Delete Series File: │ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Add List Exclusion: │ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap index bc745af..062dec1 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs expression: output --- - - - - - ╭─────────────────────────── Edit - Test Series ───────────────────────────╮ - │ │ - │ │ - │ │ - │ ╭───╮ │ - │ Monitored: ╰───╯ │ - │ ╭───╮ │ - │ Season Folder: │ │ │ - │ ╰───╯ │ - │ ╭───────────────────────────────────╮ │ - │ Quality Profile: ╰───────────────────────────────────╯ │ - │ ╭───────────────────────────────────╮ │ - │ Language Profile: │English ▼ │ │ - │ ╰───────────────────────────────────╯ │ - │ ╭───────────────────────────────────╮ │ - │ Series Type: ╰───────────────────────────────────╯ │ - │ ╭───────────────────────────────────╮ │ - │ Path: │/tv/test │ │ - │ ╰───────────────────────────────────╯ │ - │ ╭───────────────────────────────────╮ │ - │ Tags: ╰───────────────────────────────────╯ │ - ╰────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭───────────────────────────────────────── Edit - Test Series ──────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ │ │ + │ ╰───╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Quality Profile: │HD-1080p ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Language Profile: │English ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Series Type: │Standard ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Path: │/tv/test │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Tags: │ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap index e00c67d..3175a60 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs expression: output --- - - - - - ╭ Episode Details ─────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Manual Search │ - │────────────────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap index e00c67d..3175a60 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs expression: output --- - - - - - ╭ Episode Details ─────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Manual Search │ - │────────────────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap index 7e37133..a1074e1 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs expression: output --- - - - - - ╭ Episode Details ─────────────────────────────────────────────────────────────────────╮ - │ Details │ History │ File │ Manual Search │ - │────────────────────────────────────────────────────────────────────────────────────────│ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap index efada52..ad20c30 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap @@ -2,4 +2,4 @@ source: src/ui/sonarr_ui/library/library_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap index 7d08204..c229cc2 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/library/library_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap new file mode 100644 index 0000000..8453ef9 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + + + + + + + + + + + + + + ╭─────────────────── Update All Series ───────────────────╮ + │ Do you want to update info and scan your disks for all of │ + │ your series? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap new file mode 100644 index 0000000..b9edd92 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap @@ -0,0 +1,8 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Breaking Bad 2008 AMC Ended Standard HD-1080p English 0.00 GB 🏷 + The Wire 2002 HBO Continuin Standard Any English 0.00 GB 🏷 diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap index 9b59779..d1570e6 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap @@ -2,30 +2,49 @@ source: src/ui/sonarr_ui/library/season_details_ui_tests.rs expression: output --- - - - ╭ Season 0 Details ─────────────────────────────────────────────────────────────────────────────╮ - │ Episodes │ History │ Manual Search │ - │─────────────────────────────────────────────────────────────────────────────────────────────────│ - │ Source Age ⛔ Title Indexer Size Peers Languag Quality│ - │=> 0 days 0.0 GB │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + ╭ Season 0 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Age ⛔ Title Indexer Size Peers Language Quality │ + │=> 0 days 0.0 GB │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap index abfe70d..83c8c02 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap @@ -2,30 +2,49 @@ source: src/ui/sonarr_ui/library/season_details_ui_tests.rs expression: output --- - - - ╭ Season 0 Details ─────────────────────────────────────────────────────────────────────────────╮ - │ Episodes │ History │ Manual Search │ - │─────────────────────────────────────────────────────────────────────────────────────────────────│ - │ Source Title Event Type Language Quality Date │ - │=> unknown 1970-01-01 00:00:00│ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + ╭ Season 0 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Language Quality Date │ + │=> unknown 1970-01-01 00:00:00 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap index 1e405e4..0cf0b76 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap @@ -2,32 +2,51 @@ source: src/ui/sonarr_ui/library/series_details_ui_tests.rs expression: output --- - - - ╭ Test Series ───────────────────────────────────────────────────────────────────────────────────────────╮ - │Title: Test Series │ - │Overview: │ - │Network: │ - │Status: Continuing │ - │Genres: │ - │Rating: 0% │ - │Year: 0 │ - │Runtime: 0 minutes │ - │Path: │ - │╭ Series Details ──────────────────────────────────────────────────────────────────────────────────────╮│ - ││ Seasons │ History ││ - ││────────────────────────────────────────────────────────────────────────────────────────────────────────││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - ││ ││ - │╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ - ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + + + + ╭ Test Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test Series │ + │Overview: │ + │Network: │ + │Status: Continuing │ + │Genres: │ + │Rating: 0% │ + │Year: 0 │ + │Runtime: 0 minutes │ + │Path: │ + │Quality Profile: HD-1080p │ + │Language Profile: English │ + │Monitored: No │ + │ │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs index c26d0eb..6268ebd 100644 --- a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs @@ -23,6 +23,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -31,7 +33,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RootFoldersUi::draw(f, app, f.area()); }); @@ -44,7 +46,7 @@ mod tests { app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); app.data.sonarr_data.root_folders = StatefulTable::default(); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RootFoldersUi::draw(f, app, f.area()); }); @@ -71,7 +73,7 @@ mod tests { }, ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RootFoldersUi::draw(f, app, f.area()); }); @@ -85,7 +87,7 @@ mod tests { app.data.sonarr_data.root_folders = StatefulTable::default(); app.data.sonarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RootFoldersUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap index 7ac5efc..04ed9ac 100644 --- a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap @@ -2,19 +2,30 @@ source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - - - - - - - - - - - - - ╭────── Add Root Folder ───────╮ - cancel +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + + + + + + + + + + + + + + + + + + + + + ╭───────────── Add Root Folder ─────────────╮ + │ │ + ╰─────────────────────────────────────────────╯ + cancel diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap index 4b473dd..a0ffd33 100644 --- a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_empty_root_folders.snap @@ -2,4 +2,4 @@ source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap index fc3627f..c3709be 100644 --- a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + Loading ... diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap index 460ffcd..7dbd5f6 100644 --- a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap @@ -2,7 +2,7 @@ source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- -──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Path Free Space Unmapped Folders -=> /tv 100.00 GB 0 - /media/tv 50.00 GB 0 +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /tv 100.00 GB 0 + /media/tv 50.00 GB 0 diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap index 058ce75..52d8201 100644 --- a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap @@ -2,33 +2,53 @@ source: src/ui/sonarr_ui/sonarr_ui_tests.rs expression: output --- -╭ Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ -│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap index 058ce75..52d8201 100644 --- a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap @@ -2,33 +2,53 @@ source: src/ui/sonarr_ui/sonarr_ui_tests.rs expression: output --- -╭ Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ -│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap index 89b03f7..f8e5e47 100644 --- a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap @@ -2,33 +2,53 @@ source: src/ui/sonarr_ui/sonarr_ui_tests.rs expression: output --- -╭ Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ -│──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ Title Year Network Status Rating Type Quality Prof Language Size Monitor Tags │ -│=> Test Series 0 Contin Standar Any English 0.00 GB │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title Year Network Status Rating Type Quality Profile Language Size Monitored Tags │ +│=> Test Series 0 Continuin Standard Any English 0.00 GB │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/sonarr_ui_tests.rs b/src/ui/sonarr_ui/sonarr_ui_tests.rs index 8e14050..14c89f7 100644 --- a/src/ui/sonarr_ui/sonarr_ui_tests.rs +++ b/src/ui/sonarr_ui/sonarr_ui_tests.rs @@ -21,6 +21,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -51,7 +53,7 @@ mod tests { }, ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SonarrUi::draw(f, app, f.area()); }); @@ -73,7 +75,7 @@ mod tests { .history .set_items(vec![SonarrHistoryItem::default()]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SonarrUi::draw(f, app, f.area()); }); @@ -96,7 +98,7 @@ mod tests { ..Series::default() }]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SonarrUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap index 2434403..f6364ff 100644 --- a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/system/system_details_ui_tests.rs expression: output --- - - - - - ╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ Loading ... │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap index 44f2238..679fc1d 100644 --- a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/system/system_details_ui_tests.rs expression: output --- - - - - - ╭ Log Details ─────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap index 2c7c537..9a7d336 100644 --- a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap @@ -2,29 +2,47 @@ source: src/ui/sonarr_ui/system/system_details_ui_tests.rs expression: output --- - - - - - ╭ Tasks ───────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - │ │ - ╰────────────────────────────────────────────────────────────────────────────────────────╯ + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Name Interval Last Execution Next Execution │ + │=> Refresh Series 6 hours 2 hours ago 3 hours │ + │ Check for Updates 1 day 12 hours ago 11 hours │ + │ Housekeeping 1 day 1 day ago now │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap index 643dfb2..c7ce3d6 100644 --- a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap @@ -2,33 +2,53 @@ source: src/ui/sonarr_ui/system/system_ui_tests.rs expression: output --- -╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ -│ ││ │ -│ ││ │ -│ Loading ... ││ Loading ... │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ -╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ -│ │ -│ Loading ... │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ Loading ... │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap index e98cdea..feabe8e 100644 --- a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap @@ -2,33 +2,53 @@ source: src/ui/sonarr_ui/system/system_ui_tests.rs expression: output --- -╭ Tasks ─────────────────────────────────────────────────╮╭ Queued Events ─────────────────────────────────────────╮ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -│ ││ │ -╰──────────────────────────────────────────────────────────╯╰──────────────────────────────────────────────────────────╯ -╭ Logs ──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/system_details_ui_tests.rs b/src/ui/sonarr_ui/system/system_details_ui_tests.rs index d270e37..a30cabb 100644 --- a/src/ui/sonarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_details_ui_tests.rs @@ -24,6 +24,10 @@ mod tests { mod snapshot_tests { use super::*; + use crate::models::sonarr_models::{SonarrTask, SonarrTaskName}; + use crate::models::stateful_table::StatefulTable; + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use chrono::{Duration, Utc}; #[test] fn test_system_details_ui_renders_loading_tasks() { @@ -31,7 +35,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemDetailsUi::draw(f, app, f.area()); }); @@ -51,7 +55,7 @@ mod tests { .into(), ]); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemDetailsUi::draw(f, app, f.area()); }); @@ -63,7 +67,34 @@ mod tests { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let now = Utc::now(); + let mut tasks = StatefulTable::default(); + tasks.set_items(vec![ + SonarrTask { + name: "Refresh Series".to_owned(), + task_name: SonarrTaskName::RefreshSeries, + interval: 360, + last_execution: now - Duration::hours(2), + next_execution: now + Duration::hours(4), + }, + SonarrTask { + name: "Check for Updates".to_owned(), + task_name: SonarrTaskName::ApplicationUpdateCheck, + interval: 1440, + last_execution: now - Duration::hours(12), + next_execution: now + Duration::hours(12), + }, + SonarrTask { + name: "Housekeeping".to_owned(), + task_name: SonarrTaskName::Housekeeping, + interval: 1440, + last_execution: now - Duration::hours(24), + next_execution: now, + }, + ]); + app.data.sonarr_data.tasks = tasks; + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemDetailsUi::draw(f, app, f.area()); }); diff --git a/src/ui/sonarr_ui/system/system_ui_tests.rs b/src/ui/sonarr_ui/system/system_ui_tests.rs index 6234e1d..8450d11 100644 --- a/src/ui/sonarr_ui/system/system_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_ui_tests.rs @@ -26,6 +26,8 @@ mod tests { } mod snapshot_tests { + use crate::ui::ui_test_utils::test_utils::TerminalSize; + use super::*; #[test] @@ -34,7 +36,7 @@ mod tests { app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::System.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemUi::draw(f, app, f.area()); }); @@ -46,7 +48,7 @@ mod tests { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::System.into()); - let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemUi::draw(f, app, f.area()); }); diff --git a/src/ui/ui_test_utils.rs b/src/ui/ui_test_utils.rs index 6e950a1..8d27079 100644 --- a/src/ui/ui_test_utils.rs +++ b/src/ui/ui_test_utils.rs @@ -1,6 +1,8 @@ #[cfg(test)] #[allow(dead_code)] pub mod test_utils { + use std::cell::Cell; + use chrono::DateTime; use ratatui::Frame; use ratatui::Terminal; use ratatui::backend::TestBackend; @@ -8,6 +10,29 @@ pub mod test_utils { use crate::app::App; + thread_local! { + static TIMESTAMP: Cell = const { Cell::new(0) }; + } + + pub struct Utc; + + impl Utc { + pub fn now() -> DateTime { + + TIMESTAMP.with(|timestamp| { + let ts = timestamp.get(); + DateTime::::from_timestamp( + if ts != 0 { ts } else { 1684618200 }, + 0, + )} + ).expect("a valid timestamp set") + } + } + + pub fn set_timestamp(timestamp: i64) { + TIMESTAMP.set(timestamp / 1000); + } + pub fn create_test_backend(width: u16, height: u16) -> TestBackend { TestBackend::new(width, height) } @@ -17,23 +42,39 @@ pub mod test_utils { Terminal::new(backend).unwrap() } + pub enum TerminalSize { + Small, + Medium, + Large, + } + + impl TerminalSize { + pub fn to_cartesian(&self) -> (u16, u16) { + match self { + Self::Small => (80, 30), + Self::Medium => (120, 40), + Self::Large => (165, 50), + } + } + } + /// Renders a UI component and returns the output as a string /// /// # Arguments - /// * `width` - Terminal width in columns - /// * `height` - Terminal height in rows + /// * `size` - Terminal T-shirt size (Small, Medium, or Large) /// * `render_fn` - Function that renders to the frame /// /// # Example /// ```rust - /// let output = render_to_string(120, 30, |f| { + /// let output = render_to_string(TerminalSize::Medium, |f| { /// Block::default().title("Test").render(f.area(), f.buffer_mut()); /// }); /// ``` - pub fn render_to_string(width: u16, height: u16, mut render_fn: F) -> String + pub fn render_to_string(size: TerminalSize, mut render_fn: F) -> String where F: FnMut(&mut Frame), { + let (width, height) = size.to_cartesian(); let mut terminal = create_test_terminal(width, height); terminal @@ -50,8 +91,7 @@ pub mod test_utils { /// This is the primary helper for testing UI components that need app state. /// /// # Arguments - /// * `width` - Terminal width in columns (typically 120) - /// * `height` - Terminal height in rows (typically 30) + /// * `size` - Terminal T-shirt size (Small, Medium, or Large) /// * `app` - Mutable reference to App instance /// * `render_fn` - Function that renders to the frame with app /// @@ -60,21 +100,17 @@ pub mod test_utils { /// let mut app = App::test_default(); /// app.push_navigation_stack(ActiveRadarrBlock::Movies.into()); /// - /// let output = render_to_string_with_app(120, 30, &mut app, |f, app| { + /// let output = render_to_string_with_app(TerminalSize::Medium, &mut app, |f, app| { /// LibraryUi::draw(f, app, f.area()); /// }); /// /// insta::assert_snapshot!(output); /// ``` - pub fn render_to_string_with_app( - width: u16, - height: u16, - app: &mut App, - mut render_fn: F, - ) -> String + pub fn render_to_string_with_app(size: TerminalSize, app: &mut App, mut render_fn: F) -> String where F: FnMut(&mut Frame, &mut App), { + let (width, height) = size.to_cartesian(); let mut terminal = create_test_terminal(width, height); terminal diff --git a/src/ui/ui_tests.rs b/src/ui/ui_tests.rs new file mode 100644 index 0000000..765305e --- /dev/null +++ b/src/ui/ui_tests.rs @@ -0,0 +1,85 @@ +#[cfg(test)] +mod snapshot_tests { + use crate::app::App; + use crate::handlers::populate_keymapping_table; + use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::ui; + use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; + + #[test] + fn test_radarr_ui_renders_library_tab() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveRadarrBlock::default().into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + ui(f, app); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_library_tab_with_error() { + let mut app = App::test_default_fully_populated(); + app.error = "Some error".into(); + app.push_navigation_stack(ActiveRadarrBlock::default().into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + ui(f, app); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_radarr_ui_renders_library_tab_error_popup() { + let mut app = App::test_default_fully_populated(); + populate_keymapping_table(&mut app); + app.push_navigation_stack(ActiveRadarrBlock::default().into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + ui(f, app); + }); + + insta::assert_snapshot!(output); + } + + // TODO after adding fully populated Sonarr data + // #[test] + // fn test_sonarr_ui_renders_library_tab() { + // let mut app = App::test_default_fully_populated(); + // app.push_navigation_stack(ActiveSonarrBlock::default().into()); + // + // let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + // ui(f, app); + // }); + // + // insta::assert_snapshot!(output); + // } + // + // #[test] + // fn test_sonarr_ui_renders_library_tab_with_error() { + // let mut app = App::test_default_fully_populated(); + // app.push_navigation_stack(ActiveSonarrBlock::default().into()); + // app.error = "Some error".into(); + // + // let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + // ui(f, app); + // }); + // + // insta::assert_snapshot!(output); + // } + // + // #[test] + // fn test_sonarr_ui_renders_library_tab_error_popup() { + // let mut app = App::test_default_fully_populated(); + // populate_keymapping_table(&mut app); + // app.push_navigation_stack(ActiveSonarrBlock::default().into()); + // + // let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + // ui(f, app); + // }); + // + // insta::assert_snapshot!(output); + // } +} From aadd6c8abfbe07477dfb1349f074812c89dfa584 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 20:17:28 -0700 Subject: [PATCH 25/28] fix: Fixed an issue with the Managarr table that would incorrectly try to display things before is_loading was ready --- src/ui/widgets/managarr_table.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/widgets/managarr_table.rs b/src/ui/widgets/managarr_table.rs index 54162ac..a56d677 100644 --- a/src/ui/widgets/managarr_table.rs +++ b/src/ui/widgets/managarr_table.rs @@ -122,7 +122,7 @@ where }; let loading_block = LoadingBlock::new(self.is_loading, self.block.clone()); - if let Some(content) = self.content { + if let Some(content) = self.content && !self.is_loading { let (table_contents, table_state) = if content.filtered_items.is_some() { ( content.filtered_items.as_ref().unwrap(), From c072c57bbb580155abe2977586aa9642ba50d947 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 20:18:28 -0700 Subject: [PATCH 26/28] style: Applied uniform formatting across all new UI test files --- src/app/mod.rs | 16 ++-- .../radarr_network_test_utils.rs | 4 +- .../radarr_ui/blocklist/blocklist_ui_tests.rs | 13 +-- .../collection_details_ui_tests.rs | 13 +-- .../collections/collections_ui_tests.rs | 52 +++++++--- .../collections/edit_collection_ui_tests.rs | 83 ++++++++++++---- src/ui/radarr_ui/collections/mod.rs | 4 +- .../radarr_ui/downloads/downloads_ui_tests.rs | 7 +- .../indexers/edit_indexer_ui_tests.rs | 6 +- .../indexers/indexer_settings_ui_tests.rs | 5 +- .../radarr_ui/indexers/indexers_ui_tests.rs | 2 +- .../radarr_ui/library/add_movie_ui_tests.rs | 47 ++++++--- .../library/delete_movie_ui_tests.rs | 2 +- .../radarr_ui/library/edit_movie_ui_tests.rs | 37 +++++-- src/ui/radarr_ui/library/library_ui_tests.rs | 42 ++++---- .../library/movie_details_ui_tests.rs | 96 +++++++++++++++---- src/ui/radarr_ui/mod.rs | 4 +- src/ui/radarr_ui/radarr_ui_tests.rs | 2 +- .../root_folders/root_folders_ui_tests.rs | 9 +- src/ui/radarr_ui/system/mod.rs | 4 +- .../system/system_details_ui_tests.rs | 9 +- src/ui/ui_test_utils.rs | 16 ++-- src/ui/widgets/managarr_table.rs | 4 +- 23 files changed, 337 insertions(+), 140 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index 04295ce..5a04ac4 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -30,11 +30,11 @@ use { crate::models::servarr_data::radarr::modals::{ EditCollectionModal, EditMovieModal, MovieDetailsModal, }, + crate::models::stateful_table::SortOption, crate::network::radarr_network::radarr_network_test_utils::test_utils::*, chrono::DateTime, - strum::IntoEnumIterator, std::fmt::Debug, - crate::models::stateful_table::SortOption + strum::IntoEnumIterator, }; #[cfg(test)] @@ -50,9 +50,9 @@ macro_rules! sort_option { ($field:ident) => { SortOption { name: "Something", - cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)) + cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)), } - } + }; } pub struct App<'a> { @@ -386,7 +386,9 @@ impl App<'_> { movie_details_modal .movie_releases .set_items(vec![torrent_release(), usenet_release()]); - movie_details_modal.movie_releases.sorting(vec![sort_option!(indexer_id)]); + movie_details_modal + .movie_releases + .sorting(vec![sort_option!(indexer_id)]); let mut radarr_data = RadarrData { disk_space_vec: vec![diskspace()], @@ -418,7 +420,9 @@ impl App<'_> { radarr_data.collections.sorting(vec![sort_option!(id)]); radarr_data.collections.search = Some("Something".into()); radarr_data.collections.filter = Some("Something".into()); - radarr_data.collection_movies.set_items(vec![collection_movie()]); + radarr_data + .collection_movies + .set_items(vec![collection_movie()]); radarr_data.downloads.set_items(vec![download_record()]); radarr_data.blocklist.set_items(vec![blocklist_item()]); radarr_data.blocklist.sorting(vec![sort_option!(id)]); diff --git a/src/network/radarr_network/radarr_network_test_utils.rs b/src/network/radarr_network/radarr_network_test_utils.rs index 8fd4893..c8f26af 100644 --- a/src/network/radarr_network/radarr_network_test_utils.rs +++ b/src/network/radarr_network/radarr_network_test_utils.rs @@ -162,9 +162,7 @@ pub mod test_utils { } pub fn percentage_rating() -> Rating { - Rating { - value: 99.into(), - } + Rating { value: 99.into() } } pub fn ratings_list() -> RatingsList { diff --git a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs index 9e36ee9..553a4a5 100644 --- a/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/radarr_ui/blocklist/blocklist_ui_tests.rs @@ -20,8 +20,8 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; @@ -53,11 +53,12 @@ mod tests { #[rstest] fn test_blocklist_ui_renders_blocklist_tab( #[values( - ActiveRadarrBlock::Blocklist, - ActiveRadarrBlock::BlocklistSortPrompt, - ActiveRadarrBlock::DeleteBlocklistItemPrompt, - ActiveRadarrBlock::BlocklistClearAllItemsPrompt, - )] active_radarr_block: ActiveRadarrBlock + ActiveRadarrBlock::Blocklist, + ActiveRadarrBlock::BlocklistSortPrompt, + ActiveRadarrBlock::DeleteBlocklistItemPrompt, + ActiveRadarrBlock::BlocklistClearAllItemsPrompt + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); diff --git a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs index 0950701..9a78c2f 100644 --- a/src/ui/radarr_ui/collections/collection_details_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collection_details_ui_tests.rs @@ -37,16 +37,17 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; - use crate::models::stateful_table::StatefulTable; use super::*; + use crate::models::stateful_table::StatefulTable; + use rstest::rstest; #[rstest] fn test_collection_details_ui_renders_collection_details( #[values( - ActiveRadarrBlock::CollectionDetails, - ActiveRadarrBlock::ViewMovieOverview - )] active_radarr_block: ActiveRadarrBlock + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::ViewMovieOverview + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); @@ -71,4 +72,4 @@ mod tests { insta::assert_snapshot!(output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/collections/collections_ui_tests.rs b/src/ui/radarr_ui/collections/collections_ui_tests.rs index fde4733..ba8caa7 100644 --- a/src/ui/radarr_ui/collections/collections_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collections_ui_tests.rs @@ -30,9 +30,9 @@ mod tests { mod snapshot_tests { use super::*; - use rstest::rstest; use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::radarr_data::EDIT_COLLECTION_SELECTION_BLOCKS; + use rstest::rstest; #[rstest] #[case(true, false, false)] @@ -70,8 +70,10 @@ mod tests { ActiveRadarrBlock::FilterCollectionsError, ActiveRadarrBlock::SearchCollection, ActiveRadarrBlock::SearchCollectionError, - ActiveRadarrBlock::UpdateAllCollectionsPrompt, - )] active_radarr_block: ActiveRadarrBlock) { + ActiveRadarrBlock::UpdateAllCollectionsPrompt + )] + active_radarr_block: ActiveRadarrBlock, + ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); @@ -96,13 +98,34 @@ mod tests { } #[rstest] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionPrompt)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionConfirmPrompt)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleMonitored)] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionPrompt + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionConfirmPrompt + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionRootFolderPathInput + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionSelectMinimumAvailability + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionSelectQualityProfile + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionToggleSearchOnAdd + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionToggleMonitored + )] fn test_edit_collection_ui_renders_edit_collection_modal( #[case] context_block: ActiveRadarrBlock, #[case] active_radarr_block: ActiveRadarrBlock, @@ -116,7 +139,14 @@ mod tests { CollectionsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context_block.to_string()), output); + insta::assert_snapshot!( + format!( + "{}_{}", + active_radarr_block.to_string(), + context_block.to_string() + ), + output + ); } } } diff --git a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs index 65a7eb8..d4f94f5 100644 --- a/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs +++ b/src/ui/radarr_ui/collections/edit_collection_ui_tests.rs @@ -31,24 +31,66 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; use super::*; + use rstest::rstest; #[rstest] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionPrompt)] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionConfirmPrompt)] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] - #[case(ActiveRadarrBlock::Collections, ActiveRadarrBlock::EditCollectionToggleMonitored)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionPrompt)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionConfirmPrompt)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionRootFolderPathInput)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectMinimumAvailability)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionSelectQualityProfile)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleSearchOnAdd)] - #[case(ActiveRadarrBlock::CollectionDetails, ActiveRadarrBlock::EditCollectionToggleMonitored)] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionPrompt + )] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionConfirmPrompt + )] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionRootFolderPathInput + )] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionSelectMinimumAvailability + )] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionSelectQualityProfile + )] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionToggleSearchOnAdd + )] + #[case( + ActiveRadarrBlock::Collections, + ActiveRadarrBlock::EditCollectionToggleMonitored + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionPrompt + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionConfirmPrompt + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionRootFolderPathInput + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionSelectMinimumAvailability + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionSelectQualityProfile + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionToggleSearchOnAdd + )] + #[case( + ActiveRadarrBlock::CollectionDetails, + ActiveRadarrBlock::EditCollectionToggleMonitored + )] fn test_edit_collection_ui_renders_edit_collection_modal( #[case] active_radarr_block: ActiveRadarrBlock, #[case] context_block: ActiveRadarrBlock, @@ -62,7 +104,14 @@ mod tests { EditCollectionUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context_block.to_string()), output); + insta::assert_snapshot!( + format!( + "{}_{}", + active_radarr_block.to_string(), + context_block.to_string() + ), + output + ); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/collections/mod.rs b/src/ui/radarr_ui/collections/mod.rs index db16492..8cb7539 100644 --- a/src/ui/radarr_ui/collections/mod.rs +++ b/src/ui/radarr_ui/collections/mod.rs @@ -98,7 +98,7 @@ pub(super) fn draw_collections(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) Cell::from(search_on_add), Cell::from(monitored), ]) - .primary() + .primary() }; let collections_table = ManagarrTable::new(content, collection_row_mapping) .loading( @@ -137,7 +137,7 @@ pub(super) fn draw_collections(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) ActiveRadarrBlock::SearchCollection, ActiveRadarrBlock::FilterCollections, ] - .contains(&active_radarr_block) + .contains(&active_radarr_block) { collections_table.show_cursor(f, area); } diff --git a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs index 33f39ea..8e27e63 100644 --- a/src/ui/radarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/radarr_ui/downloads/downloads_ui_tests.rs @@ -20,8 +20,8 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; use super::*; + use rstest::rstest; #[test] fn test_radarr_ui_renders_downloads_tab_loading() { @@ -41,8 +41,9 @@ mod tests { #[values( ActiveRadarrBlock::Downloads, ActiveRadarrBlock::DeleteDownloadPrompt, - ActiveRadarrBlock::UpdateDownloadsPrompt, - )] active_radarr_block: ActiveRadarrBlock + ActiveRadarrBlock::UpdateDownloadsPrompt + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); diff --git a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs index cc0b7b6..cec9ae6 100644 --- a/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/edit_indexer_ui_tests.rs @@ -7,7 +7,7 @@ mod tests { use crate::models::servarr_data::radarr::radarr_data::{ ActiveRadarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::servarr_models::{Indexer}; + use crate::models::servarr_models::Indexer; use crate::ui::DrawUi; use crate::ui::radarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; @@ -24,9 +24,9 @@ mod tests { } mod snapshot_tests { + use super::*; use crate::models::servarr_data::radarr::radarr_data::EDIT_INDEXER_NZB_SELECTION_BLOCKS; use crate::network::radarr_network::radarr_network_test_utils::test_utils::indexer; - use super::*; #[test] fn test_edit_indexer_ui_renders_edit_indexer_modal_torrent() { @@ -60,4 +60,4 @@ mod tests { insta::assert_snapshot!(output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs index b85ef67..f260225 100644 --- a/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexer_settings_ui_tests.rs @@ -29,7 +29,8 @@ mod tests { fn test_indexer_settings_ui_renders_indexer_settings() { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(ActiveRadarrBlock::IndexerSettingsMinimumAgeInput.into()); - app.data.radarr_data.selected_block = BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); + app.data.radarr_data.selected_block = + BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexerSettingsUi::draw(f, app, f.area()); @@ -38,4 +39,4 @@ mod tests { insta::assert_snapshot!(output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs index 46595ae..19193d3 100644 --- a/src/ui/radarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/radarr_ui/indexers/indexers_ui_tests.rs @@ -121,4 +121,4 @@ mod tests { insta::assert_snapshot!(output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/library/add_movie_ui_tests.rs b/src/ui/radarr_ui/library/add_movie_ui_tests.rs index 4148797..749bd2e 100644 --- a/src/ui/radarr_ui/library/add_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/add_movie_ui_tests.rs @@ -20,10 +20,10 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; + use super::*; use crate::models::BlockSelectionState; use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS; - use super::*; + use rstest::rstest; #[test] fn test_add_movie_ui_renders_loading_for_search() { @@ -49,15 +49,33 @@ mod tests { #[case(ActiveRadarrBlock::AddMovieSelectRootFolder, None)] #[case(ActiveRadarrBlock::AddMovieAlreadyInLibrary, None)] #[case(ActiveRadarrBlock::AddMovieTagsInput, None)] - #[case(ActiveRadarrBlock::AddMoviePrompt, Some(ActiveRadarrBlock::CollectionDetails))] - #[case(ActiveRadarrBlock::AddMovieSelectMinimumAvailability, Some(ActiveRadarrBlock::CollectionDetails))] - #[case(ActiveRadarrBlock::AddMovieSelectMonitor, Some(ActiveRadarrBlock::CollectionDetails))] - #[case(ActiveRadarrBlock::AddMovieSelectQualityProfile, Some(ActiveRadarrBlock::CollectionDetails))] - #[case(ActiveRadarrBlock::AddMovieSelectRootFolder, Some(ActiveRadarrBlock::CollectionDetails))] - #[case(ActiveRadarrBlock::AddMovieTagsInput, Some(ActiveRadarrBlock::CollectionDetails))] + #[case( + ActiveRadarrBlock::AddMoviePrompt, + Some(ActiveRadarrBlock::CollectionDetails) + )] + #[case( + ActiveRadarrBlock::AddMovieSelectMinimumAvailability, + Some(ActiveRadarrBlock::CollectionDetails) + )] + #[case( + ActiveRadarrBlock::AddMovieSelectMonitor, + Some(ActiveRadarrBlock::CollectionDetails) + )] + #[case( + ActiveRadarrBlock::AddMovieSelectQualityProfile, + Some(ActiveRadarrBlock::CollectionDetails) + )] + #[case( + ActiveRadarrBlock::AddMovieSelectRootFolder, + Some(ActiveRadarrBlock::CollectionDetails) + )] + #[case( + ActiveRadarrBlock::AddMovieTagsInput, + Some(ActiveRadarrBlock::CollectionDetails) + )] fn test_add_movie_ui_renders( #[case] active_radarr_block: ActiveRadarrBlock, - #[case] context: Option + #[case] context: Option, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack((active_radarr_block, context).into()); @@ -68,10 +86,17 @@ mod tests { }); if let Some(context) = context { - insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context.to_string()), output); + insta::assert_snapshot!( + format!( + "{}_{}", + active_radarr_block.to_string(), + context.to_string() + ), + output + ); } else { insta::assert_snapshot!(active_radarr_block.to_string(), output); } } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs index 155c374..bd2ea87 100644 --- a/src/ui/radarr_ui/library/delete_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/delete_movie_ui_tests.rs @@ -38,4 +38,4 @@ mod tests { insta::assert_snapshot!(output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs index f045b99..8d9993f 100644 --- a/src/ui/radarr_ui/library/edit_movie_ui_tests.rs +++ b/src/ui/radarr_ui/library/edit_movie_ui_tests.rs @@ -23,17 +23,33 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; use super::*; + use rstest::rstest; #[rstest] #[case(ActiveRadarrBlock::EditMoviePrompt, None, 0)] - #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::MovieDetails), 0)] - #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::MovieHistory), 1)] - #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::FileInfo), 2)] + #[case( + ActiveRadarrBlock::EditMoviePrompt, + Some(ActiveRadarrBlock::MovieDetails), + 0 + )] + #[case( + ActiveRadarrBlock::EditMoviePrompt, + Some(ActiveRadarrBlock::MovieHistory), + 1 + )] + #[case( + ActiveRadarrBlock::EditMoviePrompt, + Some(ActiveRadarrBlock::FileInfo), + 2 + )] #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Cast), 3)] #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::Crew), 4)] - #[case(ActiveRadarrBlock::EditMoviePrompt, Some(ActiveRadarrBlock::ManualSearch), 5)] + #[case( + ActiveRadarrBlock::EditMoviePrompt, + Some(ActiveRadarrBlock::ManualSearch), + 5 + )] fn test_edit_movie_ui_renders_edit_movie_modal( #[case] active_radarr_block: ActiveRadarrBlock, #[case] context: Option, @@ -51,10 +67,17 @@ mod tests { }); if let Some(context) = context { - insta::assert_snapshot!(format!("{}_{}", active_radarr_block.to_string(), context.to_string()), output); + insta::assert_snapshot!( + format!( + "{}_{}", + active_radarr_block.to_string(), + context.to_string() + ), + output + ); } else { insta::assert_snapshot!(active_radarr_block.to_string(), output); } } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/library/library_ui_tests.rs b/src/ui/radarr_ui/library/library_ui_tests.rs index b68a44f..2ab03be 100644 --- a/src/ui/radarr_ui/library/library_ui_tests.rs +++ b/src/ui/radarr_ui/library/library_ui_tests.rs @@ -30,10 +30,12 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; - use crate::models::BlockSelectionState; - use crate::models::servarr_data::radarr::radarr_data::{ADD_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS}; use super::*; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::radarr::radarr_data::{ + ADD_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, + }; + use rstest::rstest; #[test] fn test_library_ui_renders_library_tab_loading() { @@ -69,8 +71,9 @@ mod tests { ActiveRadarrBlock::SearchMovieError, ActiveRadarrBlock::FilterMovies, ActiveRadarrBlock::FilterMoviesError, - ActiveRadarrBlock::UpdateAllMoviesPrompt, - )] active_radarr_block: ActiveRadarrBlock, + ActiveRadarrBlock::UpdateAllMoviesPrompt + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); @@ -85,17 +88,18 @@ mod tests { #[rstest] fn test_library_movie_ui_renders_add_movie_ui( #[values( - ActiveRadarrBlock::AddMovieSearchInput, - ActiveRadarrBlock::AddMovieSearchResults, - ActiveRadarrBlock::AddMovieEmptySearchResults, - ActiveRadarrBlock::AddMoviePrompt, - ActiveRadarrBlock::AddMovieSelectMinimumAvailability, - ActiveRadarrBlock::AddMovieSelectMonitor, - ActiveRadarrBlock::AddMovieSelectQualityProfile, - ActiveRadarrBlock::AddMovieSelectRootFolder, - ActiveRadarrBlock::AddMovieAlreadyInLibrary, - ActiveRadarrBlock::AddMovieTagsInput, - )] active_radarr_block: ActiveRadarrBlock, + ActiveRadarrBlock::AddMovieSearchInput, + ActiveRadarrBlock::AddMovieSearchResults, + ActiveRadarrBlock::AddMovieEmptySearchResults, + ActiveRadarrBlock::AddMoviePrompt, + ActiveRadarrBlock::AddMovieSelectMinimumAvailability, + ActiveRadarrBlock::AddMovieSelectMonitor, + ActiveRadarrBlock::AddMovieSelectQualityProfile, + ActiveRadarrBlock::AddMovieSelectRootFolder, + ActiveRadarrBlock::AddMovieAlreadyInLibrary, + ActiveRadarrBlock::AddMovieTagsInput + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); @@ -105,7 +109,7 @@ mod tests { LibraryUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(active_radarr_block.to_string(), output); + insta::assert_snapshot!(active_radarr_block.to_string(), output); } #[test] @@ -118,7 +122,7 @@ mod tests { LibraryUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!(output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/library/movie_details_ui_tests.rs b/src/ui/radarr_ui/library/movie_details_ui_tests.rs index 6b2b108..46e8417 100644 --- a/src/ui/radarr_ui/library/movie_details_ui_tests.rs +++ b/src/ui/radarr_ui/library/movie_details_ui_tests.rs @@ -50,29 +50,77 @@ mod tests { #[rstest] #[case(ActiveRadarrBlock::MovieDetails, None, 0)] - #[case(ActiveRadarrBlock::MovieDetails, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 0)] - #[case(ActiveRadarrBlock::MovieDetails, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 0)] + #[case( + ActiveRadarrBlock::MovieDetails, + Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), + 0 + )] + #[case( + ActiveRadarrBlock::MovieDetails, + Some(ActiveRadarrBlock::UpdateAndScanPrompt), + 0 + )] #[case(ActiveRadarrBlock::MovieHistory, None, 1)] - #[case(ActiveRadarrBlock::MovieHistory, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 1)] - #[case(ActiveRadarrBlock::MovieHistory, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 1)] + #[case( + ActiveRadarrBlock::MovieHistory, + Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), + 1 + )] + #[case( + ActiveRadarrBlock::MovieHistory, + Some(ActiveRadarrBlock::UpdateAndScanPrompt), + 1 + )] #[case(ActiveRadarrBlock::FileInfo, None, 2)] - #[case(ActiveRadarrBlock::FileInfo, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 2)] - #[case(ActiveRadarrBlock::FileInfo, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 2)] + #[case( + ActiveRadarrBlock::FileInfo, + Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), + 2 + )] + #[case( + ActiveRadarrBlock::FileInfo, + Some(ActiveRadarrBlock::UpdateAndScanPrompt), + 2 + )] #[case(ActiveRadarrBlock::Cast, None, 3)] - #[case(ActiveRadarrBlock::Cast, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 3)] - #[case(ActiveRadarrBlock::Cast, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 3)] + #[case( + ActiveRadarrBlock::Cast, + Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), + 3 + )] + #[case( + ActiveRadarrBlock::Cast, + Some(ActiveRadarrBlock::UpdateAndScanPrompt), + 3 + )] #[case(ActiveRadarrBlock::Crew, None, 4)] - #[case(ActiveRadarrBlock::Crew, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 4)] - #[case(ActiveRadarrBlock::Crew, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 4)] + #[case( + ActiveRadarrBlock::Crew, + Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), + 4 + )] + #[case( + ActiveRadarrBlock::Crew, + Some(ActiveRadarrBlock::UpdateAndScanPrompt), + 4 + )] #[case(ActiveRadarrBlock::ManualSearch, None, 5)] - #[case(ActiveRadarrBlock::ManualSearch, Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), 5)] - #[case(ActiveRadarrBlock::ManualSearch, Some(ActiveRadarrBlock::UpdateAndScanPrompt), 5)] + #[case( + ActiveRadarrBlock::ManualSearch, + Some(ActiveRadarrBlock::AutomaticallySearchMoviePrompt), + 5 + )] + #[case( + ActiveRadarrBlock::ManualSearch, + Some(ActiveRadarrBlock::UpdateAndScanPrompt), + 5 + )] #[case(ActiveRadarrBlock::ManualSearchSortPrompt, None, 5)] #[case(ActiveRadarrBlock::ManualSearchConfirmPrompt, None, 5)] fn test_movie_details_ui_renders_movie_details_tab( #[case] active_radarr_block: ActiveRadarrBlock, #[case] context: Option, - #[case] index: usize + #[case] index: usize, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack((active_radarr_block, context).into()); @@ -83,9 +131,15 @@ mod tests { }); if let Some(context) = context { - insta::assert_snapshot!(format!("movie_details_render_{active_radarr_block}_{context}"), output); + insta::assert_snapshot!( + format!("movie_details_render_{active_radarr_block}_{context}"), + output + ); } else { - insta::assert_snapshot!(format!("movie_details_render_{active_radarr_block}"), output); + insta::assert_snapshot!( + format!("movie_details_render_{active_radarr_block}"), + output + ); } } @@ -97,8 +151,9 @@ mod tests { ActiveRadarrBlock::FileInfo, ActiveRadarrBlock::Cast, ActiveRadarrBlock::Crew, - ActiveRadarrBlock::ManualSearch, - )] active_radarr_block: ActiveRadarrBlock + ActiveRadarrBlock::ManualSearch + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default(); app.is_loading = true; @@ -108,7 +163,10 @@ mod tests { MovieDetailsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(format!("movie_details_loading_{active_radarr_block}"), output); + insta::assert_snapshot!( + format!("movie_details_loading_{active_radarr_block}"), + output + ); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/mod.rs b/src/ui/radarr_ui/mod.rs index 32f56b8..991aa6e 100644 --- a/src/ui/radarr_ui/mod.rs +++ b/src/ui/radarr_ui/mod.rs @@ -1,14 +1,14 @@ -use std::{cmp, iter}; #[cfg(test)] use crate::ui::ui_test_utils::test_utils::Utc; +use chrono::Duration; #[cfg(not(test))] use chrono::Utc; -use chrono::{Duration}; use ratatui::Frame; use ratatui::layout::{Constraint, Layout, Rect}; use ratatui::prelude::Stylize; use ratatui::text::Text; use ratatui::widgets::{Paragraph, Row}; +use std::{cmp, iter}; use crate::app::App; use crate::logos::RADARR_LOGO; diff --git a/src/ui/radarr_ui/radarr_ui_tests.rs b/src/ui/radarr_ui/radarr_ui_tests.rs index 5cbe9d3..ab43f32 100644 --- a/src/ui/radarr_ui/radarr_ui_tests.rs +++ b/src/ui/radarr_ui/radarr_ui_tests.rs @@ -22,7 +22,7 @@ mod tests { mod snapshot_tests { use super::*; - use crate::ui::ui_test_utils::test_utils::{TerminalSize}; + use crate::ui::ui_test_utils::test_utils::TerminalSize; #[rstest] #[case(ActiveRadarrBlock::Movies, 0)] diff --git a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs index cf97b15..392ffc8 100644 --- a/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/radarr_ui/root_folders/root_folders_ui_tests.rs @@ -21,8 +21,8 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; use super::*; + use rstest::rstest; #[test] fn test_root_folders_ui_renders_loading() { @@ -55,8 +55,9 @@ mod tests { #[values( ActiveRadarrBlock::RootFolders, ActiveRadarrBlock::AddRootFolderPrompt, - ActiveRadarrBlock::DeleteRootFolderPrompt, - )] active_radarr_block: ActiveRadarrBlock + ActiveRadarrBlock::DeleteRootFolderPrompt + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); @@ -68,4 +69,4 @@ mod tests { insta::assert_snapshot!(active_radarr_block.to_string(), output); } } -} \ No newline at end of file +} diff --git a/src/ui/radarr_ui/system/mod.rs b/src/ui/radarr_ui/system/mod.rs index 8e3966f..2939924 100644 --- a/src/ui/radarr_ui/system/mod.rs +++ b/src/ui/radarr_ui/system/mod.rs @@ -1,9 +1,9 @@ use std::ops::Sub; -#[cfg(not(test))] -use chrono::Utc; #[cfg(test)] use crate::ui::ui_test_utils::test_utils::Utc; +#[cfg(not(test))] +use chrono::Utc; use ratatui::layout::Layout; use ratatui::style::Style; use ratatui::text::{Span, Text}; diff --git a/src/ui/radarr_ui/system/system_details_ui_tests.rs b/src/ui/radarr_ui/system/system_details_ui_tests.rs index f012196..37782ec 100644 --- a/src/ui/radarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_details_ui_tests.rs @@ -23,8 +23,8 @@ mod tests { } mod snapshot_tests { - use rstest::rstest; use super::*; + use rstest::rstest; #[rstest] fn test_system_details_ui_renders_tasks( @@ -33,8 +33,9 @@ mod tests { ActiveRadarrBlock::SystemQueuedEvents, ActiveRadarrBlock::SystemTasks, ActiveRadarrBlock::SystemTaskStartConfirmPrompt, - ActiveRadarrBlock::SystemUpdates, - )] active_radarr_block: ActiveRadarrBlock + ActiveRadarrBlock::SystemUpdates + )] + active_radarr_block: ActiveRadarrBlock, ) { let mut app = App::test_default_fully_populated(); app.push_navigation_stack(active_radarr_block.into()); @@ -75,7 +76,7 @@ mod tests { #[test] fn test_system_details_ui_renders_logs_loading() { let mut app = App::test_default_fully_populated(); - app.is_loading = true; + app.is_loading = true; app.push_navigation_stack(ActiveRadarrBlock::SystemLogs.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { diff --git a/src/ui/ui_test_utils.rs b/src/ui/ui_test_utils.rs index 8d27079..8d97539 100644 --- a/src/ui/ui_test_utils.rs +++ b/src/ui/ui_test_utils.rs @@ -1,12 +1,12 @@ #[cfg(test)] #[allow(dead_code)] pub mod test_utils { - use std::cell::Cell; use chrono::DateTime; use ratatui::Frame; use ratatui::Terminal; use ratatui::backend::TestBackend; use ratatui::buffer::Buffer; + use std::cell::Cell; use crate::app::App; @@ -18,14 +18,12 @@ pub mod test_utils { impl Utc { pub fn now() -> DateTime { - - TIMESTAMP.with(|timestamp| { - let ts = timestamp.get(); - DateTime::::from_timestamp( - if ts != 0 { ts } else { 1684618200 }, - 0, - )} - ).expect("a valid timestamp set") + TIMESTAMP + .with(|timestamp| { + let ts = timestamp.get(); + DateTime::::from_timestamp(if ts != 0 { ts } else { 1684618200 }, 0) + }) + .expect("a valid timestamp set") } } diff --git a/src/ui/widgets/managarr_table.rs b/src/ui/widgets/managarr_table.rs index a56d677..7aecb9f 100644 --- a/src/ui/widgets/managarr_table.rs +++ b/src/ui/widgets/managarr_table.rs @@ -122,7 +122,9 @@ where }; let loading_block = LoadingBlock::new(self.is_loading, self.block.clone()); - if let Some(content) = self.content && !self.is_loading { + if let Some(content) = self.content + && !self.is_loading + { let (table_contents, table_state) = if content.filtered_items.is_some() { ( content.filtered_items.as_ref().unwrap(), From e0fcbc71e19b089d8b015986395bea27462fcbfa Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Mon, 15 Dec 2025 20:21:14 -0700 Subject: [PATCH 27/28] ci: updated Cargo Husky hooks to not use the Makefile --- .cargo-husky/hooks/pre-commit | 7 ++----- .cargo-husky/hooks/pre-push | 8 ++++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.cargo-husky/hooks/pre-commit b/.cargo-husky/hooks/pre-commit index 91a6fe1..cb8a69e 100755 --- a/.cargo-husky/hooks/pre-commit +++ b/.cargo-husky/hooks/pre-commit @@ -7,8 +7,5 @@ echo "Running pre-push hook:" echo "Executing: cargo fmt" cargo fmt -echo "Executing: make lint" -make lint - -echo "Executing: cargo test" -cargo test +echo "Executing: cargo clippy --all" +cargo clippy --all diff --git a/.cargo-husky/hooks/pre-push b/.cargo-husky/hooks/pre-push index 1160efc..c976c2f 100755 --- a/.cargo-husky/hooks/pre-push +++ b/.cargo-husky/hooks/pre-push @@ -7,8 +7,8 @@ echo "Running pre-push hook:" echo "Executing: cargo fmt --check" cargo fmt --check -echo "Executing: make lint" -make lint +echo "Executing: cargo clippy --all" +cargo clippy --all -echo "Executing: cargo test" -cargo test +echo "Executing: cargo test --all" +cargo test --all From 0532d59746985bab331069b84c9bf3d86ae95d01 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Tue, 16 Dec 2025 14:12:10 -0700 Subject: [PATCH 28/28] test: Wrote snapshot tests for all Sonarr UI --- codecov.yml | 1 - src/app/mod.rs | 178 +--------------- src/models/servarr_data/data_test_utils.rs | 9 + src/models/servarr_data/mod.rs | 3 +- src/models/servarr_data/radarr/radarr_data.rs | 172 +++++++++++++++- src/models/servarr_data/sonarr/sonarr_data.rs | 189 ++++++++++++++++- src/network/mod.rs | 3 +- .../radarr_network_test_utils.rs | 35 +--- src/network/servarr_test_utils.rs | 35 ++++ .../sonarr_blocklist_network_tests.rs | 1 + .../episodes/sonarr_episodes_network_tests.rs | 10 +- .../seasons/sonarr_seasons_network_tests.rs | 10 +- src/network/sonarr_network/mod.rs | 2 +- .../sonarr_network_test_utils.rs | 92 ++++++++- src/network/sonarr_network/system/mod.rs | 6 +- .../system/sonarr_system_network_tests.rs | 31 +-- .../collections/collections_ui_tests.rs | 11 +- ...t_tests__collections_tab_Collections.snap} | 0 ...ollections_tab_CollectionsSortPrompt.snap} | 0 ...s__collections_tab_FilterCollections.snap} | 0 ...llections_tab_FilterCollectionsError.snap} | 0 ...ts__collections_tab_SearchCollection.snap} | 0 ...ollections_tab_SearchCollectionError.snap} | 0 ...tions_tab_UpdateAllCollectionsPrompt.snap} | 0 ...ctionConfirmPrompt_CollectionDetails.snap} | 0 ...itCollectionPrompt_CollectionDetails.snap} | 0 ...ootFolderPathInput_CollectionDetails.snap} | 0 ...inimumAvailability_CollectionDetails.snap} | 0 ...lectQualityProfile_CollectionDetails.snap} | 0 ...ionToggleMonitored_CollectionDetails.snap} | 0 ...nToggleSearchOnAdd_CollectionDetails.snap} | 0 ...mpty_movies_false_empty_profile_true.snap} | 0 ...mpty_movies_true_empty_profile_false.snap} | 0 ...pty_movies_false_empty_profile_false.snap} | 0 src/ui/radarr_ui/library/library_ui_tests.rs | 4 +- ...dd_movie_ui_AddMovieAlreadyInLibrary.snap} | 0 ..._movie_ui_AddMovieEmptySearchResults.snap} | 0 ...t_tests__add_movie_ui_AddMoviePrompt.snap} | 0 ...ts__add_movie_ui_AddMovieSearchInput.snap} | 0 ...__add_movie_ui_AddMovieSearchResults.snap} | 0 ...ui_AddMovieSelectMinimumAvailability.snap} | 0 ...__add_movie_ui_AddMovieSelectMonitor.snap} | 0 ...ovie_ui_AddMovieSelectQualityProfile.snap} | 0 ...dd_movie_ui_AddMovieSelectRootFolder.snap} | 0 ...ests__add_movie_ui_AddMovieTagsInput.snap} | 0 ...shot_tests__library_tab_FilterMovies.snap} | 0 ...tests__library_tab_FilterMoviesError.snap} | 0 ...__snapshot_tests__library_tab_Movies.snap} | 0 ..._tests__library_tab_MoviesSortPrompt.snap} | 0 ...pshot_tests__library_tab_SearchMovie.snap} | 0 ..._tests__library_tab_SearchMovieError.snap} | 0 ...s__library_tab_UpdateAllMoviesPrompt.snap} | 0 ...em_details_over_system_tab_SystemLogs.snap | 54 +++++ ...ls_over_system_tab_SystemQueuedEvents.snap | 54 +++++ ...stem_tab_SystemTaskStartConfirmPrompt.snap | 54 +++++ ...m_details_over_system_tab_SystemTasks.snap | 54 +++++ ...details_over_system_tab_SystemUpdates.snap | 54 +++++ .../system/system_details_ui_tests.rs | 2 +- src/ui/radarr_ui/system/system_ui_tests.rs | 25 +++ .../sonarr_ui/blocklist/blocklist_ui_tests.rs | 40 ++-- ...pshot_tests__blocklist_tab_Blocklist.snap} | 5 +- ...list_tab_BlocklistClearAllItemsPrompt.snap | 34 ++++ ...s__blocklist_tab_BlocklistItemDetails.snap | 34 ++++ ...ts__blocklist_tab_BlocklistSortPrompt.snap | 42 ++++ ...ocklist_tab_DeleteBlocklistItemPrompt.snap | 38 ++++ ...ot_tests__blocklist_ui_renders_empty.snap} | 0 ..._tests__blocklist_ui_renders_loading.snap} | 0 .../sonarr_ui/downloads/downloads_ui_tests.rs | 42 ++-- ...ts__downloads_ui_DeleteDownloadPrompt.snap | 38 ++++ ...apshot_tests__downloads_ui_Downloads.snap} | 3 +- ...s__downloads_ui_UpdateDownloadsPrompt.snap | 38 ++++ ..._tests__downloads_ui_renders_loading.snap} | 0 src/ui/sonarr_ui/history/history_ui_tests.rs | 51 +++-- ...shot_tests__history_tab_FilterHistory.snap | 28 +++ ...tests__history_tab_FilterHistoryError.snap | 31 +++ ..._snapshot_tests__history_tab_History.snap} | 5 +- ...tests__history_tab_HistoryItemDetails.snap | 34 ++++ ..._tests__history_tab_HistorySortPrompt.snap | 42 ++++ ...shot_tests__history_tab_SearchHistory.snap | 28 +++ ...tests__history_tab_SearchHistoryError.snap | 31 +++ ...ot_tests__history_ui_renders_loading.snap} | 0 ...t_tests__loading_history_tab_History.snap} | 0 ...oading_history_tab_HistoryItemDetails.snap | 34 ++++ .../indexers/edit_indexer_ui_tests.rs | 70 ++++--- .../indexers/indexer_settings_ui_tests.rs | 4 +- .../sonarr_ui/indexers/indexers_ui_tests.rs | 113 ++++++++--- ...dexer_ui_renders_edit_torrent_indexer.snap | 42 ++++ ...dexer_ui_renders_edit_usenet_indexer.snap} | 8 +- ...ests__edit_indexer_ui_renders_loading.snap | 42 ++++ ..._settings_ui_renders_indexer_settings.snap | 8 +- ...ests__indexers_ui_DeleteIndexerPrompt.snap | 38 ++++ ...snapshot_tests__indexers_ui_Indexers.snap} | 3 +- ...apshot_tests__indexers_ui_TestIndexer.snap | 35 ++++ ...rs_edit_torrent_indexer_over_indexers.snap | 42 ++++ ...ers_edit_usenet_indexer_over_indexers.snap | 42 ++++ ...t_tests__indexers_ui_renders_loading.snap} | 0 ...exers_ui_renders_loading_test_results.snap | 35 ++++ ...ults_when_indexer_test_errors_is_none.snap | 35 ++++ ...ers_ui_renders_test_all_over_indexers.snap | 48 +++++ ...t_tests__test_all_indexers_ui_renders.snap | 48 +++++ ...test_all_indexers_ui_renders_loading.snap} | 0 .../indexers/test_all_indexers_ui_tests.rs | 16 +- .../sonarr_ui/library/add_series_ui_tests.rs | 34 +++- .../library/delete_series_ui_tests.rs | 12 +- .../sonarr_ui/library/edit_series_ui_tests.rs | 63 ++++-- .../sonarr_ui/library/episode_details_ui.rs | 98 ++++----- .../library/episode_details_ui_tests.rs | 190 +++++++++--------- src/ui/sonarr_ui/library/library_ui_tests.rs | 152 ++++++++------ .../library/season_details_ui_tests.rs | 183 +++++++++-------- src/ui/sonarr_ui/library/series_details_ui.rs | 2 +- .../library/series_details_ui_tests.rs | 115 +++++++++-- ...d_series_ui_AddSeriesAlreadyInLibrary.snap | 47 +++++ ...series_ui_AddSeriesEmptySearchResults.snap | 47 +++++ ..._tests__add_series_ui_AddSeriesPrompt.snap | 48 +++++ ...add_series_ui_AddSeriesSearchResults.snap} | 6 +- ...ies_ui_AddSeriesSelectLanguageProfile.snap | 48 +++++ ..._add_series_ui_AddSeriesSelectMonitor.snap | 48 +++++ ...ries_ui_AddSeriesSelectQualityProfile.snap | 48 +++++ ...d_series_ui_AddSeriesSelectRootFolder.snap | 48 +++++ ...d_series_ui_AddSeriesSelectSeriesType.snap | 48 +++++ ...add_series_ui_renders_loading_search.snap} | 2 +- ...lete_series_ui_renders_delete_series.snap} | 6 +- ..._edit_series_EditSeriesConfirmPrompt.snap} | 14 +- ...EditSeriesConfirmPrompt_SeriesDetails.snap | 52 +++++ ...t_tests__edit_series_EditSeriesPrompt.snap | 48 +++++ ...series_EditSeriesPrompt_SeriesDetails.snap | 52 +++++ ...eries_EditSeriesSelectLanguageProfile.snap | 48 +++++ ...esSelectLanguageProfile_SeriesDetails.snap | 52 +++++ ...series_EditSeriesSelectQualityProfile.snap | 48 +++++ ...iesSelectQualityProfile_SeriesDetails.snap | 52 +++++ ...dit_series_EditSeriesSelectSeriesType.snap | 48 +++++ ...tSeriesSelectSeriesType_SeriesDetails.snap | 52 +++++ ...pty_episode_details_EpisodeDetails_0.snap} | 0 ..._empty_episode_details_EpisodeFile_2.snap} | 0 ...isode_details_EpisodeHistoryDetails_1.snap | 48 +++++ ...mpty_episode_details_EpisodeHistory_1.snap | 48 +++++ ...pisode_details_ManualEpisodeSearch_3.snap} | 0 ...ls_AutomaticallySearchEpisodePrompt_0.snap | 48 +++++ ...ls_AutomaticallySearchEpisodePrompt_1.snap | 48 +++++ ...ls_AutomaticallySearchEpisodePrompt_2.snap | 48 +++++ ...ls_AutomaticallySearchEpisodePrompt_3.snap | 48 +++++ ...sts__episode_details_EpisodeDetails_0.snap | 48 +++++ ..._tests__episode_details_EpisodeFile_2.snap | 48 +++++ ...isode_details_EpisodeHistoryDetails_1.snap | 48 +++++ ...sts__episode_details_EpisodeHistory_1.snap | 48 +++++ ...ls_ManualEpisodeSearchConfirmPrompt_3.snap | 48 +++++ ...tails_ManualEpisodeSearchSortPrompt_3.snap | 48 +++++ ...episode_details_ManualEpisodeSearch_3.snap | 48 +++++ ...sode_details_ui_renders_loading_state.snap | 5 - ...ding_episode_details_EpisodeDetails_0.snap | 48 +++++ ...loading_episode_details_EpisodeFile_2.snap | 48 +++++ ...ding_episode_details_EpisodeHistory_1.snap | 48 +++++ ...episode_details_ManualEpisodeSearch_3.snap | 48 +++++ ...ary_ui_renders_add_series_over_series.snap | 48 +++++ ...ui_renders_delete_episode_over_series.snap | 38 ++++ ...ry_ui_renders_edit_series_over_series.snap | 48 +++++ ...shot_tests__library_ui_renders_empty.snap} | 0 ...i_renders_episode_details_over_series.snap | 52 +++++ ...ot_tests__library_ui_renders_loading.snap} | 0 ...ui_renders_season_details_over_series.snap | 52 +++++ ...ui_renders_series_details_over_series.snap | 52 +++++ ...ot_tests__sonarr_library_FilterSeries.snap | 28 +++ ...sts__sonarr_library_FilterSeriesError.snap | 31 +++ ...ot_tests__sonarr_library_SearchSeries.snap | 28 +++ ...sts__sonarr_library_SearchSeriesError.snap | 31 +++ ...napshot_tests__sonarr_library_Series.snap} | 5 +- ...ests__sonarr_library_SeriesSortPrompt.snap | 42 ++++ ...sonarr_library_UpdateAllSeriesPrompt.snap} | 4 +- ..._season_details_ManualSeasonSearch_2.snap} | 6 +- ...empty_season_details_SeasonDetails_0.snap} | 6 +- ...season_details_SeasonHistoryDetails_1.snap | 50 +++++ ..._empty_season_details_SeasonHistory_1.snap | 50 +++++ ...g_season_details_ManualSeasonSearch_2.snap | 50 +++++ ...oading_season_details_SeasonDetails_0.snap | 50 +++++ ...season_details_SeasonHistoryDetails_1.snap | 50 +++++ ...oading_season_details_SeasonHistory_1.snap | 50 +++++ ...ers_AutomaticallySearchSeasonPrompt_0.snap | 50 +++++ ...ers_AutomaticallySearchSeasonPrompt_1.snap | 50 +++++ ...ers_AutomaticallySearchSeasonPrompt_2.snap | 50 +++++ ...ils_renders_DeleteEpisodeFilePrompt_0.snap | 50 +++++ ...ls_renders_FilterSeasonHistoryError_1.snap | 50 +++++ ...details_renders_FilterSeasonHistory_1.snap | 50 +++++ ...ers_ManualSeasonSearchConfirmPrompt_2.snap | 50 +++++ ...enders_ManualSeasonSearchSortPrompt_2.snap | 50 +++++ ..._details_renders_ManualSeasonSearch_2.snap | 50 +++++ ...details_renders_SearchEpisodesError_0.snap | 50 +++++ ...ason_details_renders_SearchEpisodes_0.snap | 50 +++++ ...ls_renders_SearchSeasonHistoryError_1.snap | 50 +++++ ...details_renders_SearchSeasonHistory_1.snap | 50 +++++ ...eason_details_renders_SeasonDetails_0.snap | 50 +++++ ...etails_renders_SeasonHistoryDetails_1.snap | 50 +++++ ...ils_renders_SeasonHistorySortPrompt_1.snap | 50 +++++ ...eason_details_renders_SeasonHistory_1.snap | 50 +++++ ...s_episode_details_over_season_details.snap | 50 +++++ ...eason_details_ui_renders_episodes_tab.snap | 5 - ...ason_details_ui_renders_loading_state.snap | 5 - ...__empty_series_details_SeriesDetails.snap} | 24 +-- ...s__empty_series_details_SeriesHistory.snap | 52 +++++ ...y_series_details_SeriesHistoryDetails.snap | 52 +++++ ..._loading_series_details_SeriesDetails.snap | 52 +++++ ..._loading_series_details_SeriesHistory.snap | 52 +++++ ..._ui_AutomaticallySearchSeriesPrompt_0.snap | 52 +++++ ..._ui_AutomaticallySearchSeriesPrompt_1.snap | 52 +++++ ...details_ui_FilterSeriesHistoryError_1.snap | 52 +++++ ...ries_details_ui_FilterSeriesHistory_1.snap | 52 +++++ ...series_details_ui_SearchSeasonError_0.snap | 52 +++++ ...sts__series_details_ui_SearchSeason_0.snap | 52 +++++ ...details_ui_SearchSeriesHistoryError_1.snap | 52 +++++ ...ries_details_ui_SearchSeriesHistory_1.snap | 52 +++++ ...ts__series_details_ui_SeriesDetails_0.snap | 52 +++++ ...ies_details_ui_SeriesHistoryDetails_1.snap | 52 +++++ ..._details_ui_SeriesHistorySortPrompt_1.snap | 52 +++++ ...ts__series_details_ui_SeriesHistory_1.snap | 52 +++++ ...etails_ui_UpdateAndScanSeriesPrompt_0.snap | 52 +++++ ...etails_ui_UpdateAndScanSeriesPrompt_1.snap | 52 +++++ ...s_episode_details_over_series_details.snap | 52 +++++ ...rs_season_details_over_series_details.snap | 52 +++++ src/ui/sonarr_ui/mod.rs | 6 +- .../root_folders/root_folders_ui_tests.rs | 53 ++--- ..._snapshot_tests__AddRootFolderPrompt.snap} | 6 +- ...napshot_tests__DeleteRootFolderPrompt.snap | 38 ++++ ...__tests__snapshot_tests__RootFolders.snap} | 3 +- ...sts__root_folders_ui_renders_loading.snap} | 0 ...snapshot_tests__sonarr_tabs_Blocklist.snap | 54 +++++ ...napshot_tests__sonarr_tabs_Downloads.snap} | 4 +- ...__snapshot_tests__sonarr_tabs_History.snap | 54 +++++ ...snapshot_tests__sonarr_tabs_Indexers.snap} | 4 +- ...pshot_tests__sonarr_tabs_RootFolders.snap} | 4 +- ...s__snapshot_tests__sonarr_tabs_Series.snap | 54 +++++ ...s__snapshot_tests__sonarr_tabs_System.snap | 54 +++++ src/ui/sonarr_ui/sonarr_ui_tests.rs | 97 ++------- src/ui/sonarr_ui/system/mod.rs | 3 + ...ts__snapshot_tests__empty_SystemLogs.snap} | 0 ...pshot_tests__empty_SystemQueuedEvents.snap | 44 ++++ ...ts__snapshot_tests__empty_SystemTasks.snap | 48 +++++ ...s__snapshot_tests__loading_SystemLogs.snap | 48 +++++ ...hot_tests__loading_SystemQueuedEvents.snap | 44 ++++ ..._snapshot_tests__loading_SystemTasks.snap} | 0 ...snapshot_tests__loading_SystemUpdates.snap | 48 +++++ ...sts__snapshot_tests__popup_SystemLogs.snap | 48 +++++ ...pshot_tests__popup_SystemQueuedEvents.snap | 44 ++++ ...s__popup_SystemTaskStartConfirmPrompt.snap | 48 +++++ ...s__snapshot_tests__popup_SystemTasks.snap} | 6 +- ...__snapshot_tests__popup_SystemUpdates.snap | 48 +++++ ...s_ui_updates_popup_loading_when_empty.snap | 48 +++++ ...sts__popups_over_system_ui_SystemLogs.snap | 54 +++++ ...ups_over_system_ui_SystemQueuedEvents.snap | 54 +++++ ...ystem_ui_SystemTaskStartConfirmPrompt.snap | 54 +++++ ...ts__popups_over_system_ui_SystemTasks.snap | 54 +++++ ...__popups_over_system_ui_SystemUpdates.snap | 54 +++++ ...ests__system_ui_renders_logs_loading.snap} | 0 ...t_tests__system_ui_renders_system_tab.snap | 54 +++++ ...__system_ui_renders_system_tab_empty.snap} | 0 ..._system_ui_renders_system_tab_loading.snap | 54 +++++ ...rs_system_tab_task_and_events_loading.snap | 54 +++++ .../system/system_details_ui_tests.rs | 116 +++++------ src/ui/sonarr_ui/system/system_ui_tests.rs | 69 ++++++- 257 files changed, 8089 insertions(+), 1029 deletions(-) create mode 100644 src/models/servarr_data/data_test_utils.rs create mode 100644 src/network/servarr_test_utils.rs rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_Collections.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_CollectionsSortPrompt.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_FilterCollections.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_FilterCollectionsError.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_SearchCollection.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_SearchCollectionError.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_UpdateAllCollectionsPrompt.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionConfirmPrompt_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionPrompt_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionRootFolderPathInput_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionSelectMinimumAvailability_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionSelectQualityProfile_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionToggleMonitored_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionToggleSearchOnAdd_CollectionDetails.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_false_empty_movies_false_empty_profile_true.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_false_empty_movies_true_empty_profile_false.snap} (100%) rename src/ui/radarr_ui/collections/snapshots/{managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap => managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_true_empty_movies_false_empty_profile_false.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieAlreadyInLibrary.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieEmptySearchResults.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMoviePrompt.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSearchInput.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSearchResults.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectMinimumAvailability.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectMonitor.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectQualityProfile.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectRootFolder.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieTagsInput.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_FilterMovies.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_FilterMoviesError.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_Movies.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_MoviesSortPrompt.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_SearchMovie.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_SearchMovieError.snap} (100%) rename src/ui/radarr_ui/library/snapshots/{managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap => managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_UpdateAllMoviesPrompt.snap} (100%) create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemLogs.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemQueuedEvents.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTaskStartConfirmPrompt.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTasks.snap create mode 100644 src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemUpdates.snap rename src/ui/sonarr_ui/blocklist/snapshots/{managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap => managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_Blocklist.snap} (53%) create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistClearAllItemsPrompt.snap create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistItemDetails.snap create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistSortPrompt.snap create mode 100644 src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_DeleteBlocklistItemPrompt.snap rename src/ui/sonarr_ui/blocklist/snapshots/{managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap => managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty.snap} (100%) rename src/ui/sonarr_ui/blocklist/snapshots/{managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_DeleteDownloadPrompt.snap rename src/ui/sonarr_ui/downloads/snapshots/{managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap => managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_Downloads.snap} (75%) create mode 100644 src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_UpdateDownloadsPrompt.snap rename src/ui/sonarr_ui/downloads/snapshots/{managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistory.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistoryError.snap rename src/ui/sonarr_ui/history/snapshots/{managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap => managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_History.snap} (54%) create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistoryItemDetails.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistorySortPrompt.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistory.snap create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistoryError.snap rename src/ui/sonarr_ui/history/snapshots/{managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading.snap} (100%) rename src/ui/sonarr_ui/history/snapshots/{managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap => managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_History.snap} (100%) create mode 100644 src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_HistoryItemDetails.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_torrent_indexer.snap rename src/ui/sonarr_ui/indexers/snapshots/{managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap => managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_usenet_indexer.snap} (91%) create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_loading.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_DeleteIndexerPrompt.snap rename src/ui/sonarr_ui/indexers/snapshots/{managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap => managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_Indexers.snap} (79%) create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_TestIndexer.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_torrent_indexer_over_indexers.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_usenet_indexer_over_indexers.snap rename src/ui/sonarr_ui/indexers/snapshots/{managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results_when_indexer_test_errors_is_none.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_all_over_indexers.snap create mode 100644 src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders.snap rename src/ui/sonarr_ui/indexers/snapshots/{managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesAlreadyInLibrary.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesEmptySearchResults.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesPrompt.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap => managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSearchResults.snap} (95%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectLanguageProfile.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectMonitor.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectQualityProfile.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectRootFolder.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectSeriesType.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_search.snap} (99%) rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap => managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series.snap} (95%) rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap => managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt.snap} (92%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt_SeriesDetails.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt_SeriesDetails.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile_SeriesDetails.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile_SeriesDetails.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType_SeriesDetails.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap => managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeDetails_0.snap} (100%) rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap => managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeFile_2.snap} (100%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistoryDetails_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistory_1.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap => managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_ManualEpisodeSearch_3.snap} (100%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_3.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeDetails_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeFile_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistoryDetails_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchConfirmPrompt_3.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchSortPrompt_3.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearch_3.snap delete mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeDetails_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeFile_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_ManualEpisodeSearch_3.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_add_series_over_series.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_delete_episode_over_series.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_edit_series_over_series.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap => managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty.snap} (100%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_episode_details_over_series.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_season_details_over_series.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_series_details_over_series.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeries.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeriesError.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeries.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeriesError.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap => managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_Series.snap} (54%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SeriesSortPrompt.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap => managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_UpdateAllSeriesPrompt.snap} (94%) rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap => managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_ManualSeasonSearch_2.snap} (95%) rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap => managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonDetails_0.snap} (95%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistoryDetails_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_ManualSeasonSearch_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonDetails_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistoryDetails_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_DeleteEpisodeFilePrompt_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistoryError_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchConfirmPrompt_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchSortPrompt_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearch_2.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodesError_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodes_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistoryError_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonDetails_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistoryDetails_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistorySortPrompt_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episode_details_over_season_details.snap delete mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap delete mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap rename src/ui/sonarr_ui/library/snapshots/{managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap => managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesDetails.snap} (90%) create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistory.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistoryDetails.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesDetails.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesHistory.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistoryError_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeasonError_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeason_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistoryError_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesDetails_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistoryDetails_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistorySortPrompt_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistory_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_0.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_1.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_episode_details_over_series_details.snap create mode 100644 src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_season_details_over_series_details.snap rename src/ui/sonarr_ui/root_folders/snapshots/{managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap => managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap} (90%) create mode 100644 src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap rename src/ui/sonarr_ui/root_folders/snapshots/{managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap => managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap} (72%) rename src/ui/sonarr_ui/root_folders/snapshots/{managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Blocklist.snap rename src/ui/sonarr_ui/snapshots/{managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap => managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Downloads.snap} (96%) create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_History.snap rename src/ui/sonarr_ui/snapshots/{managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap => managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Indexers.snap} (96%) rename src/ui/sonarr_ui/snapshots/{managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap => managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_RootFolders.snap} (96%) create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Series.snap create mode 100644 src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_System.snap rename src/ui/sonarr_ui/system/snapshots/{managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap => managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemLogs.snap} (100%) create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemQueuedEvents.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemTasks.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemLogs.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemQueuedEvents.snap rename src/ui/sonarr_ui/system/snapshots/{managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap => managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemTasks.snap} (100%) create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemUpdates.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemLogs.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemQueuedEvents.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTaskStartConfirmPrompt.snap rename src/ui/sonarr_ui/system/snapshots/{managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap => managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTasks.snap} (95%) create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemUpdates.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_updates_popup_loading_when_empty.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemLogs.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemQueuedEvents.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTaskStartConfirmPrompt.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTasks.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemUpdates.snap rename src/ui/sonarr_ui/system/snapshots/{managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap => managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_logs_loading.snap} (100%) create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab.snap rename src/ui/sonarr_ui/system/snapshots/{managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap => managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_empty.snap} (100%) create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_loading.snap create mode 100644 src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_task_and_events_loading.snap diff --git a/codecov.yml b/codecov.yml index 960aad7..2076d3b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -12,4 +12,3 @@ coverage: ignore: - "**/*_tests.rs" - - "src/ui" diff --git a/src/app/mod.rs b/src/app/mod.rs index 5a04ac4..efb05b8 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -19,23 +19,6 @@ use crate::models::servarr_models::KeybindingItem; use crate::models::stateful_table::StatefulTable; use crate::models::{HorizontallyScrollableText, Route, TabRoute, TabState}; use crate::network::NetworkEvent; -#[cfg(test)] -use { - crate::models::ScrollableText, - crate::models::radarr_models, - crate::models::radarr_models::MinimumAvailability, - crate::models::radarr_models::MovieMonitor, - crate::models::servarr_data::modals::EditIndexerModal, - crate::models::servarr_data::radarr::modals::AddMovieModal, - crate::models::servarr_data::radarr::modals::{ - EditCollectionModal, EditMovieModal, MovieDetailsModal, - }, - crate::models::stateful_table::SortOption, - crate::network::radarr_network::radarr_network_test_utils::test_utils::*, - chrono::DateTime, - std::fmt::Debug, - strum::IntoEnumIterator, -}; #[cfg(test)] mod app_tests; @@ -45,16 +28,6 @@ mod key_binding_tests; pub mod radarr; pub mod sonarr; -#[cfg(test)] -macro_rules! sort_option { - ($field:ident) => { - SortOption { - name: "Something", - cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)), - } - }; -} - pub struct App<'a> { navigation_stack: Vec, network_tx: Option>, @@ -287,157 +260,10 @@ impl App<'_> { } pub fn test_default_fully_populated() -> Self { - let quality_profile_name = "HD - 1080p".to_owned(); - let mut add_movie_modal = AddMovieModal { - tags: "alex".into(), - ..AddMovieModal::default() - }; - add_movie_modal - .root_folder_list - .set_items(vec![root_folder()]); - add_movie_modal - .monitor_list - .set_items(MovieMonitor::iter().collect()); - add_movie_modal - .minimum_availability_list - .set_items(MinimumAvailability::iter().collect()); - add_movie_modal - .quality_profile_list - .set_items(vec![quality_profile_name.clone()]); - - let mut add_movie_search_result_table = StatefulTable::default(); - add_movie_search_result_table.set_items(vec![add_movie_search_result()]); - add_movie_search_result_table.sorting(vec![sort_option!(tmdb_id)]); - add_movie_search_result_table.search = Some("something".into()); - add_movie_search_result_table.filter = Some("something".into()); - - let mut edit_movie_modal = EditMovieModal { - monitored: Some(true), - path: "/nfs/movies".into(), - tags: "alex".into(), - ..EditMovieModal::default() - }; - edit_movie_modal - .minimum_availability_list - .set_items(MinimumAvailability::iter().collect()); - edit_movie_modal - .quality_profile_list - .set_items(vec![quality_profile_name.clone()]); - - let mut edit_collection_modal = EditCollectionModal { - monitored: Some(true), - path: "/nfs/movies".into(), - search_on_add: Some(true), - ..EditCollectionModal::default() - }; - edit_collection_modal - .minimum_availability_list - .set_items(MinimumAvailability::iter().collect()); - edit_collection_modal - .quality_profile_list - .set_items(vec![quality_profile_name.clone()]); - - let edit_indexer_modal = EditIndexerModal { - name: "DrunkenSlug".into(), - enable_rss: Some(true), - enable_automatic_search: Some(true), - enable_interactive_search: Some(true), - url: "http://127.0.0.1:9696/1/".into(), - api_key: "someApiKey".into(), - seed_ratio: "ratio".into(), - tags: "25".into(), - priority: 1, - }; - - let indexer_settings = radarr_models::IndexerSettings { - allow_hardcoded_subs: true, - availability_delay: 0, - id: 1, - maximum_size: 1234, - minimum_age: 12, - prefer_indexer_flags: true, - retention: 30, - rss_sync_interval: 60, - whitelisted_hardcoded_subs: "eng".into(), - }; - - let mut indexer_test_results = StatefulTable::default(); - indexer_test_results.set_items(vec![indexer_test_result()]); - indexer_test_results.sorting(vec![sort_option!(name)]); - indexer_test_results.search = Some("something".into()); - indexer_test_results.filter = Some("something".into()); - - let mut movie_details_modal = MovieDetailsModal { - movie_details: ScrollableText::with_string("Some information".to_owned()), - file_details: "Some file info".to_owned(), - audio_details: "Some audio info".to_owned(), - video_details: "Some video info".to_owned(), - ..MovieDetailsModal::default() - }; - movie_details_modal - .movie_history - .set_items(vec![movie_history_item()]); - movie_details_modal - .movie_cast - .set_items(vec![cast_credit()]); - movie_details_modal - .movie_crew - .set_items(vec![crew_credit()]); - movie_details_modal - .movie_releases - .set_items(vec![torrent_release(), usenet_release()]); - movie_details_modal - .movie_releases - .sorting(vec![sort_option!(indexer_id)]); - - let mut radarr_data = RadarrData { - disk_space_vec: vec![diskspace()], - version: "1.2.3.4".to_owned(), - quality_profile_map: quality_profile_map(), - tags_map: tags_map(), - updates: updates(), - start_time: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), - add_movie_search: Some("test".into()), - add_movie_modal: Some(add_movie_modal), - add_searched_movies: Some(add_movie_search_result_table), - edit_movie_modal: Some(edit_movie_modal), - edit_collection_modal: Some(edit_collection_modal), - edit_indexer_modal: Some(edit_indexer_modal), - edit_root_folder: Some("/nfs/movies".into()), - indexer_settings: Some(indexer_settings), - indexer_test_errors: Some("error".into()), - indexer_test_all_results: Some(indexer_test_results), - movie_details_modal: Some(movie_details_modal), - delete_movie_files: true, - ..RadarrData::default() - }; - radarr_data.root_folders.set_items(vec![root_folder()]); - radarr_data.movies.set_items(vec![movie()]); - radarr_data.movies.sorting(vec![sort_option!(id)]); - radarr_data.movies.search = Some("Something".into()); - radarr_data.movies.filter = Some("Something".into()); - radarr_data.collections.set_items(vec![collection()]); - radarr_data.collections.sorting(vec![sort_option!(id)]); - radarr_data.collections.search = Some("Something".into()); - radarr_data.collections.filter = Some("Something".into()); - radarr_data - .collection_movies - .set_items(vec![collection_movie()]); - radarr_data.downloads.set_items(vec![download_record()]); - radarr_data.blocklist.set_items(vec![blocklist_item()]); - radarr_data.blocklist.sorting(vec![sort_option!(id)]); - radarr_data.indexers.set_items(vec![indexer()]); - radarr_data.indexers.sorting(vec![sort_option!(id)]); - radarr_data.indexers.search = Some("Something".into()); - radarr_data.indexers.filter = Some("Something".into()); - radarr_data.logs.set_items(vec![log_line().into()]); - radarr_data.log_details.set_items(vec![log_line().into()]); - radarr_data.tasks.set_items(vec![task()]); - radarr_data.queued_events.set_items(vec![queued_event()]); App { data: Data { - radarr_data, - sonarr_data: SonarrData::default(), + radarr_data: RadarrData::test_default_fully_populated(), + sonarr_data: SonarrData::test_default_fully_populated(), }, server_tabs: TabState::new(vec![ TabRoute { diff --git a/src/models/servarr_data/data_test_utils.rs b/src/models/servarr_data/data_test_utils.rs new file mode 100644 index 0000000..429ff7f --- /dev/null +++ b/src/models/servarr_data/data_test_utils.rs @@ -0,0 +1,9 @@ +#[macro_export] +macro_rules! sort_option { + ($field:ident) => { + SortOption { + name: "Something", + cmp_fn: Some(|a, b| a.$field.cmp(&b.$field)), + } + }; +} diff --git a/src/models/servarr_data/mod.rs b/src/models/servarr_data/mod.rs index dcffb96..1545315 100644 --- a/src/models/servarr_data/mod.rs +++ b/src/models/servarr_data/mod.rs @@ -5,7 +5,8 @@ pub mod radarr; pub mod sonarr; #[cfg(test)] -#[path = "servarr_data_tests.rs"] +pub(in crate::models::servarr_data) mod data_test_utils; +#[cfg(test)] mod servarr_data_tests; #[derive(Clone, Copy, PartialEq, Eq, Debug, Default)] diff --git a/src/models/servarr_data/radarr/radarr_data.rs b/src/models/servarr_data/radarr/radarr_data.rs index f5d81f7..1d2d351 100644 --- a/src/models/servarr_data/radarr/radarr_data.rs +++ b/src/models/servarr_data/radarr/radarr_data.rs @@ -26,7 +26,22 @@ use chrono::{DateTime, Utc}; use serde_json::Number; use strum::EnumIter; #[cfg(test)] -use strum_macros::{Display, EnumString}; +use { + crate::models::radarr_models::{MinimumAvailability, MovieMonitor}, + crate::models::stateful_table::SortOption, + crate::network::radarr_network::radarr_network_test_utils::test_utils::root_folder, + crate::network::radarr_network::radarr_network_test_utils::test_utils::{ + add_movie_search_result, blocklist_item, cast_credit, collection, collection_movie, + crew_credit, download_record, indexer, log_line, movie, movie_history_item, + quality_profile_map, tags_map, task, torrent_release, updates, usenet_release, + }, + crate::network::servarr_test_utils::diskspace, + crate::network::servarr_test_utils::indexer_test_result, + crate::network::servarr_test_utils::queued_event, + crate::sort_option, + strum::IntoEnumIterator, + strum_macros::{Display, EnumString}, +}; #[cfg(test)] #[path = "radarr_data_tests.rs"] @@ -225,6 +240,161 @@ impl<'a> Default for RadarrData<'a> { } } +#[cfg(test)] +impl RadarrData<'_> { + pub fn test_default_fully_populated() -> Self { + let quality_profile_name = "HD - 1080p".to_owned(); + let mut add_movie_modal = AddMovieModal { + tags: "alex".into(), + ..AddMovieModal::default() + }; + add_movie_modal + .root_folder_list + .set_items(vec![root_folder()]); + add_movie_modal + .monitor_list + .set_items(MovieMonitor::iter().collect()); + add_movie_modal + .minimum_availability_list + .set_items(MinimumAvailability::iter().collect()); + add_movie_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + + let mut add_movie_search_result_table = StatefulTable::default(); + add_movie_search_result_table.set_items(vec![add_movie_search_result()]); + add_movie_search_result_table.sorting(vec![sort_option!(tmdb_id)]); + add_movie_search_result_table.search = Some("something".into()); + add_movie_search_result_table.filter = Some("something".into()); + + let mut edit_movie_modal = EditMovieModal { + monitored: Some(true), + path: "/nfs/movies".into(), + tags: "alex".into(), + ..EditMovieModal::default() + }; + edit_movie_modal + .minimum_availability_list + .set_items(MinimumAvailability::iter().collect()); + edit_movie_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + + let mut edit_collection_modal = EditCollectionModal { + monitored: Some(true), + path: "/nfs/movies".into(), + search_on_add: Some(true), + ..EditCollectionModal::default() + }; + edit_collection_modal + .minimum_availability_list + .set_items(MinimumAvailability::iter().collect()); + edit_collection_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + + let edit_indexer_modal = EditIndexerModal { + name: "DrunkenSlug".into(), + enable_rss: Some(true), + enable_automatic_search: Some(true), + enable_interactive_search: Some(true), + url: "http://127.0.0.1:9696/1/".into(), + api_key: "someApiKey".into(), + seed_ratio: "ratio".into(), + tags: "25".into(), + priority: 1, + }; + + let indexer_settings = IndexerSettings { + allow_hardcoded_subs: true, + availability_delay: 0, + id: 1, + maximum_size: 1234, + minimum_age: 12, + prefer_indexer_flags: true, + retention: 30, + rss_sync_interval: 60, + whitelisted_hardcoded_subs: "eng".into(), + }; + + let mut indexer_test_results = StatefulTable::default(); + indexer_test_results.set_items(vec![indexer_test_result()]); + indexer_test_results.sorting(vec![sort_option!(name)]); + indexer_test_results.search = Some("something".into()); + indexer_test_results.filter = Some("something".into()); + + let mut movie_details_modal = MovieDetailsModal { + movie_details: ScrollableText::with_string("Some information".to_owned()), + file_details: "Some file info".to_owned(), + audio_details: "Some audio info".to_owned(), + video_details: "Some video info".to_owned(), + ..MovieDetailsModal::default() + }; + movie_details_modal + .movie_history + .set_items(vec![movie_history_item()]); + movie_details_modal + .movie_cast + .set_items(vec![cast_credit()]); + movie_details_modal + .movie_crew + .set_items(vec![crew_credit()]); + movie_details_modal + .movie_releases + .set_items(vec![torrent_release(), usenet_release()]); + movie_details_modal + .movie_releases + .sorting(vec![sort_option!(indexer_id)]); + + let mut radarr_data = RadarrData { + disk_space_vec: vec![diskspace()], + version: "1.2.3.4".to_owned(), + quality_profile_map: quality_profile_map(), + tags_map: tags_map(), + updates: updates(), + start_time: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), + add_movie_search: Some("test".into()), + add_movie_modal: Some(add_movie_modal), + add_searched_movies: Some(add_movie_search_result_table), + edit_movie_modal: Some(edit_movie_modal), + edit_collection_modal: Some(edit_collection_modal), + edit_indexer_modal: Some(edit_indexer_modal), + edit_root_folder: Some("/nfs/movies".into()), + indexer_settings: Some(indexer_settings), + indexer_test_errors: Some("error".into()), + indexer_test_all_results: Some(indexer_test_results), + movie_details_modal: Some(movie_details_modal), + delete_movie_files: true, + ..RadarrData::default() + }; + radarr_data.root_folders.set_items(vec![root_folder()]); + radarr_data.movies.set_items(vec![movie()]); + radarr_data.movies.sorting(vec![sort_option!(id)]); + radarr_data.movies.search = Some("Something".into()); + radarr_data.movies.filter = Some("Something".into()); + radarr_data.collections.set_items(vec![collection()]); + radarr_data.collections.sorting(vec![sort_option!(id)]); + radarr_data.collections.search = Some("Something".into()); + radarr_data.collections.filter = Some("Something".into()); + radarr_data + .collection_movies + .set_items(vec![collection_movie()]); + radarr_data.downloads.set_items(vec![download_record()]); + radarr_data.blocklist.set_items(vec![blocklist_item()]); + radarr_data.blocklist.sorting(vec![sort_option!(id)]); + radarr_data.indexers.set_items(vec![indexer()]); + radarr_data.indexers.sorting(vec![sort_option!(id)]); + radarr_data.indexers.search = Some("Something".into()); + radarr_data.indexers.filter = Some("Something".into()); + radarr_data.logs.set_items(vec![log_line().into()]); + radarr_data.log_details.set_items(vec![log_line().into()]); + radarr_data.tasks.set_items(vec![task()]); + radarr_data.queued_events.set_items(vec![queued_event()]); + + radarr_data + } +} + #[derive(Clone, Copy, PartialEq, Eq, Debug, Default, EnumIter)] #[cfg_attr(test, derive(Display, EnumString))] pub enum ActiveRadarrBlock { diff --git a/src/models/servarr_data/sonarr/sonarr_data.rs b/src/models/servarr_data/sonarr/sonarr_data.rs index 8682088..8713468 100644 --- a/src/models/servarr_data/sonarr/sonarr_data.rs +++ b/src/models/servarr_data/sonarr/sonarr_data.rs @@ -1,8 +1,4 @@ -use bimap::BiMap; -use chrono::{DateTime, Utc}; -use serde_json::Number; -use strum::EnumIter; - +use super::modals::{AddSeriesModal, EditSeriesModal, SeasonDetailsModal}; use crate::{ app::{ context_clues::{ @@ -27,8 +23,30 @@ use crate::{ }, network::sonarr_network::SonarrEvent, }; - -use super::modals::{AddSeriesModal, EditSeriesModal, SeasonDetailsModal}; +use bimap::BiMap; +use chrono::{DateTime, Utc}; +use serde_json::Number; +use strum::EnumIter; +#[cfg(test)] +use { + super::modals::EpisodeDetailsModal, + crate::models::sonarr_models::{SeriesMonitor, SeriesType}, + crate::models::stateful_table::SortOption, + crate::network::servarr_test_utils::diskspace, + crate::network::servarr_test_utils::indexer_test_result, + crate::network::servarr_test_utils::queued_event, + crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ + add_series_search_result, blocklist_item, download_record, history_item, indexer, + indexer_settings, log_line, root_folder, + }, + crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ + episode, episode_file, language_profiles_map, quality_profile_map, season, series, tags_map, + task, torrent_release, updates, usenet_release, + }, + crate::sort_option, + strum::IntoEnumIterator, + strum_macros::{Display, EnumString}, +}; #[cfg(test)] #[path = "sonarr_data_tests.rs"] @@ -212,7 +230,164 @@ impl<'a> Default for SonarrData<'a> { } } +#[cfg(test)] +impl SonarrData<'_> { + pub fn test_default_fully_populated() -> Self { + let quality_profile_name = "Bluray-1080p".to_owned(); + let language_profile_name = "English".to_owned(); + let mut add_searched_series = StatefulTable::default(); + add_searched_series.set_items(vec![add_series_search_result()]); + + let mut add_series_modal = AddSeriesModal { + use_season_folder: true, + tags: "alex".into(), + ..AddSeriesModal::default() + }; + add_series_modal + .root_folder_list + .set_items(vec![root_folder()]); + add_series_modal + .monitor_list + .set_items(SeriesMonitor::iter().collect()); + add_series_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + add_series_modal + .language_profile_list + .set_items(vec![language_profile_name.clone()]); + add_series_modal + .series_type_list + .set_items(SeriesType::iter().collect()); + + let edit_indexer_modal = EditIndexerModal { + name: "DrunkenSlug".into(), + enable_rss: Some(true), + enable_automatic_search: Some(true), + enable_interactive_search: Some(true), + url: "http://127.0.0.1:9696/1/".into(), + api_key: "someApiKey".into(), + seed_ratio: "ratio".into(), + tags: "25".into(), + priority: 1, + }; + + let mut edit_series_modal = EditSeriesModal { + monitored: Some(true), + use_season_folders: Some(true), + path: "/nfs/tv".into(), + tags: "alex".into(), + ..EditSeriesModal::default() + }; + edit_series_modal + .series_type_list + .set_items(SeriesType::iter().collect()); + edit_series_modal + .quality_profile_list + .set_items(vec![quality_profile_name.clone()]); + edit_series_modal + .language_profile_list + .set_items(vec![language_profile_name.clone()]); + + let mut indexer_test_all_results = StatefulTable::default(); + indexer_test_all_results.set_items(vec![indexer_test_result()]); + + let mut episode_details_modal = EpisodeDetailsModal { + episode_details: ScrollableText::with_string("Some episode details".into()), + file_details: "Some file details".to_owned(), + audio_details: "Some audio details".to_owned(), + video_details: "Some video details".to_owned(), + ..EpisodeDetailsModal::default() + }; + episode_details_modal + .episode_history + .set_items(vec![history_item()]); + episode_details_modal + .episode_releases + .set_items(vec![torrent_release(), usenet_release()]); + episode_details_modal + .episode_releases + .sorting(vec![sort_option!(indexer_id)]); + + let mut season_details_modal = SeasonDetailsModal { + episode_details_modal: Some(episode_details_modal), + ..SeasonDetailsModal::default() + }; + season_details_modal.episodes.set_items(vec![episode()]); + season_details_modal.episodes.search = Some("episode search".into()); + season_details_modal + .episode_files + .set_items(vec![episode_file()]); + season_details_modal + .season_history + .set_items(vec![history_item()]); + season_details_modal.season_history.search = Some("season history search".into()); + season_details_modal.season_history.filter = Some("season history filter".into()); + season_details_modal + .season_history + .sorting(vec![sort_option!(id)]); + season_details_modal + .season_releases + .set_items(vec![torrent_release(), usenet_release()]); + season_details_modal + .season_releases + .sorting(vec![sort_option!(indexer_id)]); + + let mut series_history = StatefulTable::default(); + series_history.set_items(vec![history_item()]); + series_history.sorting(vec![sort_option!(id)]); + series_history.search = Some("series history search".into()); + series_history.filter = Some("series history filter".into()); + + let mut sonarr_data = SonarrData { + add_list_exclusion: true, + add_searched_series: Some(add_searched_series), + add_series_modal: Some(add_series_modal), + add_series_search: Some("something".into()), + delete_series_files: true, + disk_space_vec: vec![diskspace()], + edit_indexer_modal: Some(edit_indexer_modal), + edit_root_folder: Some("/nfs/tv".into()), + edit_series_modal: Some(edit_series_modal), + indexer_settings: Some(indexer_settings()), + indexer_test_all_results: Some(indexer_test_all_results), + indexer_test_errors: Some("error".to_string()), + language_profiles_map: language_profiles_map(), + quality_profile_map: quality_profile_map(), + season_details_modal: Some(season_details_modal), + series_history: Some(series_history), + start_time: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), + tags_map: tags_map(), + updates: updates(), + version: "1.2.3.4".to_owned(), + ..SonarrData::default() + }; + + sonarr_data.blocklist.set_items(vec![blocklist_item()]); + sonarr_data.blocklist.sorting(vec![sort_option!(id)]); + sonarr_data.downloads.set_items(vec![download_record()]); + sonarr_data.history.set_items(vec![history_item()]); + sonarr_data.history.sorting(vec![sort_option!(id)]); + sonarr_data.history.search = Some("test search".into()); + sonarr_data.history.filter = Some("test filter".into()); + sonarr_data.indexers.set_items(vec![indexer()]); + sonarr_data.queued_events.set_items(vec![queued_event()]); + sonarr_data.root_folders.set_items(vec![root_folder()]); + sonarr_data.seasons.set_items(vec![season()]); + sonarr_data.seasons.search = Some("season search".into()); + sonarr_data.series.set_items(vec![series()]); + sonarr_data.series.sorting(vec![sort_option!(id)]); + sonarr_data.series.search = Some("series search".into()); + sonarr_data.series.filter = Some("series filter".into()); + sonarr_data.logs.set_items(vec![log_line().into()]); + sonarr_data.log_details.set_items(vec![log_line().into()]); + sonarr_data.tasks.set_items(vec![task()]); + + sonarr_data + } +} + #[derive(Clone, Copy, PartialEq, Eq, Debug, Default, EnumIter)] +#[cfg_attr(test, derive(Display, EnumString))] pub enum ActiveSonarrBlock { AddRootFolderPrompt, AddSeriesAlreadyInLibrary, diff --git a/src/network/mod.rs b/src/network/mod.rs index 1e65cd79..b3bf0f4 100644 --- a/src/network/mod.rs +++ b/src/network/mod.rs @@ -26,8 +26,9 @@ pub mod sonarr_network; mod utils; #[cfg(test)] -#[path = "network_tests.rs"] mod network_tests; +#[cfg(test)] +pub mod servarr_test_utils; #[cfg_attr(test, automock)] #[async_trait] diff --git a/src/network/radarr_network/radarr_network_test_utils.rs b/src/network/radarr_network/radarr_network_test_utils.rs index c8f26af..8cc37d6 100644 --- a/src/network/radarr_network/radarr_network_test_utils.rs +++ b/src/network/radarr_network/radarr_network_test_utils.rs @@ -6,9 +6,8 @@ pub mod test_utils { Movie, MovieCollection, MovieFile, MovieHistoryItem, RadarrRelease, RadarrTask, RadarrTaskName, Rating, RatingsList, }; - use crate::models::servarr_data::modals::IndexerTestResultModalItem; use crate::models::servarr_models::{ - DiskSpace, Indexer, IndexerField, Language, Quality, QualityWrapper, QueueEvent, RootFolder, + Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; use crate::models::{HorizontallyScrollableText, ScrollableText}; use bimap::BiMap; @@ -108,13 +107,6 @@ pub mod test_utils { } } - pub fn diskspace() -> DiskSpace { - DiskSpace { - free_space: 6500, - total_space: 8675309, - } - } - pub fn log_line() -> &'static str { "2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases" } @@ -130,23 +122,6 @@ pub mod test_utils { } } - pub fn queued_event() -> QueueEvent { - QueueEvent { - trigger: "manual".to_string(), - name: "Refresh Monitored Downloads".to_string(), - command_name: "Refresh Monitored Downloads".to_string(), - status: "completed".to_string(), - queued: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:25:16Z").unwrap()), - started: Some(DateTime::from( - DateTime::parse_from_rfc3339("2023-05-20T21:25:30Z").unwrap(), - )), - ended: Some(DateTime::from( - DateTime::parse_from_rfc3339("2023-05-20T21:28:33Z").unwrap(), - )), - duration: Some("00:03:03".to_owned()), - } - } - pub fn tags_map() -> BiMap { BiMap::from_iter([(1, "alex".to_owned())]) } @@ -490,14 +465,6 @@ pub mod test_utils { )) } - pub fn indexer_test_result() -> IndexerTestResultModalItem { - IndexerTestResultModalItem { - name: "DrunkenSlug".to_owned(), - is_valid: false, - validation_failures: "Some failure".into(), - } - } - pub fn torrent_release() -> RadarrRelease { RadarrRelease { guid: "1234".to_string(), diff --git a/src/network/servarr_test_utils.rs b/src/network/servarr_test_utils.rs new file mode 100644 index 0000000..0f79be9 --- /dev/null +++ b/src/network/servarr_test_utils.rs @@ -0,0 +1,35 @@ +use crate::models::servarr_data::modals::IndexerTestResultModalItem; +use crate::models::servarr_models::{DiskSpace, QueueEvent}; +use chrono::DateTime; + +pub fn diskspace() -> DiskSpace { + DiskSpace { + free_space: 6500, + total_space: 8675309, + } +} + +pub fn indexer_test_result() -> IndexerTestResultModalItem { + IndexerTestResultModalItem { + name: "DrunkenSlug".to_owned(), + is_valid: false, + validation_failures: "Some failure".into(), + } +} + +pub fn queued_event() -> QueueEvent { + QueueEvent { + trigger: "manual".to_string(), + name: "Refresh Monitored Downloads".to_string(), + command_name: "Refresh Monitored Downloads".to_string(), + status: "completed".to_string(), + queued: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:25:16Z").unwrap()), + started: Some(DateTime::from( + DateTime::parse_from_rfc3339("2023-05-20T21:25:30Z").unwrap(), + )), + ended: Some(DateTime::from( + DateTime::parse_from_rfc3339("2023-05-20T21:28:33Z").unwrap(), + )), + duration: Some("00:03:03".to_owned()), + } +} diff --git a/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs b/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs index 5b818cc..a8d27d8 100644 --- a/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs +++ b/src/network/sonarr_network/blocklist/sonarr_blocklist_network_tests.rs @@ -96,6 +96,7 @@ mod tests { }, { "seriesId": 2001, + "seriesTitle": "Test Series", "episodeIds": [42018], "sourceTitle": "A Series", "languages": [{ "id": 1, "name": "English" }], diff --git a/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs b/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs index cd4f536..4de541a 100644 --- a/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs +++ b/src/network/sonarr_network/library/episodes/sonarr_episodes_network_tests.rs @@ -12,7 +12,7 @@ mod tests { use crate::network::sonarr_network::SonarrEvent; use crate::network::sonarr_network::library::episodes::get_episode_status; use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ - EPISODE_JSON, episode, episode_file, history_item, release, + EPISODE_JSON, episode, episode_file, history_item, torrent_release, }; use indoc::formatdoc; use mockito::Matcher; @@ -1124,9 +1124,9 @@ mod tests { .unwrap() .episode_releases .items, - vec![release()] + vec![torrent_release()] ); - assert_eq!(releases_vec, vec![release()]); + assert_eq!(releases_vec, vec![torrent_release()]); } #[tokio::test] @@ -1179,9 +1179,9 @@ mod tests { .unwrap() .episode_releases .items, - vec![release()] + vec![torrent_release()] ); - assert_eq!(releases_vec, vec![release()]); + assert_eq!(releases_vec, vec![torrent_release()]); } #[tokio::test] diff --git a/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs b/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs index 25fb1f1..80427cc 100644 --- a/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs +++ b/src/network/sonarr_network/library/seasons/sonarr_seasons_network_tests.rs @@ -6,7 +6,7 @@ mod tests { use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::{ - SERIES_JSON, history_item, release, season, series, + SERIES_JSON, history_item, season, series, torrent_release, }; use mockito::Matcher; use pretty_assertions::assert_eq; @@ -101,16 +101,16 @@ mod tests { ]); let expected_filtered_sonarr_release = SonarrRelease { full_season: true, - ..release() + ..torrent_release() }; let expected_raw_sonarr_releases = vec![ SonarrRelease { full_season: true, - ..release() + ..torrent_release() }, SonarrRelease { guid: "4567".to_owned(), - ..release() + ..torrent_release() }, ]; let (mock, app, _server) = MockServarrApi::get() @@ -197,7 +197,7 @@ mod tests { ]); let expected_sonarr_release = SonarrRelease { full_season: true, - ..release() + ..torrent_release() }; let (mock, app, _server) = MockServarrApi::get() .returns(release_json) diff --git a/src/network/sonarr_network/mod.rs b/src/network/sonarr_network/mod.rs index 6d45118..b0f314c 100644 --- a/src/network/sonarr_network/mod.rs +++ b/src/network/sonarr_network/mod.rs @@ -19,7 +19,7 @@ mod sonarr_network_tests; #[cfg(test)] #[path = "sonarr_network_test_utils.rs"] -mod sonarr_network_test_utils; +pub mod sonarr_network_test_utils; mod blocklist; mod downloads; diff --git a/src/network/sonarr_network/sonarr_network_test_utils.rs b/src/network/sonarr_network/sonarr_network_test_utils.rs index d8eb8f5..e3fc28c 100644 --- a/src/network/sonarr_network/sonarr_network_test_utils.rs +++ b/src/network/sonarr_network/sonarr_network_test_utils.rs @@ -1,6 +1,5 @@ #[cfg(test)] -pub(in crate::network::sonarr_network) mod test_utils { - use crate::models::HorizontallyScrollableText; +pub mod test_utils { use crate::models::servarr_models::{ Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder, }; @@ -8,9 +7,13 @@ pub(in crate::network::sonarr_network) mod test_utils { AddSeriesSearchResult, AddSeriesSearchResultStatistics, BlocklistItem, DownloadRecord, DownloadStatus, DownloadsResponse, Episode, EpisodeFile, IndexerSettings, MediaInfo, Rating, Season, SeasonStatistics, Series, SeriesStatistics, SeriesStatus, SeriesType, - SonarrHistoryData, SonarrHistoryEventType, SonarrHistoryItem, SonarrRelease, + SonarrHistoryData, SonarrHistoryEventType, SonarrHistoryItem, SonarrRelease, SonarrTask, + SonarrTaskName, }; + use crate::models::{HorizontallyScrollableText, ScrollableText}; + use bimap::BiMap; use chrono::DateTime; + use indoc::formatdoc; use serde_json::{Number, Value, json}; pub const SERIES_JSON: &str = r#"{ @@ -22,6 +25,7 @@ pub(in crate::network::sonarr_network) mod test_utils { "seasons": [ { "seasonNumber": 1, + "title": "Season title", "monitored": true, "statistics": { "previousAiring": "2022-10-24T01:00:00Z", @@ -120,7 +124,7 @@ pub(in crate::network::sonarr_network) mod test_utils { BlocklistItem { id: 1, series_id: 1, - series_title: None, + series_title: Some("Test Series".to_owned()), episode_ids: vec![Number::from(1)], source_title: "Test Source Title".to_owned(), languages: vec![Some(language())], @@ -299,7 +303,7 @@ pub(in crate::network::sonarr_network) mod test_utils { pub fn season() -> Season { Season { - title: None, + title: Some("Season title".to_owned()), season_number: 1, monitored: true, statistics: Some(season_statistics()), @@ -364,7 +368,7 @@ pub(in crate::network::sonarr_network) mod test_utils { ] } - pub fn release() -> SonarrRelease { + pub fn torrent_release() -> SonarrRelease { SonarrRelease { guid: "1234".to_owned(), protocol: "torrent".to_owned(), @@ -383,6 +387,25 @@ pub(in crate::network::sonarr_network) mod test_utils { } } + pub fn usenet_release() -> SonarrRelease { + SonarrRelease { + guid: "1234".to_owned(), + protocol: "usenet".to_owned(), + age: 1, + title: HorizontallyScrollableText::from("Test Release"), + indexer: "DrunkenSlug".to_owned(), + indexer_id: 1, + size: 1234, + rejected: true, + rejections: Some(rejections()), + seeders: None, + leechers: None, + languages: Some(vec![Some(language())]), + quality: quality_wrapper(), + full_season: false, + } + } + pub fn root_folder() -> RootFolder { RootFolder { id: 1, @@ -399,4 +422,61 @@ pub(in crate::network::sonarr_network) mod test_utils { "label": "testing" }) } + + pub fn log_line() -> &'static str { + "2025-12-16 16:40:59 UTC|INFO|ImportListSyncService|No list items to process" + } + + pub fn language_profiles_map() -> BiMap { + let Language { id, name } = language(); + + BiMap::from_iter(vec![(id, name)]) + } + + pub fn quality_profile_map() -> BiMap { + BiMap::from_iter(vec![(6, quality().name)]) + } + + pub fn tags_map() -> BiMap { + BiMap::from_iter(vec![(1, "alex".to_owned())]) + } + + pub fn task() -> SonarrTask { + SonarrTask { + name: "Backup".to_owned(), + task_name: SonarrTaskName::Backup, + interval: 60, + last_execution: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T21:29:16Z").unwrap()), + next_execution: DateTime::from(DateTime::parse_from_rfc3339("2023-05-20T22:29:16Z").unwrap()), + } + } + + pub fn updates() -> ScrollableText { + let line_break = "-".repeat(200); + ScrollableText::with_string(formatdoc!( + " + The latest version of Sonarr is already installed + + 4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) + {line_break} + New: + * Cool new thing + Fixed: + * Some bugs killed + + + 3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) + {line_break} + New: + * Cool new thing (old) + * Other cool new thing (old) + + + 2.1.0 - 2023-04-15 02:02:53 UTC + {line_break} + Fixed: + * Killed bug 1 + * Fixed bug 2" + )) + } } diff --git a/src/network/sonarr_network/system/mod.rs b/src/network/sonarr_network/system/mod.rs index 9bd6b88..d2c1ed6 100644 --- a/src/network/sonarr_network/system/mod.rs +++ b/src/network/sonarr_network/system/mod.rs @@ -202,9 +202,9 @@ impl Network<'_, '_> { .map(|update| { let install_status = if update.installed_on.is_some() { if update.installed { - "(Currently Installed)".to_owned() + " (Currently Installed)".to_owned() } else { - "(Previously Installed)".to_owned() + " (Previously Installed)".to_owned() } } else { String::new() @@ -218,7 +218,7 @@ impl Network<'_, '_> { }; let mut update_info = formatdoc!( - "{} - {} {install_status} + "{} - {}{install_status} {}", update.version, update.release_date, diff --git a/src/network/sonarr_network/system/sonarr_system_network_tests.rs b/src/network/sonarr_network/system/sonarr_system_network_tests.rs index 99c3f58..b254176 100644 --- a/src/network/sonarr_network/system/sonarr_system_network_tests.rs +++ b/src/network/sonarr_network/system/sonarr_system_network_tests.rs @@ -1,14 +1,14 @@ #[cfg(test)] mod tests { + use crate::models::HorizontallyScrollableText; use crate::models::servarr_models::{ DiskSpace, HostConfig, LogResponse, QueueEvent, SecurityConfig, Update, }; use crate::models::sonarr_models::{SonarrSerdeable, SonarrTask, SonarrTaskName, SystemStatus}; - use crate::models::{HorizontallyScrollableText, ScrollableText}; use crate::network::network_tests::test_utils::{MockServarrApi, test_network}; use crate::network::sonarr_network::SonarrEvent; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::updates; use chrono::DateTime; - use indoc::formatdoc; use pretty_assertions::{assert_eq, assert_str_eq}; use serde_json::json; @@ -359,32 +359,7 @@ mod tests { }, }]); let response: Vec = serde_json::from_value(updates_json.clone()).unwrap(); - let line_break = "-".repeat(200); - let expected_text = ScrollableText::with_string(formatdoc!( - " - The latest version of Sonarr is already installed - - 4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) - {line_break} - New: - * Cool new thing - Fixed: - * Some bugs killed - - - 3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) - {line_break} - New: - * Cool new thing (old) - * Other cool new thing (old) - - - 2.1.0 - 2023-04-15 02:02:53 UTC - {line_break} - Fixed: - * Killed bug 1 - * Fixed bug 2" - )); + let expected_text = updates(); let (mock, app, _server) = MockServarrApi::get() .returns(updates_json) .build_for(SonarrEvent::GetUpdates) diff --git a/src/ui/radarr_ui/collections/collections_ui_tests.rs b/src/ui/radarr_ui/collections/collections_ui_tests.rs index ba8caa7..10fff87 100644 --- a/src/ui/radarr_ui/collections/collections_ui_tests.rs +++ b/src/ui/radarr_ui/collections/collections_ui_tests.rs @@ -58,7 +58,12 @@ mod tests { CollectionsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!( + format!( + "is_loading_{is_loading}_empty_movies_{empty_movies}_empty_profile_{empty_profile_map}" + ), + output + ); } #[rstest] @@ -81,7 +86,7 @@ mod tests { CollectionsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(active_radarr_block.to_string(), output); + insta::assert_snapshot!(format!("collections_tab_{active_radarr_block}"), output); } #[test] @@ -141,7 +146,7 @@ mod tests { insta::assert_snapshot!( format!( - "{}_{}", + "edit_collection_modal_{}_{}", active_radarr_block.to_string(), context_block.to_string() ), diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_Collections.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__Collections.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_Collections.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_CollectionsSortPrompt.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__CollectionsSortPrompt.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_CollectionsSortPrompt.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_FilterCollections.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollections.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_FilterCollections.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_FilterCollectionsError.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__FilterCollectionsError.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_FilterCollectionsError.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_SearchCollection.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollection.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_SearchCollection.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_SearchCollectionError.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__SearchCollectionError.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_SearchCollectionError.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_UpdateAllCollectionsPrompt.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__UpdateAllCollectionsPrompt.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__collections_tab_UpdateAllCollectionsPrompt.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionConfirmPrompt_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionConfirmPrompt_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionConfirmPrompt_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionPrompt_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionPrompt_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionPrompt_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionRootFolderPathInput_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionRootFolderPathInput_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionRootFolderPathInput_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionSelectMinimumAvailability_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectMinimumAvailability_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionSelectMinimumAvailability_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionSelectQualityProfile_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionSelectQualityProfile_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionSelectQualityProfile_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionToggleMonitored_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleMonitored_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionToggleMonitored_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionToggleSearchOnAdd_CollectionDetails.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__EditCollectionToggleSearchOnAdd_CollectionDetails.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__edit_collection_modal_EditCollectionToggleSearchOnAdd_CollectionDetails.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_false_empty_movies_false_empty_profile_true.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-2.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_false_empty_movies_false_empty_profile_true.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_false_empty_movies_true_empty_profile_false.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading-3.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_false_empty_movies_true_empty_profile_false.snap diff --git a/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap b/src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_true_empty_movies_false_empty_profile_false.snap similarity index 100% rename from src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__radarr_ui_renders_collections_tab_loading.snap rename to src/ui/radarr_ui/collections/snapshots/managarr__ui__radarr_ui__collections__collections_ui_tests__tests__snapshot_tests__is_loading_true_empty_movies_false_empty_profile_false.snap diff --git a/src/ui/radarr_ui/library/library_ui_tests.rs b/src/ui/radarr_ui/library/library_ui_tests.rs index 2ab03be..629c955 100644 --- a/src/ui/radarr_ui/library/library_ui_tests.rs +++ b/src/ui/radarr_ui/library/library_ui_tests.rs @@ -82,7 +82,7 @@ mod tests { LibraryUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(active_radarr_block.to_string(), output); + insta::assert_snapshot!(format!("library_tab_{active_radarr_block}"), output); } #[rstest] @@ -109,7 +109,7 @@ mod tests { LibraryUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(active_radarr_block.to_string(), output); + insta::assert_snapshot!(format!("add_movie_ui_{active_radarr_block}"), output); } #[test] diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieAlreadyInLibrary.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieAlreadyInLibrary.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieAlreadyInLibrary.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieEmptySearchResults.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieEmptySearchResults.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieEmptySearchResults.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMoviePrompt.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMoviePrompt.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMoviePrompt.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSearchInput.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchInput.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSearchInput.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSearchResults.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSearchResults.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSearchResults.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectMinimumAvailability.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMinimumAvailability.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectMinimumAvailability.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectMonitor.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectMonitor.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectMonitor.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectQualityProfile.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectQualityProfile.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectQualityProfile.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectRootFolder.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieSelectRootFolder.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieSelectRootFolder.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieTagsInput.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__AddMovieTagsInput.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__add_movie_ui_AddMovieTagsInput.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_FilterMovies.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMovies.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_FilterMovies.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_FilterMoviesError.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__FilterMoviesError.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_FilterMoviesError.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_Movies.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__Movies.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_Movies.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_MoviesSortPrompt.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__MoviesSortPrompt.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_MoviesSortPrompt.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_SearchMovie.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovie.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_SearchMovie.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_SearchMovieError.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__SearchMovieError.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_SearchMovieError.snap diff --git a/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap b/src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_UpdateAllMoviesPrompt.snap similarity index 100% rename from src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__UpdateAllMoviesPrompt.snap rename to src/ui/radarr_ui/library/snapshots/managarr__ui__radarr_ui__library__library_ui_tests__tests__snapshot_tests__library_tab_UpdateAllMoviesPrompt.snap diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemLogs.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemLogs.snap new file mode 100644 index 0000000..68c4f5f --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemLogs.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │2025-12-15 16:14:45 UTC|INFO|DownloadDecisionMaker|Processing 545 releases │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +╰───────────────────│ │────────────────────╯ +╭ Logs ───────────│ │────────────────────╮ +│2025-12-15 16:14:45│ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemQueuedEvents.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemQueuedEvents.snap new file mode 100644 index 0000000..18b71e4 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemQueuedEvents.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ │ +│ │Trigger Status Name Queued Started Duration │ │ +│ │manual completed Refresh Monitored Downlo 4 minutes ago 4 minutes ago 00:03:03 │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +╰────────────────────────────────│ │────────────────────────────────╯ +╭ Logs ────────────────────────│ │────────────────────────────────╮ +│2025-12-15 16:14:45 UTC|INFO|Dow│ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTaskStartConfirmPrompt.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTaskStartConfirmPrompt.snap new file mode 100644 index 0000000..08c6dc7 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTaskStartConfirmPrompt.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Name Interval Last Execution Last Duration Next Execution │ │ +│ │=> Backup 1 hour now 00:00:17 59 minutes │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ ╭────────────────────── Start Task ───────────────────────╮ │ │ +│ │ │ Do you want to manually start this task: Backup? │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +╰───────────────────│ │ │ │────────────────────╯ +╭ Logs ───────────│ │ │ │────────────────────╮ +│2025-12-15 16:14:45│ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │╭────────────────────────────╮╭───────────────────────────╮│ │ │ +│ │ ││ Yes ││ No ││ │ │ +│ │ │╰────────────────────────────╯╰───────────────────────────╯│ │ │ +│ │ ╰───────────────────────────────────────────────────────────╯ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTasks.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTasks.snap new file mode 100644 index 0000000..e5f4537 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemTasks.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Name Interval Last Execution Last Duration Next Execution │ │ +│ │=> Backup 1 hour now 00:00:17 59 minutes │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +╰───────────────────│ │────────────────────╯ +╭ Logs ───────────│ │────────────────────╮ +│2025-12-15 16:14:45│ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemUpdates.snap b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemUpdates.snap new file mode 100644 index 0000000..8e22df5 --- /dev/null +++ b/src/ui/radarr_ui/system/snapshots/managarr__ui__radarr_ui__system__system_ui_tests__tests__snapshot_tests__system_details_over_system_tab_SystemUpdates.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/radarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Last Duration Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 00:00:17 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Updates ───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │The latest version of Radarr is already installed │ │ +│ │ │ │ +│ │4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) │ │ +│ │--------------------------------------------------------------------------------------------------------------------------│ │ +│ │New: │ │ +│ │ * Cool new thing │ │ +│ │Fixed: │ │ +│ │ * Some bugs killed │ │ +│ │ │ │ +│ │ │ │ +│ │3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) │ │ +│ │--------------------------------------------------------------------------------------------------------------------------│ │ +│ │New: │ │ +│ │ * Cool new thing (old) │ │ +│ │ * Other cool new thing (old) │ │ +│ │ │ │ +│ │ │ │ +╰───────────────────│2.1.0 - 2023-04-15 02:02:53 UTC │────────────────────╯ +╭ Logs ───────────│--------------------------------------------------------------------------------------------------------------------------│────────────────────╮ +│2025-12-15 16:14:45│Fixed: │ │ +│ │ * Killed bug 1 │ │ +│ │ * Fixed bug 2 │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/radarr_ui/system/system_details_ui_tests.rs b/src/ui/radarr_ui/system/system_details_ui_tests.rs index 37782ec..2277f3a 100644 --- a/src/ui/radarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_details_ui_tests.rs @@ -27,7 +27,7 @@ mod tests { use rstest::rstest; #[rstest] - fn test_system_details_ui_renders_tasks( + fn test_system_details_ui_renders_popups( #[values( ActiveRadarrBlock::SystemLogs, ActiveRadarrBlock::SystemQueuedEvents, diff --git a/src/ui/radarr_ui/system/system_ui_tests.rs b/src/ui/radarr_ui/system/system_ui_tests.rs index 52ea30e..31bd161 100644 --- a/src/ui/radarr_ui/system/system_ui_tests.rs +++ b/src/ui/radarr_ui/system/system_ui_tests.rs @@ -29,6 +29,7 @@ mod tests { use super::*; use crate::models::stateful_list::StatefulList; use crate::models::stateful_table::StatefulTable; + use rstest::rstest; #[test] fn test_radarr_ui_renders_system_tab_loading() { @@ -98,5 +99,29 @@ mod tests { insta::assert_snapshot!(output); } + + #[rstest] + fn test_system_details_ui_renders_popups_over_system_tab( + #[values( + ActiveRadarrBlock::SystemLogs, + ActiveRadarrBlock::SystemQueuedEvents, + ActiveRadarrBlock::SystemTasks, + ActiveRadarrBlock::SystemTaskStartConfirmPrompt, + ActiveRadarrBlock::SystemUpdates + )] + active_radarr_block: ActiveRadarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_radarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("system_details_over_system_tab_{active_radarr_block}"), + output + ); + } } } diff --git a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs index d04e2ef..0ab47b0 100644 --- a/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +++ b/src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs @@ -4,8 +4,6 @@ mod tests { use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, BLOCKLIST_BLOCKS}; - use crate::models::sonarr_models::BlocklistItem; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::blocklist::BlocklistUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -23,11 +21,12 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_blocklist_ui_renders_loading_state() { + fn test_blocklist_ui_renders_loading() { let mut app = App::test_default(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); @@ -40,10 +39,9 @@ mod tests { } #[test] - fn test_blocklist_ui_renders_empty_blocklist() { + fn test_blocklist_ui_renders_empty() { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); - app.data.sonarr_data.blocklist = StatefulTable::default(); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { BlocklistUi::draw(f, app, f.area()); @@ -52,29 +50,25 @@ mod tests { insta::assert_snapshot!(output); } - #[test] - fn test_blocklist_ui_renders_with_blocklist_items() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Blocklist.into()); - app.data.sonarr_data.blocklist = StatefulTable::default(); - app.data.sonarr_data.blocklist.set_items(vec![ - BlocklistItem { - id: 1, - source_title: "Test.Series.S01E01.1080p".to_owned(), - ..BlocklistItem::default() - }, - BlocklistItem { - id: 2, - source_title: "Another.Series.S02E05.720p".to_owned(), - ..BlocklistItem::default() - }, - ]); + #[rstest] + fn test_blocklist_ui_renders( + #[values( + ActiveSonarrBlock::Blocklist, + ActiveSonarrBlock::BlocklistItemDetails, + ActiveSonarrBlock::DeleteBlocklistItemPrompt, + ActiveSonarrBlock::BlocklistClearAllItemsPrompt, + ActiveSonarrBlock::BlocklistSortPrompt + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { BlocklistUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("blocklist_tab_{active_sonarr_block}"), output); } } } diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_Blocklist.snap similarity index 53% rename from src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap rename to src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_Blocklist.snap index 42522b0..1d83850 100644 --- a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_with_blocklist_items.snap +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_Blocklist.snap @@ -3,6 +3,5 @@ source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Series Title Source Title Language Quality Date -=> Test.Series.S01E01.1080p 1970-01-01 00:00:00 UTC - Another.Series.S02E05.720p 1970-01-01 00:00:00 UTC + Series Title ▼ Source Title Language Quality Date +=> Test Series Test Source Title English Bluray-1080p 2024-02-10 07:28:45 UTC diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistClearAllItemsPrompt.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistClearAllItemsPrompt.snap new file mode 100644 index 0000000..2d83c6e --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistClearAllItemsPrompt.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Series Title ▼ Source Title Language Quality Date +=> Test Series Test Source Title English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + ╭────── Clear Blocklist ──────╮ + │ Do you want to clear your │ + │ blocklist? │ + │ │ + │ │ + │ │ + │╭──────────────╮╭─────────────╮│ + ││ Yes ││ No ││ + │╰──────────────╯╰─────────────╯│ + ╰───────────────────────────────╯ diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistItemDetails.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistItemDetails.snap new file mode 100644 index 0000000..8c2e63c --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistItemDetails.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Series Title ▼ Source Title Language Quality Date +=> Test Series Test Source Title English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + ╭─────────────────────────────────── Details ───────────────────────────────────╮ + │Name: Test Source Title │ + │Protocol: usenet │ + │Indexer: NZBgeek (Prowlarr) │ + │Message: test message │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistSortPrompt.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistSortPrompt.snap new file mode 100644 index 0000000..5f6e390 --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_BlocklistSortPrompt.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Series Title Source Title Language Quality Date +=> Test Series Test Source Title English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + ╭───────────────────────────────╮ + │Something │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────╯ diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_DeleteBlocklistItemPrompt.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_DeleteBlocklistItemPrompt.snap new file mode 100644 index 0000000..8f2c711 --- /dev/null +++ b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_tab_DeleteBlocklistItemPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/blocklist/blocklist_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Series Title ▼ Source Title Language Quality Date +=> Test Series Test Source Title English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + ╭────────────── Remove Item from Blocklist ───────────────╮ + │ Do you want to remove this item from your blocklist: │ + │ Test Source Title? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty.snap similarity index 100% rename from src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty_blocklist.snap rename to src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_empty.snap diff --git a/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap b/src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/blocklist/snapshots/managarr__ui__sonarr_ui__blocklist__blocklist_ui_tests__tests__snapshot_tests__blocklist_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs index b6a7b82..19985a5 100644 --- a/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +++ b/src/ui/sonarr_ui/downloads/downloads_ui_tests.rs @@ -4,8 +4,6 @@ mod tests { use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, DOWNLOADS_BLOCKS}; - use crate::models::sonarr_models::DownloadRecord; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::downloads::DownloadsUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -23,11 +21,12 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_downloads_ui_renders_loading_state() { + fn test_downloads_ui_renders_loading() { let mut app = App::test_default(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); @@ -43,7 +42,6 @@ mod tests { fn test_downloads_ui_renders_empty_downloads() { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); - app.data.sonarr_data.downloads = StatefulTable::default(); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { DownloadsUi::draw(f, app, f.area()); @@ -52,35 +50,23 @@ mod tests { insta::assert_snapshot!(output); } - #[test] - fn test_downloads_ui_renders_with_downloads() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Downloads.into()); - app.data.sonarr_data.downloads = StatefulTable::default(); - app.data.sonarr_data.downloads.set_items(vec![ - DownloadRecord { - id: 1, - title: "Test Series Download".to_owned(), - status: Default::default(), - size: 1024.0 * 1024.0 * 1024.0, - sizeleft: 512.0 * 1024.0 * 1024.0, - ..DownloadRecord::default() - }, - DownloadRecord { - id: 2, - title: "Another Series Download".to_owned(), - status: Default::default(), - size: 2048.0 * 1024.0 * 1024.0, - sizeleft: 0.0, - ..DownloadRecord::default() - }, - ]); + #[rstest] + fn test_downloads_ui_renders( + #[values( + ActiveSonarrBlock::Downloads, + ActiveSonarrBlock::DeleteDownloadPrompt, + ActiveSonarrBlock::UpdateDownloadsPrompt + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { DownloadsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("downloads_ui_{active_sonarr_block}"), output); } } } diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_DeleteDownloadPrompt.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_DeleteDownloadPrompt.snap new file mode 100644 index 0000000..c5f7dae --- /dev/null +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_DeleteDownloadPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Complete Size Output Path Indexer Download Client +=> Test Download Title 50% 3.30 GB /nfs/tv/Test show/season 1/ kickass torrents transmission + + + + + + + + + + + + + + ╭──────────────────── Cancel Download ────────────────────╮ + │ Do you really want to delete this download: │ + │ Test Download Title? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_Downloads.snap similarity index 75% rename from src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap rename to src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_Downloads.snap index 06fb5ed..933b0c9 100644 --- a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_with_downloads.snap +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_Downloads.snap @@ -4,5 +4,4 @@ expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Title Percent Complete Size Output Path Indexer Download Client -=> Test Series Download 50% 1.00 GB - Another Series Download 100% 2.00 GB +=> Test Download Title 50% 3.30 GB /nfs/tv/Test show/season 1/ kickass torrents transmission diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_UpdateDownloadsPrompt.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_UpdateDownloadsPrompt.snap new file mode 100644 index 0000000..19a85cc --- /dev/null +++ b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_UpdateDownloadsPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/downloads/downloads_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Percent Complete Size Output Path Indexer Download Client +=> Test Download Title 50% 3.30 GB /nfs/tv/Test show/season 1/ kickass torrents transmission + + + + + + + + + + + + + + ╭─────────────────── Update Downloads ────────────────────╮ + │ Do you want to update your downloads? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap b/src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/downloads/snapshots/managarr__ui__sonarr_ui__downloads__downloads_ui_tests__tests__snapshot_tests__downloads_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/history/history_ui_tests.rs b/src/ui/sonarr_ui/history/history_ui_tests.rs index 9c519d1..21ef724 100644 --- a/src/ui/sonarr_ui/history/history_ui_tests.rs +++ b/src/ui/sonarr_ui/history/history_ui_tests.rs @@ -4,8 +4,6 @@ mod tests { use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, HISTORY_BLOCKS}; - use crate::models::sonarr_models::SonarrHistoryItem; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::history::HistoryUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -23,11 +21,12 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_history_ui_renders_loading_state() { + fn test_history_ui_renders_loading() { let mut app = App::test_default(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::History.into()); @@ -39,42 +38,42 @@ mod tests { insta::assert_snapshot!(output); } - #[test] - fn test_history_ui_renders_empty_history() { + #[rstest] + fn test_history_ui_renders_empty( + #[values(ActiveSonarrBlock::History, ActiveSonarrBlock::HistoryItemDetails)] + active_sonarr_block: ActiveSonarrBlock, + ) { let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::History.into()); - app.data.sonarr_data.history = StatefulTable::default(); + app.push_navigation_stack(active_sonarr_block.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { HistoryUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("loading_history_tab_{active_sonarr_block}"), output); } - #[test] - fn test_history_ui_renders_with_history_items() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::History.into()); - app.data.sonarr_data.history = StatefulTable::default(); - app.data.sonarr_data.history.set_items(vec![ - SonarrHistoryItem { - id: 1, - source_title: "Test.Series.S01E01".to_owned().into(), - ..SonarrHistoryItem::default() - }, - SonarrHistoryItem { - id: 2, - source_title: "Another.Series.S02E05".to_owned().into(), - ..SonarrHistoryItem::default() - }, - ]); + #[rstest] + fn test_history_ui_renders( + #[values( + ActiveSonarrBlock::History, + ActiveSonarrBlock::HistoryItemDetails, + ActiveSonarrBlock::HistorySortPrompt, + ActiveSonarrBlock::FilterHistory, + ActiveSonarrBlock::FilterHistoryError, + ActiveSonarrBlock::SearchHistory, + ActiveSonarrBlock::SearchHistoryError + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { HistoryUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("history_tab_{active_sonarr_block}"), output); } } } diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistory.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistory.snap new file mode 100644 index 0000000..fd21b4e --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistory.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title ▼ Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + + ╭───────────────── Filter ──────────────────╮ + │test filter │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistoryError.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistoryError.snap new file mode 100644 index 0000000..5e35a5a --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_FilterHistoryError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title ▼ Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │The given filter produced empty results│ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_History.snap similarity index 54% rename from src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap rename to src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_History.snap index ff6f39f..b28692c 100644 --- a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_with_history_items.snap +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_History.snap @@ -3,6 +3,5 @@ source: src/ui/sonarr_ui/history/history_ui_tests.rs expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Source Title Event Type Language Quality Date -=> Test.Series.S01E01 unknown 1970-01-01 00:00:00 UTC - Another.Series.S02E05 unknown 1970-01-01 00:00:00 UTC + Source Title ▼ Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistoryItemDetails.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistoryItemDetails.snap new file mode 100644 index 0000000..77e2c98 --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistoryItemDetails.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title ▼ Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + ╭─────────────────────────────────── Details ───────────────────────────────────╮ + │Source Title: Test source │ + │Indexer: │ + │Release Group: │ + │Series Match Type: │ + │NZB Info URL: │ + │Download Client Name: │ + │Age: 0 days │ + │Published Date: 1970-01-01 00:00:00 UTC │ + ╰─────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistorySortPrompt.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistorySortPrompt.snap new file mode 100644 index 0000000..1d784c9 --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_HistorySortPrompt.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + ╭───────────────────────────────╮ + │Something │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────╯ diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistory.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistory.snap new file mode 100644 index 0000000..f7923ef --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistory.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title ▼ Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + + ╭───────────────── Search ──────────────────╮ + │test search │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistoryError.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistoryError.snap new file mode 100644 index 0000000..21e184f --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_tab_SearchHistoryError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Source Title ▼ Event Type Language Quality Date +=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ No items found matching search │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_History.snap similarity index 100% rename from src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__history_ui_renders_empty_history.snap rename to src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_History.snap diff --git a/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_HistoryItemDetails.snap b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_HistoryItemDetails.snap new file mode 100644 index 0000000..71155ea --- /dev/null +++ b/src/ui/sonarr_ui/history/snapshots/managarr__ui__sonarr_ui__history__history_ui_tests__tests__snapshot_tests__loading_history_tab_HistoryItemDetails.snap @@ -0,0 +1,34 @@ +--- +source: src/ui/sonarr_ui/history/history_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + + + + + + + + + + + + + + + + + + ╭─────────────────────────────────── Details ───────────────────────────────────╮ + │Source Title: │ + │ │ + │No additional data available │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs index e53fbf0..a1ed716 100644 --- a/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs @@ -4,16 +4,13 @@ mod tests { use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::servarr_data::modals::EditIndexerModal; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, }; - use crate::models::servarr_models::{Indexer, IndexerField}; - use crate::models::stateful_table::StatefulTable; + use crate::models::servarr_models::Indexer; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::edit_indexer_ui::EditIndexerUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; - use serde_json::json; #[test] fn test_edit_indexer_ui_accepts() { @@ -27,39 +24,52 @@ mod tests { } mod snapshot_tests { + use crate::models::servarr_data::sonarr::sonarr_data::EDIT_INDEXER_NZB_SELECTION_BLOCKS; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::indexer; use crate::ui::ui_test_utils::test_utils::TerminalSize; use super::*; #[test] - fn test_edit_indexer_ui_renders_edit_indexer_modal() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::EditIndexerNameInput.into()); - app.data.sonarr_data.indexers = StatefulTable::default(); - app.data.sonarr_data.indexers.set_items(vec![Indexer { - id: 1, - name: Some("Test Indexer".to_owned()), - enable_rss: true, - priority: 25, - fields: Some(vec![ - IndexerField { - name: Some("baseUrl".to_owned()), - value: Some(json!("https://test.indexer.com")), - }, - IndexerField { - name: Some("apiKey".to_owned()), - value: Some(json!("test-api-key")), - }, - IndexerField { - name: Some("seedCriteria.seedRatio".to_owned()), - value: Some(json!(1.0)), - }, - ]), - ..Indexer::default() - }]); + fn test_edit_indexer_ui_renders_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.data.sonarr_data.edit_indexer_modal = None; + app.push_navigation_stack(ActiveSonarrBlock::EditIndexerPrompt.into()); app.data.sonarr_data.selected_block = BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); - app.data.sonarr_data.edit_indexer_modal = Some(EditIndexerModal::from(&app.data.sonarr_data)); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EditIndexerUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_edit_indexer_ui_renders_edit_torrent_indexer() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EditIndexerPrompt.into()); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EditIndexerUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_edit_indexer_ui_renders_edit_usenet_indexer() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EditIndexerPrompt.into()); + app.data.sonarr_data.indexers.set_items(vec![Indexer { + protocol: "usenet".into(), + ..indexer() + }]); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_NZB_SELECTION_BLOCKS); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EditIndexerUi::draw(f, app, f.area()); diff --git a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs index 26b0e08..884d0ee 100644 --- a/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexer_settings_ui_tests.rs @@ -7,7 +7,6 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, INDEXER_SETTINGS_BLOCKS, INDEXER_SETTINGS_SELECTION_BLOCKS, }; - use crate::models::sonarr_models::IndexerSettings; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::indexer_settings_ui::IndexerSettingsUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -30,11 +29,10 @@ mod tests { #[test] fn test_indexer_settings_ui_renders_indexer_settings() { - let mut app = App::test_default(); + let mut app = App::test_default_fully_populated(); app.push_navigation_stack(ActiveSonarrBlock::IndexerSettingsMinimumAgeInput.into()); app.data.sonarr_data.selected_block = BlockSelectionState::new(INDEXER_SETTINGS_SELECTION_BLOCKS); - app.data.sonarr_data.indexer_settings = Some(IndexerSettings::default()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexerSettingsUi::draw(f, app, f.area()); diff --git a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs index 72c3bf6..0db0575 100644 --- a/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/indexers_ui_tests.rs @@ -7,7 +7,6 @@ mod tests { ActiveSonarrBlock, EDIT_INDEXER_BLOCKS, INDEXER_SETTINGS_BLOCKS, INDEXERS_BLOCKS, }; use crate::models::servarr_models::Indexer; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::indexers::IndexersUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -30,13 +29,19 @@ mod tests { } mod snapshot_tests { + use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::{ + EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, + }; + use crate::network::sonarr_network::sonarr_network_test_utils::test_utils::indexer; use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_indexers_ui_renders_loading_state() { - let mut app = App::test_default(); + fn test_indexers_ui_renders_loading() { + let mut app = App::test_default_fully_populated(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); @@ -47,11 +52,67 @@ mod tests { insta::assert_snapshot!(output); } + #[test] + fn test_indexers_ui_renders_loading_test_results() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::TestIndexer.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_loading_test_results_when_indexer_test_errors_is_none() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::TestIndexer.into()); + app.data.sonarr_data.indexer_test_errors = None; + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + #[test] fn test_indexers_ui_renders_empty_indexers() { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); - app.data.sonarr_data.indexers = StatefulTable::default(); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[rstest] + fn test_indexers_ui_renders( + #[values( + ActiveSonarrBlock::DeleteIndexerPrompt, + ActiveSonarrBlock::Indexers, + ActiveSonarrBlock::TestIndexer + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("indexers_ui_{active_sonarr_block}"), output); + } + + #[test] + fn test_indexers_ui_renders_test_all_over_indexers() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::TestAllIndexers.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexersUi::draw(f, app, f.area()); @@ -61,27 +122,29 @@ mod tests { } #[test] - fn test_indexers_ui_renders_with_indexers() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Indexers.into()); - app.data.sonarr_data.indexers = StatefulTable::default(); - app.data.sonarr_data.indexers.set_items(vec![ - Indexer { - id: 1, - name: Some("Test Indexer 1".to_owned()), - enable_rss: true, - enable_automatic_search: true, - enable_interactive_search: true, - priority: 25, - ..Indexer::default() - }, - Indexer { - id: 2, - name: Some("Test Indexer 2".to_owned()), - enable_rss: false, - ..Indexer::default() - }, - ]); + fn test_indexers_ui_renders_edit_usenet_indexer_over_indexers() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EditIndexerPrompt.into()); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_NZB_SELECTION_BLOCKS); + app.data.sonarr_data.indexers.set_items(vec![Indexer { + protocol: "usenet".into(), + ..indexer() + }]); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + IndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_indexers_ui_renders_edit_torrent_indexer_over_indexers() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EditIndexerPrompt.into()); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { IndexersUi::draw(f, app, f.area()); diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_torrent_indexer.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_torrent_indexer.snap new file mode 100644 index 0000000..a0b6c2a --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_torrent_indexer.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +expression: output +--- + + + + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Name: │DrunkenSlug │ URL: │http://127.0.0.1:9696/1/ │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable RSS: │ ✔ │ API Key: │someApiKey │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Automatic Search: │ ✔ │ Seed Ratio: │ratio │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Interactive Search: │ ✔ │ Tags: │25 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭─────────────────────────╮ │ + │ Indexer Priority ▴▾: │1 │ │ + │ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_usenet_indexer.snap similarity index 91% rename from src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap rename to src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_usenet_indexer.snap index 2491012..896e728 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_indexer_modal.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_edit_usenet_indexer.snap @@ -18,16 +18,16 @@ expression: output ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ │ │ │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ - │ Name: │Test Indexer │ URL: │https://test.indexer.com │ │ + │ Name: │DrunkenSlug │ URL: │http://127.0.0.1:9696/1/ │ │ │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ │ ╭───╮ ╭─────────────────────────╮ │ - │ Enable RSS: │ ✔ │ API Key: │test-api-key │ │ + │ Enable RSS: │ ✔ │ API Key: │someApiKey │ │ │ ╰───╯ ╰─────────────────────────╯ │ │ ╭───╮ ╭─────────────────────────╮ │ - │ Enable Automatic Search: │ │ Tags: │ │ │ + │ Enable Automatic Search: │ ✔ │ Tags: │25 │ │ │ ╰───╯ ╰─────────────────────────╯ │ │ ╭───╮ ╭─────────────────────────╮ │ - │ Enable Interactive Search: │ │ Indexer Priority ▴▾: │25 │ │ + │ Enable Interactive Search: │ ✔ │ Indexer Priority ▴▾: │1 │ │ │ ╰───╯ ╰─────────────────────────╯ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_loading.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_loading.snap new file mode 100644 index 0000000..2d1f45a --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__edit_indexer_ui__edit_indexer_ui_tests__tests__snapshot_tests__edit_indexer_ui_renders_loading.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/indexers/edit_indexer_ui_tests.rs +expression: output +--- + + + + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap index f2cf85f..5452cda 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexer_settings_ui__indexer_settings_ui_tests__tests__snapshot_tests__indexer_settings_ui_renders_indexer_settings.snap @@ -21,16 +21,16 @@ expression: output │ │ │ │ │ ╭────────────────────────────────╮ │ - │ Minimum Age (minutes) ▴▾: │0 │ │ + │ Minimum Age (minutes) ▴▾: │1 │ │ │ ╰────────────────────────────────╯ │ │ ╭────────────────────────────────╮ │ - │ Retention (days) ▴▾: │0 │ │ + │ Retention (days) ▴▾: │1 │ │ │ ╰────────────────────────────────╯ │ │ ╭────────────────────────────────╮ │ - │ Maximum Size (MB) ▴▾: │0 │ │ + │ Maximum Size (MB) ▴▾: │12345 │ │ │ ╰────────────────────────────────╯ │ │ ╭────────────────────────────────╮ │ - │ RSS Sync Interval (minutes) ▴▾: │0 │ │ + │ RSS Sync Interval (minutes) ▴▾: │60 │ │ │ ╰────────────────────────────────╯ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_DeleteIndexerPrompt.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_DeleteIndexerPrompt.snap new file mode 100644 index 0000000..4bbef8a --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_DeleteIndexerPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + ╭──────────────────── Delete Indexer ─────────────────────╮ + │ Do you really want to delete this indexer: │ + │ Test Indexer? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_Indexers.snap similarity index 79% rename from src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap rename to src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_Indexers.snap index e07f3a5..5392f4e 100644 --- a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_with_indexers.snap +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_Indexers.snap @@ -4,5 +4,4 @@ expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Indexer RSS Automatic Search Interactive Search Priority Tags -=> Test Indexer 1 Enabled Enabled Enabled 25 - Test Indexer 2 Disabled Disabled Disabled 0 +=> Test Indexer Enabled Enabled Enabled 25 alex diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_TestIndexer.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_TestIndexer.snap new file mode 100644 index 0000000..d7d1ec7 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_TestIndexer.snap @@ -0,0 +1,35 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ error │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_torrent_indexer_over_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_torrent_indexer_over_indexers.snap new file mode 100644 index 0000000..d29787f --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_torrent_indexer_over_indexers.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Name: │DrunkenSlug │ URL: │http://127.0.0.1:9696/1/ │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable RSS: │ ✔ │ API Key: │someApiKey │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Automatic Search: │ ✔ │ Seed Ratio: │ratio │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Interactive Search: │ ✔ │ Tags: │25 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭─────────────────────────╮ │ + │ Indexer Priority ▴▾: │1 │ │ + │ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_usenet_indexer_over_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_usenet_indexer_over_indexers.snap new file mode 100644 index 0000000..585f82b --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_edit_usenet_indexer_over_indexers.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + ╭──────────────────────────────────────────────── Edit Indexer ─────────────────────────────────────────────────╮ + │ │ + │ ╭─────────────────────────╮ ╭─────────────────────────╮ │ + │ Name: │DrunkenSlug │ URL: │http://127.0.0.1:9696/1/ │ │ + │ ╰─────────────────────────╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable RSS: │ ✔ │ API Key: │someApiKey │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Automatic Search: │ ✔ │ Tags: │25 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ ╭───╮ ╭─────────────────────────╮ │ + │ Enable Interactive Search: │ ✔ │ Indexer Priority ▴▾: │1 │ │ + │ ╰───╯ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────────────────╮╭──────────────────────────╮ │ + │ │ Save ││ Cancel │ │ + │ ╰───────────────────────────╯╰──────────────────────────╯ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results.snap new file mode 100644 index 0000000..d9d8ee2 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results.snap @@ -0,0 +1,35 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + + + Loading ... + + + + + + + + + + + + + + + + ╭ Testing Indexer ────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results_when_indexer_test_errors_is_none.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results_when_indexer_test_errors_is_none.snap new file mode 100644 index 0000000..f893fed --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_loading_test_results_when_indexer_test_errors_is_none.snap @@ -0,0 +1,35 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + + + + + + + + + + + + + + ╭ Testing Indexer ────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_all_over_indexers.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_all_over_indexers.snap new file mode 100644 index 0000000..a18b8a2 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__indexers_ui_tests__tests__snapshot_tests__indexers_ui_renders_test_all_over_indexers.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/indexers/indexers_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Indexer RSS Automatic Search Interactive Search Priority Tags +=> Test Indexer Enabled Enabled Enabled 25 alex + + + + ╭ Test All Indexers ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Indexer Pass/Fail Failure Messages │ + │=> DrunkenSlug ❌ Some failure │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders.snap new file mode 100644 index 0000000..9312f77 --- /dev/null +++ b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs +expression: output +--- + + + + + + + ╭ Test All Indexers ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Indexer Pass/Fail Failure Messages │ + │=> DrunkenSlug ❌ Some failure │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap b/src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/indexers/snapshots/managarr__ui__sonarr_ui__indexers__test_all_indexers_ui__test_all_indexers_ui_tests__tests__snapshot_tests__test_all_indexers_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs index f8152da..695ab20 100644 --- a/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs +++ b/src/ui/sonarr_ui/indexers/test_all_indexers_ui_tests.rs @@ -25,8 +25,8 @@ mod tests { use super::*; #[test] - fn test_test_all_indexers_ui_renders_loading_state() { - let mut app = App::test_default(); + fn test_test_all_indexers_ui_renders_loading() { + let mut app = App::test_default_fully_populated(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::TestAllIndexers.into()); @@ -36,5 +36,17 @@ mod tests { insta::assert_snapshot!(output); } + + #[test] + fn test_test_all_indexers_ui_renders() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::TestAllIndexers.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + TestAllIndexersUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } } } diff --git a/src/ui/sonarr_ui/library/add_series_ui_tests.rs b/src/ui/sonarr_ui/library/add_series_ui_tests.rs index f907de4..40974db 100644 --- a/src/ui/sonarr_ui/library/add_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/add_series_ui_tests.rs @@ -21,15 +21,18 @@ mod tests { } mod snapshot_tests { + use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS; use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_add_series_ui_renders_loading_state() { - let mut app = App::test_default(); + fn test_add_series_ui_renders_loading_search() { + let mut app = App::test_default_fully_populated(); app.is_loading = true; - app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into()); + app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchResults.into()); app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { @@ -39,17 +42,30 @@ mod tests { insta::assert_snapshot!(output); } - #[test] - fn test_add_series_ui_renders_search_input() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchInput.into()); - app.data.sonarr_data.add_series_search = Some(HorizontallyScrollableText::default()); + #[rstest] + fn test_add_series_ui_renders( + #[values( + ActiveSonarrBlock::AddSeriesAlreadyInLibrary, + ActiveSonarrBlock::AddSeriesEmptySearchResults, + ActiveSonarrBlock::AddSeriesPrompt, + ActiveSonarrBlock::AddSeriesSearchResults, + ActiveSonarrBlock::AddSeriesSelectLanguageProfile, + ActiveSonarrBlock::AddSeriesSelectMonitor, + ActiveSonarrBlock::AddSeriesSelectQualityProfile, + ActiveSonarrBlock::AddSeriesSelectRootFolder, + ActiveSonarrBlock::AddSeriesSelectSeriesType + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + app.data.sonarr_data.selected_block = BlockSelectionState::new(ADD_SERIES_SELECTION_BLOCKS); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { AddSeriesUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("add_series_ui_{active_sonarr_block}"), output); } } } diff --git a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs index 18243bd..a28501e 100644 --- a/src/ui/sonarr_ui/library/delete_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/delete_series_ui_tests.rs @@ -7,8 +7,6 @@ mod tests { use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, }; - use crate::models::sonarr_models::Series; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::delete_series_ui::DeleteSeriesUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -30,15 +28,9 @@ mod tests { use super::*; #[test] - fn test_delete_series_ui_renders_delete_series_toggle() { - let mut app = App::test_default(); + fn test_delete_series_ui_renders_delete_series() { + let mut app = App::test_default_fully_populated(); app.push_navigation_stack(ActiveSonarrBlock::DeleteSeriesPrompt.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - id: 1, - title: "Test Series".into(), - ..Series::default() - }]); app.data.sonarr_data.selected_block = BlockSelectionState::new(DELETE_SERIES_SELECTION_BLOCKS); diff --git a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs index 1bc62f3..c6961db 100644 --- a/src/ui/sonarr_ui/library/edit_series_ui_tests.rs +++ b/src/ui/sonarr_ui/library/edit_series_ui_tests.rs @@ -1,16 +1,12 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; use crate::models::BlockSelectionState; - use crate::models::servarr_data::sonarr::modals::EditSeriesModal; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EDIT_SERIES_BLOCKS, EDIT_SERIES_SELECTION_BLOCKS, }; - use crate::models::sonarr_models::Series; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::edit_series_ui::EditSeriesUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -28,33 +24,56 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; - #[test] - fn test_edit_series_ui_renders_edit_series_modal() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::EditSeriesPathInput.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD-1080p".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(1, "English".to_owned())]); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - id: 1, - title: "Test Series".into(), - path: "/tv/test".to_owned(), - quality_profile_id: 1, - language_profile_id: 1, - ..Series::default() - }]); + #[rstest] + #[case(ActiveSonarrBlock::EditSeriesPrompt, None)] + #[case(ActiveSonarrBlock::EditSeriesConfirmPrompt, None)] + #[case(ActiveSonarrBlock::EditSeriesSelectSeriesType, None)] + #[case(ActiveSonarrBlock::EditSeriesSelectQualityProfile, None)] + #[case(ActiveSonarrBlock::EditSeriesSelectLanguageProfile, None)] + #[case( + ActiveSonarrBlock::EditSeriesPrompt, + Some(ActiveSonarrBlock::SeriesDetails) + )] + #[case( + ActiveSonarrBlock::EditSeriesConfirmPrompt, + Some(ActiveSonarrBlock::SeriesDetails) + )] + #[case( + ActiveSonarrBlock::EditSeriesSelectSeriesType, + Some(ActiveSonarrBlock::SeriesDetails) + )] + #[case( + ActiveSonarrBlock::EditSeriesSelectQualityProfile, + Some(ActiveSonarrBlock::SeriesDetails) + )] + #[case( + ActiveSonarrBlock::EditSeriesSelectLanguageProfile, + Some(ActiveSonarrBlock::SeriesDetails) + )] + fn test_edit_series_ui_renders( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] context: Option, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack((active_sonarr_block, context).into()); app.data.sonarr_data.selected_block = BlockSelectionState::new(EDIT_SERIES_SELECTION_BLOCKS); - app.data.sonarr_data.edit_series_modal = Some(EditSeriesModal::from(&app.data.sonarr_data)); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EditSeriesUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + if let Some(context) = context { + insta::assert_snapshot!( + format!("edit_series_{active_sonarr_block}_{context}"), + output + ); + } else { + insta::assert_snapshot!(format!("edit_series_{active_sonarr_block}"), output); + } } } } diff --git a/src/ui/sonarr_ui/library/episode_details_ui.rs b/src/ui/sonarr_ui/library/episode_details_ui.rs index afc7dbf..af07c2f 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui.rs @@ -194,60 +194,60 @@ fn draw_episode_details(f: &mut Frame<'_>, app: &App<'_>, area: Rect) { fn draw_file_info(f: &mut Frame<'_>, app: &App<'_>, area: Rect) { match app.data.sonarr_data.season_details_modal.as_ref() { - Some(season_details_modal) => match season_details_modal.episode_details_modal.as_ref() { - Some(episode_details_modal) - if !episode_details_modal.file_details.is_empty() && !app.is_loading => - { - let file_info = episode_details_modal.file_details.to_owned(); - let audio_details = episode_details_modal.audio_details.to_owned(); - let video_details = episode_details_modal.video_details.to_owned(); - let [ - file_details_title_area, - file_details_area, - audio_details_title_area, - audio_details_area, - video_details_title_area, - video_details_area, - ] = Layout::vertical([ - Constraint::Length(2), - Constraint::Length(5), - Constraint::Length(1), - Constraint::Length(6), - Constraint::Length(1), - Constraint::Length(7), - ]) - .areas(area); + Some(season_details_modal) if !app.is_loading => { + match season_details_modal.episode_details_modal.as_ref() { + Some(episode_details_modal) if !episode_details_modal.file_details.is_empty() => { + let file_info = episode_details_modal.file_details.to_owned(); + let audio_details = episode_details_modal.audio_details.to_owned(); + let video_details = episode_details_modal.video_details.to_owned(); + let [ + file_details_title_area, + file_details_area, + audio_details_title_area, + audio_details_area, + video_details_title_area, + video_details_area, + ] = Layout::vertical([ + Constraint::Length(2), + Constraint::Length(5), + Constraint::Length(1), + Constraint::Length(6), + Constraint::Length(1), + Constraint::Length(7), + ]) + .areas(area); - let file_details_title_paragraph = - Paragraph::new("File Details".bold()).block(layout_block_top_border()); - let audio_details_title_paragraph = - Paragraph::new("Audio Details".bold()).block(borderless_block()); - let video_details_title_paragraph = - Paragraph::new("Video Details".bold()).block(borderless_block()); + let file_details_title_paragraph = + Paragraph::new("File Details".bold()).block(layout_block_top_border()); + let audio_details_title_paragraph = + Paragraph::new("Audio Details".bold()).block(borderless_block()); + let video_details_title_paragraph = + Paragraph::new("Video Details".bold()).block(borderless_block()); - let file_details = Text::from(file_info); - let audio_details = Text::from(audio_details); - let video_details = Text::from(video_details); + let file_details = Text::from(file_info); + let audio_details = Text::from(audio_details); + let video_details = Text::from(video_details); - let file_details_paragraph = Paragraph::new(file_details) - .block(layout_block_bottom_border()) - .wrap(Wrap { trim: false }); - let audio_details_paragraph = Paragraph::new(audio_details) - .block(layout_block_bottom_border()) - .wrap(Wrap { trim: false }); - let video_details_paragraph = Paragraph::new(video_details) - .block(borderless_block()) - .wrap(Wrap { trim: false }); + let file_details_paragraph = Paragraph::new(file_details) + .block(layout_block_bottom_border()) + .wrap(Wrap { trim: false }); + let audio_details_paragraph = Paragraph::new(audio_details) + .block(layout_block_bottom_border()) + .wrap(Wrap { trim: false }); + let video_details_paragraph = Paragraph::new(video_details) + .block(borderless_block()) + .wrap(Wrap { trim: false }); - f.render_widget(file_details_title_paragraph, file_details_title_area); - f.render_widget(file_details_paragraph, file_details_area); - f.render_widget(audio_details_title_paragraph, audio_details_title_area); - f.render_widget(audio_details_paragraph, audio_details_area); - f.render_widget(video_details_title_paragraph, video_details_title_area); - f.render_widget(video_details_paragraph, video_details_area); + f.render_widget(file_details_title_paragraph, file_details_title_area); + f.render_widget(file_details_paragraph, file_details_area); + f.render_widget(audio_details_title_paragraph, audio_details_title_area); + f.render_widget(audio_details_paragraph, audio_details_area); + f.render_widget(video_details_title_paragraph, video_details_title_area); + f.render_widget(video_details_paragraph, video_details_area); + } + _ => f.render_widget(layout_block_top_border(), area), } - _ => f.render_widget(layout_block_top_border(), area), - }, + } _ => f.render_widget( LoadingBlock::new(app.is_loading, layout_block_top_border()), area, diff --git a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs index d74f2fb..5eb2c4d 100644 --- a/src/ui/sonarr_ui/library/episode_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/episode_details_ui_tests.rs @@ -3,12 +3,9 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::servarr_data::sonarr::modals::{EpisodeDetailsModal, SeasonDetailsModal}; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, }; - use crate::models::sonarr_models::{Episode, Season, Series}; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::episode_details_ui::EpisodeDetailsUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -26,110 +23,121 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; - #[test] - fn test_episode_details_ui_renders_loading_state() { - let mut app = App::test_default(); + #[rstest] + #[case(ActiveSonarrBlock::EpisodeDetails, 0)] + #[case(ActiveSonarrBlock::EpisodeHistory, 1)] + #[case(ActiveSonarrBlock::EpisodeHistoryDetails, 1)] + #[case(ActiveSonarrBlock::EpisodeFile, 2)] + #[case(ActiveSonarrBlock::ManualEpisodeSearch, 3)] + #[case(ActiveSonarrBlock::ManualEpisodeSearchConfirmPrompt, 3)] + #[case(ActiveSonarrBlock::ManualEpisodeSearchSortPrompt, 3)] + #[case(ActiveSonarrBlock::AutomaticallySearchEpisodePrompt, 0)] + #[case(ActiveSonarrBlock::AutomaticallySearchEpisodePrompt, 1)] + #[case(ActiveSonarrBlock::AutomaticallySearchEpisodePrompt, 2)] + #[case(ActiveSonarrBlock::AutomaticallySearchEpisodePrompt, 3)] + fn test_episode_details_ui_renders( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + app + .data + .sonarr_data + .season_details_modal + .as_mut() + .unwrap() + .episode_details_modal + .as_mut() + .unwrap() + .episode_details_tabs + .set_index(index); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + EpisodeDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("episode_details_{active_sonarr_block}_{index}"), + output + ); + } + + #[rstest] + #[case(ActiveSonarrBlock::EpisodeDetails, 0)] + #[case(ActiveSonarrBlock::EpisodeHistory, 1)] + #[case(ActiveSonarrBlock::EpisodeFile, 2)] + #[case(ActiveSonarrBlock::ManualEpisodeSearch, 3)] + fn test_episode_details_ui_renders_loading( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); app.is_loading = true; - app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season { - season_number: 1, - ..Season::default() - }]), - ..Series::default() - }]); + app.push_navigation_stack(active_sonarr_block.into()); + app + .data + .sonarr_data + .season_details_modal + .as_mut() + .unwrap() + .episode_details_modal + .as_mut() + .unwrap() + .episode_details_tabs + .set_index(index); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EpisodeDetailsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!( + format!("loading_episode_details_{active_sonarr_block}_{index}"), + output + ); } - #[test] - fn test_episode_details_ui_renders_episode_details_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season { - season_number: 1, - ..Season::default() - }]), - ..Series::default() - }]); - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal - .episodes - .set_items(vec![Episode::default()]); - season_details_modal.episode_details_modal = Some(EpisodeDetailsModal::default()); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); + #[rstest] + #[case(ActiveSonarrBlock::EpisodeDetails, 0)] + #[case(ActiveSonarrBlock::EpisodeHistory, 1)] + #[case(ActiveSonarrBlock::EpisodeHistoryDetails, 1)] + #[case(ActiveSonarrBlock::EpisodeFile, 2)] + #[case(ActiveSonarrBlock::ManualEpisodeSearch, 3)] + fn test_episode_details_ui_renders_empty( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + { + let episode_details_modal = app + .data + .sonarr_data + .season_details_modal + .as_mut() + .unwrap() + .episode_details_modal + .as_mut() + .unwrap(); + episode_details_modal.episode_details_tabs.set_index(index); + episode_details_modal.episode_details = Default::default(); + episode_details_modal.episode_history = Default::default(); + episode_details_modal.file_details = Default::default(); + episode_details_modal.episode_releases = Default::default(); + } let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { EpisodeDetailsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); - } - - #[test] - fn test_episode_details_ui_renders_episode_history_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season { - season_number: 1, - ..Season::default() - }]), - ..Series::default() - }]); - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal - .episodes - .set_items(vec![Episode::default()]); - let mut episode_details_modal = EpisodeDetailsModal::default(); - episode_details_modal.episode_details_tabs.set_index(1); - season_details_modal.episode_details_modal = Some(episode_details_modal); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - EpisodeDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_episode_details_ui_renders_manual_search_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season { - season_number: 1, - ..Season::default() - }]), - ..Series::default() - }]); - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal - .episodes - .set_items(vec![Episode::default()]); - let mut episode_details_modal = EpisodeDetailsModal::default(); - episode_details_modal.episode_details_tabs.set_index(3); - season_details_modal.episode_details_modal = Some(episode_details_modal); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - EpisodeDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); + insta::assert_snapshot!( + format!("empty_episode_details_{active_sonarr_block}_{index}"), + output + ); } } } diff --git a/src/ui/sonarr_ui/library/library_ui_tests.rs b/src/ui/sonarr_ui/library/library_ui_tests.rs index 5d5cc2a..7d65fdc 100644 --- a/src/ui/sonarr_ui/library/library_ui_tests.rs +++ b/src/ui/sonarr_ui/library/library_ui_tests.rs @@ -247,18 +247,44 @@ mod tests { } mod snapshot_tests { - use crate::app::App; - use crate::models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock; + use crate::models::BlockSelectionState; + use crate::models::servarr_data::sonarr::sonarr_data::{ + ADD_SERIES_SELECTION_BLOCKS, ActiveSonarrBlock, DELETE_SERIES_SELECTION_BLOCKS, + EDIT_SERIES_SELECTION_BLOCKS, + }; + use rstest::rstest; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::LibraryUi; use crate::ui::ui_test_utils::test_utils::{TerminalSize, render_to_string_with_app}; + #[rstest] + fn test_library_ui_renders( + #[values( + ActiveSonarrBlock::Series, + ActiveSonarrBlock::SeriesSortPrompt, + ActiveSonarrBlock::SearchSeries, + ActiveSonarrBlock::SearchSeriesError, + ActiveSonarrBlock::FilterSeries, + ActiveSonarrBlock::FilterSeriesError, + ActiveSonarrBlock::UpdateAllSeriesPrompt + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("sonarr_library_{active_sonarr_block}"), output); + } + #[test] - fn test_library_ui_renders_loading_state() { - let mut app = App::test_default(); + fn test_library_ui_renders_loading() { + let mut app = App::test_default_fully_populated(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::Series.into()); @@ -270,10 +296,9 @@ mod tests { } #[test] - fn test_library_ui_renders_empty_series() { + fn test_library_ui_renders_empty() { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - app.data.sonarr_data.series = StatefulTable::default(); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { LibraryUi::draw(f, app, f.area()); @@ -283,56 +308,9 @@ mod tests { } #[test] - fn test_library_ui_renders_with_series() { - use crate::models::sonarr_models::{Series, SeriesStatus, SeriesType}; - use crate::models::stateful_table::StatefulTable; - use bimap::BiMap; - - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - - // Set up quality profile and language profile maps - let mut quality_profile_map = BiMap::new(); - quality_profile_map.insert(1, "HD-1080p".to_owned()); - quality_profile_map.insert(2, "Any".to_owned()); - app.data.sonarr_data.quality_profile_map = quality_profile_map; - - let mut language_profiles_map = BiMap::new(); - language_profiles_map.insert(1, "English".to_owned()); - language_profiles_map.insert(2, "Any".to_owned()); - app.data.sonarr_data.language_profiles_map = language_profiles_map; - - // Create series with data - let mut series_table = StatefulTable::default(); - series_table.set_items(vec![ - Series { - id: 1, - title: "Breaking Bad".into(), - year: 2008, - network: Some("AMC".to_owned()), - status: SeriesStatus::Ended, - monitored: true, - series_type: SeriesType::Standard, - quality_profile_id: 1, - language_profile_id: 1, - seasons: Some(vec![]), - ..Series::default() - }, - Series { - id: 2, - title: "The Wire".into(), - year: 2002, - network: Some("HBO".to_owned()), - status: SeriesStatus::Continuing, - monitored: true, - series_type: SeriesType::Standard, - quality_profile_id: 2, - language_profile_id: 1, - seasons: Some(vec![]), - ..Series::default() - }, - ]); - app.data.sonarr_data.series = series_table; + fn test_library_ui_renders_series_details_over_series() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::SeriesDetails.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { LibraryUi::draw(f, app, f.area()); @@ -342,11 +320,61 @@ mod tests { } #[test] - fn test_library_ui_renders_update_all_series_prompt() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - app.push_navigation_stack(ActiveSonarrBlock::UpdateAllSeriesPrompt.into()); - app.data.sonarr_data.series = StatefulTable::default(); + fn test_library_ui_renders_season_details_over_series() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_episode_details_over_series() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_delete_episode_over_series() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::DeleteSeriesPrompt.into()); + app.data.sonarr_data.selected_block = + BlockSelectionState::new(DELETE_SERIES_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_edit_series_over_series() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EditSeriesPrompt.into()); + app.data.sonarr_data.selected_block = BlockSelectionState::new(EDIT_SERIES_SELECTION_BLOCKS); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + LibraryUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_library_ui_renders_add_series_over_series() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::AddSeriesPrompt.into()); + app.data.sonarr_data.selected_block = BlockSelectionState::new(ADD_SERIES_SELECTION_BLOCKS); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { LibraryUi::draw(f, app, f.area()); diff --git a/src/ui/sonarr_ui/library/season_details_ui_tests.rs b/src/ui/sonarr_ui/library/season_details_ui_tests.rs index c0a5ad9..26cd503 100644 --- a/src/ui/sonarr_ui/library/season_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/season_details_ui_tests.rs @@ -1,14 +1,11 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; - use crate::models::servarr_data::sonarr::modals::SeasonDetailsModal; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, }; - use crate::models::sonarr_models::{Season, Series}; use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::season_details_ui::SeasonDetailsUi; @@ -30,114 +27,116 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; - #[test] - fn test_season_details_ui_renders_loading_state() { - let mut app = App::test_default(); + #[rstest] + #[case(ActiveSonarrBlock::SeasonDetails, 0)] + #[case(ActiveSonarrBlock::SeasonHistory, 1)] + #[case(ActiveSonarrBlock::SearchEpisodes, 0)] + #[case(ActiveSonarrBlock::SearchEpisodesError, 0)] + #[case(ActiveSonarrBlock::AutomaticallySearchSeasonPrompt, 0)] + #[case(ActiveSonarrBlock::AutomaticallySearchSeasonPrompt, 1)] + #[case(ActiveSonarrBlock::AutomaticallySearchSeasonPrompt, 2)] + #[case(ActiveSonarrBlock::SearchSeasonHistory, 1)] + #[case(ActiveSonarrBlock::SearchSeasonHistoryError, 1)] + #[case(ActiveSonarrBlock::FilterSeasonHistory, 1)] + #[case(ActiveSonarrBlock::FilterSeasonHistoryError, 1)] + #[case(ActiveSonarrBlock::SeasonHistorySortPrompt, 1)] + #[case(ActiveSonarrBlock::SeasonHistoryDetails, 1)] + #[case(ActiveSonarrBlock::ManualSeasonSearch, 2)] + #[case(ActiveSonarrBlock::ManualSeasonSearchConfirmPrompt, 2)] + #[case(ActiveSonarrBlock::ManualSeasonSearchSortPrompt, 2)] + #[case(ActiveSonarrBlock::DeleteEpisodeFilePrompt, 0)] + fn test_season_details_ui_renders( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + app + .data + .sonarr_data + .season_details_modal + .as_mut() + .unwrap() + .season_details_tabs + .set_index(index); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SeasonDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("season_details_renders_{active_sonarr_block}_{index}"), + output + ); + } + + #[rstest] + #[case(ActiveSonarrBlock::SeasonDetails, 0)] + #[case(ActiveSonarrBlock::SeasonHistory, 1)] + #[case(ActiveSonarrBlock::SeasonHistoryDetails, 1)] + #[case(ActiveSonarrBlock::ManualSeasonSearch, 2)] + fn test_season_details_ui_renders_loading( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); app.is_loading = true; - app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season::default()]), - ..Series::default() - }]); + app.push_navigation_stack(active_sonarr_block.into()); + { + let season_details_modal = app.data.sonarr_data.season_details_modal.as_mut().unwrap(); + season_details_modal.season_releases = StatefulTable::default(); + season_details_modal.season_history = StatefulTable::default(); + season_details_modal.episodes = StatefulTable::default(); + season_details_modal.season_details_tabs.set_index(index); + } let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!( + format!("loading_season_details_{active_sonarr_block}_{index}"), + output + ); } - #[test] - fn test_season_details_ui_renders_episodes_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season::default()]), - ..Series::default() - }]); + #[rstest] + #[case(ActiveSonarrBlock::SeasonDetails, 0)] + #[case(ActiveSonarrBlock::SeasonHistory, 1)] + #[case(ActiveSonarrBlock::SeasonHistoryDetails, 1)] + #[case(ActiveSonarrBlock::ManualSeasonSearch, 2)] + fn test_season_details_ui_renders_empty( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + { + let season_details_modal = app.data.sonarr_data.season_details_modal.as_mut().unwrap(); + season_details_modal.season_releases = StatefulTable::default(); + season_details_modal.season_history = StatefulTable::default(); + season_details_modal.episodes = StatefulTable::default(); + season_details_modal.season_details_tabs.set_index(index); + } let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); + insta::assert_snapshot!( + format!("empty_season_details_{active_sonarr_block}_{index}"), + output + ); } #[test] - fn test_season_details_ui_renders_manual_search_tab() { - use crate::models::sonarr_models::{Episode, EpisodeFile, SonarrRelease}; - - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(0, "English".to_owned())]); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season::default()]), - ..Series::default() - }]); - app - .data - .sonarr_data - .seasons - .set_items(vec![Season::default()]); - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal.season_details_tabs.set_index(2); - season_details_modal - .episodes - .set_items(vec![Episode::default()]); - season_details_modal - .episode_files - .set_items(vec![EpisodeFile::default()]); - season_details_modal - .season_releases - .set_items(vec![SonarrRelease::default()]); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - SeasonDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_season_details_ui_renders_season_history_tab() { - use crate::models::sonarr_models::{Episode, EpisodeFile, SonarrHistoryItem}; - - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(0, "English".to_owned())]); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - seasons: Some(vec![Season::default()]), - ..Series::default() - }]); - app - .data - .sonarr_data - .seasons - .set_items(vec![Season::default()]); - let mut season_details_modal = SeasonDetailsModal::default(); - season_details_modal.season_details_tabs.set_index(1); - season_details_modal - .episodes - .set_items(vec![Episode::default()]); - season_details_modal - .episode_files - .set_items(vec![EpisodeFile::default()]); - season_details_modal - .season_history - .set_items(vec![SonarrHistoryItem::default()]); - app.data.sonarr_data.season_details_modal = Some(season_details_modal); + fn test_season_details_ui_renders_episode_details_over_season_details() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeasonDetailsUi::draw(f, app, f.area()); diff --git a/src/ui/sonarr_ui/library/series_details_ui.rs b/src/ui/sonarr_ui/library/series_details_ui.rs index bcdaf45..b395ee2 100644 --- a/src/ui/sonarr_ui/library/series_details_ui.rs +++ b/src/ui/sonarr_ui/library/series_details_ui.rs @@ -252,7 +252,7 @@ fn draw_seasons_table(f: &mut Frame<'_>, app: &mut App<'_>, area: Rect) { let row = Row::new(vec![ Cell::from(season_monitored.to_owned()), - Cell::from(title.clone().unwrap()), + Cell::from(title.clone().unwrap_or_default()), Cell::from(format!("{episode_file_count}/{episode_count}")), Cell::from(format!("{size:.2} GB")), ]); diff --git a/src/ui/sonarr_ui/library/series_details_ui_tests.rs b/src/ui/sonarr_ui/library/series_details_ui_tests.rs index 16de0b8..85ab39c 100644 --- a/src/ui/sonarr_ui/library/series_details_ui_tests.rs +++ b/src/ui/sonarr_ui/library/series_details_ui_tests.rs @@ -1,14 +1,11 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::app::App; use crate::models::servarr_data::sonarr::sonarr_data::{ ActiveSonarrBlock, EPISODE_DETAILS_BLOCKS, SEASON_DETAILS_BLOCKS, SERIES_DETAILS_BLOCKS, }; - use crate::models::sonarr_models::{Season, Series}; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::library::series_details_ui::SeriesDetailsUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -29,27 +26,107 @@ mod tests { } mod snapshot_tests { + use crate::models::stateful_table::StatefulTable; use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; - #[test] - fn test_series_details_ui_renders_series_details() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::SeriesDetails.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(1, "HD-1080p".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(1, "English".to_owned())]); - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - id: 1, - title: "Test Series".into(), - seasons: Some(vec![Season::default()]), - quality_profile_id: 1, - language_profile_id: 1, - ..Series::default() - }]); + #[rstest] + #[case(ActiveSonarrBlock::SeriesDetails, 0)] + #[case(ActiveSonarrBlock::SeriesHistory, 1)] + #[case(ActiveSonarrBlock::SearchSeason, 0)] + #[case(ActiveSonarrBlock::SearchSeasonError, 0)] + #[case(ActiveSonarrBlock::UpdateAndScanSeriesPrompt, 0)] + #[case(ActiveSonarrBlock::UpdateAndScanSeriesPrompt, 1)] + #[case(ActiveSonarrBlock::AutomaticallySearchSeriesPrompt, 0)] + #[case(ActiveSonarrBlock::AutomaticallySearchSeriesPrompt, 1)] + #[case(ActiveSonarrBlock::SearchSeriesHistory, 1)] + #[case(ActiveSonarrBlock::SearchSeriesHistoryError, 1)] + #[case(ActiveSonarrBlock::FilterSeriesHistory, 1)] + #[case(ActiveSonarrBlock::FilterSeriesHistoryError, 1)] + #[case(ActiveSonarrBlock::SeriesHistorySortPrompt, 1)] + #[case(ActiveSonarrBlock::SeriesHistoryDetails, 1)] + fn test_series_details_ui_renders_series_details( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + app.data.sonarr_data.series_info_tabs.set_index(index); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SeriesDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("series_details_ui_{active_sonarr_block}_{index}"), + output + ); + } + + #[rstest] + #[case(ActiveSonarrBlock::SeriesDetails, 0)] + #[case(ActiveSonarrBlock::SeriesHistory, 1)] + fn test_series_details_ui_renders_series_details_loading( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + app.data.sonarr_data.series_info_tabs.set_index(index); + app.is_loading = true; + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SeriesDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("loading_series_details_{active_sonarr_block}"), + output + ); + } + + #[rstest] + #[case(ActiveSonarrBlock::SeriesDetails, 0)] + #[case(ActiveSonarrBlock::SeriesHistory, 1)] + #[case(ActiveSonarrBlock::SeriesHistoryDetails, 1)] + fn test_series_details_ui_renders_series_details_empty( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.data.sonarr_data.seasons = StatefulTable::default(); app.data.sonarr_data.series_history = Some(StatefulTable::default()); + app.data.sonarr_data.series_info_tabs.set_index(index); + app.push_navigation_stack(active_sonarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SeriesDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("empty_series_details_{active_sonarr_block}"), + output + ); + } + + #[test] + fn test_series_details_ui_renders_season_details_over_series_details() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::SeasonDetails.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SeriesDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_series_details_ui_renders_episode_details_over_series_details() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::EpisodeDetails.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SeriesDetailsUi::draw(f, app, f.area()); diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesAlreadyInLibrary.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesAlreadyInLibrary.snap new file mode 100644 index 0000000..d39b8d2 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesAlreadyInLibrary.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Series ─────────────────────────────────────────────────────╮ + │something │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ ✔ Title Year Network Seasons Rating Genres │ + │=> Test 2023 Prime Video 8.4 3 cool, family, fun │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Error ───────────────╮ │ + │ │This series is already in your library │ │ + │ │ │ │ + │ ╰───────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesEmptySearchResults.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesEmptySearchResults.snap new file mode 100644 index 0000000..9a5e62e --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesEmptySearchResults.snap @@ -0,0 +1,47 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + + ╭───────────────────────────────────────────────────── Add Series ─────────────────────────────────────────────────────╮ + │something │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Error ───────────────╮ │ + │ │ No series found matching your query! │ │ + │ │ │ │ + │ ╰───────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesPrompt.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesPrompt.snap new file mode 100644 index 0000000..2c83b81 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │Bluray-1080p ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Language Profile: │English ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Series Type: │Standard ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSearchResults.snap similarity index 95% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSearchResults.snap index 747e047..1dea6ec 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_search_input.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSearchResults.snap @@ -10,11 +10,11 @@ expression: output ╭───────────────────────────────────────────────────── Add Series ─────────────────────────────────────────────────────╮ - │ │ + │something │ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ - │ │ - │ │ + │ ✔ Title Year Network Seasons Rating Genres │ + │=> Test 2023 Prime Video 8.4 3 cool, family, fun │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectLanguageProfile.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectLanguageProfile.snap new file mode 100644 index 0000000..68859e7 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectLanguageProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╭───────────────────────────────╮──────────────────────────────╯ │ │ + │ │ │English │──────────────────────────────╮ │ │ + │ │ Qual│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ Langu│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │ │ │ + │ │ Se│ │ │ │ + │ │ │ │ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ ╰───────────────────────────────╯ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectMonitor.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectMonitor.snap new file mode 100644 index 0000000..0e76f39 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectMonitor.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╭───────────────────────────────╮──────────────────────────────╯ │ │ + │ │ │All Episodes │──────────────────────────────╮ │ │ + │ │ Qual│Unknown │ ▼ │ │ │ + │ │ │Future Episodes │──────────────────────────────╯ │ │ + │ │ │Missing Episodes │──────────────────────────────╮ │ │ + │ │ Langu│Existing Episodes │ ▼ │ │ │ + │ │ │Only First Season │──────────────────────────────╯ │ │ + │ │ │Only Last Season │──────────────────────────────╮ │ │ + │ │ │Only Latest Season │ ▼ │ │ │ + │ │ │Pilot Episode │──────────────────────────────╯ │ │ + │ │ │Recent Episodes │ │ │ + │ │ Se│Only Specials │ │ │ + │ │ │Not Specials │ │ │ + │ │ │None │──────────────────────────────╮ │ │ + │ │ ╰───────────────────────────────╯ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectQualityProfile.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectQualityProfile.snap new file mode 100644 index 0000000..dcc57ae --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectQualityProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╭───────────────────────────────╮──────────────────────────────╯ │ │ + │ │ │Bluray-1080p │──────────────────────────────╮ │ │ + │ │ Qual│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ Langu│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │ │ │ + │ │ Se│ │ │ │ + │ │ │ │ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ ╰───────────────────────────────╯ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectRootFolder.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectRootFolder.snap new file mode 100644 index 0000000..924f085 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectRootFolder.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╭───────────────────────────────╮──────────────────────────────╯ │ │ + │ │ │/nfs │──────────────────────────────╮ │ │ + │ │ Qual│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ Langu│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │ │ │ + │ │ Se│ │ │ │ + │ │ │ │ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ ╰───────────────────────────────╯ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectSeriesType.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectSeriesType.snap new file mode 100644 index 0000000..7434c27 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_AddSeriesSelectSeriesType.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/add_series_ui_tests.rs +expression: output +--- + + + + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╭───────────────────────────────╮──────────────────────────────╯ │ │ + │ │ │Standard │──────────────────────────────╮ │ │ + │ │ Qual│Daily │ ▼ │ │ │ + │ │ │Anime │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ Langu│ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ │ │ ▼ │ │ │ + │ │ │ │──────────────────────────────╯ │ │ + │ │ │ │ │ │ + │ │ Se│ │ │ │ + │ │ │ │ │ │ + │ │ │ │──────────────────────────────╮ │ │ + │ │ ╰───────────────────────────────╯ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_search.snap similarity index 99% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_search.snap index 747e047..07dcfec 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_state.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__add_series_ui__add_series_ui_tests__tests__snapshot_tests__add_series_ui_renders_loading_search.snap @@ -15,7 +15,7 @@ expression: output ╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ - │ │ + │ Loading ... │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series.snap similarity index 95% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series.snap index e75cc87..84ece76 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series_toggle.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__delete_series_ui__delete_series_ui_tests__tests__snapshot_tests__delete_series_ui_renders_delete_series.snap @@ -20,14 +20,14 @@ expression: output ╭───────────────────── Delete Series ─────────────────────╮ │ Do you really want to delete the series: │ - │ Test Series? │ + │ Test? │ │ │ │ │ │ ╭───╮ │ - │ Delete Series File: │ │ │ + │ Delete Series File: │ ✔ │ │ │ ╰───╯ │ │ ╭───╮ │ - │ Add List Exclusion: │ │ │ + │ Add List Exclusion: │ ✔ │ │ │ ╰───╯ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt.snap similarity index 92% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt.snap index 062dec1..fd06895 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_ui_renders_edit_series_modal.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt.snap @@ -8,21 +8,21 @@ expression: output - ╭───────────────────────────────────────── Edit - Test Series ──────────────────────────────────────────╮ - │ │ + ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ + │ Blah blah blah │ │ │ │ │ │ │ │ │ │ │ │ ╭───╮ │ - │ Monitored: │ │ │ + │ Monitored: │ ✔ │ │ │ ╰───╯ │ │ ╭───╮ │ - │ Season Folder: │ │ │ + │ Season Folder: │ ✔ │ │ │ ╰───╯ │ │ ╭─────────────────────────────────────────────────╮ │ - │ Quality Profile: │HD-1080p ▼ │ │ + │ Quality Profile: │Bluray-1080p ▼ │ │ │ ╰─────────────────────────────────────────────────╯ │ │ ╭─────────────────────────────────────────────────╮ │ │ Language Profile: │English ▼ │ │ @@ -31,10 +31,10 @@ expression: output │ Series Type: │Standard ▼ │ │ │ ╰─────────────────────────────────────────────────╯ │ │ ╭─────────────────────────────────────────────────╮ │ - │ Path: │/tv/test │ │ + │ Path: │/nfs/tv │ │ │ ╰─────────────────────────────────────────────────╯ │ │ ╭─────────────────────────────────────────────────╮ │ - │ Tags: │ │ │ + │ Tags: │alex │ │ │ ╰─────────────────────────────────────────────────╯ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt_SeriesDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt_SeriesDetails.snap new file mode 100644 index 0000000..be8a8fe --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesConfirmPrompt_SeriesDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ │ + │Status: Continuing │ Blah blah blah │ │ + │Genres: cool, famil│ │ │ + │Rating: 84% │ │ │ + │Year: 2022 │ │ │ + │Runtime: 63 minutes│ │ │ + │Path: /nfs/tv/Test │ │ │ + │Quality Profile: Bl│ ╭───╮ │ │ + │Language Profile: E│ Monitored: │ ✔ │ │ │ + │Monitored: Yes │ ╰───╯ │ │ + │Size on Disk: 59.51│ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │╭ Series Details │ Quality Profile: │Bluray-1080p ▼ │ │────────────────────╮│ + ││ Seasons │ History│ ╰─────────────────────────────────────────────────╯ │ ││ + ││──────────────────│ ╭─────────────────────────────────────────────────╮ │────────────────────││ + ││ Monitored Seaso│ Language Profile: │English ▼ │ │ ││ + ││=> 🏷 Seaso│ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ ╭─────────────────────────────────────────────────╮ │ ││ + ││ │ Series Type: │Standard ▼ │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ ╭─────────────────────────────────────────────────╮ │ ││ + ││ │ Path: │/nfs/tv │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ ╭─────────────────────────────────────────────────╮ │ ││ + ││ │ Tags: │alex │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ ││ + ││ ││ Save ││ Cancel ││ ││ + ││ │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt.snap new file mode 100644 index 0000000..fd06895 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + + + + ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ ✔ │ │ + │ ╰───╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Quality Profile: │Bluray-1080p ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Language Profile: │English ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Series Type: │Standard ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Path: │/nfs/tv │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Tags: │alex │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt_SeriesDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt_SeriesDetails.snap new file mode 100644 index 0000000..be8a8fe --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesPrompt_SeriesDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ │ + │Status: Continuing │ Blah blah blah │ │ + │Genres: cool, famil│ │ │ + │Rating: 84% │ │ │ + │Year: 2022 │ │ │ + │Runtime: 63 minutes│ │ │ + │Path: /nfs/tv/Test │ │ │ + │Quality Profile: Bl│ ╭───╮ │ │ + │Language Profile: E│ Monitored: │ ✔ │ │ │ + │Monitored: Yes │ ╰───╯ │ │ + │Size on Disk: 59.51│ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │╭ Series Details │ Quality Profile: │Bluray-1080p ▼ │ │────────────────────╮│ + ││ Seasons │ History│ ╰─────────────────────────────────────────────────╯ │ ││ + ││──────────────────│ ╭─────────────────────────────────────────────────╮ │────────────────────││ + ││ Monitored Seaso│ Language Profile: │English ▼ │ │ ││ + ││=> 🏷 Seaso│ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ ╭─────────────────────────────────────────────────╮ │ ││ + ││ │ Series Type: │Standard ▼ │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ ╭─────────────────────────────────────────────────╮ │ ││ + ││ │ Path: │/nfs/tv │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ ╭─────────────────────────────────────────────────╮ │ ││ + ││ │ Tags: │alex │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ ││ + ││ ││ Save ││ Cancel ││ ││ + ││ │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile.snap new file mode 100644 index 0000000..9990fb3 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + + + + ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ ✔ │ │ + │ ╭───────────────────────────────╮ │ + │ │English │──────────────────────────────╮ │ + │ Qual│ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ Langu│ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ │ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ │ │ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ ╰───────────────────────────────╯ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile_SeriesDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile_SeriesDetails.snap new file mode 100644 index 0000000..f882c48 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectLanguageProfile_SeriesDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ │ + │Status: Continuing │ Blah blah blah │ │ + │Genres: cool, famil│ │ │ + │Rating: 84% │ │ │ + │Year: 2022 │ │ │ + │Runtime: 63 minutes│ │ │ + │Path: /nfs/tv/Test │ │ │ + │Quality Profile: Bl│ ╭───╮ │ │ + │Language Profile: E│ Monitored: │ ✔ │ │ │ + │Monitored: Yes │ ╰───╯ │ │ + │Size on Disk: 59.51│ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╭───────────────────────────────╮ │ │ + │ │ │English │──────────────────────────────╮ │ │ + │╭ Series Details │ Qual│ │ ▼ │ │────────────────────╮│ + ││ Seasons │ History│ │ │──────────────────────────────╯ │ ││ + ││──────────────────│ │ │──────────────────────────────╮ │────────────────────││ + ││ Monitored Seaso│ Langu│ │ ▼ │ │ ││ + ││=> 🏷 Seaso│ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ │ │ ▼ │ │ ││ + ││ │ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ │ │ │ │ ││ + ││ │ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ ╰───────────────────────────────╯ │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ ││ + ││ ││ Save ││ Cancel ││ ││ + ││ │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile.snap new file mode 100644 index 0000000..3cc0c3e --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + + + + ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ ✔ │ │ + │ ╭───────────────────────────────╮ │ + │ │Bluray-1080p │──────────────────────────────╮ │ + │ Qual│ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ Langu│ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ │ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ │ │ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ ╰───────────────────────────────╯ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile_SeriesDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile_SeriesDetails.snap new file mode 100644 index 0000000..7f9f544 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectQualityProfile_SeriesDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ │ + │Status: Continuing │ Blah blah blah │ │ + │Genres: cool, famil│ │ │ + │Rating: 84% │ │ │ + │Year: 2022 │ │ │ + │Runtime: 63 minutes│ │ │ + │Path: /nfs/tv/Test │ │ │ + │Quality Profile: Bl│ ╭───╮ │ │ + │Language Profile: E│ Monitored: │ ✔ │ │ │ + │Monitored: Yes │ ╰───╯ │ │ + │Size on Disk: 59.51│ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╭───────────────────────────────╮ │ │ + │ │ │Bluray-1080p │──────────────────────────────╮ │ │ + │╭ Series Details │ Qual│ │ ▼ │ │────────────────────╮│ + ││ Seasons │ History│ │ │──────────────────────────────╯ │ ││ + ││──────────────────│ │ │──────────────────────────────╮ │────────────────────││ + ││ Monitored Seaso│ Langu│ │ ▼ │ │ ││ + ││=> 🏷 Seaso│ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ │ │ ▼ │ │ ││ + ││ │ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ │ │ │ │ ││ + ││ │ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ ╰───────────────────────────────╯ │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ ││ + ││ ││ Save ││ Cancel ││ ││ + ││ │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType.snap new file mode 100644 index 0000000..cd0e5be --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + + + + ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ ✔ │ │ + │ ╭───────────────────────────────╮ │ + │ │Standard │──────────────────────────────╮ │ + │ Qual│Daily │ ▼ │ │ + │ │Anime │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ Langu│ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ │ │ ▼ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ │ │ │ │ + │ │ │──────────────────────────────╯ │ + │ │ │──────────────────────────────╮ │ + │ ╰───────────────────────────────╯ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType_SeriesDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType_SeriesDetails.snap new file mode 100644 index 0000000..8d22ec9 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__edit_series_ui__edit_series_ui_tests__tests__snapshot_tests__edit_series_EditSeriesSelectSeriesType_SeriesDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/edit_series_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ │ + │Status: Continuing │ Blah blah blah │ │ + │Genres: cool, famil│ │ │ + │Rating: 84% │ │ │ + │Year: 2022 │ │ │ + │Runtime: 63 minutes│ │ │ + │Path: /nfs/tv/Test │ │ │ + │Quality Profile: Bl│ ╭───╮ │ │ + │Language Profile: E│ Monitored: │ ✔ │ │ │ + │Monitored: Yes │ ╰───╯ │ │ + │Size on Disk: 59.51│ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╭───────────────────────────────╮ │ │ + │ │ │Standard │──────────────────────────────╮ │ │ + │╭ Series Details │ Qual│Daily │ ▼ │ │────────────────────╮│ + ││ Seasons │ History│ │Anime │──────────────────────────────╯ │ ││ + ││──────────────────│ │ │──────────────────────────────╮ │────────────────────││ + ││ Monitored Seaso│ Langu│ │ ▼ │ │ ││ + ││=> 🏷 Seaso│ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ │ │ ▼ │ │ ││ + ││ │ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ │ │ │ │ ││ + ││ │ │ │──────────────────────────────╯ │ ││ + ││ │ │ │──────────────────────────────╮ │ ││ + ││ │ ╰───────────────────────────────╯ │ │ ││ + ││ │ ╰─────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ ││ + ││ ││ Save ││ Cancel ││ ││ + ││ │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeDetails_0.snap similarity index 100% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_details_tab.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeDetails_0.snap diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeFile_2.snap similarity index 100% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_episode_history_tab.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeFile_2.snap diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistoryDetails_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistoryDetails_1.snap new file mode 100644 index 0000000..e8150f4 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistoryDetails_1.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────── Details ─────────────────────────╮ │ + │ │Source Title: │ │ + │ │ │ │ + │ │No additional data available │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistory_1.snap new file mode 100644 index 0000000..3175a60 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_EpisodeHistory_1.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_ManualEpisodeSearch_3.snap similarity index 100% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_manual_search_tab.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__empty_episode_details_ManualEpisodeSearch_3.snap diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_0.snap new file mode 100644 index 0000000..bf73223 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_0.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Some episode details: │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Automatic Episode Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the episode: Something cool │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_1.snap new file mode 100644 index 0000000..4cf2444 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_1.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Automatic Episode Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the episode: Something cool │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_2.snap new file mode 100644 index 0000000..43a03f9 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_2.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │File Details │ + │Some file details │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Audio Details │ + │Some audio details ╭─────────────── Automatic Episode Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the episode: Something cool │ │ + │ │ │ │ + │ │ │ │ + │──────────────────────────────│ │───────────────────────────────│ + │Video Details │ │ │ + │Some video details │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_3.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_3.snap new file mode 100644 index 0000000..19969df --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_AutomaticallySearchEpisodePrompt_3.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p│ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p│ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────── Automatic Episode Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for the episode: Something cool │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeDetails_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeDetails_0.snap new file mode 100644 index 0000000..b579484 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeDetails_0.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Some episode details: │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeFile_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeFile_2.snap new file mode 100644 index 0000000..5dc8e69 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeFile_2.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │File Details │ + │Some file details │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Audio Details │ + │Some audio details │ + │ │ + │ │ + │ │ + │ │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │Video Details │ + │Some video details │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistoryDetails_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistoryDetails_1.snap new file mode 100644 index 0000000..0ae4533 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistoryDetails_1.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────── Details ─────────────────────────╮ │ + │ │Source Title: Test source │ │ + │ │Indexer: │ │ + │ │Release Group: │ │ + │ │Series Match Type: │ │ + │ │NZB Info URL: │ │ + │ │Download Client Name: │ │ + │ ╰────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistory_1.snap new file mode 100644 index 0000000..5dca4e2 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_EpisodeHistory_1.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchConfirmPrompt_3.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchConfirmPrompt_3.snap new file mode 100644 index 0000000..5822cba --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchConfirmPrompt_3.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p│ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p│ + │ │ + │ │ + │ │ + │ ╭───────────────── Download Rejected Release ──────────────────╮ │ + │ │ Do you really want to download the rejected release: Test │ │ + │ │ Release? │ │ + │ │ │ │ + │ │ │ │ + │ │Rejection reasons: │ │ + │ │• Unknown quality profile │ │ + │ │• Release is already mapped │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭──────────────────────────────╮╭──────────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰──────────────────────────────╯╰──────────────────────────────╯│ │ + │ ╰────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchSortPrompt_3.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchSortPrompt_3.snap new file mode 100644 index 0000000..2c17647 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearchSortPrompt_3.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p│ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────╮ │ + │ │Something │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰──────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearch_3.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearch_3.snap new file mode 100644 index 0000000..cb7aac1 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ManualEpisodeSearch_3.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p│ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap deleted file mode 100644 index f112e11..0000000 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__episode_details_ui_renders_loading_state.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs -expression: output ---- - diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeDetails_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeDetails_0.snap new file mode 100644 index 0000000..a1074e1 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeDetails_0.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeFile_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeFile_2.snap new file mode 100644 index 0000000..a1074e1 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeFile_2.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeHistory_1.snap new file mode 100644 index 0000000..a1074e1 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_EpisodeHistory_1.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_ManualEpisodeSearch_3.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_ManualEpisodeSearch_3.snap new file mode 100644 index 0000000..a1074e1 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__episode_details_ui__episode_details_ui_tests__tests__snapshot_tests__loading_episode_details_ManualEpisodeSearch_3.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/episode_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Details │ History │ File │ Manual Search │ + │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_add_series_over_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_add_series_over_series.snap new file mode 100644 index 0000000..c5f433a --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_add_series_over_series.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + ╭────────────────────────────────────────── Add Series - Test ──────────────────────────────────────────╮ + ╭──────│ New series blah blah blah │───────╮ + │someth│ │ │ + ╰──────│ │───────╯ + ╭──────│ │───────╮ + │ ✔ │ │ │ + │=> │ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Root Folder: │/nfs ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Monitor: │All Episodes ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Quality Profile: │Bluray-1080p ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Language Profile: │English ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Series Type: │Standard ▼ │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ ╭───╮ │ │ + │ │ Season Folder: │ ✔ │ │ │ + │ │ ╰───╯ │ │ + │ │ ╭─────────────────────────────────────────────────╮ │ │ + │ │ Tags: │alex │ │ │ + │ │ ╰─────────────────────────────────────────────────╯ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ │ + │ ││ Add ││ Cancel ││ │ + ╰──────│╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│───────╯ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_delete_episode_over_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_delete_episode_over_series.snap new file mode 100644 index 0000000..5d15d26 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_delete_episode_over_series.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + + + + + + + + + + + ╭───────────────────── Delete Series ─────────────────────╮ + │ Do you really want to delete the series: │ + │ Test? │ + │ │ + │ │ + │ ╭───╮ │ + │ Delete Series File: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Add List Exclusion: │ ✔ │ │ + │ ╰───╯ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_edit_series_over_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_edit_series_over_series.snap new file mode 100644 index 0000000..7fe1a71 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_edit_series_over_series.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + ╭───────────────────────────────────────────── Edit - Test ─────────────────────────────────────────────╮ + │ Blah blah blah │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───╮ │ + │ Monitored: │ ✔ │ │ + │ ╰───╯ │ + │ ╭───╮ │ + │ Season Folder: │ ✔ │ │ + │ ╰───╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Quality Profile: │Bluray-1080p ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Language Profile: │English ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Series Type: │Standard ▼ │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Path: │/nfs/tv │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ ╭─────────────────────────────────────────────────╮ │ + │ Tags: │alex │ │ + │ ╰─────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭───────────────────────────────────────────────────╮╭──────────────────────────────────────────────────╮│ + ││ Save ││ Cancel ││ + │╰───────────────────────────────────────────────────╯╰──────────────────────────────────────────────────╯│ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty.snap similarity index 100% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty_series.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_empty.snap diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_episode_details_over_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_episode_details_over_series.snap new file mode 100644 index 0000000..a2da567 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_episode_details_over_series.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Titl╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ + │Over│ Episodes │ History │ Manual Search │ │ + │Netw│──────╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮─────│ │ + │Stat│ 🏷 │ Details │ History │ File │ Manual Search │file │ │ + │Genr│=> 🏷 │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│p │ │ + │Rati│ │Some episode details: │ │ │ + │Year│ │ │ │ │ + │Runt│ │ │ │ │ + │Path│ │ │ │ │ + │Qual│ │ │ │ │ + │Lang│ │ │ │ │ + │Moni│ │ │ │ │ + │Size│ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │╭ S│ │ │ │─────╮│ + ││ Se│ │ │ │ ││ + ││───│ │ │ │─────││ + ││ │ │ │ │ ││ + ││=> │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_season_details_over_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_season_details_over_series.snap new file mode 100644 index 0000000..2d4535c --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_season_details_over_series.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Titl╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ + │Over│ Episodes │ History │ Manual Search │ │ + │Netw│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ │ + │Stat│ 🏷 # Title Air Date Size on Disk Quality Profile │ │ + │Genr│=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ │ + │Rati│ │ │ + │Year│ │ │ + │Runt│ │ │ + │Path│ │ │ + │Qual│ │ │ + │Lang│ │ │ + │Moni│ │ │ + │Size│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │╭ S│ │─────╮│ + ││ Se│ │ ││ + ││───│ │─────││ + ││ │ │ ││ + ││=> │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_series_details_over_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_series_details_over_series.snap new file mode 100644 index 0000000..81ab929 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_series_details_over_series.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Monitored Season Episode Count Size on Disk ││ + ││=> 🏷 Season title 10/10 34.19 GB ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeries.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeries.snap new file mode 100644 index 0000000..4b2598c --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeries.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + + + + + + + + + + + + + + + + ╭───────────────── Filter ──────────────────╮ + │series filter │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeriesError.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeriesError.snap new file mode 100644 index 0000000..9bef7e7 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_FilterSeriesError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │The given filter produced empty results│ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeries.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeries.snap new file mode 100644 index 0000000..7d230a7 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeries.snap @@ -0,0 +1,28 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + + + + + + + + + + + + + + + + ╭───────────────── Search ──────────────────╮ + │series search │ + ╰─────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeriesError.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeriesError.snap new file mode 100644 index 0000000..57eaf04 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SearchSeriesError.snap @@ -0,0 +1,31 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + + + + + + + + + + + + + + + + + + ╭─────────────── Error ───────────────╮ + │ No items found matching search │ + │ │ + ╰───────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_Series.snap similarity index 54% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_Series.snap index b9edd92..95e1e51 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_with_series.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_Series.snap @@ -3,6 +3,5 @@ source: src/ui/sonarr_ui/library/library_ui_tests.rs expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - Title Year Network Status Rating Type Quality Profile Language Size Monitored Tags -=> Breaking Bad 2008 AMC Ended Standard HD-1080p English 0.00 GB 🏷 - The Wire 2002 HBO Continuin Standard Any English 0.00 GB 🏷 + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SeriesSortPrompt.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SeriesSortPrompt.snap new file mode 100644 index 0000000..166527f --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_SeriesSortPrompt.snap @@ -0,0 +1,42 @@ +--- +source: src/ui/sonarr_ui/library/library_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Title Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 + + + + + + + + + + + ╭───────────────────────────────╮ + │Something │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_UpdateAllSeriesPrompt.snap similarity index 94% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_UpdateAllSeriesPrompt.snap index 8453ef9..b43cea3 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__library_ui_renders_update_all_series_prompt.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__library_ui_tests__tests__snapshot_tests__sonarr_library_UpdateAllSeriesPrompt.snap @@ -3,8 +3,8 @@ source: src/ui/sonarr_ui/library/library_ui_tests.rs expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - + Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags +=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_ManualSeasonSearch_2.snap similarity index 95% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_ManualSeasonSearch_2.snap index d1570e6..2d7f490 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_manual_search_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_ManualSeasonSearch_2.snap @@ -6,13 +6,13 @@ expression: output - ╭ Season 0 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Episodes │ History │ Manual Search │ │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ - │ Source Age ⛔ Title Indexer Size Peers Language Quality │ - │=> 0 days 0.0 GB │ │ │ │ │ + │ Loading ... │ + │ │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonDetails_0.snap similarity index 95% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonDetails_0.snap index 83c8c02..26d5a94 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_season_history_tab.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonDetails_0.snap @@ -6,11 +6,11 @@ expression: output - ╭ Season 0 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Episodes │ History │ Manual Search │ │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ - │ Source Title Event Type Language Quality Date │ - │=> unknown 1970-01-01 00:00:00 UTC │ + │ │ + │ │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistoryDetails_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistoryDetails_1.snap new file mode 100644 index 0000000..b0bd2ac --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistoryDetails_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────────── Details ────────────────────────────╮ │ + │ │Source Title: │ │ + │ │ │ │ + │ │No additional data available │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰───────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistory_1.snap new file mode 100644 index 0000000..26d5a94 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__empty_season_details_SeasonHistory_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_ManualSeasonSearch_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_ManualSeasonSearch_2.snap new file mode 100644 index 0000000..2d7f490 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_ManualSeasonSearch_2.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonDetails_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonDetails_0.snap new file mode 100644 index 0000000..2d7f490 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonDetails_0.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistoryDetails_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistoryDetails_1.snap new file mode 100644 index 0000000..7c519e8 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistoryDetails_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────────── Details ────────────────────────────╮ │ + │ │Source Title: │ │ + │ │ │ │ + │ │No additional data available │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰───────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistory_1.snap new file mode 100644 index 0000000..2d7f490 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__loading_season_details_SeasonHistory_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_0.snap new file mode 100644 index 0000000..3ea342c --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_0.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ 🏷 # Title Air Date Size on Disk Quality Profile │ + │=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Season Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for season packs for: Season title │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_1.snap new file mode 100644 index 0000000..a976fef --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Season Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for season packs for: Season title │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_2.snap new file mode 100644 index 0000000..4dcfb7e --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_AutomaticallySearchSeasonPrompt_2.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p │ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────── Automatic Season Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for season packs for: Season title │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_DeleteEpisodeFilePrompt_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_DeleteEpisodeFilePrompt_0.snap new file mode 100644 index 0000000..cefc809 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_DeleteEpisodeFilePrompt_0.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ 🏷 # Title Air Date Size on Disk Quality Profile │ + │=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────── Delete Episode ─────────────────────╮ │ + │ │ Do you really want to delete this episode: │ │ + │ │ Something cool? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistoryError_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistoryError_1.snap new file mode 100644 index 0000000..55e0a12 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistoryError_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────── Error ────────────╮ │ + │ │ The given filter produced empty│ │ + │ ╰────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistory_1.snap new file mode 100644 index 0000000..25d8c76 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_FilterSeasonHistory_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────── Filter ──────────────╮ │ + │ │season history filter │ │ + │ ╰─────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchConfirmPrompt_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchConfirmPrompt_2.snap new file mode 100644 index 0000000..b5d1814 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchConfirmPrompt_2.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p │ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────────── Download Rejected Release ──────────────────╮ │ + │ │ Do you really want to download the rejected release: Test │ │ + │ │ Release? │ │ + │ │ │ │ + │ │ │ │ + │ │Rejection reasons: │ │ + │ │• Unknown quality profile │ │ + │ │• Release is already mapped │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭──────────────────────────────╮╭──────────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰──────────────────────────────╯╰──────────────────────────────╯│ │ + │ ╰────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchSortPrompt_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchSortPrompt_2.snap new file mode 100644 index 0000000..5892849 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearchSortPrompt_2.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p │ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────────────────╮ │ + │ │Something │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearch_2.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearch_2.snap new file mode 100644 index 0000000..8f62f05 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_ManualSeasonSearch_2.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source ▼ Age ⛔ Title Indexer Size Peers Language Quality │ + │=> torrent 1 days ⛔ Test Release kickass torrents 0.0 GB 2 / 1 English Bluray-1080p │ + │ usenet 1 days ⛔ Test Release DrunkenSlug 0.0 GB English Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodesError_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodesError_0.snap new file mode 100644 index 0000000..7e035fb --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodesError_0.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ 🏷 # Title Air Date Size on Disk Quality Profile │ + │=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────── Error ────────────╮ │ + │ │ No items found matching search │ │ + │ ╰────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodes_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodes_0.snap new file mode 100644 index 0000000..6c651db --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchEpisodes_0.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ 🏷 # Title Air Date Size on Disk Quality Profile │ + │=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────── Search ──────────────╮ │ + │ │episode search │ │ + │ ╰─────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistoryError_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistoryError_1.snap new file mode 100644 index 0000000..029d6b0 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistoryError_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────── Error ────────────╮ │ + │ │ No items found matching search │ │ + │ ╰────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistory_1.snap new file mode 100644 index 0000000..4f189dd --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SearchSeasonHistory_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭───────────── Search ──────────────╮ │ + │ │season history search │ │ + │ ╰─────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonDetails_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonDetails_0.snap new file mode 100644 index 0000000..65c3117 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonDetails_0.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ 🏷 # Title Air Date Size on Disk Quality Profile │ + │=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistoryDetails_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistoryDetails_1.snap new file mode 100644 index 0000000..6fe8412 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistoryDetails_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭──────────────────────────── Details ────────────────────────────╮ │ + │ │Source Title: Test source │ │ + │ │Indexer: │ │ + │ │Release Group: │ │ + │ │Series Match Type: │ │ + │ │NZB Info URL: │ │ + │ │Download Client Name: │ │ + │ ╰───────────────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistorySortPrompt_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistorySortPrompt_1.snap new file mode 100644 index 0000000..033ca8a --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistorySortPrompt_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭─────────────────────────╮ │ + │ │Something │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰─────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistory_1.snap new file mode 100644 index 0000000..60cb3c2 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_renders_SeasonHistory_1.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ + │ Source Title ▼ Event Type Language Quality Date │ + │=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episode_details_over_season_details.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episode_details_over_season_details.snap new file mode 100644 index 0000000..f5f399a --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episode_details_over_season_details.snap @@ -0,0 +1,50 @@ +--- +source: src/ui/sonarr_ui/library/season_details_ui_tests.rs +expression: output +--- + + + + + ╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Episodes │ History │ Manual Search │ + │──────╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮─────│ + │ 🏷 │ Details │ History │ File │ Manual Search │file │ + │=> 🏷 │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│p │ + │ │Some episode details: │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ + │ │ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap deleted file mode 100644 index 67b9605..0000000 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_episodes_tab.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/ui/sonarr_ui/library/season_details_ui_tests.rs -expression: output ---- - diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap deleted file mode 100644 index 67b9605..0000000 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__season_details_ui__season_details_ui_tests__tests__snapshot_tests__season_details_ui_renders_loading_state.snap +++ /dev/null @@ -1,5 +0,0 @@ ---- -source: src/ui/sonarr_ui/library/season_details_ui_tests.rs -expression: output ---- - diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesDetails.snap similarity index 90% rename from src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap rename to src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesDetails.snap index 0cf0b76..8d7f917 100644 --- a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_series_details.snap +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesDetails.snap @@ -5,20 +5,20 @@ expression: output - ╭ Test Series ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ - │Title: Test Series │ - │Overview: │ - │Network: │ + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ │Status: Continuing │ - │Genres: │ - │Rating: 0% │ - │Year: 0 │ - │Runtime: 0 minutes │ - │Path: │ - │Quality Profile: HD-1080p │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ │Language Profile: English │ - │Monitored: No │ - │ │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistory.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistory.snap new file mode 100644 index 0000000..8d7f917 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistory.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistoryDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistoryDetails.snap new file mode 100644 index 0000000..f70e2fe --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__empty_series_details_SeriesHistoryDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ╭─────────────────────────────── Details ───────────────────────────────╮ ││ + ││───────────────────────────────────│Source Title: │───────────────────────────────────││ + ││ │ │ ││ + ││ │No additional data available │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesDetails.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesDetails.snap new file mode 100644 index 0000000..f7e287f --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesDetails.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ ││ + ││ ││ + ││ Loading ... ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesHistory.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesHistory.snap new file mode 100644 index 0000000..f7e287f --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__loading_series_details_SeriesHistory.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ ││ + ││ ││ + ││ Loading ... ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_0.snap new file mode 100644 index 0000000..385ee3e --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_0.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB ╭──────────────── Automatic Series Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for all monitored episode(s) for the series: Test │ │ + │ │ │ │ + │╭ Series Details ───────────────────────│ │───────────────────────────────────────────╮│ + ││ Seasons │ History │ │ ││ + ││─────────────────────────────────────────│ │───────────────────────────────────────────││ + ││ Monitored Season │ │Size on Disk ││ + ││=> 🏷 Season title │ │34.19 GB ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭────────────────────────────╮╭───────────────────────────╮│ ││ + ││ ││ Yes ││ No ││ ││ + ││ │╰────────────────────────────╯╰───────────────────────────╯│ ││ + ││ ╰───────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_1.snap new file mode 100644 index 0000000..accf608 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_AutomaticallySearchSeriesPrompt_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB ╭──────────────── Automatic Series Search ────────────────╮ │ + │ │Do you want to trigger an automatic search of your indexers│ │ + │ │ for all monitored episode(s) for the series: Test │ │ + │ │ │ │ + │╭ Series Details ───────────────────────│ │───────────────────────────────────────────╮│ + ││ Seasons │ History │ │ ││ + ││─────────────────────────────────────────│ │───────────────────────────────────────────││ + ││ Source Title ▼ │ │ty Date ││ + ││=> Test source │ │y-1080p 2024-02-10 07:28:45 UTC ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭────────────────────────────╮╭───────────────────────────╮│ ││ + ││ ││ Yes ││ No ││ ││ + ││ │╰────────────────────────────╯╰───────────────────────────╯│ ││ + ││ ╰───────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistoryError_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistoryError_1.snap new file mode 100644 index 0000000..7e0ca69 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistoryError_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Source Title ▼ Event Type Language Quality Date ││ + ││=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭──────────── Error ─────────────╮ ││ + ││ │ The given filter produced empty │ ││ + ││ ╰──────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistory_1.snap new file mode 100644 index 0000000..3e37c14 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_FilterSeriesHistory_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Source Title ▼ Event Type Language Quality Date ││ + ││=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭────────────── Filter ───────────────╮ ││ + ││ │series history filter │ ││ + ││ ╰───────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeasonError_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeasonError_0.snap new file mode 100644 index 0000000..3bd7da7 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeasonError_0.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Monitored Season Episode Count Size on Disk ││ + ││=> 🏷 Season title 10/10 34.19 GB ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭──────────── Error ─────────────╮ ││ + ││ │ No items found matching search │ ││ + ││ ╰──────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeason_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeason_0.snap new file mode 100644 index 0000000..a594073 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeason_0.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Monitored Season Episode Count Size on Disk ││ + ││=> 🏷 Season title 10/10 34.19 GB ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭────────────── Search ───────────────╮ ││ + ││ │season search │ ││ + ││ ╰───────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistoryError_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistoryError_1.snap new file mode 100644 index 0000000..c213bf2 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistoryError_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Source Title ▼ Event Type Language Quality Date ││ + ││=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭──────────── Error ─────────────╮ ││ + ││ │ No items found matching search │ ││ + ││ ╰──────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistory_1.snap new file mode 100644 index 0000000..afd0fa0 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SearchSeriesHistory_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Source Title ▼ Event Type Language Quality Date ││ + ││=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭────────────── Search ───────────────╮ ││ + ││ │series history search │ ││ + ││ ╰───────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesDetails_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesDetails_0.snap new file mode 100644 index 0000000..1f91c3a --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesDetails_0.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Monitored Season Episode Count Size on Disk ││ + ││=> 🏷 Season title 10/10 34.19 GB ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistoryDetails_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistoryDetails_1.snap new file mode 100644 index 0000000..756cf8f --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistoryDetails_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ╭─────────────────────────────── Details ───────────────────────────────╮ ││ + ││───────────────────────────────────│Source Title: Test source │───────────────────────────────────││ + ││ Source Title ▼ │Indexer: │ Date ││ + ││=> Test source │Release Group: │ 2024-02-10 07:28:45 UTC ││ + ││ │Series Match Type: │ ││ + ││ │NZB Info URL: │ ││ + ││ │Download Client Name: │ ││ + ││ │Age: 0 days │ ││ + ││ ╰─────────────────────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistorySortPrompt_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistorySortPrompt_1.snap new file mode 100644 index 0000000..4c982de --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistorySortPrompt_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Source Title Event Type Language Quality Date ││ + ││=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC ││ + ││ ││ + ││ ││ + ││ ││ + ││ ╭───────────────────────────╮ ││ + ││ │Something │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ ╰───────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistory_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistory_1.snap new file mode 100644 index 0000000..7633027 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_SeriesHistory_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB │ + │ │ + │ │ + │ │ + │╭ Series Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ + ││ Seasons │ History ││ + ││─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────││ + ││ Source Title ▼ Event Type Language Quality Date ││ + ││=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_0.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_0.snap new file mode 100644 index 0000000..0596611 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_0.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ series: Test? │ │ + │ │ │ │ + │╭ Series Details ───────────────────────│ │───────────────────────────────────────────╮│ + ││ Seasons │ History │ │ ││ + ││─────────────────────────────────────────│ │───────────────────────────────────────────││ + ││ Monitored Season │ │Size on Disk ││ + ││=> 🏷 Season title │ │34.19 GB ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭────────────────────────────╮╭───────────────────────────╮│ ││ + ││ ││ Yes ││ No ││ ││ + ││ │╰────────────────────────────╯╰───────────────────────────╯│ ││ + ││ ╰───────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_1.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_1.snap new file mode 100644 index 0000000..2e1e2ee --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_UpdateAndScanSeriesPrompt_1.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Title: Test │ + │Overview: Blah blah blah │ + │Network: HBO │ + │Status: Continuing │ + │Genres: cool, family, fun │ + │Rating: 84% │ + │Year: 2022 │ + │Runtime: 63 minutes │ + │Path: /nfs/tv/Test │ + │Quality Profile: Bluray-1080p │ + │Language Profile: English │ + │Monitored: Yes │ + │Size on Disk: 59.51 GB ╭──────────────────── Update and Scan ────────────────────╮ │ + │ │ Do you want to trigger an update and disk scan for the │ │ + │ │ series: Test? │ │ + │ │ │ │ + │╭ Series Details ───────────────────────│ │───────────────────────────────────────────╮│ + ││ Seasons │ History │ │ ││ + ││─────────────────────────────────────────│ │───────────────────────────────────────────││ + ││ Source Title ▼ │ │ty Date ││ + ││=> Test source │ │y-1080p 2024-02-10 07:28:45 UTC ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │╭────────────────────────────╮╭───────────────────────────╮│ ││ + ││ ││ Yes ││ No ││ ││ + ││ │╰────────────────────────────╯╰───────────────────────────╯│ ││ + ││ ╰───────────────────────────────────────────────────────────╯ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + ││ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_episode_details_over_series_details.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_episode_details_over_series_details.snap new file mode 100644 index 0000000..32906b6 --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_episode_details_over_series_details.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Titl╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ + │Over│ Episodes │ History │ Manual Search │ │ + │Netw│──────╭ Episode Details ───────────────────────────────────────────────────────────────────────────────────────────────────────╮─────│ │ + │Stat│ 🏷 │ Details │ History │ File │ Manual Search │file │ │ + │Genr│=> 🏷 │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│p │ │ + │Rati│ │Some episode details: │ │ │ + │Year│ │ │ │ │ + │Runt│ │ │ │ │ + │Path│ │ │ │ │ + │Qual│ │ │ │ │ + │Lang│ │ │ │ │ + │Moni│ │ │ │ │ + │Size│ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │╭ S│ │ │ │─────╮│ + ││ Se│ │ │ │ ││ + ││───│ │ │ │─────││ + ││ │ │ │ │ ││ + ││=> │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ │ │ │ ││ + ││ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ ││ + ││ │ │ ││ + ││ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_season_details_over_series_details.snap b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_season_details_over_series_details.snap new file mode 100644 index 0000000..677c48d --- /dev/null +++ b/src/ui/sonarr_ui/library/snapshots/managarr__ui__sonarr_ui__library__series_details_ui__series_details_ui_tests__tests__snapshot_tests__series_details_ui_renders_season_details_over_series_details.snap @@ -0,0 +1,52 @@ +--- +source: src/ui/sonarr_ui/library/series_details_ui_tests.rs +expression: output +--- + + + + ╭ Test ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │Titl╭ Season 1 Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ + │Over│ Episodes │ History │ Manual Search │ │ + │Netw│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ │ + │Stat│ 🏷 # Title Air Date Size on Disk Quality Profile │ │ + │Genr│=> 🏷 1 Something cool 2024-02-10 07:28:45 UTC 3.30 GB Bluray-1080p │ │ + │Rati│ │ │ + │Year│ │ │ + │Runt│ │ │ + │Path│ │ │ + │Qual│ │ │ + │Lang│ │ │ + │Moni│ │ │ + │Size│ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │╭ S│ │─────╮│ + ││ Se│ │ ││ + ││───│ │─────││ + ││ │ │ ││ + ││=> │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ │ │ ││ + ││ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ ││ + │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ + ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/mod.rs b/src/ui/sonarr_ui/mod.rs index 90cec31..bbe1979 100644 --- a/src/ui/sonarr_ui/mod.rs +++ b/src/ui/sonarr_ui/mod.rs @@ -1,7 +1,11 @@ use std::{cmp, iter}; +#[cfg(test)] +use crate::ui::ui_test_utils::test_utils::Utc; use blocklist::BlocklistUi; -use chrono::{Duration, Utc}; +use chrono::Duration; +#[cfg(not(test))] +use chrono::Utc; use downloads::DownloadsUi; use history::HistoryUi; use indexers::IndexersUi; diff --git a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs index 6268ebd..e2a113d 100644 --- a/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +++ b/src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs @@ -3,10 +3,7 @@ mod tests { use strum::IntoEnumIterator; use crate::app::App; - use crate::models::HorizontallyScrollableText; use crate::models::servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, ROOT_FOLDERS_BLOCKS}; - use crate::models::servarr_models::RootFolder; - use crate::models::stateful_table::StatefulTable; use crate::ui::DrawUi; use crate::ui::sonarr_ui::root_folders::RootFoldersUi; use crate::ui::ui_test_utils::test_utils::render_to_string_with_app; @@ -24,11 +21,12 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_root_folders_ui_renders_loading_state() { + fn test_root_folders_ui_renders_loading() { let mut app = App::test_default(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); @@ -44,7 +42,6 @@ mod tests { fn test_root_folders_ui_renders_empty_root_folders() { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); - app.data.sonarr_data.root_folders = StatefulTable::default(); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RootFoldersUi::draw(f, app, f.area()); @@ -53,45 +50,23 @@ mod tests { insta::assert_snapshot!(output); } - #[test] - fn test_root_folders_ui_renders_with_root_folders() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::RootFolders.into()); - app.data.sonarr_data.root_folders = StatefulTable::default(); - app.data.sonarr_data.root_folders.set_items(vec![ - RootFolder { - path: "/tv".to_owned(), - accessible: true, - free_space: 1024 * 1024 * 1024 * 100, - ..RootFolder::default() - }, - RootFolder { - path: "/media/tv".to_owned(), - accessible: true, - free_space: 1024 * 1024 * 1024 * 50, - ..RootFolder::default() - }, - ]); + #[rstest] + fn test_root_folders_ui_renders_root_folders_tab( + #[values( + ActiveSonarrBlock::RootFolders, + ActiveSonarrBlock::AddRootFolderPrompt, + ActiveSonarrBlock::DeleteRootFolderPrompt + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { RootFoldersUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); - } - - #[test] - fn test_root_folders_ui_renders_add_root_folder() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::AddRootFolderPrompt.into()); - app.data.sonarr_data.root_folders = StatefulTable::default(); - app.data.sonarr_data.edit_root_folder = Some(HorizontallyScrollableText::default()); - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - RootFoldersUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); + insta::assert_snapshot!(active_sonarr_block.to_string(), output); } } } diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap similarity index 90% rename from src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap rename to src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap index 04ed9ac..89588c8 100644 --- a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_add_root_folder.snap +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__AddRootFolderPrompt.snap @@ -3,8 +3,8 @@ source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── - - + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 @@ -26,6 +26,6 @@ expression: output ╭───────────── Add Root Folder ─────────────╮ - │ │ + │/nfs/tv │ ╰─────────────────────────────────────────────╯ cancel diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap new file mode 100644 index 0000000..e3e2165 --- /dev/null +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__DeleteRootFolderPrompt.snap @@ -0,0 +1,38 @@ +--- +source: src/ui/sonarr_ui/root_folders/root_folders_ui_tests.rs +expression: output +--- +───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── + Path Free Space Unmapped Folders +=> /nfs 204800.00 GB 0 + + + + + + + + + + + + + + ╭────────────────── Delete Root Folder ───────────────────╮ + │ Do you really want to delete this root folder: │ + │ /nfs? │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │╭────────────────────────────╮╭───────────────────────────╮│ + ││ Yes ││ No ││ + │╰────────────────────────────╯╰───────────────────────────╯│ + ╰───────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap similarity index 72% rename from src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap rename to src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap index 7dbd5f6..2700bd5 100644 --- a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_with_root_folders.snap +++ b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__RootFolders.snap @@ -4,5 +4,4 @@ expression: output --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Path Free Space Unmapped Folders -=> /tv 100.00 GB 0 - /media/tv 50.00 GB 0 +=> /nfs 204800.00 GB 0 diff --git a/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap b/src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap similarity index 100% rename from src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/root_folders/snapshots/managarr__ui__sonarr_ui__root_folders__root_folders_ui_tests__tests__snapshot_tests__root_folders_ui_renders_loading.snap diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Blocklist.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Blocklist.snap new file mode 100644 index 0000000..8954c9e --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Blocklist.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Series Title ▼ Source Title Language Quality Date │ +│=> Test Series Test Source Title English Bluray-1080p 2024-02-10 07:28:45 UTC │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Downloads.snap similarity index 96% rename from src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap rename to src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Downloads.snap index 52d8201..06ca6ee 100644 --- a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_history_tab.snap +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Downloads.snap @@ -5,8 +5,8 @@ expression: output ╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ │ -│ │ +│ Title Percent Complete Size Output Path Indexer Download Client │ +│=> Test Download Title 50% 3.30 GB /nfs/tv/Test show/season 1/ kickass torrents transmission │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_History.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_History.snap new file mode 100644 index 0000000..537275c --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_History.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Source Title ▼ Event Type Language Quality Date │ +│=> Test source grabbed English Bluray-1080p 2024-02-10 07:28:45 UTC │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Indexers.snap similarity index 96% rename from src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap rename to src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Indexers.snap index f8e5e47..6e26942 100644 --- a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_library_tab.snap +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Indexers.snap @@ -5,8 +5,8 @@ expression: output ╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ Title Year Network Status Rating Type Quality Profile Language Size Monitored Tags │ -│=> Test Series 0 Continuin Standard Any English 0.00 GB │ +│ Indexer RSS Automatic Search Interactive Search Priority Tags │ +│=> Test Indexer Enabled Enabled Enabled 25 alex │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_RootFolders.snap similarity index 96% rename from src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap rename to src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_RootFolders.snap index 52d8201..767cad4 100644 --- a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_ui_renders_downloads_tab.snap +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_RootFolders.snap @@ -5,8 +5,8 @@ expression: output ╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ │───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ -│ │ -│ │ +│ Path Free Space Unmapped Folders │ +│=> /nfs 204800.00 GB 0 │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Series.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Series.snap new file mode 100644 index 0000000..b364ada --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_Series.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────│ +│ Title ▼ Year Network Status Rating Type Quality Profile Language Size Monitored Tags │ +│=> Test 2022 HBO Continuin TV-MA Standard Bluray-1080p English 59.51 GB 🏷 │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_System.snap b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_System.snap new file mode 100644 index 0000000..c163cd3 --- /dev/null +++ b/src/ui/sonarr_ui/snapshots/managarr__ui__sonarr_ui__sonarr_ui_tests__tests__snapshot_tests__sonarr_tabs_System.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/sonarr_ui_tests.rs +expression: output +--- +╭ Series ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ Library │ Downloads │ Blocklist │ History │ Root Folders │ Indexers │ System │ +│╭ Tasks ───────────────────────────────────────────────────────────────────────╮╭ Queued Events ──────────────────────────────────────────────────────────────╮│ +││Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration ││ +││Backup 1 hour now 59 minutes ││manual completed Refresh Monitored 4 minutes ago 4 minutes a 00:03:03 ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +││ ││ ││ +│╰────────────────────────────────────────────────────────────────────────────────╯╰───────────────────────────────────────────────────────────────────────────────╯│ +│╭ Logs ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ +││2025-12-16 16:40:59 UTC|INFO|ImportListSyncService|No list items to process ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +││ ││ +│╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯│ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/sonarr_ui_tests.rs b/src/ui/sonarr_ui/sonarr_ui_tests.rs index 14c89f7..d52b62a 100644 --- a/src/ui/sonarr_ui/sonarr_ui_tests.rs +++ b/src/ui/sonarr_ui/sonarr_ui_tests.rs @@ -1,15 +1,10 @@ #[cfg(test)] mod tests { - use bimap::BiMap; use strum::IntoEnumIterator; use crate::{ app::App, - models::{ - servarr_data::sonarr::sonarr_data::ActiveSonarrBlock, - sonarr_models::{DownloadRecord, DownloadStatus, Series, SonarrHistoryItem}, - stateful_table::StatefulTable, - }, + models::servarr_data::sonarr::sonarr_data::ActiveSonarrBlock, ui::{DrawUi, sonarr_ui::SonarrUi, ui_test_utils::test_utils::render_to_string_with_app}, }; @@ -22,87 +17,31 @@ mod tests { mod snapshot_tests { use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; - #[test] - fn test_sonarr_ui_renders_downloads_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(0, "English".to_owned())]); - app.data.sonarr_data.main_tabs.set_index(1); // Downloads tab - app.data.sonarr_data.downloads = StatefulTable::default(); - app.data.sonarr_data.downloads.set_items(vec![ - DownloadRecord { - id: 1, - title: "Test Series S01E01".to_owned(), - status: DownloadStatus::Downloading, - size: 1500000000.0, - sizeleft: 500000000.0, - ..DownloadRecord::default() - }, - DownloadRecord { - id: 2, - title: "Another Series S02E05".to_owned(), - status: DownloadStatus::Downloading, - size: 1200000000.0, - sizeleft: 400000000.0, - ..DownloadRecord::default() - }, - ]); + #[rstest] + #[case(ActiveSonarrBlock::Series, 0)] + #[case(ActiveSonarrBlock::Downloads, 1)] + #[case(ActiveSonarrBlock::Blocklist, 2)] + #[case(ActiveSonarrBlock::History, 3)] + #[case(ActiveSonarrBlock::RootFolders, 4)] + #[case(ActiveSonarrBlock::Indexers, 5)] + #[case(ActiveSonarrBlock::System, 6)] + fn test_sonarr_ui_renders_sonarr_tabs( + #[case] active_sonarr_block: ActiveSonarrBlock, + #[case] index: usize, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + app.data.sonarr_data.main_tabs.set_index(index); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SonarrUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); - } - - #[test] - fn test_sonarr_ui_renders_history_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(0, "English".to_owned())]); - app.data.sonarr_data.main_tabs.set_index(2); // History tab - app.data.sonarr_data.history = StatefulTable::default(); - app - .data - .sonarr_data - .history - .set_items(vec![SonarrHistoryItem::default()]); - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - SonarrUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); - } - - #[test] - fn test_sonarr_ui_renders_library_tab() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::Series.into()); - app.data.sonarr_data.quality_profile_map = BiMap::from_iter(vec![(0, "Any".to_owned())]); - app.data.sonarr_data.language_profiles_map = - BiMap::from_iter(vec![(0, "English".to_owned())]); - app.data.sonarr_data.main_tabs.set_index(0); // Library tab - app.data.sonarr_data.series = StatefulTable::default(); - app.data.sonarr_data.series.set_items(vec![Series { - id: 1, - title: "Test Series".into(), - quality_profile_id: 0, - ..Series::default() - }]); - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - SonarrUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("sonarr_tabs_{active_sonarr_block}"), output); } } } diff --git a/src/ui/sonarr_ui/system/mod.rs b/src/ui/sonarr_ui/system/mod.rs index 7876112..96d06ee 100644 --- a/src/ui/sonarr_ui/system/mod.rs +++ b/src/ui/sonarr_ui/system/mod.rs @@ -1,5 +1,8 @@ use std::ops::Sub; +#[cfg(test)] +use crate::ui::ui_test_utils::test_utils::Utc; +#[cfg(not(test))] use chrono::Utc; use ratatui::layout::Layout; use ratatui::style::Style; diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemLogs.snap similarity index 100% rename from src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_logs.snap rename to src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemLogs.snap diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemQueuedEvents.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemQueuedEvents.snap new file mode 100644 index 0000000..1f76436 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemQueuedEvents.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemTasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemTasks.snap new file mode 100644 index 0000000..8850c6d --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__empty_SystemTasks.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemLogs.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemLogs.snap new file mode 100644 index 0000000..2a54bbb --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemLogs.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemQueuedEvents.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemQueuedEvents.snap new file mode 100644 index 0000000..778cfdc --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemQueuedEvents.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemTasks.snap similarity index 100% rename from src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_loading_tasks.snap rename to src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemTasks.snap diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemUpdates.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemUpdates.snap new file mode 100644 index 0000000..ed21afc --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__loading_SystemUpdates.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Updates ───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemLogs.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemLogs.snap new file mode 100644 index 0000000..37b4d25 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemLogs.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │2025-12-16 16:40:59 UTC|INFO|ImportListSyncService|No list items to process │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemQueuedEvents.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemQueuedEvents.snap new file mode 100644 index 0000000..8f4fb2a --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemQueuedEvents.snap @@ -0,0 +1,44 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + + + + + ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ + │Trigger Status Name Queued Started Duration │ + │manual completed Refresh Monitored Downlo 4 minutes ago 4 minutes ago 00:03:03 │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTaskStartConfirmPrompt.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTaskStartConfirmPrompt.snap new file mode 100644 index 0000000..adc698a --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTaskStartConfirmPrompt.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ Name Interval Last Execution Next Execution │ + │=> Backup 1 hour now 59 minutes │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ ╭────────────────────── Start Task ───────────────────────╮ │ + │ │ Do you want to manually start this task: Backup? │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │╭────────────────────────────╮╭───────────────────────────╮│ │ + │ ││ Yes ││ No ││ │ + │ │╰────────────────────────────╯╰───────────────────────────╯│ │ + │ ╰───────────────────────────────────────────────────────────╯ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTasks.snap similarity index 95% rename from src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap rename to src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTasks.snap index 9a7d336..dfc226c 100644 --- a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_renders_tasks.snap +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemTasks.snap @@ -10,9 +10,9 @@ expression: output ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ Name Interval Last Execution Next Execution │ - │=> Refresh Series 6 hours 2 hours ago 3 hours │ - │ Check for Updates 1 day 12 hours ago 11 hours │ - │ Housekeeping 1 day 1 day ago now │ + │=> Backup 1 hour now 59 minutes │ + │ │ + │ │ │ │ │ │ │ │ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemUpdates.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemUpdates.snap new file mode 100644 index 0000000..e893c41 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__popup_SystemUpdates.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Updates ───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │The latest version of Sonarr is already installed │ + │ │ + │4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) │ + │--------------------------------------------------------------------------------------------------------------------------│ + │New: │ + │ * Cool new thing │ + │Fixed: │ + │ * Some bugs killed │ + │ │ + │ │ + │3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) │ + │--------------------------------------------------------------------------------------------------------------------------│ + │New: │ + │ * Cool new thing (old) │ + │ * Other cool new thing (old) │ + │ │ + │ │ + │2.1.0 - 2023-04-15 02:02:53 UTC │ + │--------------------------------------------------------------------------------------------------------------------------│ + │Fixed: │ + │ * Killed bug 1 │ + │ * Fixed bug 2 │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_updates_popup_loading_when_empty.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_updates_popup_loading_when_empty.snap new file mode 100644 index 0000000..ed21afc --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_details_ui__system_details_ui_tests__tests__snapshot_tests__system_details_ui_updates_popup_loading_when_empty.snap @@ -0,0 +1,48 @@ +--- +source: src/ui/sonarr_ui/system/system_details_ui_tests.rs +expression: output +--- + + + + + + + ╭ Updates ───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ + │ │ + │ │ + │ Loading ... │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemLogs.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemLogs.snap new file mode 100644 index 0000000..fc263ca --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemLogs.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Log Details ───────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │2025-12-16 16:40:59 UTC|INFO|ImportListSyncService|No list items to process │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +╰───────────────────│ │────────────────────╯ +╭ Logs ───────────│ │────────────────────╮ +│2025-12-16 16:40:59│ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemQueuedEvents.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemQueuedEvents.snap new file mode 100644 index 0000000..056e356 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemQueuedEvents.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Queued Events ────────────────────────────────────────────────────────────────────────────────╮ │ +│ │Trigger Status Name Queued Started Duration │ │ +│ │manual completed Refresh Monitored Downlo 4 minutes ago 4 minutes ago 00:03:03 │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +╰────────────────────────────────│ │────────────────────────────────╯ +╭ Logs ────────────────────────│ │────────────────────────────────╮ +│2025-12-16 16:40:59 UTC|INFO|Imp│ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTaskStartConfirmPrompt.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTaskStartConfirmPrompt.snap new file mode 100644 index 0000000..2ef27cf --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTaskStartConfirmPrompt.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Name Interval Last Execution Next Execution │ │ +│ │=> Backup 1 hour now 59 minutes │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ ╭────────────────────── Start Task ───────────────────────╮ │ │ +│ │ │ Do you want to manually start this task: Backup? │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +╰───────────────────│ │ │ │────────────────────╯ +╭ Logs ───────────│ │ │ │────────────────────╮ +│2025-12-16 16:40:59│ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ │ │╭────────────────────────────╮╭───────────────────────────╮│ │ │ +│ │ ││ Yes ││ No ││ │ │ +│ │ │╰────────────────────────────╯╰───────────────────────────╯│ │ │ +│ │ ╰───────────────────────────────────────────────────────────╯ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTasks.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTasks.snap new file mode 100644 index 0000000..443f812 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemTasks.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Tasks ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ Name Interval Last Execution Next Execution │ │ +│ │=> Backup 1 hour now 59 minutes │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +╰───────────────────│ │────────────────────╯ +╭ Logs ───────────│ │────────────────────╮ +│2025-12-16 16:40:59│ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemUpdates.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemUpdates.snap new file mode 100644 index 0000000..3e3fe6d --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__popups_over_system_ui_SystemUpdates.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ╭ Updates ───────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │The latest version of Sonarr is already installed │ │ +│ │ │ │ +│ │4.3.2.1 - 2023-04-15 02:02:53 UTC (Currently Installed) │ │ +│ │--------------------------------------------------------------------------------------------------------------------------│ │ +│ │New: │ │ +│ │ * Cool new thing │ │ +│ │Fixed: │ │ +│ │ * Some bugs killed │ │ +│ │ │ │ +│ │ │ │ +│ │3.2.1.0 - 2023-04-15 02:02:53 UTC (Previously Installed) │ │ +│ │--------------------------------------------------------------------------------------------------------------------------│ │ +│ │New: │ │ +│ │ * Cool new thing (old) │ │ +│ │ * Other cool new thing (old) │ │ +│ │ │ │ +│ │ │ │ +╰───────────────────│2.1.0 - 2023-04-15 02:02:53 UTC │────────────────────╯ +╭ Logs ───────────│--------------------------------------------------------------------------------------------------------------------------│────────────────────╮ +│2025-12-16 16:40:59│Fixed: │ │ +│ │ * Killed bug 1 │ │ +│ │ * Fixed bug 2 │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ │ │ │ +│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_logs_loading.snap similarity index 100% rename from src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_loading_state.snap rename to src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_logs_loading.snap diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab.snap new file mode 100644 index 0000000..5d8e5c1 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│Name Interval Last Execution Next Execution ││Trigger Status Name Queued Started Duration │ +│Backup 1 hour now 59 minutes ││manual completed Refresh Monitored D 4 minutes ago 4 minutes a 00:03:03 │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│2025-12-16 16:40:59 UTC|INFO|ImportListSyncService|No list items to process │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_empty.snap similarity index 100% rename from src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_menu.snap rename to src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_empty.snap diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_loading.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_loading.snap new file mode 100644 index 0000000..c7ce3d6 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_loading.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ │ +│ Loading ... │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_task_and_events_loading.snap b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_task_and_events_loading.snap new file mode 100644 index 0000000..cbfcdc4 --- /dev/null +++ b/src/ui/sonarr_ui/system/snapshots/managarr__ui__sonarr_ui__system__system_ui_tests__tests__snapshot_tests__system_ui_renders_system_tab_task_and_events_loading.snap @@ -0,0 +1,54 @@ +--- +source: src/ui/sonarr_ui/system/system_ui_tests.rs +expression: output +--- +╭ Tasks ────────────────────────────────────────────────────────────────────────╮╭ Queued Events ───────────────────────────────────────────────────────────────╮ +│ ││ │ +│ ││ │ +│ Loading ... ││ Loading ... │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +│ ││ │ +╰─────────────────────────────────────────────────────────────────────────────────╯╰────────────────────────────────────────────────────────────────────────────────╯ +╭ Logs ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│2025-12-16 16:40:59 UTC|INFO|ImportListSyncService|No list items to process │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/src/ui/sonarr_ui/system/system_details_ui_tests.rs b/src/ui/sonarr_ui/system/system_details_ui_tests.rs index a30cabb..ec42b04 100644 --- a/src/ui/sonarr_ui/system/system_details_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_details_ui_tests.rs @@ -24,16 +24,58 @@ mod tests { mod snapshot_tests { use super::*; - use crate::models::sonarr_models::{SonarrTask, SonarrTaskName}; - use crate::models::stateful_table::StatefulTable; + use crate::models::ScrollableText; use crate::ui::ui_test_utils::test_utils::TerminalSize; - use chrono::{Duration, Utc}; + use rstest::rstest; - #[test] - fn test_system_details_ui_renders_loading_tasks() { + #[rstest] + fn test_system_details_ui_popups( + #[values( + ActiveSonarrBlock::SystemLogs, + ActiveSonarrBlock::SystemQueuedEvents, + ActiveSonarrBlock::SystemTasks, + ActiveSonarrBlock::SystemTaskStartConfirmPrompt, + ActiveSonarrBlock::SystemUpdates + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("popup_{active_sonarr_block}"), output); + } + + #[rstest] + fn test_system_details_ui_loading( + #[values( + ActiveSonarrBlock::SystemLogs, + ActiveSonarrBlock::SystemQueuedEvents, + ActiveSonarrBlock::SystemTasks, + ActiveSonarrBlock::SystemUpdates + )] + active_sonarr_block: ActiveSonarrBlock, + ) { let mut app = App::test_default(); app.is_loading = true; - app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); + app.push_navigation_stack(active_sonarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemDetailsUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(format!("loading_{active_sonarr_block}"), output); + } + + #[test] + fn test_system_details_ui_updates_popup_loading_when_empty() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::SystemUpdates.into()); + app.data.sonarr_data.updates = ScrollableText::with_string("".to_string()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemDetailsUi::draw(f, app, f.area()); @@ -42,63 +84,23 @@ mod tests { insta::assert_snapshot!(output); } - #[test] - fn test_system_details_ui_renders_logs() { + #[rstest] + fn test_system_details_ui_popups_empty( + #[values( + ActiveSonarrBlock::SystemLogs, + ActiveSonarrBlock::SystemQueuedEvents, + ActiveSonarrBlock::SystemTasks + )] + active_sonarr_block: ActiveSonarrBlock, + ) { let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::SystemLogs.into()); - app.data.sonarr_data.logs.set_items(vec![ - "2023-01-01T12:00:00Z | Info | Test log message 1" - .to_owned() - .into(), - "2023-01-01T12:01:00Z | Warn | Test warning message" - .to_owned() - .into(), - ]); + app.push_navigation_stack(active_sonarr_block.into()); let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { SystemDetailsUi::draw(f, app, f.area()); }); - insta::assert_snapshot!(output); - } - - #[test] - fn test_system_details_ui_renders_tasks() { - let mut app = App::test_default(); - app.push_navigation_stack(ActiveSonarrBlock::SystemTasks.into()); - - let now = Utc::now(); - let mut tasks = StatefulTable::default(); - tasks.set_items(vec![ - SonarrTask { - name: "Refresh Series".to_owned(), - task_name: SonarrTaskName::RefreshSeries, - interval: 360, - last_execution: now - Duration::hours(2), - next_execution: now + Duration::hours(4), - }, - SonarrTask { - name: "Check for Updates".to_owned(), - task_name: SonarrTaskName::ApplicationUpdateCheck, - interval: 1440, - last_execution: now - Duration::hours(12), - next_execution: now + Duration::hours(12), - }, - SonarrTask { - name: "Housekeeping".to_owned(), - task_name: SonarrTaskName::Housekeeping, - interval: 1440, - last_execution: now - Duration::hours(24), - next_execution: now, - }, - ]); - app.data.sonarr_data.tasks = tasks; - - let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { - SystemDetailsUi::draw(f, app, f.area()); - }); - - insta::assert_snapshot!(output); + insta::assert_snapshot!(format!("empty_{active_sonarr_block}"), output); } } } diff --git a/src/ui/sonarr_ui/system/system_ui_tests.rs b/src/ui/sonarr_ui/system/system_ui_tests.rs index 8450d11..39b258c 100644 --- a/src/ui/sonarr_ui/system/system_ui_tests.rs +++ b/src/ui/sonarr_ui/system/system_ui_tests.rs @@ -26,12 +26,14 @@ mod tests { } mod snapshot_tests { + use crate::models::stateful_list::StatefulList; use crate::ui::ui_test_utils::test_utils::TerminalSize; + use rstest::rstest; use super::*; #[test] - fn test_system_ui_renders_loading_state() { + fn test_system_ui_renders_system_tab_loading() { let mut app = App::test_default(); app.is_loading = true; app.push_navigation_stack(ActiveSonarrBlock::System.into()); @@ -44,7 +46,46 @@ mod tests { } #[test] - fn test_system_ui_renders_system_menu() { + fn test_system_ui_renders_logs_loading() { + let mut app = App::test_default_fully_populated(); + app.is_loading = true; + app.push_navigation_stack(ActiveSonarrBlock::System.into()); + app.data.sonarr_data.logs = StatefulList::default(); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_ui_renders_system_tab_task_and_events_loading() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::System.into()); + app.is_loading = true; + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_ui_renders_system_tab() { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(ActiveSonarrBlock::System.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!(output); + } + + #[test] + fn test_system_ui_renders_system_tab_empty() { let mut app = App::test_default(); app.push_navigation_stack(ActiveSonarrBlock::System.into()); @@ -54,5 +95,29 @@ mod tests { insta::assert_snapshot!(output); } + + #[rstest] + fn test_system_details_ui_renders_popups_over_system_ui( + #[values( + ActiveSonarrBlock::SystemLogs, + ActiveSonarrBlock::SystemQueuedEvents, + ActiveSonarrBlock::SystemTasks, + ActiveSonarrBlock::SystemTaskStartConfirmPrompt, + ActiveSonarrBlock::SystemUpdates + )] + active_sonarr_block: ActiveSonarrBlock, + ) { + let mut app = App::test_default_fully_populated(); + app.push_navigation_stack(active_sonarr_block.into()); + + let output = render_to_string_with_app(TerminalSize::Large, &mut app, |f, app| { + SystemUi::draw(f, app, f.area()); + }); + + insta::assert_snapshot!( + format!("popups_over_system_ui_{active_sonarr_block}"), + output + ); + } } }