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); }