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
+1
View File
@@ -10,6 +10,7 @@ pub struct EditIndexerModal {
pub api_key: HorizontallyScrollableText,
pub seed_ratio: HorizontallyScrollableText,
pub tags: HorizontallyScrollableText,
pub priority: i64,
}
#[derive(Default, Clone, Eq, PartialEq, Debug)]
@@ -209,7 +209,6 @@ impl<'a> Default for RadarrData<'a> {
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, EnumIter)]
pub enum ActiveRadarrBlock {
AddIndexer,
AddMovieAlreadyInLibrary,
AddMovieSearchInput,
AddMovieSearchResults,
@@ -256,6 +255,7 @@ pub enum ActiveRadarrBlock {
EditIndexerToggleEnableRss,
EditIndexerToggleEnableAutomaticSearch,
EditIndexerToggleEnableInteractiveSearch,
EditIndexerPriorityInput,
EditIndexerUrlInput,
EditIndexerTagsInput,
EditMoviePrompt,
@@ -327,8 +327,7 @@ pub static COLLECTIONS_BLOCKS: [ActiveRadarrBlock; 7] = [
ActiveRadarrBlock::FilterCollectionsError,
ActiveRadarrBlock::UpdateAllCollectionsPrompt,
];
pub static INDEXERS_BLOCKS: [ActiveRadarrBlock; 4] = [
ActiveRadarrBlock::AddIndexer,
pub static INDEXERS_BLOCKS: [ActiveRadarrBlock; 3] = [
ActiveRadarrBlock::DeleteIndexerPrompt,
ActiveRadarrBlock::Indexers,
ActiveRadarrBlock::TestIndexer,
@@ -431,7 +430,7 @@ pub const DELETE_MOVIE_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[
&[ActiveRadarrBlock::DeleteMovieToggleAddListExclusion],
&[ActiveRadarrBlock::DeleteMovieConfirmPrompt],
];
pub static EDIT_INDEXER_BLOCKS: [ActiveRadarrBlock; 10] = [
pub static EDIT_INDEXER_BLOCKS: [ActiveRadarrBlock; 11] = [
ActiveRadarrBlock::EditIndexerPrompt,
ActiveRadarrBlock::EditIndexerConfirmPrompt,
ActiveRadarrBlock::EditIndexerApiKeyInput,
@@ -440,6 +439,7 @@ pub static EDIT_INDEXER_BLOCKS: [ActiveRadarrBlock; 10] = [
ActiveRadarrBlock::EditIndexerToggleEnableRss,
ActiveRadarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveRadarrBlock::EditIndexerPriorityInput,
ActiveRadarrBlock::EditIndexerUrlInput,
ActiveRadarrBlock::EditIndexerTagsInput,
];
@@ -460,6 +460,10 @@ pub const EDIT_INDEXER_TORRENT_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[
ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveRadarrBlock::EditIndexerTagsInput,
],
&[
ActiveRadarrBlock::EditIndexerPriorityInput,
ActiveRadarrBlock::EditIndexerConfirmPrompt,
],
&[
ActiveRadarrBlock::EditIndexerConfirmPrompt,
ActiveRadarrBlock::EditIndexerConfirmPrompt,
@@ -480,7 +484,7 @@ pub const EDIT_INDEXER_NZB_SELECTION_BLOCKS: &[&[ActiveRadarrBlock]] = &[
],
&[
ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveRadarrBlock::EditIndexerConfirmPrompt,
ActiveRadarrBlock::EditIndexerPriorityInput,
],
&[
ActiveRadarrBlock::EditIndexerConfirmPrompt,
@@ -303,8 +303,7 @@ mod tests {
#[test]
fn test_indexers_blocks_contents() {
assert_eq!(INDEXERS_BLOCKS.len(), 4);
assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::AddIndexer));
assert_eq!(INDEXERS_BLOCKS.len(), 3);
assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::DeleteIndexerPrompt));
assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::Indexers));
assert!(INDEXERS_BLOCKS.contains(&ActiveRadarrBlock::TestIndexer));
@@ -413,7 +412,7 @@ mod tests {
#[test]
fn test_edit_indexer_blocks_contents() {
assert_eq!(EDIT_INDEXER_BLOCKS.len(), 10);
assert_eq!(EDIT_INDEXER_BLOCKS.len(), 11);
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveRadarrBlock::EditIndexerPrompt));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveRadarrBlock::EditIndexerConfirmPrompt));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveRadarrBlock::EditIndexerApiKeyInput));
@@ -428,6 +427,7 @@ mod tests {
);
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveRadarrBlock::EditIndexerUrlInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveRadarrBlock::EditIndexerTagsInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveRadarrBlock::EditIndexerPriorityInput));
}
#[test]
@@ -607,6 +607,13 @@ mod tests {
ActiveRadarrBlock::EditIndexerTagsInput,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveRadarrBlock::EditIndexerPriorityInput,
ActiveRadarrBlock::EditIndexerConfirmPrompt,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
@@ -646,7 +653,7 @@ mod tests {
edit_indexer_nzb_selection_block_iter.next().unwrap(),
&[
ActiveRadarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveRadarrBlock::EditIndexerConfirmPrompt,
ActiveRadarrBlock::EditIndexerPriorityInput,
]
);
assert_eq!(
@@ -216,6 +216,16 @@ pub enum ActiveSonarrBlock {
DeleteSeriesToggleDeleteFile,
Downloads,
EditIndexerPrompt,
EditIndexerConfirmPrompt,
EditIndexerApiKeyInput,
EditIndexerNameInput,
EditIndexerSeedRatioInput,
EditIndexerToggleEnableRss,
EditIndexerToggleEnableAutomaticSearch,
EditIndexerToggleEnableInteractiveSearch,
EditIndexerUrlInput,
EditIndexerPriorityInput,
EditIndexerTagsInput,
EditSeriesPrompt,
EditSeriesConfirmPrompt,
EditSeriesPathInput,
@@ -370,6 +380,87 @@ pub const DELETE_SERIES_SELECTION_BLOCKS: &[&[ActiveSonarrBlock]] = &[
&[ActiveSonarrBlock::DeleteSeriesConfirmPrompt],
];
pub static EDIT_INDEXER_BLOCKS: [ActiveSonarrBlock; 11] = [
ActiveSonarrBlock::EditIndexerPrompt,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
ActiveSonarrBlock::EditIndexerApiKeyInput,
ActiveSonarrBlock::EditIndexerNameInput,
ActiveSonarrBlock::EditIndexerSeedRatioInput,
ActiveSonarrBlock::EditIndexerToggleEnableRss,
ActiveSonarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveSonarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveSonarrBlock::EditIndexerPriorityInput,
ActiveSonarrBlock::EditIndexerUrlInput,
ActiveSonarrBlock::EditIndexerTagsInput,
];
pub const EDIT_INDEXER_TORRENT_SELECTION_BLOCKS: &[&[ActiveSonarrBlock]] = &[
&[
ActiveSonarrBlock::EditIndexerNameInput,
ActiveSonarrBlock::EditIndexerUrlInput,
],
&[
ActiveSonarrBlock::EditIndexerToggleEnableRss,
ActiveSonarrBlock::EditIndexerApiKeyInput,
],
&[
ActiveSonarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveSonarrBlock::EditIndexerSeedRatioInput,
],
&[
ActiveSonarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveSonarrBlock::EditIndexerTagsInput,
],
&[
ActiveSonarrBlock::EditIndexerPriorityInput,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
],
&[
ActiveSonarrBlock::EditIndexerConfirmPrompt,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
],
];
pub const EDIT_INDEXER_NZB_SELECTION_BLOCKS: &[&[ActiveSonarrBlock]] = &[
&[
ActiveSonarrBlock::EditIndexerNameInput,
ActiveSonarrBlock::EditIndexerUrlInput,
],
&[
ActiveSonarrBlock::EditIndexerToggleEnableRss,
ActiveSonarrBlock::EditIndexerApiKeyInput,
],
&[
ActiveSonarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveSonarrBlock::EditIndexerTagsInput,
],
&[
ActiveSonarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveSonarrBlock::EditIndexerPriorityInput,
],
&[
ActiveSonarrBlock::EditIndexerConfirmPrompt,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
],
];
pub static INDEXER_SETTINGS_BLOCKS: [ActiveSonarrBlock; 6] = [
ActiveSonarrBlock::AllIndexerSettingsPrompt,
ActiveSonarrBlock::IndexerSettingsConfirmPrompt,
ActiveSonarrBlock::IndexerSettingsMaximumSizeInput,
ActiveSonarrBlock::IndexerSettingsMinimumAgeInput,
ActiveSonarrBlock::IndexerSettingsRetentionInput,
ActiveSonarrBlock::IndexerSettingsRssSyncIntervalInput,
];
pub const INDEXER_SETTINGS_SELECTION_BLOCKS: &[&[ActiveSonarrBlock]] = &[
&[ActiveSonarrBlock::IndexerSettingsMinimumAgeInput],
&[ActiveSonarrBlock::IndexerSettingsRetentionInput],
&[ActiveSonarrBlock::IndexerSettingsMaximumSizeInput],
&[ActiveSonarrBlock::IndexerSettingsRssSyncIntervalInput],
&[ActiveSonarrBlock::IndexerSettingsConfirmPrompt],
];
pub static HISTORY_BLOCKS: [ActiveSonarrBlock; 7] = [
ActiveSonarrBlock::History,
ActiveSonarrBlock::HistoryItemDetails,
@@ -386,6 +477,12 @@ pub static ROOT_FOLDERS_BLOCKS: [ActiveSonarrBlock; 3] = [
ActiveSonarrBlock::DeleteRootFolderPrompt,
];
pub static INDEXERS_BLOCKS: [ActiveSonarrBlock; 3] = [
ActiveSonarrBlock::DeleteIndexerPrompt,
ActiveSonarrBlock::Indexers,
ActiveSonarrBlock::TestIndexer,
];
impl From<ActiveSonarrBlock> for Route {
fn from(active_sonarr_block: ActiveSonarrBlock) -> Route {
Route::Sonarr(active_sonarr_block, None)
@@ -203,8 +203,10 @@ mod tests {
mod active_sonarr_block_tests {
use crate::models::servarr_data::sonarr::sonarr_data::{
ActiveSonarrBlock, ADD_SERIES_BLOCKS, ADD_SERIES_SELECTION_BLOCKS, BLOCKLIST_BLOCKS,
DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_SERIES_BLOCKS,
EDIT_SERIES_SELECTION_BLOCKS, HISTORY_BLOCKS, LIBRARY_BLOCKS, ROOT_FOLDERS_BLOCKS,
DELETE_SERIES_BLOCKS, DELETE_SERIES_SELECTION_BLOCKS, DOWNLOADS_BLOCKS, EDIT_INDEXER_BLOCKS,
EDIT_INDEXER_NZB_SELECTION_BLOCKS, EDIT_INDEXER_TORRENT_SELECTION_BLOCKS, EDIT_SERIES_BLOCKS,
EDIT_SERIES_SELECTION_BLOCKS, HISTORY_BLOCKS, INDEXERS_BLOCKS, INDEXER_SETTINGS_BLOCKS,
INDEXER_SETTINGS_SELECTION_BLOCKS, LIBRARY_BLOCKS, ROOT_FOLDERS_BLOCKS,
};
#[test]
@@ -375,6 +377,158 @@ mod tests {
assert_eq!(delete_series_block_iter.next(), None);
}
#[test]
fn test_edit_indexer_blocks_contents() {
assert_eq!(EDIT_INDEXER_BLOCKS.len(), 11);
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerPrompt));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerConfirmPrompt));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerApiKeyInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerNameInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerSeedRatioInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerToggleEnableRss));
assert!(
EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerToggleEnableAutomaticSearch)
);
assert!(
EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerToggleEnableInteractiveSearch)
);
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerUrlInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerTagsInput));
assert!(EDIT_INDEXER_BLOCKS.contains(&ActiveSonarrBlock::EditIndexerPriorityInput));
}
#[test]
fn test_edit_indexer_nzb_selection_blocks_ordering() {
let mut edit_indexer_nzb_selection_block_iter = EDIT_INDEXER_NZB_SELECTION_BLOCKS.iter();
assert_eq!(
edit_indexer_nzb_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerNameInput,
ActiveSonarrBlock::EditIndexerUrlInput,
]
);
assert_eq!(
edit_indexer_nzb_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerToggleEnableRss,
ActiveSonarrBlock::EditIndexerApiKeyInput,
]
);
assert_eq!(
edit_indexer_nzb_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveSonarrBlock::EditIndexerTagsInput,
]
);
assert_eq!(
edit_indexer_nzb_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveSonarrBlock::EditIndexerPriorityInput,
]
);
assert_eq!(
edit_indexer_nzb_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerConfirmPrompt,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
]
);
assert_eq!(edit_indexer_nzb_selection_block_iter.next(), None);
}
#[test]
fn test_edit_indexer_torrent_selection_blocks_ordering() {
let mut edit_indexer_torrent_selection_block_iter =
EDIT_INDEXER_TORRENT_SELECTION_BLOCKS.iter();
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerNameInput,
ActiveSonarrBlock::EditIndexerUrlInput,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerToggleEnableRss,
ActiveSonarrBlock::EditIndexerApiKeyInput,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerToggleEnableAutomaticSearch,
ActiveSonarrBlock::EditIndexerSeedRatioInput,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerToggleEnableInteractiveSearch,
ActiveSonarrBlock::EditIndexerTagsInput,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerPriorityInput,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
]
);
assert_eq!(
edit_indexer_torrent_selection_block_iter.next().unwrap(),
&[
ActiveSonarrBlock::EditIndexerConfirmPrompt,
ActiveSonarrBlock::EditIndexerConfirmPrompt,
]
);
assert_eq!(edit_indexer_torrent_selection_block_iter.next(), None);
}
#[test]
fn test_indexer_settings_blocks_contents() {
assert_eq!(INDEXER_SETTINGS_BLOCKS.len(), 6);
assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::AllIndexerSettingsPrompt));
assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsConfirmPrompt));
assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsMaximumSizeInput));
assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsMinimumAgeInput));
assert!(INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsRetentionInput));
assert!(
INDEXER_SETTINGS_BLOCKS.contains(&ActiveSonarrBlock::IndexerSettingsRssSyncIntervalInput)
);
}
#[test]
fn test_indexer_settings_selection_blocks_ordering() {
let mut indexer_settings_block_iter = INDEXER_SETTINGS_SELECTION_BLOCKS.iter();
assert_eq!(
indexer_settings_block_iter.next().unwrap(),
&[ActiveSonarrBlock::IndexerSettingsMinimumAgeInput,]
);
assert_eq!(
indexer_settings_block_iter.next().unwrap(),
&[ActiveSonarrBlock::IndexerSettingsRetentionInput,]
);
assert_eq!(
indexer_settings_block_iter.next().unwrap(),
&[ActiveSonarrBlock::IndexerSettingsMaximumSizeInput,]
);
assert_eq!(
indexer_settings_block_iter.next().unwrap(),
&[ActiveSonarrBlock::IndexerSettingsRssSyncIntervalInput,]
);
assert_eq!(
indexer_settings_block_iter.next().unwrap(),
&[ActiveSonarrBlock::IndexerSettingsConfirmPrompt,]
);
assert_eq!(indexer_settings_block_iter.next(), None);
}
#[test]
fn test_history_blocks_contents() {
assert_eq!(HISTORY_BLOCKS.len(), 7);
@@ -394,5 +548,13 @@ mod tests {
assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveSonarrBlock::AddRootFolderPrompt));
assert!(ROOT_FOLDERS_BLOCKS.contains(&ActiveSonarrBlock::DeleteRootFolderPrompt));
}
#[test]
fn test_indexers_blocks_contents() {
assert_eq!(INDEXERS_BLOCKS.len(), 3);
assert!(INDEXERS_BLOCKS.contains(&ActiveSonarrBlock::DeleteIndexerPrompt));
assert!(INDEXERS_BLOCKS.contains(&ActiveSonarrBlock::Indexers));
assert!(INDEXERS_BLOCKS.contains(&ActiveSonarrBlock::TestIndexer));
}
}
}