test: give the string input and table filter property tests real assertions

This commit is contained in:
Dark-Alex-17 committed 2026-09-17 14:33:16 -06:00
1 parent d678f5777a
commit 9b4b3003b5
2 files changed
+53 -19

No files matched your search

@@ -5,3 +5,4 @@
# It is recommended to check this file in to source control so that
# everyone who runs the test benefits from these saved cases.
cc 56330c025ad79db641d0eb9f429ab74e95822e1fb015b58f0e158ea674cd42a1 # shrinks to list_size = 1, page_ops = 1
cc 29df5ff471eb388b0ffde573a959a539e4cf32acd9e1cea5187bba2268dd57f7 # shrinks to list_size = 1, filter_term = "𑛀"
+52 -19
View File
@@ -3,13 +3,16 @@ mod property_tests {
use proptest::prelude::*;
use crate::app::App;
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::event::Key;
use crate::handlers::handle_events;
use crate::handlers::handler_test_utils::test_utils::proptest_helpers::{
list_size, text_input_string,
};
use crate::models::radarr_models::Movie;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::models::stateful_table::StatefulTable;
use crate::models::{Paginated, Scrollable};
use crate::models::{Paginated, Scrollable, strip_non_search_characters};
proptest! {
#[test]
@@ -104,13 +107,29 @@ mod property_tests {
#[test]
fn test_string_input_safety(input in text_input_string()) {
let _lowercase = input.to_lowercase();
let _uppercase = input.to_uppercase();
let _trimmed = input.trim();
let _len = input.len();
let _chars: Vec<char> = input.chars().collect();
let mut app = App::test_default();
app.data.radarr_data.movies.set_items(vec![Movie::default()]);
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
handle_events(DEFAULT_KEYBINDINGS.filter.key, &mut app);
prop_assert!(true);
for character in input.chars() {
handle_events(Key::Char(character), &mut app);
}
prop_assert_eq!(app.get_current_route(), ActiveRadarrBlock::FilterMovies.into());
prop_assert_eq!(
app.data.radarr_data.movies.filter.as_ref().unwrap().text.as_str(),
input.as_str()
);
for _ in 0..input.chars().count() {
handle_events(DEFAULT_KEYBINDINGS.backspace.key, &mut app);
}
prop_assert_eq!(
app.data.radarr_data.movies.filter.as_ref().unwrap().text.as_str(),
""
);
}
#[test]
@@ -177,22 +196,36 @@ mod property_tests {
..Movie::default()
})
.collect();
table.set_items(movies.clone());
let original_size = table.items.len();
table.filter = Some(filter_term.clone().into());
let scrubbed_filter = strip_non_search_characters(&filter_term);
let matches_filter = |movie: &Movie| {
strip_non_search_characters(&movie.title.text).contains(&scrubbed_filter)
};
if !filter_term.is_empty() {
let filtered: Vec<Movie> = movies.into_iter()
.filter(|m| m.title.text.to_lowercase().contains(&filter_term.to_lowercase()))
.collect();
table.set_items(filtered);
}
let has_match = table.apply_filter(|movie| &movie.title.text);
prop_assert!(table.items.len() <= original_size);
prop_assert_eq!(&table.items, &movies);
prop_assert!(table.filter.is_none());
if !table.items.is_empty() {
let current = table.current_selection();
prop_assert!(current.id >= 0);
if has_match {
let filtered_items = table.filtered_items.as_ref().unwrap();
prop_assert!(!filtered_items.is_empty());
prop_assert!(filtered_items.len() <= movies.len());
for movie in filtered_items {
prop_assert!(matches_filter(movie));
}
for movie in movies.iter().filter(|movie| !filtered_items.contains(movie)) {
prop_assert!(!matches_filter(movie));
}
} else {
prop_assert!(table.filtered_items.is_none());
prop_assert!(
filter_term.is_empty() || movies.iter().all(|movie| !matches_filter(movie))
);
}
}
}