Refactored the Edit/Add modals into their own structs so that adding similar modals in the future is more consistent, uses less RAM (since it's wrapped in an Option now), and is easier to implement. This comes with an initial example of the IndexerSettings UI that needs its own modal now. The modal has been created but it is still not used just yet so that's the next step.

This commit is contained in:
2023-08-08 10:50:07 -06:00
parent e2e4bf16e4
commit 2d624e2648
80 changed files with 3264 additions and 1114 deletions
@@ -1,6 +1,6 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS,
};
use crate::models::{BlockSelectionState, Scrollable, StatefulTable};
@@ -46,21 +46,42 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
ActiveRadarrBlock::AddMovieSearchResults => {
self.app.data.radarr_data.add_searched_movies.scroll_up()
}
ActiveRadarrBlock::AddMovieSelectMonitor => {
self.app.data.radarr_data.monitor_list.scroll_up()
}
ActiveRadarrBlock::AddMovieSelectMonitor => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_up(),
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_up(),
ActiveRadarrBlock::AddMovieSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_up()
}
ActiveRadarrBlock::AddMovieSelectRootFolder => {
self.app.data.radarr_data.root_folder_list.scroll_up()
}
ActiveRadarrBlock::AddMovieSelectQualityProfile => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_up(),
ActiveRadarrBlock::AddMovieSelectRootFolder => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_up(),
ActiveRadarrBlock::AddMoviePrompt => self.app.data.radarr_data.selected_block.previous(),
_ => (),
}
@@ -71,21 +92,42 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
ActiveRadarrBlock::AddMovieSearchResults => {
self.app.data.radarr_data.add_searched_movies.scroll_down()
}
ActiveRadarrBlock::AddMovieSelectMonitor => {
self.app.data.radarr_data.monitor_list.scroll_down()
}
ActiveRadarrBlock::AddMovieSelectMonitor => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_down(),
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_down(),
ActiveRadarrBlock::AddMovieSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_down()
}
ActiveRadarrBlock::AddMovieSelectRootFolder => {
self.app.data.radarr_data.root_folder_list.scroll_down()
}
ActiveRadarrBlock::AddMovieSelectQualityProfile => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_down(),
ActiveRadarrBlock::AddMovieSelectRootFolder => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_down(),
ActiveRadarrBlock::AddMoviePrompt => self.app.data.radarr_data.selected_block.next(),
_ => (),
}
@@ -99,26 +141,52 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
.radarr_data
.add_searched_movies
.scroll_to_top(),
ActiveRadarrBlock::AddMovieSelectMonitor => {
self.app.data.radarr_data.monitor_list.scroll_to_top()
}
ActiveRadarrBlock::AddMovieSelectMonitor => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_to_top(),
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_to_top(),
ActiveRadarrBlock::AddMovieSelectQualityProfile => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_to_top(),
ActiveRadarrBlock::AddMovieSelectRootFolder => {
self.app.data.radarr_data.root_folder_list.scroll_to_top()
}
ActiveRadarrBlock::AddMovieSelectRootFolder => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_to_top(),
ActiveRadarrBlock::AddMovieSearchInput => self.app.data.radarr_data.search.scroll_home(),
ActiveRadarrBlock::AddMovieTagsInput => self.app.data.radarr_data.edit_tags.scroll_home(),
ActiveRadarrBlock::AddMovieTagsInput => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.tags
.scroll_home(),
_ => (),
}
}
@@ -131,29 +199,52 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
.radarr_data
.add_searched_movies
.scroll_to_bottom(),
ActiveRadarrBlock::AddMovieSelectMonitor => {
self.app.data.radarr_data.monitor_list.scroll_to_bottom()
}
ActiveRadarrBlock::AddMovieSelectMonitor => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_to_bottom(),
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_to_bottom(),
ActiveRadarrBlock::AddMovieSelectQualityProfile => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_to_bottom(),
ActiveRadarrBlock::AddMovieSelectRootFolder => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_to_bottom(),
ActiveRadarrBlock::AddMovieSearchInput => self.app.data.radarr_data.search.reset_offset(),
ActiveRadarrBlock::AddMovieTagsInput => self.app.data.radarr_data.edit_tags.reset_offset(),
ActiveRadarrBlock::AddMovieTagsInput => self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.tags
.reset_offset(),
_ => (),
}
}
@@ -167,7 +258,18 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
handle_text_box_left_right_keys!(self, self.key, self.app.data.radarr_data.search)
}
ActiveRadarrBlock::AddMovieTagsInput => {
handle_text_box_left_right_keys!(self, self.key, self.app.data.radarr_data.edit_tags)
handle_text_box_left_right_keys!(
self,
self.key,
self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.tags
)
}
_ => (),
}
@@ -175,7 +277,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
fn handle_submit(&mut self) {
match self.active_radarr_block {
ActiveRadarrBlock::AddMovieSearchInput => {
_ if *self.active_radarr_block == ActiveRadarrBlock::AddMovieSearchInput
&& !self.app.data.radarr_data.search.text.is_empty() =>
{
self
.app
.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchResults.into());
@@ -215,7 +319,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
self
.app
.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
self.app.data.radarr_data.populate_preferences_lists();
self.app.data.radarr_data.add_movie_modal = Some((&self.app.data.radarr_data).into());
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&ADD_MOVIE_SELECTION_BLOCKS);
}
@@ -278,7 +382,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
}
ActiveRadarrBlock::AddMoviePrompt => {
self.app.pop_navigation_stack();
self.app.data.radarr_data.reset_add_edit_media_fields();
self.app.data.radarr_data.add_movie_modal = None;
self.app.data.radarr_data.prompt_confirm = false;
}
ActiveRadarrBlock::AddMovieSelectMonitor
@@ -301,7 +405,18 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
handle_text_box_keys!(self, key, self.app.data.radarr_data.search)
}
ActiveRadarrBlock::AddMovieTagsInput => {
handle_text_box_keys!(self, key, self.app.data.radarr_data.edit_tags)
handle_text_box_keys!(
self,
key,
self
.app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.tags
)
}
_ => (),
}
@@ -11,7 +11,7 @@ mod tests {
use crate::models::radarr_models::{
AddMovieSearchResult, MinimumAvailability, Monitor, RootFolder,
};
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, ADD_MOVIE_BLOCKS};
use crate::models::HorizontallyScrollableText;
mod test_handle_scroll_up_and_down {
@@ -19,9 +19,10 @@ mod tests {
use rstest::rstest;
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::{simple_stateful_iterable_vec, test_enum_scroll, test_iterable_scroll};
use crate::{simple_stateful_iterable_vec, test_iterable_scroll};
use super::*;
@@ -36,41 +37,245 @@ mod tests {
to_string
);
test_enum_scroll!(
test_add_movie_select_monitor_scroll,
AddMovieHandler,
Monitor,
monitor_list,
ActiveRadarrBlock::AddMovieSelectMonitor,
None
);
#[rstest]
fn test_add_movie_select_monitor_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let monitor_vec = Vec::from_iter(Monitor::iter());
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list
.set_items(monitor_vec.clone());
test_enum_scroll!(
test_add_movie_select_minimum_availability_scroll,
AddMovieHandler,
MinimumAvailability,
minimum_availability_list,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
None
);
if key == Key::Up {
for i in (0..monitor_vec.len()).rev() {
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMonitor,
&None,
)
.handle();
test_iterable_scroll!(
test_add_movie_select_quality_profile_scroll,
AddMovieHandler,
quality_profile_list,
ActiveRadarrBlock::AddMovieSelectQualityProfile,
None
);
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.monitor_list
.current_selection(),
&monitor_vec[i]
);
}
} else {
for i in 0..monitor_vec.len() {
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMonitor,
&None,
)
.handle();
test_iterable_scroll!(
test_add_movie_select_root_folder_scroll,
AddMovieHandler,
root_folder_list,
simple_stateful_iterable_vec!(RootFolder, String, path),
ActiveRadarrBlock::AddMovieSelectRootFolder,
None,
path
);
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.monitor_list
.current_selection(),
&monitor_vec[(i + 1) % monitor_vec.len()]
);
}
}
}
#[rstest]
fn test_add_movie_select_minimum_availability_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let minimum_availability_vec = Vec::from_iter(MinimumAvailability::iter());
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.set_items(minimum_availability_vec.clone());
if key == Key::Up {
for i in (0..minimum_availability_vec.len()).rev() {
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[i]
);
}
} else {
for i in 0..minimum_availability_vec.len() {
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[(i + 1) % minimum_availability_vec.len()]
);
}
}
}
#[rstest]
fn test_add_movie_select_quality_profile_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.set_items(vec!["Test 1".to_owned(), "Test 2".to_owned()]);
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 2"
);
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 1"
);
}
#[rstest]
fn test_add_movie_select_root_folder_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list
.set_items(simple_stateful_iterable_vec!(RootFolder, String, path));
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectRootFolder,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.root_folder_list
.current_selection()
.path,
"Test 2"
);
AddMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectRootFolder,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.root_folder_list
.current_selection()
.path,
"Test 1"
);
}
#[rstest]
fn test_add_movie_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
@@ -97,9 +302,9 @@ mod tests {
mod test_handle_home_end {
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::{
extended_stateful_iterable_vec, test_enum_home_and_end, test_iterable_home_and_end,
test_text_box_home_end_keys,
extended_stateful_iterable_vec, test_iterable_home_and_end, test_text_box_home_end_keys,
};
use super::*;
@@ -115,41 +320,229 @@ mod tests {
to_string
);
test_enum_home_and_end!(
test_add_movie_select_monitor_home_end,
AddMovieHandler,
Monitor,
monitor_list,
ActiveRadarrBlock::AddMovieSelectMonitor,
None
);
#[test]
fn test_add_movie_select_monitor_home_end() {
let monitor_vec = Vec::from_iter(Monitor::iter());
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.monitor_list
.set_items(monitor_vec.clone());
test_enum_home_and_end!(
test_add_movie_select_minimum_availability_home_end,
AddMovieHandler,
MinimumAvailability,
minimum_availability_list,
ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
None
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMonitor,
&None,
)
.handle();
test_iterable_home_and_end!(
test_add_movie_select_quality_profile_home_end,
AddMovieHandler,
quality_profile_list,
ActiveRadarrBlock::AddMovieSelectQualityProfile,
None
);
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.monitor_list
.current_selection(),
&monitor_vec[monitor_vec.len() - 1]
);
test_iterable_home_and_end!(
test_add_movie_select_root_folder_home_end,
AddMovieHandler,
root_folder_list,
extended_stateful_iterable_vec!(RootFolder, String, path),
ActiveRadarrBlock::AddMovieSelectRootFolder,
None,
path
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMonitor,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.monitor_list
.current_selection(),
&monitor_vec[0]
);
}
#[test]
fn test_add_movie_select_minimum_availability_home_end() {
let minimum_availability_vec = Vec::from_iter(MinimumAvailability::iter());
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.set_items(minimum_availability_vec.clone());
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[minimum_availability_vec.len() - 1]
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[0]
);
}
#[test]
fn test_add_movie_select_quality_profile_home_end() {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.set_items(vec![
"Test 1".to_owned(),
"Test 2".to_owned(),
"Test 3".to_owned(),
]);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 3"
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 1"
);
}
#[test]
fn test_add_movie_select_root_folder_home_end() {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app
.data
.radarr_data
.add_movie_modal
.as_mut()
.unwrap()
.root_folder_list
.set_items(extended_stateful_iterable_vec!(RootFolder, String, path));
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectRootFolder,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.root_folder_list
.current_selection()
.path,
"Test 3"
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::AddMovieSelectRootFolder,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.root_folder_list
.current_selection()
.path,
"Test 1"
);
}
#[test]
fn test_add_movie_search_input_home_end_keys() {
@@ -162,15 +555,58 @@ mod tests {
#[test]
fn test_add_movie_tags_input_home_end_keys() {
test_text_box_home_end_keys!(
AddMovieHandler,
ActiveRadarrBlock::AddMovieTagsInput,
edit_tags
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal {
tags: "Test".into(),
..AddMovieModal::default()
});
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::AddMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
4
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::AddMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
0
);
}
}
mod test_handle_left_right_action {
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use rstest::rstest;
use crate::test_text_box_left_right_keys;
@@ -201,10 +637,52 @@ mod tests {
#[test]
fn test_add_movie_tags_input_left_right_keys() {
test_text_box_left_right_keys!(
AddMovieHandler,
ActiveRadarrBlock::AddMovieTagsInput,
edit_tags
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal {
tags: "Test".into(),
..AddMovieModal::default()
});
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.left.key,
&mut app,
&ActiveRadarrBlock::AddMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
1
);
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.right.key,
&mut app,
&ActiveRadarrBlock::AddMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
0
);
}
}
@@ -215,7 +693,8 @@ mod tests {
use rstest::rstest;
use crate::models::radarr_models::Movie;
use crate::models::servarr_data::radarr_data::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::ADD_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::network::radarr_network::RadarrEvent;
@@ -227,6 +706,7 @@ mod tests {
fn test_add_movie_search_input_submit() {
let mut app = App::default();
app.should_ignore_quit_key = true;
app.data.radarr_data.search = "test".into();
AddMovieHandler::with(
&SUBMIT_KEY,
@@ -243,6 +723,27 @@ mod tests {
);
}
#[test]
fn test_add_movie_search_input_submit_noop_on_empty_search() {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchInput.into());
app.should_ignore_quit_key = true;
AddMovieHandler::with(
&SUBMIT_KEY,
&mut app,
&ActiveRadarrBlock::AddMovieSearchInput,
&None,
)
.handle();
assert!(app.should_ignore_quit_key);
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::AddMovieSearchInput.into()
);
}
#[test]
fn test_add_movie_search_results_submit() {
let mut app = App::default();
@@ -270,18 +771,41 @@ mod tests {
app.data.radarr_data.selected_block.get_active_block(),
&ActiveRadarrBlock::AddMovieSelectRootFolder
);
assert!(!app.data.radarr_data.monitor_list.items.is_empty());
assert!(app.data.radarr_data.add_movie_modal.is_some());
assert!(!app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.monitor_list
.items
.is_empty());
assert!(!app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.items
.is_empty());
assert!(!app.data.radarr_data.quality_profile_list.items.is_empty());
assert!(!app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.items
.is_empty());
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"A - Test 1"
@@ -361,6 +885,7 @@ mod tests {
#[test]
fn test_add_movie_confirm_prompt_prompt_confirmation_submit() {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
app.data.radarr_data.prompt_confirm = true;
@@ -384,6 +909,7 @@ mod tests {
app.data.radarr_data.prompt_confirm_action,
Some(RadarrEvent::AddMovie)
);
assert!(app.data.radarr_data.add_movie_modal.is_some());
}
#[rstest]
@@ -464,11 +990,9 @@ mod tests {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::models::servarr_data::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::{
assert_edit_media_reset, assert_preferences_selections_reset, assert_search_reset,
simple_stateful_iterable_vec,
};
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::{assert_search_reset, simple_stateful_iterable_vec};
use super::*;
@@ -571,6 +1095,7 @@ mod tests {
#[test]
fn test_add_movie_prompt_esc() {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
app.data.radarr_data = create_test_radarr_data();
app.push_navigation_stack(ActiveRadarrBlock::AddMovieSearchResults.into());
app.push_navigation_stack(ActiveRadarrBlock::AddMoviePrompt.into());
@@ -588,8 +1113,7 @@ mod tests {
app.get_current_route(),
&ActiveRadarrBlock::AddMovieSearchResults.into()
);
assert_preferences_selections_reset!(app.data.radarr_data);
assert_edit_media_reset!(app.data.radarr_data);
assert!(app.data.radarr_data.add_movie_modal.is_none());
}
#[test]
@@ -662,6 +1186,7 @@ mod tests {
mod test_handle_key_char {
use super::*;
use crate::models::servarr_data::radarr::modals::AddMovieModal;
#[test]
fn test_add_movie_search_input_backspace() {
@@ -682,7 +1207,10 @@ mod tests {
#[test]
fn test_add_movie_tags_input_backspace() {
let mut app = App::default();
app.data.radarr_data.edit_tags = "Test".to_owned().into();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal {
tags: "Test".into(),
..AddMovieModal::default()
});
AddMovieHandler::with(
&DEFAULT_KEYBINDINGS.backspace.key,
@@ -692,7 +1220,17 @@ mod tests {
)
.handle();
assert_str_eq!(app.data.radarr_data.edit_tags.text, "Tes");
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.tags
.text,
"Tes"
);
}
#[test]
@@ -713,6 +1251,7 @@ mod tests {
#[test]
fn test_add_movie_tags_input_char_key() {
let mut app = App::default();
app.data.radarr_data.add_movie_modal = Some(AddMovieModal::default());
AddMovieHandler::with(
&Key::Char('h'),
@@ -722,7 +1261,17 @@ mod tests {
)
.handle();
assert_str_eq!(app.data.radarr_data.edit_tags.text, "h");
assert_str_eq!(
app
.data
.radarr_data
.add_movie_modal
.as_ref()
.unwrap()
.tags
.text,
"h"
);
}
}
@@ -1,7 +1,7 @@
use crate::app::App;
use crate::event::Key;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::network::radarr_network::RadarrEvent;
#[cfg(test)]
@@ -7,13 +7,13 @@ mod tests {
use crate::event::Key;
use crate::handlers::radarr_handlers::library::delete_movie_handler::DeleteMovieHandler;
use crate::handlers::KeyEventHandler;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, DELETE_MOVIE_BLOCKS};
mod test_handle_scroll_up_and_down {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::models::servarr_data::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use super::*;
@@ -66,7 +66,7 @@ mod tests {
mod test_handle_submit {
use pretty_assertions::assert_eq;
use crate::models::servarr_data::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::network::radarr_network::RadarrEvent;
@@ -2,7 +2,7 @@ use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::app::App;
use crate::event::Key;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
use crate::models::Scrollable;
use crate::network::radarr_network::RadarrEvent;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys};
@@ -47,11 +47,20 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_up(),
ActiveRadarrBlock::EditMovieSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_up()
}
ActiveRadarrBlock::EditMovieSelectQualityProfile => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_up(),
ActiveRadarrBlock::EditMoviePrompt => self.app.data.radarr_data.selected_block.previous(),
_ => (),
}
@@ -63,11 +72,20 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_down(),
ActiveRadarrBlock::EditMovieSelectQualityProfile => {
self.app.data.radarr_data.quality_profile_list.scroll_down()
}
ActiveRadarrBlock::EditMovieSelectQualityProfile => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_down(),
ActiveRadarrBlock::EditMoviePrompt => self.app.data.radarr_data.selected_block.next(),
_ => (),
}
@@ -79,16 +97,38 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_to_top(),
ActiveRadarrBlock::EditMovieSelectQualityProfile => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_to_top(),
ActiveRadarrBlock::EditMoviePathInput => self.app.data.radarr_data.edit_path.scroll_home(),
ActiveRadarrBlock::EditMovieTagsInput => self.app.data.radarr_data.edit_tags.scroll_home(),
ActiveRadarrBlock::EditMoviePathInput => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.path
.scroll_home(),
ActiveRadarrBlock::EditMovieTagsInput => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.tags
.scroll_home(),
_ => (),
}
}
@@ -99,16 +139,38 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.scroll_to_bottom(),
ActiveRadarrBlock::EditMovieSelectQualityProfile => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_to_bottom(),
ActiveRadarrBlock::EditMoviePathInput => self.app.data.radarr_data.edit_path.reset_offset(),
ActiveRadarrBlock::EditMovieTagsInput => self.app.data.radarr_data.edit_tags.reset_offset(),
ActiveRadarrBlock::EditMoviePathInput => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.path
.reset_offset(),
ActiveRadarrBlock::EditMovieTagsInput => self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.tags
.reset_offset(),
_ => (),
}
}
@@ -119,10 +181,32 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
match self.active_radarr_block {
ActiveRadarrBlock::EditMoviePrompt => handle_prompt_toggle(self.app, self.key),
ActiveRadarrBlock::EditMoviePathInput => {
handle_text_box_left_right_keys!(self, self.key, self.app.data.radarr_data.edit_path)
handle_text_box_left_right_keys!(
self,
self.key,
self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.path
)
}
ActiveRadarrBlock::EditMovieTagsInput => {
handle_text_box_left_right_keys!(self, self.key, self.app.data.radarr_data.edit_tags)
handle_text_box_left_right_keys!(
self,
self.key,
self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.tags
)
}
_ => (),
}
@@ -159,8 +243,24 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
self.app.should_ignore_quit_key = true;
}
ActiveRadarrBlock::EditMovieToggleMonitored => {
self.app.data.radarr_data.edit_monitored =
Some(!self.app.data.radarr_data.edit_monitored.unwrap_or_default())
self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.monitored = Some(
!self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.monitored
.unwrap_or_default(),
)
}
_ => (),
}
@@ -183,7 +283,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
}
ActiveRadarrBlock::EditMoviePrompt => {
self.app.pop_navigation_stack();
self.app.data.radarr_data.reset_add_edit_media_fields();
self.app.data.radarr_data.edit_movie_modal = None;
self.app.data.radarr_data.prompt_confirm = false;
}
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
@@ -196,10 +296,32 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
let key = self.key;
match self.active_radarr_block {
ActiveRadarrBlock::EditMoviePathInput => {
handle_text_box_keys!(self, key, self.app.data.radarr_data.edit_path)
handle_text_box_keys!(
self,
key,
self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.path
)
}
ActiveRadarrBlock::EditMovieTagsInput => {
handle_text_box_keys!(self, key, self.app.data.radarr_data.edit_tags)
handle_text_box_keys!(
self,
key,
self
.app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.tags
)
}
_ => (),
}
@@ -9,35 +9,137 @@ mod tests {
use crate::handlers::radarr_handlers::library::edit_movie_handler::EditMovieHandler;
use crate::handlers::KeyEventHandler;
use crate::models::radarr_models::MinimumAvailability;
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, EDIT_MOVIE_BLOCKS};
mod test_handle_scroll_up_and_down {
use pretty_assertions::assert_eq;
use rstest::rstest;
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr_data::EDIT_MOVIE_SELECTION_BLOCKS;
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use crate::models::servarr_data::radarr::radarr_data::EDIT_MOVIE_SELECTION_BLOCKS;
use crate::models::BlockSelectionState;
use crate::{test_enum_scroll, test_iterable_scroll};
use super::*;
test_enum_scroll!(
test_edit_movie_select_minimum_availability_scroll,
EditMovieHandler,
MinimumAvailability,
minimum_availability_list,
ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
None
);
#[rstest]
fn test_edit_movie_select_minimum_availability_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let minimum_availability_vec = Vec::from_iter(MinimumAvailability::iter());
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.set_items(minimum_availability_vec.clone());
test_iterable_scroll!(
test_edit_movie_select_quality_profile_scroll,
EditMovieHandler,
quality_profile_list,
ActiveRadarrBlock::EditMovieSelectQualityProfile,
None
);
if key == Key::Up {
for i in (0..minimum_availability_vec.len()).rev() {
EditMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[i]
);
}
} else {
for i in 0..minimum_availability_vec.len() {
EditMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[(i + 1) % minimum_availability_vec.len()]
);
}
}
}
#[rstest]
fn test_edit_movie_select_quality_profile_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.set_items(vec!["Test 1".to_owned(), "Test 2".to_owned()]);
EditMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 2"
);
EditMovieHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 1"
);
}
#[rstest]
fn test_edit_movie_prompt_scroll(#[values(Key::Up, Key::Down)] key: Key) {
@@ -64,51 +166,230 @@ mod tests {
mod test_handle_home_end {
use strum::IntoEnumIterator;
use crate::{test_enum_home_and_end, test_iterable_home_and_end, test_text_box_home_end_keys};
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use super::*;
test_enum_home_and_end!(
test_edit_movie_select_minimum_availability_home_end,
EditMovieHandler,
MinimumAvailability,
minimum_availability_list,
ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
None
);
#[test]
fn test_edit_movie_select_minimum_availability_home_end() {
let minimum_availability_vec = Vec::from_iter(MinimumAvailability::iter());
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.minimum_availability_list
.set_items(minimum_availability_vec.clone());
test_iterable_home_and_end!(
test_edit_movie_select_quality_profile_scroll,
EditMovieHandler,
quality_profile_list,
ActiveRadarrBlock::EditMovieSelectQualityProfile,
None
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[minimum_availability_vec.len() - 1]
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectMinimumAvailability,
&None,
)
.handle();
assert_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.minimum_availability_list
.current_selection(),
&minimum_availability_vec[0]
);
}
#[test]
fn test_edit_movie_select_quality_profile_scroll() {
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.quality_profile_list
.set_items(vec![
"Test 1".to_owned(),
"Test 2".to_owned(),
"Test 3".to_owned(),
]);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 3"
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::EditMovieSelectQualityProfile,
&None,
)
.handle();
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.quality_profile_list
.current_selection(),
"Test 1"
);
}
#[test]
fn test_edit_movie_path_input_home_end_keys() {
test_text_box_home_end_keys!(
EditMovieHandler,
ActiveRadarrBlock::EditMoviePathInput,
edit_path
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
path: "Test".into(),
..EditMovieModal::default()
});
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::EditMoviePathInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.offset
.borrow(),
4
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::EditMoviePathInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.offset
.borrow(),
0
);
}
#[test]
fn test_edit_movie_tags_input_home_end_keys() {
test_text_box_home_end_keys!(
EditMovieHandler,
ActiveRadarrBlock::EditMovieTagsInput,
edit_tags
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
tags: "Test".into(),
..EditMovieModal::default()
});
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::EditMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
4
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::EditMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
0
);
}
}
mod test_handle_left_right_action {
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use rstest::rstest;
use crate::test_text_box_left_right_keys;
use super::*;
#[rstest]
@@ -126,19 +407,103 @@ mod tests {
#[test]
fn test_edit_movie_path_input_left_right_keys() {
test_text_box_left_right_keys!(
EditMovieHandler,
ActiveRadarrBlock::EditMoviePathInput,
edit_path
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
path: "Test".into(),
..EditMovieModal::default()
});
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.left.key,
&mut app,
&ActiveRadarrBlock::EditMoviePathInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.offset
.borrow(),
1
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.right.key,
&mut app,
&ActiveRadarrBlock::EditMoviePathInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.offset
.borrow(),
0
);
}
#[test]
fn test_edit_movie_tags_input_left_right_keys() {
test_text_box_left_right_keys!(
EditMovieHandler,
ActiveRadarrBlock::EditMovieTagsInput,
edit_tags
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
tags: "Test".into(),
..EditMovieModal::default()
});
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.left.key,
&mut app,
&ActiveRadarrBlock::EditMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
1
);
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.right.key,
&mut app,
&ActiveRadarrBlock::EditMovieTagsInput,
&None,
)
.handle();
assert_eq!(
*app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.offset
.borrow(),
0
);
}
}
@@ -147,7 +512,8 @@ mod tests {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{
EDIT_COLLECTION_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS,
};
use crate::models::{BlockSelectionState, Route};
@@ -161,7 +527,10 @@ mod tests {
fn test_edit_movie_path_input_submit() {
let mut app = App::default();
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_path = "Test Path".to_owned().into();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
path: "Test Path".into(),
..EditMovieModal::default()
});
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into());
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePathInput.into());
@@ -174,7 +543,15 @@ mod tests {
.handle();
assert!(!app.should_ignore_quit_key);
assert!(!app.data.radarr_data.edit_path.text.is_empty());
assert!(!app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.text
.is_empty());
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::EditMoviePrompt.into()
@@ -185,7 +562,10 @@ mod tests {
fn test_edit_movie_tags_input_submit() {
let mut app = App::default();
app.should_ignore_quit_key = true;
app.data.radarr_data.edit_tags = "Test Tags".to_owned().into();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
tags: "Test Tags".into(),
..EditMovieModal::default()
});
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into());
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePathInput.into());
@@ -198,7 +578,15 @@ mod tests {
.handle();
assert!(!app.should_ignore_quit_key);
assert!(!app.data.radarr_data.edit_tags.text.is_empty());
assert!(!app
.data
.radarr_data
.edit_movie_modal
.as_mut()
.unwrap()
.tags
.text
.is_empty());
assert_eq!(
app.get_current_route(),
&ActiveRadarrBlock::EditMoviePrompt.into()
@@ -232,6 +620,7 @@ mod tests {
#[test]
fn test_edit_movie_confirm_prompt_prompt_confirmation_submit() {
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
app.push_navigation_stack(ActiveRadarrBlock::Movies.into());
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into());
app.data.radarr_data.prompt_confirm = true;
@@ -255,6 +644,7 @@ mod tests {
app.data.radarr_data.prompt_confirm_action,
Some(RadarrEvent::EditMovie)
);
assert!(app.data.radarr_data.edit_movie_modal.is_some());
assert!(app.should_refresh);
}
@@ -265,6 +655,7 @@ mod tests {
Some(ActiveRadarrBlock::Movies),
));
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
app.data.radarr_data.selected_block = BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
app.push_navigation_stack(current_route);
@@ -277,7 +668,16 @@ mod tests {
.handle();
assert_eq!(app.get_current_route(), &current_route);
assert_eq!(app.data.radarr_data.edit_monitored, Some(true));
assert_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.monitored,
Some(true)
);
EditMovieHandler::with(
&SUBMIT_KEY,
@@ -288,7 +688,16 @@ mod tests {
.handle();
assert_eq!(app.get_current_route(), &current_route);
assert_eq!(app.data.radarr_data.edit_monitored, Some(false));
assert_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.monitored,
Some(false)
);
}
#[rstest]
@@ -371,8 +780,8 @@ mod tests {
use pretty_assertions::assert_eq;
use rstest::rstest;
use crate::models::servarr_data::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::{assert_edit_media_reset, assert_preferences_selections_reset};
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use super::*;
@@ -406,6 +815,7 @@ mod tests {
let mut app = App::default();
app.push_navigation_stack(ActiveRadarrBlock::EditMoviePrompt.into());
app.data.radarr_data = create_test_radarr_data();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
EditMovieHandler::with(
&ESC_KEY,
@@ -416,11 +826,9 @@ mod tests {
.handle();
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
let radarr_data = &app.data.radarr_data;
assert_preferences_selections_reset!(radarr_data);
assert_edit_media_reset!(radarr_data);
assert!(!radarr_data.prompt_confirm);
assert!(app.data.radarr_data.edit_movie_modal.is_none());
assert!(!app.data.radarr_data.prompt_confirm);
}
#[rstest]
@@ -443,11 +851,15 @@ mod tests {
mod test_handle_key_char {
use super::*;
use crate::models::servarr_data::radarr::modals::EditMovieModal;
#[test]
fn test_edit_movie_path_input_backspace() {
let mut app = App::default();
app.data.radarr_data.edit_path = "Test".to_owned().into();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
path: "Test".into(),
..EditMovieModal::default()
});
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.backspace.key,
@@ -457,13 +869,26 @@ mod tests {
)
.handle();
assert_str_eq!(app.data.radarr_data.edit_path.text, "Tes");
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.text,
"Tes"
);
}
#[test]
fn test_edit_movie_tags_input_backspace() {
let mut app = App::default();
app.data.radarr_data.edit_tags = "Test".to_owned().into();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal {
tags: "Test".into(),
..EditMovieModal::default()
});
EditMovieHandler::with(
&DEFAULT_KEYBINDINGS.backspace.key,
@@ -473,12 +898,23 @@ mod tests {
)
.handle();
assert_str_eq!(app.data.radarr_data.edit_tags.text, "Tes");
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.text,
"Tes"
);
}
#[test]
fn test_edit_movie_path_input_char_key() {
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
EditMovieHandler::with(
&Key::Char('h'),
@@ -488,12 +924,23 @@ mod tests {
)
.handle();
assert_str_eq!(app.data.radarr_data.edit_path.text, "h");
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.path
.text,
"h"
);
}
#[test]
fn test_edit_movie_tags_input_char_key() {
let mut app = App::default();
app.data.radarr_data.edit_movie_modal = Some(EditMovieModal::default());
EditMovieHandler::with(
&Key::Char('h'),
@@ -503,7 +950,17 @@ mod tests {
)
.handle();
assert_str_eq!(app.data.radarr_data.edit_tags.text, "h");
assert_str_eq!(
app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.text,
"h"
);
}
}
@@ -10,7 +10,7 @@ mod tests {
use crate::handlers::radarr_handlers::library::LibraryHandler;
use crate::handlers::KeyEventHandler;
use crate::models::radarr_models::Movie;
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, ADD_MOVIE_BLOCKS, DELETE_MOVIE_BLOCKS, EDIT_MOVIE_BLOCKS, LIBRARY_BLOCKS,
MOVIE_DETAILS_BLOCKS,
};
@@ -91,7 +91,7 @@ mod tests {
use pretty_assertions::assert_eq;
use crate::assert_delete_prompt;
use crate::models::servarr_data::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS;
use crate::models::servarr_data::radarr::radarr_data::DELETE_MOVIE_SELECTION_BLOCKS;
use super::*;
@@ -365,7 +365,7 @@ mod tests {
mod test_handle_esc {
use pretty_assertions::assert_eq;
use crate::models::servarr_data::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::{assert_filter_reset, assert_search_reset};
use super::*;
@@ -445,9 +445,11 @@ mod tests {
use strum::IntoEnumIterator;
use crate::models::radarr_models::MinimumAvailability;
use crate::models::servarr_data::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::models::servarr_data::radarr_data::{RadarrData, EDIT_MOVIE_SELECTION_BLOCKS};
use crate::models::HorizontallyScrollableText;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::models::servarr_data::radarr::radarr_data::{
RadarrData, EDIT_MOVIE_SELECTION_BLOCKS,
};
use crate::models::StatefulTable;
use crate::{assert_refresh_key, test_edit_movie_key};
+2 -2
View File
@@ -9,7 +9,7 @@ use crate::handlers::radarr_handlers::{
filter_table, handle_change_tab_left_right_keys, search_table,
};
use crate::handlers::{handle_clear_errors, handle_prompt_toggle, KeyEventHandler};
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, DELETE_MOVIE_SELECTION_BLOCKS, EDIT_MOVIE_SELECTION_BLOCKS, LIBRARY_BLOCKS,
};
use crate::models::{BlockSelectionState, Scrollable};
@@ -266,7 +266,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for LibraryHandler<'a, '
)
.into(),
);
self.app.data.radarr_data.populate_edit_movie_fields();
self.app.data.radarr_data.edit_movie_modal = Some((&self.app.data.radarr_data).into());
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
}
@@ -8,7 +8,7 @@ use crate::app::App;
use crate::event::Key;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::radarr_models::{Language, Release, ReleaseField};
use crate::models::servarr_data::radarr_data::{
use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS,
};
use crate::models::{BlockSelectionState, Scrollable};
@@ -243,7 +243,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
)
.into(),
);
self.app.data.radarr_data.populate_edit_movie_fields();
self.app.data.radarr_data.edit_movie_modal = Some((&self.app.data.radarr_data).into());
self.app.data.radarr_data.selected_block =
BlockSelectionState::new(&EDIT_MOVIE_SELECTION_BLOCKS);
}
@@ -15,7 +15,7 @@ mod tests {
use crate::models::radarr_models::{
Credit, Language, MovieHistoryItem, Quality, QualityWrapper, Release, ReleaseField,
};
use crate::models::servarr_data::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::models::servarr_data::radarr::radarr_data::{ActiveRadarrBlock, MOVIE_DETAILS_BLOCKS};
use crate::models::{HorizontallyScrollableText, ScrollableText};
mod test_handle_scroll_up_and_down {
@@ -24,10 +24,7 @@ mod tests {
use strum::IntoEnumIterator;
use crate::models::radarr_models::ReleaseField;
use crate::{
simple_stateful_iterable_vec, test_enum_scroll, test_iterable_scroll,
test_scrollable_text_scroll,
};
use crate::{simple_stateful_iterable_vec, test_iterable_scroll, test_scrollable_text_scroll};
use super::*;
@@ -82,14 +79,50 @@ mod tests {
to_string
);
test_enum_scroll!(
test_manual_search_sort_scroll,
MovieDetailsHandler,
ReleaseField,
movie_releases_sort,
ActiveRadarrBlock::ManualSearchSortPrompt,
None
);
#[rstest]
fn test_manual_search_sort_scroll(
#[values(DEFAULT_KEYBINDINGS.up.key, DEFAULT_KEYBINDINGS.down.key)] key: Key,
) {
let release_field_vec = Vec::from_iter(ReleaseField::iter());
let mut app = App::default();
app
.data
.radarr_data
.movie_releases_sort
.set_items(release_field_vec.clone());
if key == Key::Up {
for i in (0..release_field_vec.len()).rev() {
MovieDetailsHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::ManualSearchSortPrompt,
&None,
)
.handle();
assert_eq!(
app.data.radarr_data.movie_releases_sort.current_selection(),
&release_field_vec[i]
);
}
} else {
for i in 0..release_field_vec.len() {
MovieDetailsHandler::with(
&key,
&mut app,
&ActiveRadarrBlock::ManualSearchSortPrompt,
&None,
)
.handle();
assert_eq!(
app.data.radarr_data.movie_releases_sort.current_selection(),
&release_field_vec[(i + 1) % release_field_vec.len()]
);
}
}
}
}
mod test_handle_home_end {
@@ -97,8 +130,7 @@ mod tests {
use crate::models::radarr_models::ReleaseField;
use crate::{
extended_stateful_iterable_vec, test_enum_home_and_end, test_iterable_home_and_end,
test_scrollable_text_home_and_end,
extended_stateful_iterable_vec, test_iterable_home_and_end, test_scrollable_text_home_and_end,
};
use super::*;
@@ -154,14 +186,42 @@ mod tests {
to_string
);
test_enum_home_and_end!(
test_manual_search_sort_home_end,
MovieDetailsHandler,
ReleaseField,
movie_releases_sort,
ActiveRadarrBlock::ManualSearchSortPrompt,
None
);
#[test]
fn test_manual_search_sort_home_end() {
let release_field_vec = Vec::from_iter(ReleaseField::iter());
let mut app = App::default();
app
.data
.radarr_data
.movie_releases_sort
.set_items(release_field_vec.clone());
MovieDetailsHandler::with(
&DEFAULT_KEYBINDINGS.end.key,
&mut app,
&ActiveRadarrBlock::ManualSearchSortPrompt,
&None,
)
.handle();
assert_eq!(
app.data.radarr_data.movie_releases_sort.current_selection(),
&release_field_vec[release_field_vec.len() - 1]
);
MovieDetailsHandler::with(
&DEFAULT_KEYBINDINGS.home.key,
&mut app,
&ActiveRadarrBlock::ManualSearchSortPrompt,
&None,
)
.handle();
assert_eq!(
app.data.radarr_data.movie_releases_sort.current_selection(),
&release_field_vec[0]
);
}
}
mod test_handle_left_right_action {
@@ -355,7 +415,7 @@ mod tests {
use rstest::rstest;
use crate::assert_movie_info_tabs_reset;
use crate::models::servarr_data::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use super::*;
@@ -413,9 +473,10 @@ mod tests {
use strum::IntoEnumIterator;
use crate::models::radarr_models::{MinimumAvailability, Movie};
use crate::models::servarr_data::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::models::servarr_data::radarr_data::{RadarrData, EDIT_MOVIE_SELECTION_BLOCKS};
use crate::models::HorizontallyScrollableText;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils::create_test_radarr_data;
use crate::models::servarr_data::radarr::radarr_data::{
RadarrData, EDIT_MOVIE_SELECTION_BLOCKS,
};
use crate::models::StatefulTable;
use crate::test_edit_movie_key;