feat: Added CLI and TUI support for editing Lidarr artists

This commit is contained in:
2026-01-07 12:01:03 -07:00
parent 3c1634d1e3
commit b1afdaf541
49 changed files with 2338 additions and 296 deletions
+17 -13
View File
@@ -1,5 +1,6 @@
use serde_json::Number;
use super::modals::EditArtistModal;
use crate::app::lidarr::lidarr_context_clues::ARTISTS_CONTEXT_CLUES;
use crate::models::{
BlockSelectionState, Route, TabRoute, TabState,
@@ -10,16 +11,17 @@ use crate::models::{
use crate::network::lidarr_network::LidarrEvent;
use bimap::BiMap;
use chrono::{DateTime, Utc};
use strum::{EnumIter};
use super::modals::EditArtistModal;
use strum::EnumIter;
#[cfg(test)]
use {
strum::{Display, EnumString, IntoEnumIterator},
crate::models::lidarr_models::NewItemMonitorType,
crate::models::stateful_table::SortOption,
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::quality_profile_map,
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::{
download_record, metadata_profile, metadata_profile_map, quality_profile, root_folder, tags_map,
},
crate::network::servarr_test_utils::diskspace,
crate::network::lidarr_network::lidarr_network_test_utils::test_utils::{download_record, metadata_profile, metadata_profile_map, quality_profile, root_folder, tags_map},
strum::{Display, EnumString, IntoEnumIterator},
};
#[cfg(test)]
@@ -114,9 +116,15 @@ impl LidarrData<'_> {
tags: "alex".into(),
..EditArtistModal::default()
};
edit_artist_modal.monitor_list.set_items(NewItemMonitorType::iter().collect());
edit_artist_modal.quality_profile_list.set_items(vec![quality_profile().name]);
edit_artist_modal.metadata_profile_list.set_items(vec![metadata_profile().name]);
edit_artist_modal
.monitor_list
.set_items(NewItemMonitorType::iter().collect());
edit_artist_modal
.quality_profile_list
.set_items(vec![quality_profile().name]);
edit_artist_modal
.metadata_profile_list
.set_items(vec![metadata_profile().name]);
let mut lidarr_data = LidarrData {
delete_artist_files: true,
@@ -134,12 +142,8 @@ impl LidarrData<'_> {
}]);
lidarr_data.artists.search = Some("artist search".into());
lidarr_data.artists.filter = Some("artist filter".into());
lidarr_data
.downloads
.set_items(vec![download_record()]);
lidarr_data
.root_folders
.set_items(vec![root_folder()]);
lidarr_data.downloads.set_items(vec![download_record()]);
lidarr_data.root_folders.set_items(vec![root_folder()]);
lidarr_data.version = "1.0.0".to_owned();
lidarr_data
@@ -1,12 +1,15 @@
#[cfg(test)]
mod tests {
use bimap::BiMap;
use crate::app::lidarr::lidarr_context_clues::ARTISTS_CONTEXT_CLUES;
use crate::models::servarr_data::lidarr::lidarr_data::{DELETE_ARTIST_BLOCKS, DELETE_ARTIST_SELECTION_BLOCKS, EDIT_ARTIST_BLOCKS, EDIT_ARTIST_SELECTION_BLOCKS};
use crate::models::servarr_data::lidarr::lidarr_data::{
DELETE_ARTIST_BLOCKS, DELETE_ARTIST_SELECTION_BLOCKS, EDIT_ARTIST_BLOCKS,
EDIT_ARTIST_SELECTION_BLOCKS,
};
use crate::models::{
BlockSelectionState, Route,
servarr_data::lidarr::lidarr_data::{ActiveLidarrBlock, LIBRARY_BLOCKS, LidarrData},
};
use bimap::BiMap;
use chrono::{DateTime, Utc};
use pretty_assertions::{assert_eq, assert_str_eq};
use serde_json::Number;
@@ -52,7 +55,10 @@ mod tests {
..LidarrData::default()
};
assert_str_eq!(lidarr_data.tag_ids_to_display(&[Number::from(1), Number::from(2)]), "test 1, test 2");
assert_str_eq!(
lidarr_data.tag_ids_to_display(&[Number::from(1), Number::from(2)]),
"test 1, test 2"
);
}
#[test]
@@ -65,9 +71,16 @@ mod tests {
quality_profile_map,
..LidarrData::default()
};
let expected_quality_profile_vec = vec!["test 1".to_owned(), "test 2".to_owned(), "test 3".to_owned()];
let expected_quality_profile_vec = vec![
"test 1".to_owned(),
"test 2".to_owned(),
"test 3".to_owned(),
];
assert_iter_eq!(lidarr_data.sorted_quality_profile_names(), expected_quality_profile_vec);
assert_iter_eq!(
lidarr_data.sorted_quality_profile_names(),
expected_quality_profile_vec
);
}
#[test]
@@ -80,9 +93,16 @@ mod tests {
metadata_profile_map,
..LidarrData::default()
};
let expected_metadata_profile_vec = vec!["test 1".to_owned(), "test 2".to_owned(), "test 3".to_owned()];
let expected_metadata_profile_vec = vec![
"test 1".to_owned(),
"test 2".to_owned(),
"test 3".to_owned(),
];
assert_iter_eq!(lidarr_data.sorted_metadata_profile_names(), expected_metadata_profile_vec);
assert_iter_eq!(
lidarr_data.sorted_metadata_profile_names(),
expected_metadata_profile_vec
);
}
#[test]
@@ -176,13 +196,34 @@ mod tests {
fn test_edit_artist_selection_blocks_ordering() {
let mut edit_artist_block_iter = EDIT_ARTIST_SELECTION_BLOCKS.iter();
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistToggleMonitored]);
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistSelectMonitorNewItems]);
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistSelectQualityProfile]);
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistSelectMetadataProfile]);
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistPathInput]);
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistTagsInput]);
assert_eq!(edit_artist_block_iter.next().unwrap(), &[ActiveLidarrBlock::EditArtistConfirmPrompt]);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistToggleMonitored]
);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistSelectMonitorNewItems]
);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistSelectQualityProfile]
);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistSelectMetadataProfile]
);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistPathInput]
);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistTagsInput]
);
assert_eq!(
edit_artist_block_iter.next().unwrap(),
&[ActiveLidarrBlock::EditArtistConfirmPrompt]
);
assert_none!(edit_artist_block_iter.next());
}
}
@@ -10,10 +10,16 @@ mod tests {
#[test]
fn test_edit_artist_modal_from_lidarr_data() {
let mut lidarr_data = LidarrData {
quality_profile_map: BiMap::from_iter([(1i64, "HD - 1080p".to_owned()), (2i64, "Any".to_owned())]),
metadata_profile_map: BiMap::from_iter([(1i64, "Standard".to_owned()), (2i64, "None".to_owned())]),
quality_profile_map: BiMap::from_iter([
(1i64, "HD - 1080p".to_owned()),
(2i64, "Any".to_owned()),
]),
metadata_profile_map: BiMap::from_iter([
(1i64, "Standard".to_owned()),
(2i64, "None".to_owned()),
]),
tags_map: BiMap::from_iter([(1i64, "usenet".to_owned())]),
..LidarrData::default()
..LidarrData::default()
};
let artist = Artist {
id: 1,
@@ -1,10 +1,6 @@
#[cfg(test)]
mod tests {
mod radarr_data_tests {
use bimap::BiMap;
use chrono::{DateTime, Utc};
use pretty_assertions::{assert_eq, assert_str_eq};
use serde_json::Number;
use crate::app::context_clues::{
BLOCKLIST_CONTEXT_CLUES, DOWNLOADS_CONTEXT_CLUES, INDEXERS_CONTEXT_CLUES,
ROOT_FOLDERS_CONTEXT_CLUES, SYSTEM_CONTEXT_CLUES,
@@ -13,6 +9,10 @@ mod tests {
COLLECTIONS_CONTEXT_CLUES, LIBRARY_CONTEXT_CLUES, MANUAL_MOVIE_SEARCH_CONTEXT_CLUES,
MOVIE_DETAILS_CONTEXT_CLUES,
};
use bimap::BiMap;
use chrono::{DateTime, Utc};
use pretty_assertions::{assert_eq, assert_str_eq};
use serde_json::Number;
use crate::models::Route;
use crate::models::servarr_data::radarr::radarr_data::radarr_test_utils::utils;
@@ -73,7 +73,10 @@ mod tests {
..RadarrData::default()
};
assert_str_eq!(radarr_data.tag_ids_to_display(&[Number::from(1), Number::from(2)]), "test 1, test 2");
assert_str_eq!(
radarr_data.tag_ids_to_display(&[Number::from(1), Number::from(2)]),
"test 1, test 2"
);
}
#[test]
@@ -86,9 +89,16 @@ mod tests {
quality_profile_map,
..RadarrData::default()
};
let expected_quality_profile_vec = vec!["test 1".to_owned(), "test 2".to_owned(), "test 3".to_owned()];
let expected_quality_profile_vec = vec![
"test 1".to_owned(),
"test 2".to_owned(),
"test 3".to_owned(),
];
assert_iter_eq!(radarr_data.sorted_quality_profile_names(), expected_quality_profile_vec);
assert_iter_eq!(
radarr_data.sorted_quality_profile_names(),
expected_quality_profile_vec
);
}
#[test]
@@ -1,10 +1,6 @@
#[cfg(test)]
mod tests {
mod sonarr_data_tests {
use bimap::BiMap;
use chrono::{DateTime, Utc};
use pretty_assertions::{assert_eq, assert_str_eq};
use serde_json::Number;
use crate::app::sonarr::sonarr_context_clues::SERIES_HISTORY_CONTEXT_CLUES;
use crate::models::sonarr_models::{Season, SonarrHistoryItem};
use crate::models::stateful_table::StatefulTable;
@@ -23,6 +19,10 @@ mod tests {
servarr_data::sonarr::sonarr_data::{ActiveSonarrBlock, SonarrData},
},
};
use bimap::BiMap;
use chrono::{DateTime, Utc};
use pretty_assertions::{assert_eq, assert_str_eq};
use serde_json::Number;
#[test]
fn test_from_active_sonarr_block_to_route() {
@@ -89,7 +89,10 @@ mod tests {
..SonarrData::default()
};
assert_str_eq!(sonarr_data.tag_ids_to_display(&[Number::from(1), Number::from(2)]), "test 1, test 2");
assert_str_eq!(
sonarr_data.tag_ids_to_display(&[Number::from(1), Number::from(2)]),
"test 1, test 2"
);
}
#[test]
@@ -102,9 +105,16 @@ mod tests {
quality_profile_map,
..SonarrData::default()
};
let expected_quality_profile_vec = vec!["test 1".to_owned(), "test 2".to_owned(), "test 3".to_owned()];
let expected_quality_profile_vec = vec![
"test 1".to_owned(),
"test 2".to_owned(),
"test 3".to_owned(),
];
assert_iter_eq!(sonarr_data.sorted_quality_profile_names(), expected_quality_profile_vec);
assert_iter_eq!(
sonarr_data.sorted_quality_profile_names(),
expected_quality_profile_vec
);
}
#[test]
@@ -117,9 +127,16 @@ mod tests {
language_profiles_map,
..SonarrData::default()
};
let expected_language_profiles_vec = vec!["test 1".to_owned(), "test 2".to_owned(), "test 3".to_owned()];
let expected_language_profiles_vec = vec![
"test 1".to_owned(),
"test 2".to_owned(),
"test 3".to_owned(),
];
assert_iter_eq!(sonarr_data.sorted_language_profile_names(), expected_language_profiles_vec);
assert_iter_eq!(
sonarr_data.sorted_language_profile_names(),
expected_language_profiles_vec
);
}
#[test]