Partial implementation of Tasks and Logs and test refactor
This commit is contained in:
@@ -0,0 +1,212 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::anyhow;
|
||||
use pretty_assertions::{assert_eq, assert_str_eq};
|
||||
use tokio::sync::mpsc;
|
||||
|
||||
use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::app::{App, Data, RadarrConfig, DEFAULT_ROUTE};
|
||||
use crate::models::{HorizontallyScrollableText, Route, TabRoute};
|
||||
use crate::network::radarr_network::RadarrEvent;
|
||||
use crate::network::NetworkEvent;
|
||||
|
||||
#[test]
|
||||
fn test_app_default() {
|
||||
let app = App::default();
|
||||
|
||||
assert_eq!(app.navigation_stack, vec![DEFAULT_ROUTE]);
|
||||
assert!(app.network_tx.is_none());
|
||||
assert_eq!(app.error, HorizontallyScrollableText::default());
|
||||
assert!(app.response.is_empty());
|
||||
assert_eq!(app.server_tabs.index, 0);
|
||||
assert_eq!(
|
||||
app.server_tabs.tabs,
|
||||
vec![
|
||||
TabRoute {
|
||||
title: "Radarr",
|
||||
route: ActiveRadarrBlock::Movies.into(),
|
||||
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Sonarr",
|
||||
route: Route::Sonarr,
|
||||
help: "<tab> change servarr | <q> quit ",
|
||||
contextual_help: None,
|
||||
},
|
||||
]
|
||||
);
|
||||
assert_str_eq!(app.title, "Managarr");
|
||||
assert_eq!(app.tick_until_poll, 400);
|
||||
assert_eq!(app.ticks_until_scroll, 4);
|
||||
assert_eq!(app.tick_count, 0);
|
||||
assert!(!app.is_loading);
|
||||
assert!(!app.is_routing);
|
||||
assert!(!app.should_refresh);
|
||||
assert!(!app.should_ignore_quit_key);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_navigation_stack_methods() {
|
||||
let mut app = App::default();
|
||||
|
||||
assert_eq!(app.get_current_route(), &DEFAULT_ROUTE);
|
||||
|
||||
app.push_navigation_stack(ActiveRadarrBlock::Downloads.into());
|
||||
|
||||
assert_eq!(
|
||||
app.get_current_route(),
|
||||
&ActiveRadarrBlock::Downloads.into()
|
||||
);
|
||||
assert!(app.is_routing);
|
||||
|
||||
app.is_routing = false;
|
||||
app.pop_and_push_navigation_stack(ActiveRadarrBlock::Collections.into());
|
||||
|
||||
assert_eq!(
|
||||
app.get_current_route(),
|
||||
&ActiveRadarrBlock::Collections.into()
|
||||
);
|
||||
assert!(app.is_routing);
|
||||
|
||||
app.is_routing = false;
|
||||
app.pop_navigation_stack();
|
||||
|
||||
assert_eq!(app.get_current_route(), &DEFAULT_ROUTE);
|
||||
assert!(app.is_routing);
|
||||
|
||||
app.is_routing = false;
|
||||
app.pop_navigation_stack();
|
||||
|
||||
assert_eq!(app.get_current_route(), &DEFAULT_ROUTE);
|
||||
assert!(app.is_routing);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reset_tick_count() {
|
||||
let mut app = App {
|
||||
tick_count: 2,
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.reset_tick_count();
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reset() {
|
||||
let mut app = App {
|
||||
tick_count: 2,
|
||||
error: "Test error".to_owned().into(),
|
||||
data: Data {
|
||||
radarr_data: RadarrData {
|
||||
version: "test".to_owned(),
|
||||
..RadarrData::default()
|
||||
},
|
||||
},
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.reset();
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
assert_eq!(app.error, HorizontallyScrollableText::default());
|
||||
assert!(app.data.radarr_data.version.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_handle_error() {
|
||||
let mut app = App::default();
|
||||
let test_string = "Testing";
|
||||
|
||||
app.handle_error(anyhow!(test_string));
|
||||
|
||||
assert_eq!(app.error.text, test_string);
|
||||
|
||||
app.handle_error(anyhow!("Testing a different error"));
|
||||
|
||||
assert_eq!(app.error.text, test_string);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_on_tick_first_render() {
|
||||
let (sync_network_tx, mut sync_network_rx) = mpsc::channel::<NetworkEvent>(500);
|
||||
|
||||
let mut app = App {
|
||||
tick_until_poll: 2,
|
||||
network_tx: Some(sync_network_tx),
|
||||
..App::default()
|
||||
};
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
|
||||
app.on_tick(true).await;
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetQualityProfiles.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetTags.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetRootFolders.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetOverview.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetStatus.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetMovies.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetDownloads.into()
|
||||
);
|
||||
assert!(!app.is_routing);
|
||||
assert!(!app.should_refresh);
|
||||
assert_eq!(app.tick_count, 1);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_on_tick_routing() {
|
||||
let mut app = App {
|
||||
tick_until_poll: 2,
|
||||
tick_count: 2,
|
||||
is_routing: true,
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.on_tick(false).await;
|
||||
assert!(!app.is_routing);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_on_tick_should_refresh() {
|
||||
let mut app = App {
|
||||
tick_until_poll: 2,
|
||||
tick_count: 2,
|
||||
should_refresh: true,
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.on_tick(false).await;
|
||||
assert!(!app.should_refresh);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_radarr_config_default() {
|
||||
let radarr_config = RadarrConfig::default();
|
||||
|
||||
assert_str_eq!(radarr_config.host, "localhost");
|
||||
assert_eq!(radarr_config.port, Some(7878));
|
||||
assert!(radarr_config.api_token.is_empty());
|
||||
}
|
||||
}
|
||||
+5
-215
@@ -9,8 +9,11 @@ use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::models::{HorizontallyScrollableText, Route, TabRoute, TabState};
|
||||
use crate::network::NetworkEvent;
|
||||
|
||||
pub(crate) mod key_binding;
|
||||
pub(crate) mod radarr;
|
||||
#[cfg(test)]
|
||||
#[path = "app_tests.rs"]
|
||||
mod app_tests;
|
||||
pub mod key_binding;
|
||||
pub mod radarr;
|
||||
|
||||
const DEFAULT_ROUTE: Route = Route::Radarr(ActiveRadarrBlock::Movies, None);
|
||||
|
||||
@@ -174,216 +177,3 @@ impl Default for RadarrConfig {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use anyhow::anyhow;
|
||||
use pretty_assertions::{assert_eq, assert_str_eq};
|
||||
use tokio::sync::mpsc;
|
||||
|
||||
use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::app::{App, Data, RadarrConfig, DEFAULT_ROUTE};
|
||||
use crate::models::{HorizontallyScrollableText, Route, TabRoute};
|
||||
use crate::network::radarr_network::RadarrEvent;
|
||||
use crate::network::NetworkEvent;
|
||||
|
||||
#[test]
|
||||
fn test_app_default() {
|
||||
let app = App::default();
|
||||
|
||||
assert_eq!(app.navigation_stack, vec![DEFAULT_ROUTE]);
|
||||
assert!(app.network_tx.is_none());
|
||||
assert_eq!(app.error, HorizontallyScrollableText::default());
|
||||
assert!(app.response.is_empty());
|
||||
assert_eq!(app.server_tabs.index, 0);
|
||||
assert_eq!(
|
||||
app.server_tabs.tabs,
|
||||
vec![
|
||||
TabRoute {
|
||||
title: "Radarr",
|
||||
route: ActiveRadarrBlock::Movies.into(),
|
||||
help: "<↑↓> scroll | ←→ change tab | <tab> change servarr | <q> quit ",
|
||||
contextual_help: None,
|
||||
},
|
||||
TabRoute {
|
||||
title: "Sonarr",
|
||||
route: Route::Sonarr,
|
||||
help: "<tab> change servarr | <q> quit ",
|
||||
contextual_help: None,
|
||||
}
|
||||
]
|
||||
);
|
||||
assert_str_eq!(app.title, "Managarr");
|
||||
assert_eq!(app.tick_until_poll, 400);
|
||||
assert_eq!(app.ticks_until_scroll, 4);
|
||||
assert_eq!(app.tick_count, 0);
|
||||
assert!(!app.is_loading);
|
||||
assert!(!app.is_routing);
|
||||
assert!(!app.should_refresh);
|
||||
assert!(!app.should_ignore_quit_key);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_navigation_stack_methods() {
|
||||
let mut app = App::default();
|
||||
|
||||
assert_eq!(app.get_current_route(), &DEFAULT_ROUTE);
|
||||
|
||||
app.push_navigation_stack(ActiveRadarrBlock::Downloads.into());
|
||||
|
||||
assert_eq!(
|
||||
app.get_current_route(),
|
||||
&ActiveRadarrBlock::Downloads.into()
|
||||
);
|
||||
assert!(app.is_routing);
|
||||
|
||||
app.is_routing = false;
|
||||
app.pop_and_push_navigation_stack(ActiveRadarrBlock::Collections.into());
|
||||
|
||||
assert_eq!(
|
||||
app.get_current_route(),
|
||||
&ActiveRadarrBlock::Collections.into()
|
||||
);
|
||||
assert!(app.is_routing);
|
||||
|
||||
app.is_routing = false;
|
||||
app.pop_navigation_stack();
|
||||
|
||||
assert_eq!(app.get_current_route(), &DEFAULT_ROUTE);
|
||||
assert!(app.is_routing);
|
||||
|
||||
app.is_routing = false;
|
||||
app.pop_navigation_stack();
|
||||
|
||||
assert_eq!(app.get_current_route(), &DEFAULT_ROUTE);
|
||||
assert!(app.is_routing);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reset_tick_count() {
|
||||
let mut app = App {
|
||||
tick_count: 2,
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.reset_tick_count();
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reset() {
|
||||
let mut app = App {
|
||||
tick_count: 2,
|
||||
error: "Test error".to_owned().into(),
|
||||
data: Data {
|
||||
radarr_data: RadarrData {
|
||||
version: "test".to_owned(),
|
||||
..RadarrData::default()
|
||||
},
|
||||
},
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.reset();
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
assert_eq!(app.error, HorizontallyScrollableText::default());
|
||||
assert!(app.data.radarr_data.version.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_handle_error() {
|
||||
let mut app = App::default();
|
||||
let test_string = "Testing";
|
||||
|
||||
app.handle_error(anyhow!(test_string));
|
||||
|
||||
assert_eq!(app.error.text, test_string);
|
||||
|
||||
app.handle_error(anyhow!("Testing a different error"));
|
||||
|
||||
assert_eq!(app.error.text, test_string);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_on_tick_first_render() {
|
||||
let (sync_network_tx, mut sync_network_rx) = mpsc::channel::<NetworkEvent>(500);
|
||||
|
||||
let mut app = App {
|
||||
tick_until_poll: 2,
|
||||
network_tx: Some(sync_network_tx),
|
||||
..App::default()
|
||||
};
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
|
||||
app.on_tick(true).await;
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetQualityProfiles.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetTags.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetRootFolders.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetOverview.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetStatus.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetMovies.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetDownloads.into()
|
||||
);
|
||||
assert!(!app.is_routing);
|
||||
assert!(!app.should_refresh);
|
||||
assert_eq!(app.tick_count, 1);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_on_tick_routing() {
|
||||
let mut app = App {
|
||||
tick_until_poll: 2,
|
||||
tick_count: 2,
|
||||
is_routing: true,
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.on_tick(false).await;
|
||||
assert!(!app.is_routing);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_on_tick_should_refresh() {
|
||||
let mut app = App {
|
||||
tick_until_poll: 2,
|
||||
tick_count: 2,
|
||||
should_refresh: true,
|
||||
..App::default()
|
||||
};
|
||||
|
||||
app.on_tick(false).await;
|
||||
assert!(!app.should_refresh);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_radarr_config_default() {
|
||||
let radarr_config = RadarrConfig::default();
|
||||
|
||||
assert_str_eq!(radarr_config.host, "localhost");
|
||||
assert_eq!(radarr_config.port, Some(7878));
|
||||
assert!(radarr_config.api_token.is_empty());
|
||||
}
|
||||
}
|
||||
|
||||
+23
-1234
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,126 @@
|
||||
#[cfg(test)]
|
||||
pub mod utils {
|
||||
use crate::app::radarr::RadarrData;
|
||||
use crate::models::radarr_models::{
|
||||
AddMovieSearchResult, Collection, CollectionMovie, Credit, Log, MinimumAvailability, Monitor,
|
||||
Movie, MovieHistoryItem, Release, ReleaseField, RootFolder,
|
||||
};
|
||||
use crate::models::ScrollableText;
|
||||
|
||||
pub fn create_test_radarr_data<'a>() -> RadarrData<'a> {
|
||||
let mut radarr_data = RadarrData {
|
||||
is_searching: true,
|
||||
is_filtering: true,
|
||||
delete_movie_files: true,
|
||||
add_list_exclusion: true,
|
||||
search: "test search".to_owned().into(),
|
||||
filter: "test filter".to_owned().into(),
|
||||
edit_path: "test path".to_owned().into(),
|
||||
edit_tags: "usenet, test".to_owned().into(),
|
||||
edit_monitored: Some(true),
|
||||
edit_search_on_add: Some(true),
|
||||
file_details: "test file details".to_owned(),
|
||||
audio_details: "test audio details".to_owned(),
|
||||
video_details: "test video details".to_owned(),
|
||||
movie_details: ScrollableText::with_string("test movie details".to_owned()),
|
||||
..RadarrData::default()
|
||||
};
|
||||
radarr_data
|
||||
.movie_history
|
||||
.set_items(vec![MovieHistoryItem::default()]);
|
||||
radarr_data.movie_cast.set_items(vec![Credit::default()]);
|
||||
radarr_data.movie_crew.set_items(vec![Credit::default()]);
|
||||
radarr_data
|
||||
.movie_releases
|
||||
.set_items(vec![Release::default()]);
|
||||
radarr_data.movie_info_tabs.index = 1;
|
||||
radarr_data.monitor_list.set_items(vec![Monitor::default()]);
|
||||
radarr_data
|
||||
.minimum_availability_list
|
||||
.set_items(vec![MinimumAvailability::default()]);
|
||||
radarr_data
|
||||
.quality_profile_list
|
||||
.set_items(vec![String::default()]);
|
||||
radarr_data
|
||||
.root_folder_list
|
||||
.set_items(vec![RootFolder::default()]);
|
||||
radarr_data
|
||||
.movie_releases_sort
|
||||
.set_items(vec![ReleaseField::default()]);
|
||||
radarr_data.sort_ascending = Some(true);
|
||||
radarr_data
|
||||
.filtered_movies
|
||||
.set_items(vec![Movie::default()]);
|
||||
radarr_data
|
||||
.filtered_collections
|
||||
.set_items(vec![Collection::default()]);
|
||||
radarr_data
|
||||
.add_searched_movies
|
||||
.set_items(vec![AddMovieSearchResult::default()]);
|
||||
radarr_data
|
||||
.collection_movies
|
||||
.set_items(vec![CollectionMovie::default()]);
|
||||
radarr_data.logs.set_items(vec![Log::default()]);
|
||||
|
||||
radarr_data
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_search_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!(!$radarr_data.is_searching);
|
||||
assert!($radarr_data.search.text.is_empty());
|
||||
assert!($radarr_data.filter.text.is_empty());
|
||||
assert!($radarr_data.filtered_movies.items.is_empty());
|
||||
assert!($radarr_data.filtered_collections.items.is_empty());
|
||||
assert!($radarr_data.add_searched_movies.items.is_empty());
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_edit_media_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!($radarr_data.edit_monitored.is_none());
|
||||
assert!($radarr_data.edit_search_on_add.is_none());
|
||||
assert!($radarr_data.edit_path.text.is_empty());
|
||||
assert!($radarr_data.edit_tags.text.is_empty());
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_filter_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!(!$radarr_data.is_filtering);
|
||||
assert!($radarr_data.filter.text.is_empty());
|
||||
assert!($radarr_data.filtered_movies.items.is_empty());
|
||||
assert!($radarr_data.filtered_collections.items.is_empty());
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_movie_info_tabs_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!($radarr_data.file_details.is_empty());
|
||||
assert!($radarr_data.audio_details.is_empty());
|
||||
assert!($radarr_data.video_details.is_empty());
|
||||
assert!($radarr_data.movie_details.get_text().is_empty());
|
||||
assert!($radarr_data.movie_history.items.is_empty());
|
||||
assert!($radarr_data.movie_cast.items.is_empty());
|
||||
assert!($radarr_data.movie_crew.items.is_empty());
|
||||
assert!($radarr_data.movie_releases.items.is_empty());
|
||||
assert!($radarr_data.movie_releases_sort.items.is_empty());
|
||||
assert!($radarr_data.sort_ascending.is_none());
|
||||
assert_eq!($radarr_data.movie_info_tabs.index, 0);
|
||||
};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_preferences_selections_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!($radarr_data.monitor_list.items.is_empty());
|
||||
assert!($radarr_data.minimum_availability_list.items.is_empty());
|
||||
assert!($radarr_data.quality_profile_list.items.is_empty());
|
||||
assert!($radarr_data.root_folder_list.items.is_empty());
|
||||
};
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user