refactor(handlers): Refactored the handlers to all use the handle_table_events macro when appropriate and created tests for the macro so tests don't have to be duplicated across each handler

This commit is contained in:
2024-12-11 17:03:52 -07:00
parent c09950d0af
commit ed2211586e
44 changed files with 1592 additions and 9288 deletions
@@ -1,11 +1,13 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::handlers::table_handler::TableHandlingConfig;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS,
};
use crate::models::sonarr_models::AddSeriesSearchResult;
use crate::models::{BlockSelectionState, Scrollable};
use crate::network::sonarr_network::SonarrEvent;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys, App, Key};
use crate::{handle_table_events, handle_text_box_keys, handle_text_box_left_right_keys, App, Key};
#[cfg(test)]
#[path = "add_series_handler_tests.rs"]
@@ -18,7 +20,31 @@ pub(super) struct AddSeriesHandler<'a, 'b> {
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> AddSeriesHandler<'a, 'b> {
handle_table_events!(
self,
add_searched_series,
self
.app
.data
.sonarr_data
.add_searched_series
.as_mut()
.unwrap(),
AddSeriesSearchResult
);
}
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a, 'b> {
fn handle(&mut self) {
let add_series_table_handling_config =
TableHandlingConfig::new(ActiveSonarrBlock::AddSeriesSearchResults.into());
if !self.handle_add_searched_series_table_events(add_series_table_handling_config) {
self.handle_key_event();
}
}
fn accepts(active_block: ActiveSonarrBlock) -> bool {
ADD_SERIES_BLOCKS.contains(&active_block)
}
@@ -47,14 +73,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a,
fn handle_scroll_up(&mut self) {
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesSearchResults => self
.app
.data
.sonarr_data
.add_searched_series
.as_mut()
.unwrap()
.scroll_up(),
ActiveSonarrBlock::AddSeriesSelectMonitor => self
.app
.data
@@ -107,14 +125,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a,
fn handle_scroll_down(&mut self) {
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesSearchResults => self
.app
.data
.sonarr_data
.add_searched_series
.as_mut()
.unwrap()
.scroll_down(),
ActiveSonarrBlock::AddSeriesSelectMonitor => self
.app
.data
@@ -167,14 +177,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a,
fn handle_home(&mut self) {
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesSearchResults => self
.app
.data
.sonarr_data
.add_searched_series
.as_mut()
.unwrap()
.scroll_to_top(),
ActiveSonarrBlock::AddSeriesSelectMonitor => self
.app
.data
@@ -243,14 +245,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a,
fn handle_end(&mut self) {
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesSearchResults => self
.app
.data
.sonarr_data
.add_searched_series
.as_mut()
.unwrap()
.scroll_to_bottom(),
ActiveSonarrBlock::AddSeriesSelectMonitor => self
.app
.data
@@ -20,125 +20,11 @@ mod tests {
use crate::models::servarr_data::sonarr::modals::AddSeriesModal;
use crate::models::servarr_data::sonarr::sonarr_data::ADD_SERIES_SELECTION_BLOCKS;
use crate::models::stateful_table::StatefulTable;
use crate::models::BlockSelectionState;
use crate::simple_stateful_iterable_vec;
use super::*;
#[rstest]
fn test_add_series_search_results_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveSonarrBlock::Series.into());
let mut add_searched_series = StatefulTable::default();
add_searched_series.set_items(simple_stateful_iterable_vec!(
AddSeriesSearchResult,
HorizontallyScrollableText
));
app.data.sonarr_data.add_searched_series = Some(add_searched_series);
AddSeriesHandler::with(
key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 2"
);
AddSeriesHandler::with(
key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 1"
);
}
#[rstest]
fn test_add_series_search_results_scroll_no_op_when_not_ready(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveSonarrBlock::Series.into());
app.is_loading = true;
let mut add_searched_series = StatefulTable::default();
add_searched_series.set_items(simple_stateful_iterable_vec!(
AddSeriesSearchResult,
HorizontallyScrollableText
));
app.data.sonarr_data.add_searched_series = Some(add_searched_series);
AddSeriesHandler::with(
key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 1"
);
AddSeriesHandler::with(
key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 1"
);
}
#[rstest]
fn test_add_series_select_monitor_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
@@ -486,119 +372,9 @@ mod tests {
use crate::extended_stateful_iterable_vec;
use crate::models::servarr_data::sonarr::modals::AddSeriesModal;
use crate::models::stateful_table::StatefulTable;
use super::*;
#[test]
fn test_add_series_search_results_home_end() {
let mut app = App::default();
app.push_navigation_stack(ActiveSonarrBlock::Series.into());
let mut add_searched_series = StatefulTable::default();
add_searched_series.set_items(extended_stateful_iterable_vec!(
AddSeriesSearchResult,
HorizontallyScrollableText
));
app.data.sonarr_data.add_searched_series = Some(add_searched_series);
AddSeriesHandler::with(
DEFAULT_KEYBINDINGS.end.key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 3"
);
AddSeriesHandler::with(
DEFAULT_KEYBINDINGS.home.key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 1"
);
}
#[test]
fn test_add_series_search_results_home_end_no_op_when_not_ready() {
let mut app = App::default();
app.push_navigation_stack(ActiveSonarrBlock::Series.into());
app.is_loading = true;
let mut add_searched_series = StatefulTable::default();
add_searched_series.set_items(extended_stateful_iterable_vec!(
AddSeriesSearchResult,
HorizontallyScrollableText
));
app.data.sonarr_data.add_searched_series = Some(add_searched_series);
AddSeriesHandler::with(
DEFAULT_KEYBINDINGS.end.key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 1"
);
AddSeriesHandler::with(
DEFAULT_KEYBINDINGS.home.key,
&mut app,
ActiveSonarrBlock::AddSeriesSearchResults,
None,
)
.handle();
assert_str_eq!(
app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.title
.to_string(),
"Test 1"
);
}
#[test]
fn test_add_series_select_monitor_home_end() {
let monitor_vec = Vec::from_iter(SeriesMonitor::iter());
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -15,7 +15,7 @@ use crate::{
},
sonarr_models::Series,
stateful_table::SortOption,
BlockSelectionState, HorizontallyScrollableText, Scrollable,
BlockSelectionState, HorizontallyScrollableText,
},
network::sonarr_network::SonarrEvent,
};
@@ -23,7 +23,7 @@ use crate::{
use super::handle_change_tab_left_right_keys;
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::handlers::sonarr_handlers::library::series_details_handler::SeriesDetailsHandler;
use crate::handlers::table_handler::TableHandlingProps;
use crate::handlers::table_handler::TableHandlingConfig;
mod add_series_handler;
mod delete_series_handler;
@@ -46,7 +46,7 @@ impl<'a, 'b> LibraryHandler<'a, 'b> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, 'b> {
fn handle(&mut self) {
let series_table_handling_props = TableHandlingProps::new(ActiveSonarrBlock::Series.into())
let series_table_handling_config = TableHandlingConfig::new(ActiveSonarrBlock::Series.into())
.sorting_block(ActiveSonarrBlock::SeriesSortPrompt.into())
.sort_by_fn(|a: &Series, b: &Series| a.id.cmp(&b.id))
.sort_options(series_sorting_options())
@@ -57,7 +57,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, '
.filter_error_block(ActiveSonarrBlock::FilterSeriesError.into())
.filter_field_fn(|series| &series.title.text);
if !self.handle_series_table_events(series_table_handling_props) {
if !self.handle_series_table_events(series_table_handling_config) {
match self.active_sonarr_block {
_ if AddSeriesHandler::accepts(self.active_sonarr_block) => {
AddSeriesHandler::with(self.key, self.app, self.active_sonarr_block, self.context)
@@ -3,13 +3,13 @@ use crate::app::App;
use crate::event::Key;
use crate::handle_table_events;
use crate::handlers::sonarr_handlers::history::history_sorting_options;
use crate::handlers::table_handler::TableHandlingProps;
use crate::handlers::table_handler::TableHandlingConfig;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
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, Scrollable};
use crate::models::BlockSelectionState;
use crate::network::sonarr_network::SonarrEvent;
#[cfg(test)]
@@ -41,8 +41,8 @@ impl<'a, 'b> SeriesDetailsHandler<'a, 'b> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler<'a, 'b> {
fn handle(&mut self) {
let season_table_handling_props =
TableHandlingProps::new(ActiveSonarrBlock::SeriesDetails.into())
let season_table_handling_config =
TableHandlingConfig::new(ActiveSonarrBlock::SeriesDetails.into())
.searching_block(ActiveSonarrBlock::SearchSeason.into())
.search_error_block(ActiveSonarrBlock::SearchSeasonError.into())
.search_field_fn(|season: &Season| {
@@ -51,8 +51,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler
.as_ref()
.expect("Season was not populated with title in handlers")
});
let series_history_table_handling_props =
TableHandlingProps::new(ActiveSonarrBlock::SeriesHistory.into())
let series_history_table_handling_config =
TableHandlingConfig::new(ActiveSonarrBlock::SeriesHistory.into())
.sorting_block(ActiveSonarrBlock::SeriesHistorySortPrompt.into())
.sort_options(history_sorting_options())
.sort_by_fn(|a: &SonarrHistoryItem, b: &SonarrHistoryItem| a.id.cmp(&b.id))
@@ -63,8 +63,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for SeriesDetailsHandler
.filter_error_block(ActiveSonarrBlock::FilterSeriesHistoryError.into())
.filter_field_fn(|history_item: &SonarrHistoryItem| &history_item.source_title.text);
if !self.handle_season_table_events(season_table_handling_props)
&& !self.handle_series_history_table_events(series_history_table_handling_props)
if !self.handle_season_table_events(season_table_handling_config)
&& !self.handle_series_history_table_events(series_history_table_handling_config)
{
self.handle_key_event();
}
File diff suppressed because it is too large Load Diff