Refactored table filtering and searching so that they are now relative to the table being filtered/searched on. Also created two new widgets for error messages and popups to make life easier moving forward. Going to refactor table sorting into StatefulTable's as well so all tables can be searched, filtered, and sorted moving forwards.

This commit is contained in:
2024-02-11 19:02:18 -07:00
parent 5973f4d685
commit adda82f7f3
38 changed files with 1561 additions and 1165 deletions
@@ -1,6 +1,6 @@
#[cfg(test)]
mod tests {
use pretty_assertions::{assert_eq, assert_str_eq};
use pretty_assertions::assert_eq;
use rstest::rstest;
use strum::IntoEnumIterator;
@@ -8,249 +8,8 @@ mod tests {
use crate::app::App;
use crate::handlers::radarr_handlers::{handle_change_tab_left_right_keys, RadarrHandler};
use crate::handlers::KeyEventHandler;
use crate::models::radarr_models::Movie;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::models::{HorizontallyScrollableText, StatefulTable};
use crate::utils::strip_non_search_characters;
use crate::{
extended_stateful_iterable_vec, filter_table, search_table, test_handler_delegation,
};
#[test]
fn test_search_table_macro() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::SearchMovie.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.search = Some("Test 2".into());
app.data.radarr_data.is_searching = true;
app.should_ignore_quit_key = true;
search_table!(app, movies, ActiveRadarrBlock::SearchMovieError);
assert_str_eq!(
app.data.radarr_data.movies.current_selection().title.text,
"Test 2"
);
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert!(!app.data.radarr_data.is_searching);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.search.is_none());
}
#[test]
fn test_search_table_macro_empty_search() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::SearchMovie.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.search = Some("".into());
app.data.radarr_data.is_searching = true;
app.should_ignore_quit_key = true;
search_table!(app, movies, ActiveRadarrBlock::SearchMovieError);
assert_str_eq!(
app.data.radarr_data.movies.current_selection().title.text,
"Test 1"
);
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert!(!app.data.radarr_data.is_searching);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.search.is_none());
}
#[test]
fn test_search_table_macro_error_on_no_search_hits() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::SearchMovie.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.search = Some("Test 5".into());
app.data.radarr_data.is_searching = true;
app.should_ignore_quit_key = true;
search_table!(app, movies, ActiveRadarrBlock::SearchMovieError);
assert_str_eq!(
app.data.radarr_data.movies.current_selection().title.text,
"Test 1"
);
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::SearchMovieError.into()
);
assert!(!app.data.radarr_data.is_searching);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.search.is_none());
}
#[test]
fn test_filter_table_macro() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::FilterMovies.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.filter = Some("Test 2".into());
app.data.radarr_data.is_filtering = true;
app.should_ignore_quit_key = true;
filter_table!(
app,
movies,
filtered_movies,
ActiveRadarrBlock::FilterMoviesError
);
assert!(app.data.radarr_data.filtered_movies.is_some());
assert_eq!(
app
.data
.radarr_data
.filtered_movies
.as_ref()
.unwrap()
.items
.len(),
1
);
assert_str_eq!(
app.data.radarr_data.filtered_movies.as_ref().unwrap().items[0]
.title
.text,
"Test 2"
);
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert!(!app.data.radarr_data.is_filtering);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.filter.is_none());
}
#[test]
fn test_filter_table_macro_reset_and_pop_on_empty_filter() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::FilterMovies.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.filter = Some("".into());
app.data.radarr_data.is_filtering = true;
app.should_ignore_quit_key = true;
filter_table!(
app,
movies,
filtered_movies,
ActiveRadarrBlock::FilterMoviesError
);
assert!(app.data.radarr_data.filtered_movies.is_none());
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert!(!app.data.radarr_data.is_filtering);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.filter.is_none());
}
#[test]
fn test_filter_table_error_on_no_filter_matches() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::FilterMovies.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.filter = Some("Test 5".into());
app.data.radarr_data.is_filtering = true;
app.should_ignore_quit_key = true;
filter_table!(
app,
movies,
filtered_movies,
ActiveRadarrBlock::FilterMoviesError
);
assert!(app.data.radarr_data.filtered_movies.is_none());
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::FilterMoviesError.into()
);
assert!(!app.data.radarr_data.is_filtering);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.filter.is_none());
}
#[test]
fn test_filter_table_macro_error_on_none_filter() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::FilterMovies.into());
app
.data
.radarr_data
.movies
.set_items(extended_stateful_iterable_vec!(
Movie,
HorizontallyScrollableText
));
app.data.radarr_data.is_filtering = true;
app.should_ignore_quit_key = true;
filter_table!(
app,
movies,
filtered_movies,
ActiveRadarrBlock::FilterMoviesError
);
assert!(app.data.radarr_data.filtered_movies.is_none());
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::FilterMoviesError.into()
);
assert!(!app.data.radarr_data.is_filtering);
assert!(!app.should_ignore_quit_key);
assert!(app.data.radarr_data.filter.is_none());
}
use crate::test_handler_delegation;
#[rstest]
#[case(0, ActiveRadarrBlock::System, ActiveRadarrBlock::Downloads)]
@@ -375,9 +134,6 @@ mod tests {
#[rstest]
fn test_delegates_indexers_blocks_to_indexers_handler(
// Add these once implemented:
// ActiveRadarrBlock::AddIndexer,
// ActiveRadarrBlock::EditIndexer,
#[values(
ActiveRadarrBlock::DeleteIndexerPrompt,
ActiveRadarrBlock::Indexers,