Added the full Radarr CLI so users can programmatically access all the same management features as in the TUI

This commit is contained in:
2024-10-29 18:47:40 -06:00
parent 217d3242a8
commit 1f8d72c939
65 changed files with 9401 additions and 1370 deletions
@@ -367,7 +367,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::AddMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddMovie);
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddMovie(None));
}
self.app.pop_navigation_stack();
@@ -416,6 +416,8 @@ mod tests {
}
mod test_handle_home_end {
use std::sync::atomic::Ordering;
use strum::IntoEnumIterator;
use crate::extended_stateful_iterable_vec;
@@ -769,14 +771,14 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_search
.as_ref()
.unwrap()
.offset
.borrow(),
.load(Ordering::SeqCst),
4
);
@@ -789,14 +791,14 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_search
.as_ref()
.unwrap()
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
@@ -818,7 +820,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_modal
@@ -826,7 +828,7 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
4
);
@@ -839,7 +841,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_modal
@@ -847,13 +849,15 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
}
mod test_handle_left_right_action {
use std::sync::atomic::Ordering;
use crate::models::servarr_data::radarr::modals::AddMovieModal;
use rstest::rstest;
@@ -886,14 +890,14 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_search
.as_ref()
.unwrap()
.offset
.borrow(),
.load(Ordering::SeqCst),
1
);
@@ -906,14 +910,14 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_search
.as_ref()
.unwrap()
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
@@ -935,7 +939,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_modal
@@ -943,7 +947,7 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
1
);
@@ -956,7 +960,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.add_movie_modal
@@ -964,7 +968,7 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
@@ -1211,7 +1215,7 @@ mod tests {
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert_eq!(
app.data.radarr_data.prompt_confirm_action,
Some(RadarrEvent::AddMovie)
Some(RadarrEvent::AddMovie(None))
);
assert!(app.data.radarr_data.add_movie_modal.is_some());
}
@@ -71,7 +71,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<'
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::DeleteMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie);
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(None));
self.app.should_refresh = true;
} else {
self.app.data.radarr_data.reset_delete_movie_preferences();
@@ -150,7 +150,7 @@ mod tests {
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert_eq!(
app.data.radarr_data.prompt_confirm_action,
Some(RadarrEvent::DeleteMovie)
Some(RadarrEvent::DeleteMovie(None))
);
assert!(app.should_refresh);
assert!(app.data.radarr_data.prompt_confirm);
@@ -222,7 +222,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::EditMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditMovie);
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditMovie(None));
self.app.should_refresh = true;
}
@@ -182,6 +182,8 @@ mod tests {
}
mod test_handle_home_end {
use std::sync::atomic::Ordering;
use strum::IntoEnumIterator;
use crate::models::servarr_data::radarr::modals::EditMovieModal;
@@ -318,7 +320,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -326,7 +328,7 @@ mod tests {
.unwrap()
.path
.offset
.borrow(),
.load(Ordering::SeqCst),
4
);
@@ -339,7 +341,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -347,7 +349,7 @@ mod tests {
.unwrap()
.path
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
@@ -369,7 +371,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -377,7 +379,7 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
4
);
@@ -390,7 +392,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -398,13 +400,15 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
}
mod test_handle_left_right_action {
use std::sync::atomic::Ordering;
use crate::models::servarr_data::radarr::modals::EditMovieModal;
use rstest::rstest;
@@ -440,7 +444,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -448,7 +452,7 @@ mod tests {
.unwrap()
.path
.offset
.borrow(),
.load(Ordering::SeqCst),
1
);
@@ -461,7 +465,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -469,7 +473,7 @@ mod tests {
.unwrap()
.path
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
@@ -491,7 +495,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -499,7 +503,7 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
1
);
@@ -512,7 +516,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.edit_movie_modal
@@ -520,7 +524,7 @@ mod tests {
.unwrap()
.tags
.offset
.borrow(),
.load(Ordering::SeqCst),
0
);
}
@@ -661,7 +665,7 @@ mod tests {
assert_eq!(app.get_current_route(), &ActiveRadarrBlock::Movies.into());
assert_eq!(
app.data.radarr_data.prompt_confirm_action,
Some(RadarrEvent::EditMovie)
Some(RadarrEvent::EditMovie(None))
);
assert!(app.data.radarr_data.edit_movie_modal.is_some());
assert!(app.should_refresh);
@@ -1,5 +1,6 @@
#[cfg(test)]
mod tests {
use core::sync::atomic::Ordering::SeqCst;
use pretty_assertions::{assert_eq, assert_str_eq};
use rstest::rstest;
use std::cmp::Ordering;
@@ -213,7 +214,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -221,7 +222,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
4
);
@@ -234,7 +235,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -242,7 +243,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
0
);
}
@@ -266,7 +267,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -274,7 +275,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
4
);
@@ -287,7 +288,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -295,7 +296,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
0
);
}
@@ -488,7 +489,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -496,7 +497,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
1
);
@@ -509,7 +510,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -517,7 +518,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
0
);
}
@@ -536,7 +537,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -544,7 +545,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
1
);
@@ -557,7 +558,7 @@ mod tests {
.handle();
assert_eq!(
*app
app
.data
.radarr_data
.movies
@@ -565,7 +566,7 @@ mod tests {
.as_ref()
.unwrap()
.offset
.borrow(),
.load(SeqCst),
0
);
}
@@ -349,14 +349,14 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
ActiveRadarrBlock::AutomaticallySearchMoviePrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::TriggerAutomaticSearch);
Some(RadarrEvent::TriggerAutomaticSearch(None));
}
self.app.pop_navigation_stack();
}
ActiveRadarrBlock::UpdateAndScanPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan);
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None));
}
self.app.pop_navigation_stack();
@@ -368,7 +368,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
}
ActiveRadarrBlock::ManualSearchConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DownloadRelease);
self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::DownloadRelease(None));
}
self.app.pop_navigation_stack();
@@ -1292,12 +1292,15 @@ mod tests {
#[rstest]
#[case(
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
RadarrEvent::TriggerAutomaticSearch
RadarrEvent::TriggerAutomaticSearch(None)
)]
#[case(
ActiveRadarrBlock::UpdateAndScanPrompt,
RadarrEvent::UpdateAndScan(None)
)]
#[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan)]
#[case(
ActiveRadarrBlock::ManualSearchConfirmPrompt,
RadarrEvent::DownloadRelease
RadarrEvent::DownloadRelease(None)
)]
fn test_movie_info_prompt_confirm_submit(
#[case] prompt_block: ActiveRadarrBlock,