feat(handler): Full indexer tab handler support

This commit is contained in:
2024-12-03 17:46:37 -07:00
parent 8660de530d
commit 093ef136e7
23 changed files with 4995 additions and 79 deletions
@@ -45,14 +45,42 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<'
}
fn handle_scroll_up(&mut self) {
if self.active_radarr_block == ActiveRadarrBlock::EditIndexerPrompt {
self.app.data.radarr_data.selected_block.up();
match self.active_radarr_block {
ActiveRadarrBlock::EditIndexerPrompt => {
self.app.data.radarr_data.selected_block.up();
}
ActiveRadarrBlock::EditIndexerPriorityInput => {
self
.app
.data
.radarr_data
.edit_indexer_modal
.as_mut()
.unwrap()
.priority += 1;
}
_ => (),
}
}
fn handle_scroll_down(&mut self) {
if self.active_radarr_block == ActiveRadarrBlock::EditIndexerPrompt {
self.app.data.radarr_data.selected_block.down();
match self.active_radarr_block {
ActiveRadarrBlock::EditIndexerPrompt => {
self.app.data.radarr_data.selected_block.down();
}
ActiveRadarrBlock::EditIndexerPriorityInput => {
let edit_indexer_modal = self
.app
.data
.radarr_data
.edit_indexer_modal
.as_mut()
.unwrap();
if edit_indexer_modal.priority > 0 {
edit_indexer_modal.priority -= 1;
}
}
_ => (),
}
}
@@ -287,6 +315,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<'
self.app.push_navigation_stack(selected_block.into());
self.app.should_ignore_quit_key = true;
}
ActiveRadarrBlock::EditIndexerPriorityInput => self
.app
.push_navigation_stack(ActiveRadarrBlock::EditIndexerPriorityInput.into()),
ActiveRadarrBlock::EditIndexerToggleEnableRss => {
let indexer = self
.app
@@ -330,6 +361,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<'
self.app.pop_navigation_stack();
self.app.should_ignore_quit_key = false;
}
ActiveRadarrBlock::EditIndexerPriorityInput => self.app.pop_navigation_stack(),
_ => (),
}
}
@@ -345,6 +377,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<'
| ActiveRadarrBlock::EditIndexerUrlInput
| ActiveRadarrBlock::EditIndexerApiKeyInput
| ActiveRadarrBlock::EditIndexerSeedRatioInput
| ActiveRadarrBlock::EditIndexerPriorityInput
| ActiveRadarrBlock::EditIndexerTagsInput => {
self.app.pop_navigation_stack();
self.app.should_ignore_quit_key = false;
@@ -20,9 +20,86 @@ mod tests {
use super::*;
#[rstest]
fn test_edit_indexer_priority_scroll(#[values(Key::Up, Key::Down)] key: Key) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
EditIndexerHandler::with(
key,
&mut app,
ActiveRadarrBlock::EditIndexerPriorityInput,
None,
)
.handle();
if key == Key::Up {
assert_eq!(
app
.data
.radarr_data
.edit_indexer_modal
.as_ref()
.unwrap()
.priority,
1
);
} else {
assert_eq!(
app
.data
.radarr_data
.edit_indexer_modal
.as_ref()
.unwrap()
.priority,
0
);
EditIndexerHandler::with(
Key::Up,
&mut app,
ActiveRadarrBlock::EditIndexerPriorityInput,
None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.edit_indexer_modal
.as_ref()
.unwrap()
.priority,
1
);
EditIndexerHandler::with(
key,
&mut app,
ActiveRadarrBlock::EditIndexerPriorityInput,
None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.edit_indexer_modal
.as_ref()
.unwrap()
.priority,
0
);
}
}
#[rstest]
fn test_edit_indexer_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
@@ -48,6 +125,7 @@ mod tests {
#[values(Key::Up, Key::Down)] key: Key,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.is_loading = true;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.data.radarr_data.selected_block =
@@ -75,6 +153,7 @@ mod tests {
#[test]
fn test_edit_indexer_name_input_home_end() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
name: "Test".into(),
..EditIndexerModal::default()
@@ -126,6 +205,7 @@ mod tests {
#[test]
fn test_edit_indexer_url_input_home_end() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
url: "Test".into(),
..EditIndexerModal::default()
@@ -177,6 +257,7 @@ mod tests {
#[test]
fn test_edit_indexer_api_key_input_home_end() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
api_key: "Test".into(),
..EditIndexerModal::default()
@@ -228,6 +309,7 @@ mod tests {
#[test]
fn test_edit_indexer_seed_ratio_input_home_end() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
seed_ratio: "Test".into(),
..EditIndexerModal::default()
@@ -279,6 +361,7 @@ mod tests {
#[test]
fn test_edit_indexer_tags_input_home_end() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
tags: "Test".into(),
..EditIndexerModal::default()
@@ -345,6 +428,7 @@ mod tests {
#[rstest]
fn test_left_right_prompt_toggle(#[values(Key::Left, Key::Right)] key: Key) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.y = EDIT_INDEXER_TORRENT_SELECTION_BLOCKS.len() - 1;
@@ -386,6 +470,7 @@ mod tests {
#[case] right_block: ActiveRadarrBlock,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.y = starting_y_index;
@@ -426,6 +511,11 @@ mod tests {
ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveRadarrBlock::EditIndexerTagsInput
)]
#[case(
3,
ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveRadarrBlock::EditIndexerPriorityInput
)]
fn test_left_right_block_toggle_nzb(
#[values(Key::Left, Key::Right)] key: Key,
#[case] starting_y_index: usize,
@@ -433,6 +523,7 @@ mod tests {
#[case] right_block: ActiveRadarrBlock,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_NZB_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.y = starting_y_index;
@@ -458,18 +549,19 @@ mod tests {
}
#[rstest]
fn test_left_right_block_toggle_nzb_empty_row_to_prompt_confirm(
fn test_left_right_block_toggle_torren_empty_row_to_prompt_confirm(
#[values(Key::Left, Key::Right)] key: Key,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_NZB_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.y = 3;
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.y = 4;
app.data.radarr_data.prompt_confirm = false;
assert_eq!(
app.data.radarr_data.selected_block.get_active_block(),
ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch
ActiveRadarrBlock::EditIndexerPriorityInput
);
EditIndexerHandler::with(key, &mut app, ActiveRadarrBlock::EditIndexerPrompt, None).handle();
@@ -491,6 +583,7 @@ mod tests {
#[test]
fn test_edit_indexer_name_input_left_right_keys() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
name: "Test".into(),
..EditIndexerModal::default()
@@ -542,6 +635,7 @@ mod tests {
#[test]
fn test_edit_indexer_url_input_left_right_keys() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
url: "Test".into(),
..EditIndexerModal::default()
@@ -593,6 +687,7 @@ mod tests {
#[test]
fn test_edit_indexer_api_key_input_left_right_keys() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
api_key: "Test".into(),
..EditIndexerModal::default()
@@ -644,6 +739,7 @@ mod tests {
#[test]
fn test_edit_indexer_seed_ratio_input_left_right_keys() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
seed_ratio: "Test".into(),
..EditIndexerModal::default()
@@ -695,6 +791,7 @@ mod tests {
#[test]
fn test_edit_indexer_tags_input_left_right_keys() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
tags: "Test".into(),
..EditIndexerModal::default()
@@ -857,6 +954,7 @@ mod tests {
#[case] block: ActiveRadarrBlock,
) {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.push_navigation_stack(ActiveRadarrBlock::EditIndexerPrompt.into());
app.data.radarr_data.selected_block =
@@ -879,9 +977,35 @@ mod tests {
assert!(app.should_ignore_quit_key);
}
#[test]
fn test_edit_indexer_priority_input_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.push_navigation_stack(ActiveRadarrBlock::EditIndexerPrompt.into());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
app.data.radarr_data.selected_block.set_index(0, 4);
EditIndexerHandler::with(
SUBMIT_KEY,
&mut app,
ActiveRadarrBlock::EditIndexerPrompt,
None,
)
.handle();
assert_eq!(
app.get_current_route(),
ActiveRadarrBlock::EditIndexerPriorityInput.into()
);
assert!(!app.should_ignore_quit_key);
}
#[test]
fn test_edit_indexer_toggle_enable_rss_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
@@ -934,6 +1058,7 @@ mod tests {
#[test]
fn test_edit_indexer_toggle_enable_automatic_search_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
@@ -986,6 +1111,7 @@ mod tests {
#[test]
fn test_edit_indexer_toggle_enable_interactive_search_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
app.data.radarr_data.selected_block =
BlockSelectionState::new(EDIT_INDEXER_TORRENT_SELECTION_BLOCKS);
@@ -1038,6 +1164,7 @@ mod tests {
#[test]
fn test_edit_indexer_name_input_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
name: "Test".into(),
@@ -1073,6 +1200,7 @@ mod tests {
#[test]
fn test_edit_indexer_url_input_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
url: "Test".into(),
@@ -1108,6 +1236,7 @@ mod tests {
#[test]
fn test_edit_indexer_api_key_input_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
api_key: "Test".into(),
@@ -1143,6 +1272,7 @@ mod tests {
#[test]
fn test_edit_indexer_seed_ratio_input_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
seed_ratio: "Test".into(),
@@ -1178,6 +1308,7 @@ mod tests {
#[test]
fn test_edit_indexer_tags_input_submit() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
tags: "Test".into(),
@@ -1249,7 +1380,8 @@ mod tests {
ActiveRadarrBlock::EditIndexerUrlInput,
ActiveRadarrBlock::EditIndexerApiKeyInput,
ActiveRadarrBlock::EditIndexerSeedRatioInput,
ActiveRadarrBlock::EditIndexerTagsInput
ActiveRadarrBlock::EditIndexerTagsInput,
ActiveRadarrBlock::EditIndexerPriorityInput
)]
active_radarr_block: ActiveRadarrBlock,
) {
@@ -1283,6 +1415,7 @@ mod tests {
#[test]
fn test_edit_indexer_name_input_backspace() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
name: "Test".into(),
..EditIndexerModal::default()
@@ -1312,6 +1445,7 @@ mod tests {
#[test]
fn test_edit_indexer_url_input_backspace() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
url: "Test".into(),
..EditIndexerModal::default()
@@ -1341,6 +1475,7 @@ mod tests {
#[test]
fn test_edit_indexer_api_key_input_backspace() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
api_key: "Test".into(),
..EditIndexerModal::default()
@@ -1370,6 +1505,7 @@ mod tests {
#[test]
fn test_edit_indexer_seed_ratio_input_backspace() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
seed_ratio: "Test".into(),
..EditIndexerModal::default()
@@ -1399,6 +1535,7 @@ mod tests {
#[test]
fn test_edit_indexer_tags_input_backspace() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal {
tags: "Test".into(),
..EditIndexerModal::default()
@@ -1428,6 +1565,7 @@ mod tests {
#[test]
fn test_edit_indexer_name_input_char_key() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
EditIndexerHandler::with(
@@ -1454,6 +1592,7 @@ mod tests {
#[test]
fn test_edit_indexer_url_input_char_key() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
EditIndexerHandler::with(
@@ -1480,6 +1619,7 @@ mod tests {
#[test]
fn test_edit_indexer_api_key_input_char_key() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
EditIndexerHandler::with(
@@ -1506,6 +1646,7 @@ mod tests {
#[test]
fn test_edit_indexer_seed_ratio_input_char_key() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
EditIndexerHandler::with(
@@ -1532,6 +1673,7 @@ mod tests {
#[test]
fn test_edit_indexer_tags_input_char_key() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
EditIndexerHandler::with(
@@ -1588,7 +1730,7 @@ mod tests {
}
#[test]
fn test_indexer_settings_handler_accepts() {
fn test_edit_indexer_handler_accepts() {
ActiveRadarrBlock::iter().for_each(|active_radarr_block| {
if EDIT_INDEXER_BLOCKS.contains(&active_radarr_block) {
assert!(EditIndexerHandler::accepts(active_radarr_block));
@@ -1601,6 +1743,7 @@ mod tests {
#[test]
fn test_edit_indexer_handler_is_not_ready_when_loading() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.is_loading = true;
let handler = EditIndexerHandler::with(
@@ -1616,6 +1759,7 @@ mod tests {
#[test]
fn test_edit_indexer_handler_is_not_ready_when_edit_indexer_modal_is_none() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.is_loading = false;
let handler = EditIndexerHandler::with(
@@ -1631,6 +1775,7 @@ mod tests {
#[test]
fn test_edit_indexer_handler_is_ready_when_edit_indexer_modal_is_some() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.is_loading = false;
app.data.radarr_data.edit_indexer_modal = Some(EditIndexerModal::default());
@@ -459,51 +459,6 @@ mod tests {
use super::*;
#[test]
fn test_indexer_add() {
let mut app = App::default();
app
.data
.radarr_data
.indexers
.set_items(vec![Indexer::default()]);
IndexersHandler::with(
DEFAULT_KEYBINDINGS.add.key,
&mut app,
ActiveRadarrBlock::Indexers,
None,
)
.handle();
assert_eq!(
app.get_current_route(),
ActiveRadarrBlock::AddIndexer.into()
);
}
#[test]
fn test_indexer_add_no_op_when_not_ready() {
let mut app = App::default();
app.is_loading = true;
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app
.data
.radarr_data
.indexers
.set_items(vec![Indexer::default()]);
IndexersHandler::with(
DEFAULT_KEYBINDINGS.add.key,
&mut app,
ActiveRadarrBlock::Indexers,
None,
)
.handle();
assert_eq!(app.get_current_route(), ActiveRadarrBlock::Indexers.into());
}
#[test]
fn test_refresh_indexers_key() {
let mut app = App::default();
@@ -169,11 +169,6 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexersHandler<'a,
let key = self.key;
match self.active_radarr_block {
ActiveRadarrBlock::Indexers => match self.key {
_ if key == DEFAULT_KEYBINDINGS.add.key => {
self
.app
.push_navigation_stack(ActiveRadarrBlock::AddIndexer.into());
}
_ if key == DEFAULT_KEYBINDINGS.refresh.key => {
self.app.should_refresh = true;
}