Implemented the ability to edit collections and fixed a refresh bug so screens will automatically refresh when users edit movies or collections
This commit is contained in:
+2
-2
@@ -194,7 +194,7 @@ mod tests {
|
||||
assert_eq!(app.navigation_stack, vec![DEFAULT_ROUTE]);
|
||||
assert!(app.network_tx.is_none());
|
||||
assert_eq!(app.error, HorizontallyScrollableText::default());
|
||||
assert_eq!(app.response, String::default());
|
||||
assert!(app.response.is_empty());
|
||||
assert_eq!(app.server_tabs.index, 0);
|
||||
assert_eq!(
|
||||
app.server_tabs.tabs,
|
||||
@@ -289,7 +289,7 @@ mod tests {
|
||||
|
||||
assert_eq!(app.tick_count, 0);
|
||||
assert_eq!(app.error, HorizontallyScrollableText::default());
|
||||
assert_eq!(app.data.radarr_data.version, String::default());
|
||||
assert!(app.data.radarr_data.version.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
+521
-90
@@ -20,9 +20,9 @@ pub struct RadarrData {
|
||||
pub movies: StatefulTable<Movie>,
|
||||
pub filtered_movies: StatefulTable<Movie>,
|
||||
pub add_searched_movies: StatefulTable<AddMovieSearchResult>,
|
||||
pub movie_monitor_list: StatefulList<Monitor>,
|
||||
pub movie_minimum_availability_list: StatefulList<MinimumAvailability>,
|
||||
pub movie_quality_profile_list: StatefulList<String>,
|
||||
pub monitor_list: StatefulList<Monitor>,
|
||||
pub minimum_availability_list: StatefulList<MinimumAvailability>,
|
||||
pub quality_profile_list: StatefulList<String>,
|
||||
pub selected_block: ActiveRadarrBlock,
|
||||
pub downloads: StatefulTable<DownloadRecord>,
|
||||
pub quality_profile_map: BiMap<u64, String>,
|
||||
@@ -47,6 +47,7 @@ pub struct RadarrData {
|
||||
pub edit_path: HorizontallyScrollableText,
|
||||
pub edit_tags: HorizontallyScrollableText,
|
||||
pub edit_monitored: Option<bool>,
|
||||
pub edit_search_on_add: Option<bool>,
|
||||
pub sort_ascending: Option<bool>,
|
||||
pub prompt_confirm: bool,
|
||||
pub is_searching: bool,
|
||||
@@ -74,11 +75,12 @@ impl RadarrData {
|
||||
self.filtered_collections = StatefulTable::default();
|
||||
}
|
||||
|
||||
pub fn reset_add_edit_movie_fields(&mut self) {
|
||||
pub fn reset_add_edit_media_fields(&mut self) {
|
||||
self.edit_monitored = None;
|
||||
self.edit_search_on_add = None;
|
||||
self.edit_path = HorizontallyScrollableText::default();
|
||||
self.edit_tags = HorizontallyScrollableText::default();
|
||||
self.reset_movie_preferences_selections();
|
||||
self.reset_preferences_selections();
|
||||
}
|
||||
|
||||
pub fn reset_movie_info_tabs(&mut self) {
|
||||
@@ -95,29 +97,25 @@ impl RadarrData {
|
||||
self.movie_info_tabs.index = 0;
|
||||
}
|
||||
|
||||
pub fn reset_movie_preferences_selections(&mut self) {
|
||||
self.movie_monitor_list = StatefulList::default();
|
||||
self.movie_minimum_availability_list = StatefulList::default();
|
||||
self.movie_quality_profile_list = StatefulList::default();
|
||||
pub fn reset_preferences_selections(&mut self) {
|
||||
self.monitor_list = StatefulList::default();
|
||||
self.minimum_availability_list = StatefulList::default();
|
||||
self.quality_profile_list = StatefulList::default();
|
||||
}
|
||||
|
||||
pub fn populate_movie_preferences_lists(&mut self) {
|
||||
pub fn populate_preferences_lists(&mut self) {
|
||||
self.monitor_list.set_items(Vec::from_iter(Monitor::iter()));
|
||||
self
|
||||
.movie_monitor_list
|
||||
.set_items(Vec::from_iter(Monitor::iter()));
|
||||
self
|
||||
.movie_minimum_availability_list
|
||||
.minimum_availability_list
|
||||
.set_items(Vec::from_iter(MinimumAvailability::iter()));
|
||||
let mut quality_profile_names: Vec<String> =
|
||||
self.quality_profile_map.right_values().cloned().collect();
|
||||
quality_profile_names.sort();
|
||||
self
|
||||
.movie_quality_profile_list
|
||||
.set_items(quality_profile_names);
|
||||
self.quality_profile_list.set_items(quality_profile_names);
|
||||
}
|
||||
|
||||
pub fn populate_edit_movie_fields(&mut self) {
|
||||
self.populate_movie_preferences_lists();
|
||||
self.populate_preferences_lists();
|
||||
let Movie {
|
||||
path,
|
||||
tags,
|
||||
@@ -147,12 +145,12 @@ impl RadarrData {
|
||||
self.edit_monitored = Some(*monitored);
|
||||
|
||||
let minimum_availability_index = self
|
||||
.movie_minimum_availability_list
|
||||
.minimum_availability_list
|
||||
.items
|
||||
.iter()
|
||||
.position(|ma| ma == minimum_availability);
|
||||
self
|
||||
.movie_minimum_availability_list
|
||||
.minimum_availability_list
|
||||
.state
|
||||
.select(minimum_availability_index);
|
||||
|
||||
@@ -161,12 +159,56 @@ impl RadarrData {
|
||||
.get_by_left(&quality_profile_id.as_u64().unwrap())
|
||||
.unwrap();
|
||||
let quality_profile_index = self
|
||||
.movie_quality_profile_list
|
||||
.quality_profile_list
|
||||
.items
|
||||
.iter()
|
||||
.position(|profile| profile == quality_profile_name);
|
||||
self
|
||||
.movie_quality_profile_list
|
||||
.quality_profile_list
|
||||
.state
|
||||
.select(quality_profile_index);
|
||||
}
|
||||
|
||||
pub fn populate_edit_collection_fields(&mut self) {
|
||||
self.populate_preferences_lists();
|
||||
let Collection {
|
||||
root_folder_path,
|
||||
monitored,
|
||||
search_on_add,
|
||||
minimum_availability,
|
||||
quality_profile_id,
|
||||
..
|
||||
} = if self.filtered_collections.items.is_empty() {
|
||||
self.collections.current_selection()
|
||||
} else {
|
||||
self.filtered_collections.current_selection()
|
||||
};
|
||||
|
||||
self.edit_path = root_folder_path.clone().unwrap_or_default().into();
|
||||
self.edit_monitored = Some(*monitored);
|
||||
self.edit_search_on_add = Some(*search_on_add);
|
||||
|
||||
let minimum_availability_index = self
|
||||
.minimum_availability_list
|
||||
.items
|
||||
.iter()
|
||||
.position(|ma| ma == minimum_availability);
|
||||
self
|
||||
.minimum_availability_list
|
||||
.state
|
||||
.select(minimum_availability_index);
|
||||
|
||||
let quality_profile_name = self
|
||||
.quality_profile_map
|
||||
.get_by_left(&quality_profile_id.as_u64().unwrap())
|
||||
.unwrap();
|
||||
let quality_profile_index = self
|
||||
.quality_profile_list
|
||||
.items
|
||||
.iter()
|
||||
.position(|profile| profile == quality_profile_name);
|
||||
self
|
||||
.quality_profile_list
|
||||
.state
|
||||
.select(quality_profile_index);
|
||||
}
|
||||
@@ -181,9 +223,9 @@ impl Default for RadarrData {
|
||||
start_time: DateTime::default(),
|
||||
movies: StatefulTable::default(),
|
||||
add_searched_movies: StatefulTable::default(),
|
||||
movie_monitor_list: StatefulList::default(),
|
||||
movie_minimum_availability_list: StatefulList::default(),
|
||||
movie_quality_profile_list: StatefulList::default(),
|
||||
monitor_list: StatefulList::default(),
|
||||
minimum_availability_list: StatefulList::default(),
|
||||
quality_profile_list: StatefulList::default(),
|
||||
selected_block: ActiveRadarrBlock::AddMovieSelectMonitor,
|
||||
filtered_movies: StatefulTable::default(),
|
||||
downloads: StatefulTable::default(),
|
||||
@@ -207,6 +249,7 @@ impl Default for RadarrData {
|
||||
edit_path: HorizontallyScrollableText::default(),
|
||||
edit_tags: HorizontallyScrollableText::default(),
|
||||
edit_monitored: None,
|
||||
edit_search_on_add: None,
|
||||
sort_ascending: None,
|
||||
is_searching: false,
|
||||
is_filtering: false,
|
||||
@@ -229,7 +272,7 @@ impl Default for RadarrData {
|
||||
title: "Collections".to_owned(),
|
||||
route: ActiveRadarrBlock::Collections.into(),
|
||||
help: String::default(),
|
||||
contextual_help: Some("<s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"
|
||||
contextual_help: Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter"
|
||||
.to_owned()),
|
||||
},
|
||||
]),
|
||||
@@ -295,6 +338,13 @@ pub enum ActiveRadarrBlock {
|
||||
DeleteMoviePrompt,
|
||||
DeleteDownloadPrompt,
|
||||
Downloads,
|
||||
EditCollectionPrompt,
|
||||
EditCollectionConfirmPrompt,
|
||||
EditCollectionRootFolderPathInput,
|
||||
EditCollectionSelectMinimumAvailability,
|
||||
EditCollectionSelectQualityProfile,
|
||||
EditCollectionToggleSearchOnAdd,
|
||||
EditCollectionToggleMonitored,
|
||||
EditMoviePrompt,
|
||||
EditMovieConfirmPrompt,
|
||||
EditMoviePathInput,
|
||||
@@ -331,6 +381,15 @@ pub const ADD_MOVIE_BLOCKS: [ActiveRadarrBlock; 9] = [
|
||||
ActiveRadarrBlock::AddMovieAlreadyInLibrary,
|
||||
ActiveRadarrBlock::AddMovieTagsInput,
|
||||
];
|
||||
pub const EDIT_COLLECTION_BLOCKS: [ActiveRadarrBlock; 7] = [
|
||||
ActiveRadarrBlock::EditCollectionPrompt,
|
||||
ActiveRadarrBlock::EditCollectionConfirmPrompt,
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput,
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability,
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile,
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd,
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored,
|
||||
];
|
||||
pub const EDIT_MOVIE_BLOCKS: [ActiveRadarrBlock; 7] = [
|
||||
ActiveRadarrBlock::EditMoviePrompt,
|
||||
ActiveRadarrBlock::EditMovieConfirmPrompt,
|
||||
@@ -366,7 +425,7 @@ pub const FILTER_BLOCKS: [ActiveRadarrBlock; 2] = [
|
||||
];
|
||||
|
||||
impl ActiveRadarrBlock {
|
||||
pub fn next_add_prompt_block(&self) -> Self {
|
||||
pub fn next_add_movie_prompt_block(&self) -> Self {
|
||||
match self {
|
||||
ActiveRadarrBlock::AddMovieSelectMonitor => {
|
||||
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
|
||||
@@ -380,7 +439,7 @@ impl ActiveRadarrBlock {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn next_edit_prompt_block(&self) -> Self {
|
||||
pub fn next_edit_movie_prompt_block(&self) -> Self {
|
||||
match self {
|
||||
ActiveRadarrBlock::EditMovieToggleMonitored => {
|
||||
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
|
||||
@@ -395,7 +454,28 @@ impl ActiveRadarrBlock {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn previous_add_prompt_block(&self) -> Self {
|
||||
pub fn next_edit_collection_prompt_block(&self) -> Self {
|
||||
match self {
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored => {
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability => {
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd => {
|
||||
ActiveRadarrBlock::EditCollectionConfirmPrompt
|
||||
}
|
||||
_ => ActiveRadarrBlock::EditCollectionToggleMonitored,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn previous_add_movie_prompt_block(&self) -> Self {
|
||||
match self {
|
||||
ActiveRadarrBlock::AddMovieSelectMonitor => ActiveRadarrBlock::AddMovieConfirmPrompt,
|
||||
ActiveRadarrBlock::AddMovieSelectMinimumAvailability => {
|
||||
@@ -410,7 +490,7 @@ impl ActiveRadarrBlock {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn previous_edit_prompt_block(&self) -> Self {
|
||||
pub fn previous_edit_movie_prompt_block(&self) -> Self {
|
||||
match self {
|
||||
ActiveRadarrBlock::EditMovieToggleMonitored => ActiveRadarrBlock::EditMovieConfirmPrompt,
|
||||
ActiveRadarrBlock::EditMovieSelectMinimumAvailability => {
|
||||
@@ -425,6 +505,30 @@ impl ActiveRadarrBlock {
|
||||
_ => ActiveRadarrBlock::EditMovieToggleMonitored,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn previous_edit_collection_prompt_block(&self) -> Self {
|
||||
match self {
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored => {
|
||||
ActiveRadarrBlock::EditCollectionConfirmPrompt
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability => {
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile => {
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput => {
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd => {
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput
|
||||
}
|
||||
ActiveRadarrBlock::EditCollectionConfirmPrompt => {
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
|
||||
}
|
||||
_ => ActiveRadarrBlock::EditCollectionToggleMonitored,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<ActiveRadarrBlock> for Route {
|
||||
@@ -538,10 +642,14 @@ impl App {
|
||||
self.dispatch_by_radarr_block(&active_radarr_block).await;
|
||||
}
|
||||
|
||||
if self.is_routing || self.tick_count % self.tick_until_poll == 0 {
|
||||
self.refresh_metadata().await;
|
||||
if self.should_refresh {
|
||||
self.dispatch_by_radarr_block(&active_radarr_block).await;
|
||||
}
|
||||
|
||||
if self.is_routing || self.tick_count % self.tick_until_poll == 0 {
|
||||
self.dispatch_by_radarr_block(&active_radarr_block).await;
|
||||
self.refresh_metadata().await;
|
||||
}
|
||||
}
|
||||
|
||||
async fn refresh_metadata(&mut self) {
|
||||
@@ -603,6 +711,7 @@ pub mod radarr_test_utils {
|
||||
edit_path: "test path".to_owned().into(),
|
||||
edit_tags: "usenet, test".to_owned().into(),
|
||||
edit_monitored: Some(true),
|
||||
edit_search_on_add: Some(true),
|
||||
file_details: "test file details".to_owned(),
|
||||
audio_details: "test audio details".to_owned(),
|
||||
video_details: "test video details".to_owned(),
|
||||
@@ -618,14 +727,12 @@ pub mod radarr_test_utils {
|
||||
.movie_releases
|
||||
.set_items(vec![Release::default()]);
|
||||
radarr_data.movie_info_tabs.index = 1;
|
||||
radarr_data.monitor_list.set_items(vec![Monitor::default()]);
|
||||
radarr_data
|
||||
.movie_monitor_list
|
||||
.set_items(vec![Monitor::default()]);
|
||||
radarr_data
|
||||
.movie_minimum_availability_list
|
||||
.minimum_availability_list
|
||||
.set_items(vec![MinimumAvailability::default()]);
|
||||
radarr_data
|
||||
.movie_quality_profile_list
|
||||
.quality_profile_list
|
||||
.set_items(vec![String::default()]);
|
||||
radarr_data
|
||||
.movie_releases_sort
|
||||
@@ -667,9 +774,10 @@ pub mod radarr_test_utils {
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_edit_movie_reset {
|
||||
macro_rules! assert_edit_media_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!($radarr_data.edit_monitored.is_none());
|
||||
assert!($radarr_data.edit_search_on_add.is_none());
|
||||
assert!($radarr_data.edit_path.text.is_empty());
|
||||
assert!($radarr_data.edit_tags.text.is_empty());
|
||||
};
|
||||
@@ -703,14 +811,11 @@ pub mod radarr_test_utils {
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! assert_movie_preferences_selections_reset {
|
||||
macro_rules! assert_preferences_selections_reset {
|
||||
($radarr_data:expr) => {
|
||||
assert!($radarr_data.movie_monitor_list.items.is_empty());
|
||||
assert!($radarr_data
|
||||
.movie_minimum_availability_list
|
||||
.items
|
||||
.is_empty());
|
||||
assert!($radarr_data.movie_quality_profile_list.items.is_empty());
|
||||
assert!($radarr_data.monitor_list.items.is_empty());
|
||||
assert!($radarr_data.minimum_availability_list.items.is_empty());
|
||||
assert!($radarr_data.quality_profile_list.items.is_empty());
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -719,6 +824,7 @@ pub mod radarr_test_utils {
|
||||
mod tests {
|
||||
mod radarr_data_tests {
|
||||
use bimap::BiMap;
|
||||
use chrono::{DateTime, Utc};
|
||||
use pretty_assertions::{assert_eq, assert_str_eq};
|
||||
use rstest::rstest;
|
||||
use serde_json::Number;
|
||||
@@ -726,8 +832,10 @@ mod tests {
|
||||
|
||||
use crate::app::radarr::radarr_test_utils::create_test_radarr_data;
|
||||
use crate::app::radarr::{ActiveRadarrBlock, RadarrData};
|
||||
use crate::models::radarr_models::{MinimumAvailability, Monitor, Movie};
|
||||
use crate::models::{HorizontallyScrollableText, Route, StatefulTable};
|
||||
use crate::models::radarr_models::{Collection, MinimumAvailability, Monitor, Movie};
|
||||
use crate::models::HorizontallyScrollableText;
|
||||
use crate::models::Route;
|
||||
use crate::models::StatefulTable;
|
||||
|
||||
#[test]
|
||||
fn test_from_tuple_to_route_with_context() {
|
||||
@@ -780,30 +888,31 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reset_edit_movie() {
|
||||
fn test_reset_add_edit_media_fields() {
|
||||
let mut radarr_data = RadarrData {
|
||||
edit_monitored: Some(true),
|
||||
edit_search_on_add: Some(true),
|
||||
edit_path: "test path".to_owned().into(),
|
||||
edit_tags: "test tag".to_owned().into(),
|
||||
..RadarrData::default()
|
||||
};
|
||||
|
||||
radarr_data.reset_add_edit_movie_fields();
|
||||
radarr_data.reset_add_edit_media_fields();
|
||||
|
||||
assert_edit_movie_reset!(radarr_data);
|
||||
assert_edit_media_reset!(radarr_data);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_reset_movie_preferences_selections() {
|
||||
fn test_reset_preferences_selections() {
|
||||
let mut radarr_data = create_test_radarr_data();
|
||||
|
||||
radarr_data.reset_movie_preferences_selections();
|
||||
radarr_data.reset_preferences_selections();
|
||||
|
||||
assert_movie_preferences_selections_reset!(radarr_data);
|
||||
assert_preferences_selections_reset!(radarr_data);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_populate_movie_preferences_lists() {
|
||||
fn test_populate_preferences_lists() {
|
||||
let mut radarr_data = RadarrData {
|
||||
quality_profile_map: BiMap::from_iter([
|
||||
(2222, "HD - 1080p".to_owned()),
|
||||
@@ -812,18 +921,18 @@ mod tests {
|
||||
..RadarrData::default()
|
||||
};
|
||||
|
||||
radarr_data.populate_movie_preferences_lists();
|
||||
radarr_data.populate_preferences_lists();
|
||||
|
||||
assert_eq!(
|
||||
radarr_data.movie_monitor_list.items,
|
||||
radarr_data.monitor_list.items,
|
||||
Vec::from_iter(Monitor::iter())
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.movie_minimum_availability_list.items,
|
||||
radarr_data.minimum_availability_list.items,
|
||||
Vec::from_iter(MinimumAvailability::iter())
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.movie_quality_profile_list.items,
|
||||
radarr_data.quality_profile_list.items,
|
||||
vec!["Any".to_owned(), "HD - 1080p".to_owned()]
|
||||
);
|
||||
}
|
||||
@@ -860,27 +969,236 @@ mod tests {
|
||||
radarr_data.populate_edit_movie_fields();
|
||||
|
||||
assert_eq!(
|
||||
radarr_data.movie_minimum_availability_list.items,
|
||||
radarr_data.minimum_availability_list.items,
|
||||
Vec::from_iter(MinimumAvailability::iter())
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data
|
||||
.movie_minimum_availability_list
|
||||
.current_selection(),
|
||||
radarr_data.minimum_availability_list.current_selection(),
|
||||
&MinimumAvailability::Released
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.movie_quality_profile_list.items,
|
||||
radarr_data.quality_profile_list.items,
|
||||
vec!["Any".to_owned(), "HD - 1080p".to_owned()]
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_quality_profile_list.current_selection(),
|
||||
radarr_data.quality_profile_list.current_selection(),
|
||||
"HD - 1080p"
|
||||
);
|
||||
assert_str_eq!(radarr_data.edit_path.text, "/nfs/movies/Test");
|
||||
assert_str_eq!(radarr_data.edit_tags.text, "usenet, test");
|
||||
assert_eq!(radarr_data.edit_monitored, Some(true));
|
||||
}
|
||||
|
||||
#[rstest]
|
||||
fn test_populate_edit_collection_fields(
|
||||
#[values(true, false)] test_filtered_collections: bool,
|
||||
) {
|
||||
let mut radarr_data = RadarrData {
|
||||
edit_path: HorizontallyScrollableText::default(),
|
||||
edit_monitored: None,
|
||||
edit_search_on_add: None,
|
||||
quality_profile_map: BiMap::from_iter([
|
||||
(2222, "HD - 1080p".to_owned()),
|
||||
(1111, "Any".to_owned()),
|
||||
]),
|
||||
filtered_collections: StatefulTable::default(),
|
||||
..create_test_radarr_data()
|
||||
};
|
||||
let collection = Collection {
|
||||
root_folder_path: Some("/nfs/movies/Test".to_owned()),
|
||||
monitored: true,
|
||||
search_on_add: true,
|
||||
quality_profile_id: Number::from(2222),
|
||||
minimum_availability: MinimumAvailability::Released,
|
||||
..Collection::default()
|
||||
};
|
||||
|
||||
if test_filtered_collections {
|
||||
radarr_data.filtered_collections.set_items(vec![collection]);
|
||||
} else {
|
||||
radarr_data.collections.set_items(vec![collection]);
|
||||
}
|
||||
|
||||
radarr_data.populate_edit_collection_fields();
|
||||
|
||||
assert_eq!(
|
||||
radarr_data.minimum_availability_list.items,
|
||||
Vec::from_iter(MinimumAvailability::iter())
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.minimum_availability_list.current_selection(),
|
||||
&MinimumAvailability::Released
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.quality_profile_list.items,
|
||||
vec!["Any".to_owned(), "HD - 1080p".to_owned()]
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.quality_profile_list.current_selection(),
|
||||
"HD - 1080p"
|
||||
);
|
||||
assert_str_eq!(radarr_data.edit_path.text, "/nfs/movies/Test");
|
||||
assert_eq!(radarr_data.edit_monitored, Some(true));
|
||||
assert_eq!(radarr_data.edit_search_on_add, Some(true));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_radarr_data_defaults() {
|
||||
let radarr_data = RadarrData::default();
|
||||
|
||||
assert_eq!(radarr_data.root_folders, Vec::new());
|
||||
assert_eq!(radarr_data.disk_space_vec, Vec::new());
|
||||
assert!(radarr_data.version.is_empty());
|
||||
assert_eq!(radarr_data.start_time, <DateTime<Utc>>::default());
|
||||
assert!(radarr_data.movies.items.is_empty());
|
||||
assert!(radarr_data.add_searched_movies.items.is_empty());
|
||||
assert!(radarr_data.monitor_list.items.is_empty());
|
||||
assert!(radarr_data.minimum_availability_list.items.is_empty());
|
||||
assert!(radarr_data.quality_profile_list.items.is_empty());
|
||||
assert_eq!(
|
||||
radarr_data.selected_block,
|
||||
ActiveRadarrBlock::AddMovieSelectMonitor
|
||||
);
|
||||
assert!(radarr_data.filtered_movies.items.is_empty());
|
||||
assert!(radarr_data.downloads.items.is_empty());
|
||||
assert!(radarr_data.quality_profile_map.is_empty());
|
||||
assert!(radarr_data.tags_map.is_empty());
|
||||
assert!(radarr_data.file_details.is_empty());
|
||||
assert!(radarr_data.audio_details.is_empty());
|
||||
assert!(radarr_data.video_details.is_empty());
|
||||
assert!(radarr_data.movie_details.get_text().is_empty());
|
||||
assert!(radarr_data.movie_history.items.is_empty());
|
||||
assert!(radarr_data.movie_cast.items.is_empty());
|
||||
assert!(radarr_data.movie_crew.items.is_empty());
|
||||
assert!(radarr_data.movie_releases.items.is_empty());
|
||||
assert!(radarr_data.movie_releases_sort.items.is_empty());
|
||||
assert!(radarr_data.collections.items.is_empty());
|
||||
assert!(radarr_data.filtered_collections.items.is_empty());
|
||||
assert!(radarr_data.collection_movies.items.is_empty());
|
||||
assert!(radarr_data.prompt_confirm_action.is_none());
|
||||
assert!(radarr_data.search.text.is_empty());
|
||||
assert!(radarr_data.filter.text.is_empty());
|
||||
assert!(radarr_data.edit_path.text.is_empty());
|
||||
assert!(radarr_data.edit_tags.text.is_empty());
|
||||
assert!(radarr_data.edit_monitored.is_none());
|
||||
assert!(radarr_data.edit_search_on_add.is_none());
|
||||
assert!(radarr_data.sort_ascending.is_none());
|
||||
assert!(!radarr_data.is_searching);
|
||||
assert!(!radarr_data.is_filtering);
|
||||
assert!(!radarr_data.prompt_confirm);
|
||||
|
||||
assert_eq!(radarr_data.main_tabs.tabs.len(), 3);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[0].title, "Library");
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[0].route,
|
||||
ActiveRadarrBlock::Movies.into()
|
||||
);
|
||||
assert!(radarr_data.main_tabs.tabs[0].help.is_empty());
|
||||
assert_eq!(radarr_data.main_tabs.tabs[0].contextual_help,
|
||||
Some("<a> add | <e> edit | <s> search | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter | <del> delete".to_owned()));
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[1].title, "Downloads");
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[1].route,
|
||||
ActiveRadarrBlock::Downloads.into()
|
||||
);
|
||||
assert!(radarr_data.main_tabs.tabs[1].help.is_empty());
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[1].contextual_help,
|
||||
Some("<r> refresh | <del> delete".to_owned())
|
||||
);
|
||||
|
||||
assert_str_eq!(radarr_data.main_tabs.tabs[2].title, "Collections");
|
||||
assert_eq!(
|
||||
radarr_data.main_tabs.tabs[2].route,
|
||||
ActiveRadarrBlock::Collections.into()
|
||||
);
|
||||
assert!(radarr_data.main_tabs.tabs[2].help.is_empty());
|
||||
assert_eq!(radarr_data.main_tabs.tabs[2].contextual_help,
|
||||
Some("<s> search | <e> edit | <f> filter | <r> refresh | <u> update all | <enter> details | <esc> cancel filter".to_owned()));
|
||||
|
||||
assert_eq!(radarr_data.movie_info_tabs.tabs.len(), 6);
|
||||
|
||||
assert_str_eq!(radarr_data.movie_info_tabs.tabs[0].title, "Details");
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[0].route,
|
||||
ActiveRadarrBlock::MovieDetails.into()
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[0].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[0]
|
||||
.contextual_help
|
||||
.is_none());
|
||||
|
||||
assert_str_eq!(radarr_data.movie_info_tabs.tabs[1].title, "History");
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[1].route,
|
||||
ActiveRadarrBlock::MovieHistory.into()
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[1].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[1]
|
||||
.contextual_help
|
||||
.is_none());
|
||||
|
||||
assert_str_eq!(radarr_data.movie_info_tabs.tabs[2].title, "File");
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[2].route,
|
||||
ActiveRadarrBlock::FileInfo.into()
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[2].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[2]
|
||||
.contextual_help
|
||||
.is_none());
|
||||
|
||||
assert_str_eq!(radarr_data.movie_info_tabs.tabs[3].title, "Cast");
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[3].route,
|
||||
ActiveRadarrBlock::Cast.into()
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[3].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[3]
|
||||
.contextual_help
|
||||
.is_none());
|
||||
|
||||
assert_str_eq!(radarr_data.movie_info_tabs.tabs[4].title, "Crew");
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[4].route,
|
||||
ActiveRadarrBlock::Crew.into()
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[4].help,
|
||||
"<r> refresh | <u> update | <e> edit | <s> auto search | <esc> close"
|
||||
);
|
||||
assert!(radarr_data.movie_info_tabs.tabs[4]
|
||||
.contextual_help
|
||||
.is_none());
|
||||
|
||||
assert_str_eq!(radarr_data.movie_info_tabs.tabs[5].title, "Manual Search");
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[5].route,
|
||||
ActiveRadarrBlock::ManualSearch.into()
|
||||
);
|
||||
assert_str_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[5].help,
|
||||
"<r> refresh | <u> update | <e> edit | <o> sort | <s> auto search | <esc> close"
|
||||
);
|
||||
assert_eq!(
|
||||
radarr_data.movie_info_tabs.tabs[5].contextual_help,
|
||||
Some("<enter> details".to_owned())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
mod active_radarr_block_tests {
|
||||
@@ -889,128 +1207,215 @@ mod tests {
|
||||
use crate::app::radarr::ActiveRadarrBlock;
|
||||
|
||||
#[test]
|
||||
fn test_next_add_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::AddMovieSelectMonitor.next_add_prompt_block();
|
||||
fn test_next_add_movie_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::AddMovieSelectMonitor.next_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
|
||||
);
|
||||
|
||||
let active_block = active_block.next_add_prompt_block();
|
||||
let active_block = active_block.next_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::AddMovieSelectQualityProfile
|
||||
);
|
||||
|
||||
let active_block = active_block.next_add_prompt_block();
|
||||
let active_block = active_block.next_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::AddMovieTagsInput);
|
||||
|
||||
let active_block = active_block.next_add_prompt_block();
|
||||
let active_block = active_block.next_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::AddMovieConfirmPrompt);
|
||||
|
||||
let active_block = active_block.next_add_prompt_block();
|
||||
let active_block = active_block.next_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::AddMovieSelectMonitor);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_next_edit_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::EditMovieToggleMonitored.next_edit_prompt_block();
|
||||
fn test_next_edit_movie_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::EditMovieToggleMonitored.next_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
|
||||
);
|
||||
|
||||
let active_block = active_block.next_edit_prompt_block();
|
||||
let active_block = active_block.next_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditMovieSelectQualityProfile
|
||||
);
|
||||
|
||||
let active_block = active_block.next_edit_prompt_block();
|
||||
let active_block = active_block.next_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMoviePathInput);
|
||||
|
||||
let active_block = active_block.next_edit_prompt_block();
|
||||
let active_block = active_block.next_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMovieTagsInput);
|
||||
|
||||
let active_block = active_block.next_edit_prompt_block();
|
||||
let active_block = active_block.next_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMovieConfirmPrompt);
|
||||
|
||||
let active_block = active_block.next_edit_prompt_block();
|
||||
let active_block = active_block.next_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMovieToggleMonitored);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_previous_add_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::AddMovieSelectMonitor.previous_add_prompt_block();
|
||||
fn test_next_edit_collection_prompt_block() {
|
||||
let active_block =
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored.next_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
|
||||
);
|
||||
|
||||
let active_block = active_block.next_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile
|
||||
);
|
||||
|
||||
let active_block = active_block.next_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput
|
||||
);
|
||||
|
||||
let active_block = active_block.next_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
|
||||
);
|
||||
|
||||
let active_block = active_block.next_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditCollectionConfirmPrompt);
|
||||
|
||||
let active_block = active_block.next_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_previous_add_movie_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::AddMovieSelectMonitor.previous_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::AddMovieConfirmPrompt);
|
||||
|
||||
let active_block = active_block.previous_add_prompt_block();
|
||||
let active_block = active_block.previous_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::AddMovieTagsInput);
|
||||
|
||||
let active_block = active_block.previous_add_prompt_block();
|
||||
let active_block = active_block.previous_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::AddMovieSelectQualityProfile
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_add_prompt_block();
|
||||
let active_block = active_block.previous_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::AddMovieSelectMinimumAvailability
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_add_prompt_block();
|
||||
let active_block = active_block.previous_add_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::AddMovieSelectMonitor);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_previous_edit_prompt_block() {
|
||||
let active_block = ActiveRadarrBlock::EditMovieToggleMonitored.previous_edit_prompt_block();
|
||||
fn test_previous_edit_movie_prompt_block() {
|
||||
let active_block =
|
||||
ActiveRadarrBlock::EditMovieToggleMonitored.previous_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMovieConfirmPrompt);
|
||||
|
||||
let active_block = active_block.previous_edit_prompt_block();
|
||||
let active_block = active_block.previous_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMovieTagsInput);
|
||||
|
||||
let active_block = active_block.previous_edit_prompt_block();
|
||||
let active_block = active_block.previous_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMoviePathInput);
|
||||
|
||||
let active_block = active_block.previous_edit_prompt_block();
|
||||
let active_block = active_block.previous_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditMovieSelectQualityProfile
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_edit_prompt_block();
|
||||
let active_block = active_block.previous_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditMovieSelectMinimumAvailability
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_edit_prompt_block();
|
||||
let active_block = active_block.previous_edit_movie_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditMovieToggleMonitored);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_previous_edit_collection_prompt_block() {
|
||||
let active_block =
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored.previous_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(active_block, ActiveRadarrBlock::EditCollectionConfirmPrompt);
|
||||
|
||||
let active_block = active_block.previous_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionToggleSearchOnAdd
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionRootFolderPathInput
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionSelectQualityProfile
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionSelectMinimumAvailability
|
||||
);
|
||||
|
||||
let active_block = active_block.previous_edit_collection_prompt_block();
|
||||
|
||||
assert_eq!(
|
||||
active_block,
|
||||
ActiveRadarrBlock::EditCollectionToggleMonitored
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
mod radarr_tests {
|
||||
@@ -1430,6 +1835,10 @@ mod tests {
|
||||
.radarr_on_tick(ActiveRadarrBlock::Downloads, false)
|
||||
.await;
|
||||
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetDownloads.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetQualityProfiles.into()
|
||||
@@ -1446,6 +1855,24 @@ mod tests {
|
||||
assert!(!app.data.radarr_data.prompt_confirm);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_radarr_on_tick_should_refresh() {
|
||||
let (mut app, mut sync_network_rx) = construct_app_unit();
|
||||
app.should_refresh = true;
|
||||
|
||||
app
|
||||
.radarr_on_tick(ActiveRadarrBlock::Downloads, false)
|
||||
.await;
|
||||
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetDownloads.into()
|
||||
);
|
||||
assert!(app.is_loading);
|
||||
assert!(app.should_refresh);
|
||||
assert!(!app.data.radarr_data.prompt_confirm);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_radarr_on_tick_network_tick_frequency() {
|
||||
let (mut app, mut sync_network_rx) = construct_app_unit();
|
||||
@@ -1456,6 +1883,10 @@ mod tests {
|
||||
.radarr_on_tick(ActiveRadarrBlock::Downloads, false)
|
||||
.await;
|
||||
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetDownloads.into()
|
||||
);
|
||||
assert_eq!(
|
||||
sync_network_rx.recv().await.unwrap(),
|
||||
RadarrEvent::GetQualityProfiles.into()
|
||||
|
||||
Reference in New Issue
Block a user