feat(handler): Add series support for Sonarr

This commit is contained in:
2024-12-02 12:43:17 -07:00
parent 0db57fbff1
commit d7f6d12f59
6 changed files with 2519 additions and 25 deletions
@@ -0,0 +1,550 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
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::{BlockSelectionState, Scrollable};
use crate::network::sonarr_network::SonarrEvent;
use crate::{handle_text_box_keys, handle_text_box_left_right_keys, App, Key};
#[cfg(test)]
#[path = "add_series_handler_tests.rs"]
mod add_series_handler_tests;
pub(super) struct AddSeriesHandler<'a, 'b> {
key: Key,
app: &'a mut App<'b>,
active_sonarr_block: ActiveSonarrBlock,
_context: Option<ActiveSonarrBlock>,
}
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for AddSeriesHandler<'a, 'b> {
fn accepts(active_block: ActiveSonarrBlock) -> bool {
ADD_SERIES_BLOCKS.contains(&active_block)
}
fn with(
key: Key,
app: &'a mut App<'b>,
active_block: ActiveSonarrBlock,
_context: Option<ActiveSonarrBlock>,
) -> AddSeriesHandler<'a, 'b> {
AddSeriesHandler {
key,
app,
active_sonarr_block: active_block,
_context,
}
}
fn get_key(&self) -> Key {
self.key
}
fn is_ready(&self) -> bool {
!self.app.is_loading
}
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
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_up(),
ActiveSonarrBlock::AddSeriesSelectSeriesType => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.series_type_list
.scroll_up(),
ActiveSonarrBlock::AddSeriesSelectQualityProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_up(),
ActiveSonarrBlock::AddSeriesSelectLanguageProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.language_profile_list
.scroll_up(),
ActiveSonarrBlock::AddSeriesSelectRootFolder => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_up(),
ActiveSonarrBlock::AddSeriesPrompt => self.app.data.sonarr_data.selected_block.up(),
_ => (),
}
}
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
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_down(),
ActiveSonarrBlock::AddSeriesSelectSeriesType => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.series_type_list
.scroll_down(),
ActiveSonarrBlock::AddSeriesSelectQualityProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_down(),
ActiveSonarrBlock::AddSeriesSelectLanguageProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.language_profile_list
.scroll_down(),
ActiveSonarrBlock::AddSeriesSelectRootFolder => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_down(),
ActiveSonarrBlock::AddSeriesPrompt => self.app.data.sonarr_data.selected_block.down(),
_ => (),
}
}
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
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_to_top(),
ActiveSonarrBlock::AddSeriesSelectSeriesType => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.series_type_list
.scroll_to_top(),
ActiveSonarrBlock::AddSeriesSelectQualityProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_to_top(),
ActiveSonarrBlock::AddSeriesSelectLanguageProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.language_profile_list
.scroll_to_top(),
ActiveSonarrBlock::AddSeriesSelectRootFolder => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_to_top(),
ActiveSonarrBlock::AddSeriesSearchInput => self
.app
.data
.sonarr_data
.add_series_search
.as_mut()
.unwrap()
.scroll_home(),
ActiveSonarrBlock::AddSeriesTagsInput => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.tags
.scroll_home(),
_ => (),
}
}
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
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.monitor_list
.scroll_to_bottom(),
ActiveSonarrBlock::AddSeriesSelectSeriesType => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.series_type_list
.scroll_to_bottom(),
ActiveSonarrBlock::AddSeriesSelectQualityProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.quality_profile_list
.scroll_to_bottom(),
ActiveSonarrBlock::AddSeriesSelectLanguageProfile => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.language_profile_list
.scroll_to_bottom(),
ActiveSonarrBlock::AddSeriesSelectRootFolder => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.root_folder_list
.scroll_to_bottom(),
ActiveSonarrBlock::AddSeriesSearchInput => self
.app
.data
.sonarr_data
.add_series_search
.as_mut()
.unwrap()
.reset_offset(),
ActiveSonarrBlock::AddSeriesTagsInput => self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.tags
.reset_offset(),
_ => (),
}
}
fn handle_delete(&mut self) {}
fn handle_left_right_action(&mut self) {
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesPrompt => handle_prompt_toggle(self.app, self.key),
ActiveSonarrBlock::AddSeriesSearchInput => {
handle_text_box_left_right_keys!(
self,
self.key,
self
.app
.data
.sonarr_data
.add_series_search
.as_mut()
.unwrap()
)
}
ActiveSonarrBlock::AddSeriesTagsInput => {
handle_text_box_left_right_keys!(
self,
self.key,
self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.tags
)
}
_ => (),
}
}
fn handle_submit(&mut self) {
match self.active_sonarr_block {
_ if self.active_sonarr_block == ActiveSonarrBlock::AddSeriesSearchInput
&& !self
.app
.data
.sonarr_data
.add_series_search
.as_mut()
.unwrap()
.text
.is_empty() =>
{
self
.app
.push_navigation_stack(ActiveSonarrBlock::AddSeriesSearchResults.into());
self.app.should_ignore_quit_key = false;
}
_ if self.active_sonarr_block == ActiveSonarrBlock::AddSeriesSearchResults
&& self.app.data.sonarr_data.add_searched_series.is_some() =>
{
let tvdb_id = self
.app
.data
.sonarr_data
.add_searched_series
.as_ref()
.unwrap()
.current_selection()
.tvdb_id;
if self
.app
.data
.sonarr_data
.series
.items
.iter()
.any(|series| series.tvdb_id == tvdb_id)
{
self
.app
.push_navigation_stack(ActiveSonarrBlock::AddSeriesAlreadyInLibrary.into());
} else {
self
.app
.push_navigation_stack(ActiveSonarrBlock::AddSeriesPrompt.into());
self.app.data.sonarr_data.add_series_modal = Some((&self.app.data.sonarr_data).into());
self.app.data.sonarr_data.selected_block =
BlockSelectionState::new(ADD_SERIES_SELECTION_BLOCKS);
}
}
ActiveSonarrBlock::AddSeriesPrompt => {
match self.app.data.sonarr_data.selected_block.get_active_block() {
ActiveSonarrBlock::AddSeriesConfirmPrompt => {
if self.app.data.sonarr_data.prompt_confirm {
self.app.data.sonarr_data.prompt_confirm_action = Some(SonarrEvent::AddSeries(None));
}
self.app.pop_navigation_stack();
}
ActiveSonarrBlock::AddSeriesSelectMonitor
| ActiveSonarrBlock::AddSeriesSelectSeriesType
| ActiveSonarrBlock::AddSeriesSelectQualityProfile
| ActiveSonarrBlock::AddSeriesSelectLanguageProfile
| ActiveSonarrBlock::AddSeriesSelectRootFolder => self.app.push_navigation_stack(
self
.app
.data
.sonarr_data
.selected_block
.get_active_block()
.into(),
),
ActiveSonarrBlock::AddSeriesTagsInput => {
self.app.push_navigation_stack(
self
.app
.data
.sonarr_data
.selected_block
.get_active_block()
.into(),
);
self.app.should_ignore_quit_key = true;
}
ActiveSonarrBlock::AddSeriesToggleUseSeasonFolder => {
self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.use_season_folder = !self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.use_season_folder;
}
_ => (),
}
}
ActiveSonarrBlock::AddSeriesSelectMonitor
| ActiveSonarrBlock::AddSeriesSelectSeriesType
| ActiveSonarrBlock::AddSeriesSelectQualityProfile
| ActiveSonarrBlock::AddSeriesSelectLanguageProfile
| ActiveSonarrBlock::AddSeriesSelectRootFolder => self.app.pop_navigation_stack(),
ActiveSonarrBlock::AddSeriesTagsInput => {
self.app.pop_navigation_stack();
self.app.should_ignore_quit_key = false;
}
_ => (),
}
}
fn handle_esc(&mut self) {
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesSearchInput => {
self.app.pop_navigation_stack();
self.app.data.sonarr_data.add_series_search = None;
self.app.should_ignore_quit_key = false;
}
ActiveSonarrBlock::AddSeriesSearchResults
| ActiveSonarrBlock::AddSeriesEmptySearchResults => {
self.app.pop_navigation_stack();
self.app.data.sonarr_data.add_searched_series = None;
self.app.should_ignore_quit_key = true;
}
ActiveSonarrBlock::AddSeriesPrompt => {
self.app.pop_navigation_stack();
self.app.data.sonarr_data.add_series_modal = None;
self.app.data.sonarr_data.prompt_confirm = false;
}
ActiveSonarrBlock::AddSeriesSelectMonitor
| ActiveSonarrBlock::AddSeriesSelectSeriesType
| ActiveSonarrBlock::AddSeriesSelectQualityProfile
| ActiveSonarrBlock::AddSeriesSelectLanguageProfile
| ActiveSonarrBlock::AddSeriesAlreadyInLibrary
| ActiveSonarrBlock::AddSeriesSelectRootFolder => self.app.pop_navigation_stack(),
ActiveSonarrBlock::AddSeriesTagsInput => {
self.app.pop_navigation_stack();
self.app.should_ignore_quit_key = false;
}
_ => (),
}
}
fn handle_char_key_event(&mut self) {
let key = self.key;
match self.active_sonarr_block {
ActiveSonarrBlock::AddSeriesSearchInput => {
handle_text_box_keys!(
self,
key,
self
.app
.data
.sonarr_data
.add_series_search
.as_mut()
.unwrap()
)
}
ActiveSonarrBlock::AddSeriesTagsInput => {
handle_text_box_keys!(
self,
key,
self
.app
.data
.sonarr_data
.add_series_modal
.as_mut()
.unwrap()
.tags
)
}
ActiveSonarrBlock::AddSeriesPrompt => {
if self.app.data.sonarr_data.selected_block.get_active_block()
== ActiveSonarrBlock::AddSeriesConfirmPrompt
&& key == DEFAULT_KEYBINDINGS.confirm.key
{
self.app.data.sonarr_data.prompt_confirm = true;
self.app.data.sonarr_data.prompt_confirm_action = Some(SonarrEvent::AddSeries(None));
self.app.pop_navigation_stack();
}
}
_ => (),
}
}
}
File diff suppressed because it is too large Load Diff
@@ -12,7 +12,7 @@ mod tests {
use crate::handlers::sonarr_handlers::library::{series_sorting_options, LibraryHandler};
use crate::handlers::KeyEventHandler;
use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, DELETE_SERIES_BLOCKS, LIBRARY_BLOCKS,
ActiveSonarrBlock, ADD_SERIES_BLOCKS, DELETE_SERIES_BLOCKS, LIBRARY_BLOCKS,
};
use crate::models::sonarr_models::{Series, SeriesStatus, SeriesType};
use crate::models::stateful_table::SortOption;
@@ -1441,27 +1441,29 @@ mod tests {
}
}
// #[rstest]
// fn test_delegates_add_series_blocks_to_add_series_handler(
// #[values(
// ActiveSonarrBlock::AddSeriesSearchInput,
// ActiveSonarrBlock::AddSeriesSearchResults,
// ActiveSonarrBlock::AddSeriesPrompt,
// ActiveSonarrBlock::AddSeriesSelectMonitor,
// ActiveSonarrBlock::AddSeriesSelectSeriesType,
// ActiveSonarrBlock::AddSeriesSelectQualityProfile,
// ActiveSonarrBlock::AddSeriesSelectRootFolder,
// ActiveSonarrBlock::AddSeriesAlreadyInLibrary,
// ActiveSonarrBlock::AddSeriesTagsInput
// )]
// active_sonarr_block: ActiveSonarrBlock,
// ) {
// test_handler_delegation!(
// LibraryHandler,
// ActiveSonarrBlock::Series,
// active_sonarr_block
// );
// }
#[rstest]
fn test_delegates_add_series_blocks_to_add_series_handler(
#[values(
ActiveSonarrBlock::AddSeriesAlreadyInLibrary,
ActiveSonarrBlock::AddSeriesEmptySearchResults,
ActiveSonarrBlock::AddSeriesPrompt,
ActiveSonarrBlock::AddSeriesSearchInput,
ActiveSonarrBlock::AddSeriesSearchResults,
ActiveSonarrBlock::AddSeriesSelectLanguageProfile,
ActiveSonarrBlock::AddSeriesSelectMonitor,
ActiveSonarrBlock::AddSeriesSelectQualityProfile,
ActiveSonarrBlock::AddSeriesSelectRootFolder,
ActiveSonarrBlock::AddSeriesSelectSeriesType,
ActiveSonarrBlock::AddSeriesTagsInput
)]
active_sonarr_block: ActiveSonarrBlock,
) {
test_handler_delegation!(
LibraryHandler,
ActiveSonarrBlock::Series,
active_sonarr_block
);
}
// #[rstest]
// fn test_delegates_series_details_blocks_to_series_details_handler(
@@ -1705,6 +1707,7 @@ mod tests {
fn test_library_handler_accepts() {
let mut library_handler_blocks = Vec::new();
library_handler_blocks.extend(LIBRARY_BLOCKS);
library_handler_blocks.extend(ADD_SERIES_BLOCKS);
library_handler_blocks.extend(DELETE_SERIES_BLOCKS);
ActiveSonarrBlock::iter().for_each(|active_sonarr_block| {
+8 -1
View File
@@ -1,3 +1,4 @@
use add_series_handler::AddSeriesHandler;
use delete_series_handler::DeleteSeriesHandler;
use crate::{
@@ -20,6 +21,7 @@ use crate::{
use super::handle_change_tab_left_right_keys;
use crate::app::key_binding::DEFAULT_KEYBINDINGS;
mod add_series_handler;
mod delete_series_handler;
#[cfg(test)]
@@ -36,6 +38,9 @@ pub(super) struct LibraryHandler<'a, 'b> {
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, 'b> {
fn handle(&mut self) {
match self.active_sonarr_block {
_ if AddSeriesHandler::accepts(self.active_sonarr_block) => {
AddSeriesHandler::with(self.key, self.app, self.active_sonarr_block, self.context).handle();
}
_ if DeleteSeriesHandler::accepts(self.active_sonarr_block) => {
DeleteSeriesHandler::with(self.key, self.app, self.active_sonarr_block, self.context)
.handle();
@@ -45,7 +50,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveSonarrBlock> for LibraryHandler<'a, '
}
fn accepts(active_block: ActiveSonarrBlock) -> bool {
DeleteSeriesHandler::accepts(active_block) || LIBRARY_BLOCKS.contains(&active_block)
AddSeriesHandler::accepts(active_block)
|| DeleteSeriesHandler::accepts(active_block)
|| LIBRARY_BLOCKS.contains(&active_block)
}
fn with(
@@ -295,6 +295,33 @@ pub static LIBRARY_BLOCKS: [ActiveSonarrBlock; 7] = [
ActiveSonarrBlock::UpdateAllSeriesPrompt,
];
pub static ADD_SERIES_BLOCKS: [ActiveSonarrBlock; 13] = [
ActiveSonarrBlock::AddSeriesAlreadyInLibrary,
ActiveSonarrBlock::AddSeriesConfirmPrompt,
ActiveSonarrBlock::AddSeriesEmptySearchResults,
ActiveSonarrBlock::AddSeriesPrompt,
ActiveSonarrBlock::AddSeriesSearchInput,
ActiveSonarrBlock::AddSeriesSearchResults,
ActiveSonarrBlock::AddSeriesSelectLanguageProfile,
ActiveSonarrBlock::AddSeriesSelectMonitor,
ActiveSonarrBlock::AddSeriesSelectQualityProfile,
ActiveSonarrBlock::AddSeriesSelectRootFolder,
ActiveSonarrBlock::AddSeriesSelectSeriesType,
ActiveSonarrBlock::AddSeriesTagsInput,
ActiveSonarrBlock::AddSeriesToggleUseSeasonFolder,
];
pub const ADD_SERIES_SELECTION_BLOCKS: &[&[ActiveSonarrBlock]] = &[
&[ActiveSonarrBlock::AddSeriesSelectRootFolder],
&[ActiveSonarrBlock::AddSeriesSelectMonitor],
&[ActiveSonarrBlock::AddSeriesSelectQualityProfile],
&[ActiveSonarrBlock::AddSeriesSelectLanguageProfile],
&[ActiveSonarrBlock::AddSeriesSelectSeriesType],
&[ActiveSonarrBlock::AddSeriesToggleUseSeasonFolder],
&[ActiveSonarrBlock::AddSeriesTagsInput],
&[ActiveSonarrBlock::AddSeriesConfirmPrompt],
];
pub static EDIT_SERIES_BLOCKS: [ActiveSonarrBlock; 9] = [
ActiveSonarrBlock::EditSeriesPrompt,
ActiveSonarrBlock::EditSeriesConfirmPrompt,
@@ -202,8 +202,9 @@ mod tests {
mod active_sonarr_block_tests {
use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS,
EDIT_SERIES_BLOCKS, EDIT_SERIES_SELECTION_BLOCKS, LIBRARY_BLOCKS,
ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, DELETE_SERIES_BLOCKS,
DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_SERIES_BLOCKS,
EDIT_SERIES_SELECTION_BLOCKS, LIBRARY_BLOCKS,
};
#[test]
@@ -218,6 +219,63 @@ mod tests {
assert!(LIBRARY_BLOCKS.contains(&ActiveSonarrBlock::UpdateAllSeriesPrompt));
}
#[test]
fn test_add_series_blocks_contents() {
assert_eq!(ADD_SERIES_BLOCKS.len(), 13);
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesAlreadyInLibrary));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesConfirmPrompt));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesEmptySearchResults));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesPrompt));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSearchInput));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSearchResults));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSelectLanguageProfile));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSelectMonitor));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSelectQualityProfile));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSelectRootFolder));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesSelectSeriesType));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesTagsInput));
assert!(ADD_SERIES_BLOCKS.contains(&ActiveSonarrBlock::AddSeriesToggleUseSeasonFolder));
}
#[test]
fn test_add_series_selection_blocks_ordering() {
let mut add_series_block_iter = ADD_SERIES_SELECTION_BLOCKS.iter();
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesSelectRootFolder]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesSelectMonitor]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesSelectQualityProfile]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesSelectLanguageProfile]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesSelectSeriesType]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesToggleUseSeasonFolder]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesTagsInput]
);
assert_eq!(
add_series_block_iter.next().unwrap(),
&[ActiveSonarrBlock::AddSeriesConfirmPrompt]
);
assert_eq!(add_series_block_iter.next(), None);
}
#[test]
fn test_edit_movie_blocks_contents() {
assert_eq!(EDIT_SERIES_BLOCKS.len(), 9);