fix(radarr): Provide the movie ID alongside all TriggerAutomaticMovieSearch events when publishing to the networking channel

This commit is contained in:
2024-12-17 21:26:34 -07:00
parent 8d071c7674
commit cb8035a2ce
32 changed files with 320 additions and 224 deletions
+21 -12
View File
@@ -103,17 +103,23 @@ impl<'a> App<'a> {
} }
ActiveRadarrBlock::AddMovieSearchResults => { ActiveRadarrBlock::AddMovieSearchResults => {
self self
.dispatch_network_event(RadarrEvent::SearchNewMovie(self.extract_movie_search_query().await).into()) .dispatch_network_event(
RadarrEvent::SearchNewMovie(self.extract_movie_search_query().await).into(),
)
.await; .await;
} }
ActiveRadarrBlock::MovieDetails | ActiveRadarrBlock::FileInfo => { ActiveRadarrBlock::MovieDetails | ActiveRadarrBlock::FileInfo => {
self self
.dispatch_network_event(RadarrEvent::GetMovieDetails(self.extract_movie_id().await).into()) .dispatch_network_event(
RadarrEvent::GetMovieDetails(self.extract_movie_id().await).into(),
)
.await; .await;
} }
ActiveRadarrBlock::MovieHistory => { ActiveRadarrBlock::MovieHistory => {
self self
.dispatch_network_event(RadarrEvent::GetMovieHistory(self.extract_movie_id().await).into()) .dispatch_network_event(
RadarrEvent::GetMovieHistory(self.extract_movie_id().await).into(),
)
.await; .await;
} }
ActiveRadarrBlock::Cast | ActiveRadarrBlock::Crew => { ActiveRadarrBlock::Cast | ActiveRadarrBlock::Crew => {
@@ -123,7 +129,9 @@ impl<'a> App<'a> {
|| movie_details_modal.movie_crew.items.is_empty() => || movie_details_modal.movie_crew.items.is_empty() =>
{ {
self self
.dispatch_network_event(RadarrEvent::GetMovieCredits(self.extract_movie_id().await).into()) .dispatch_network_event(
RadarrEvent::GetMovieCredits(self.extract_movie_id().await).into(),
)
.await; .await;
} }
_ => (), _ => (),
@@ -221,17 +229,18 @@ impl<'a> App<'a> {
} }
async fn extract_movie_id(&self) -> i64 { async fn extract_movie_id(&self) -> i64 {
self self.data.radarr_data.movies.current_selection().clone().id
.data
.radarr_data
.movies
.current_selection()
.clone()
.id
} }
async fn extract_movie_search_query(&self) -> String { async fn extract_movie_search_query(&self) -> String {
self.data.radarr_data.add_movie_search.as_ref().expect("Add movie search is empty").text.clone() self
.data
.radarr_data
.add_movie_search
.as_ref()
.expect("Add movie search is empty")
.text
.clone()
} }
async fn extract_indexer_id(&self) -> i64 { async fn extract_indexer_id(&self) -> i64 {
+3 -1
View File
@@ -138,7 +138,9 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrAddCommand> for RadarrAddCommandHan
serde_json::to_string_pretty(&resp)? serde_json::to_string_pretty(&resp)?
} }
RadarrAddCommand::RootFolder { root_folder_path } => { RadarrAddCommand::RootFolder { root_folder_path } => {
let add_root_folder_body = AddRootFolderBody { path: root_folder_path }; let add_root_folder_body = AddRootFolderBody {
path: root_folder_path,
};
let resp = self let resp = self
.network .network
.handle_network_event(RadarrEvent::AddRootFolder(add_root_folder_body).into()) .handle_network_event(RadarrEvent::AddRootFolder(add_root_folder_body).into())
+3 -1
View File
@@ -422,7 +422,9 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn test_handle_add_root_folder_command() { async fn test_handle_add_root_folder_command() {
let expected_root_folder_path = "/nfs/test".to_owned(); let expected_root_folder_path = "/nfs/test".to_owned();
let expected_add_root_folder_body = AddRootFolderBody { path: expected_root_folder_path.clone() }; let expected_add_root_folder_body = AddRootFolderBody {
path: expected_root_folder_path.clone(),
};
let mut mock_network = MockNetworkTrait::new(); let mut mock_network = MockNetworkTrait::new();
mock_network mock_network
.expect_handle_network_event() .expect_handle_network_event()
+1 -1
View File
@@ -253,7 +253,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrCommand> for RadarrCliHandler<'a, '
RadarrCommand::TriggerAutomaticSearch { movie_id } => { RadarrCommand::TriggerAutomaticSearch { movie_id } => {
let resp = self let resp = self
.network .network
.handle_network_event(RadarrEvent::TriggerAutomaticSearch(Some(movie_id)).into()) .handle_network_event(RadarrEvent::TriggerAutomaticSearch(movie_id).into())
.await?; .await?;
serde_json::to_string_pretty(&resp)? serde_json::to_string_pretty(&resp)?
} }
+1 -1
View File
@@ -468,7 +468,7 @@ mod tests {
mock_network mock_network
.expect_handle_network_event() .expect_handle_network_event()
.with(eq::<NetworkEvent>( .with(eq::<NetworkEvent>(
RadarrEvent::TriggerAutomaticSearch(Some(expected_movie_id)).into(), RadarrEvent::TriggerAutomaticSearch(expected_movie_id).into(),
)) ))
.times(1) .times(1)
.returning(|_| { .returning(|_| {
@@ -551,7 +551,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::Blocklist, ActiveRadarrBlock::Blocklist,
None, None,
).extract_blocklist_item_id(); )
.extract_blocklist_item_id();
assert_eq!(blocklist_item_id, 3); assert_eq!(blocklist_item_id, 3);
} }
+7 -11
View File
@@ -30,13 +30,7 @@ impl<'a, 'b> BlocklistHandler<'a, 'b> {
); );
fn extract_blocklist_item_id(&self) -> i64 { fn extract_blocklist_item_id(&self) -> i64 {
self self.app.data.radarr_data.blocklist.current_selection().id
.app
.data
.radarr_data
.blocklist
.current_selection()
.id
} }
} }
@@ -108,8 +102,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for BlocklistHandler<'a,
match self.active_radarr_block { match self.active_radarr_block {
ActiveRadarrBlock::DeleteBlocklistItemPrompt => { ActiveRadarrBlock::DeleteBlocklistItemPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteBlocklistItem(
Some(RadarrEvent::DeleteBlocklistItem(self.extract_blocklist_item_id())); self.extract_blocklist_item_id(),
));
} }
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -161,8 +156,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for BlocklistHandler<'a,
ActiveRadarrBlock::DeleteBlocklistItemPrompt => { ActiveRadarrBlock::DeleteBlocklistItemPrompt => {
if key == DEFAULT_KEYBINDINGS.confirm.key { if key == DEFAULT_KEYBINDINGS.confirm.key {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteBlocklistItem(
Some(RadarrEvent::DeleteBlocklistItem(self.extract_blocklist_item_id())); self.extract_blocklist_item_id(),
));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
@@ -29,9 +29,16 @@ impl<'a, 'b> EditCollectionHandler<'a, 'b> {
minimum_availability_list, minimum_availability_list,
monitored, monitored,
quality_profile_list, quality_profile_list,
} = self.app.data.radarr_data.edit_collection_modal.as_ref().unwrap(); } = self
.app
.data
.radarr_data
.edit_collection_modal
.as_ref()
.unwrap();
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self.app let quality_profile_id = *self
.app
.data .data
.radarr_data .radarr_data
.quality_profile_map .quality_profile_map
@@ -47,14 +54,13 @@ impl<'a, 'b> EditCollectionHandler<'a, 'b> {
let minimum_availability = *minimum_availability_list.current_selection(); let minimum_availability = *minimum_availability_list.current_selection();
self.app.data.radarr_data.edit_collection_modal = None; self.app.data.radarr_data.edit_collection_modal = None;
EditCollectionParams { EditCollectionParams {
collection_id, collection_id,
monitored: Some(monitored), monitored: Some(monitored),
minimum_availability: Some(minimum_availability), minimum_availability: Some(minimum_availability),
quality_profile_id: Some(quality_profile_id), quality_profile_id: Some(quality_profile_id),
root_folder_path: Some(root_folder_path), root_folder_path: Some(root_folder_path),
search_on_add: Some(search_on_add) search_on_add: Some(search_on_add),
} }
} }
} }
@@ -231,8 +237,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditCollectionHandle
match self.app.data.radarr_data.selected_block.get_active_block() { match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::EditCollectionConfirmPrompt => { ActiveRadarrBlock::EditCollectionConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditCollection(
Some(RadarrEvent::EditCollection(self.build_edit_collection_params())); self.build_edit_collection_params(),
));
self.app.should_refresh = true; self.app.should_refresh = true;
} }
@@ -351,7 +358,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditCollectionHandle
&& key == DEFAULT_KEYBINDINGS.confirm.key && key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditCollection(self.build_edit_collection_params())); self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditCollection(
self.build_edit_collection_params(),
));
self.app.should_refresh = true; self.app.should_refresh = true;
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -1056,7 +1056,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::EditCollectionPrompt, ActiveRadarrBlock::EditCollectionPrompt,
None, None,
).build_edit_collection_params(); )
.build_edit_collection_params();
assert_eq!(edit_collection_params, expected_edit_collection_params); assert_eq!(edit_collection_params, expected_edit_collection_params);
assert!(app.data.radarr_data.edit_collection_modal.is_none()); assert!(app.data.radarr_data.edit_collection_modal.is_none());
@@ -390,14 +390,19 @@ mod tests {
#[test] #[test]
fn test_extract_download_id() { fn test_extract_download_id() {
let mut app = App::default(); let mut app = App::default();
app.data.radarr_data.downloads.set_items(vec![download_record()]); app
.data
.radarr_data
.downloads
.set_items(vec![download_record()]);
let download_id = DownloadsHandler::with( let download_id = DownloadsHandler::with(
DEFAULT_KEYBINDINGS.esc.key, DEFAULT_KEYBINDINGS.esc.key,
&mut app, &mut app,
ActiveRadarrBlock::Downloads, ActiveRadarrBlock::Downloads,
None, None,
).extract_download_id(); )
.extract_download_id();
assert_eq!(download_id, 1); assert_eq!(download_id, 1);
} }
@@ -29,13 +29,7 @@ impl<'a, 'b> DownloadsHandler<'a, 'b> {
); );
fn extract_download_id(&self) -> i64 { fn extract_download_id(&self) -> i64 {
self self.app.data.radarr_data.downloads.current_selection().id
.app
.data
.radarr_data
.downloads
.current_selection()
.id
} }
} }
@@ -105,7 +99,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DownloadsHandler<'a,
match self.active_radarr_block { match self.active_radarr_block {
ActiveRadarrBlock::DeleteDownloadPrompt => { ActiveRadarrBlock::DeleteDownloadPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteDownload(self.extract_download_id())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::DeleteDownload(self.extract_download_id()));
} }
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -148,7 +143,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DownloadsHandler<'a,
ActiveRadarrBlock::DeleteDownloadPrompt => { ActiveRadarrBlock::DeleteDownloadPrompt => {
if key == DEFAULT_KEYBINDINGS.confirm.key { if key == DEFAULT_KEYBINDINGS.confirm.key {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteDownload(self.extract_download_id())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::DeleteDownload(self.extract_download_id()));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
@@ -44,7 +44,13 @@ impl<'a, 'b> EditIndexerHandler<'a, 'b> {
seed_ratio, seed_ratio,
priority, priority,
.. ..
} = self.app.data.radarr_data.edit_indexer_modal.as_ref().unwrap(); } = self
.app
.data
.radarr_data
.edit_indexer_modal
.as_ref()
.unwrap();
EditIndexerParams { EditIndexerParams {
indexer_id, indexer_id,
@@ -349,7 +355,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<'
match selected_block { match selected_block {
ActiveRadarrBlock::EditIndexerConfirmPrompt => { ActiveRadarrBlock::EditIndexerConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditIndexer(self.build_edit_indexer_params())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::EditIndexer(self.build_edit_indexer_params()));
self.app.should_refresh = true; self.app.should_refresh = true;
} else { } else {
self.app.data.radarr_data.edit_indexer_modal = None; self.app.data.radarr_data.edit_indexer_modal = None;
@@ -514,7 +521,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditIndexerHandler<'
&& self.key == DEFAULT_KEYBINDINGS.confirm.key && self.key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditIndexer(self.build_edit_indexer_params())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::EditIndexer(self.build_edit_indexer_params()));
self.app.should_refresh = true; self.app.should_refresh = true;
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -1828,7 +1828,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::EditIndexerPrompt, ActiveRadarrBlock::EditIndexerPrompt,
None, None,
).build_edit_indexer_params(); )
.build_edit_indexer_params();
assert_eq!(edit_indexer_params, expected_edit_indexer_params); assert_eq!(edit_indexer_params, expected_edit_indexer_params);
assert!(app.data.radarr_data.edit_indexer_modal.is_none()); assert!(app.data.radarr_data.edit_indexer_modal.is_none());
@@ -176,7 +176,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexerSettingsHandl
match self.app.data.radarr_data.selected_block.get_active_block() { match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::IndexerSettingsConfirmPrompt => { ActiveRadarrBlock::IndexerSettingsConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditAllIndexerSettings(self.build_edit_indexer_settings_body())); self.app.data.radarr_data.prompt_confirm_action = Some(
RadarrEvent::EditAllIndexerSettings(self.build_edit_indexer_settings_body()),
);
self.app.should_refresh = true; self.app.should_refresh = true;
} else { } else {
self.app.data.radarr_data.indexer_settings = None; self.app.data.radarr_data.indexer_settings = None;
@@ -266,8 +268,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexerSettingsHandl
&& self.key == DEFAULT_KEYBINDINGS.confirm.key && self.key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action = Some(
Some(RadarrEvent::EditAllIndexerSettings(self.build_edit_indexer_settings_body())); RadarrEvent::EditAllIndexerSettings(self.build_edit_indexer_settings_body()),
);
self.app.should_refresh = true; self.app.should_refresh = true;
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -980,7 +980,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::AllIndexerSettingsPrompt, ActiveRadarrBlock::AllIndexerSettingsPrompt,
None, None,
).build_edit_indexer_settings_body(); )
.build_edit_indexer_settings_body();
assert_eq!(body, indexer_settings()); assert_eq!(body, indexer_settings());
assert!(app.data.radarr_data.indexer_settings.is_none()); assert!(app.data.radarr_data.indexer_settings.is_none());
@@ -241,11 +241,7 @@ mod tests {
#[test] #[test]
fn test_delete_indexer_prompt_confirm_submit() { fn test_delete_indexer_prompt_confirm_submit() {
let mut app = App::default(); let mut app = App::default();
app app.data.radarr_data.indexers.set_items(vec![indexer()]);
.data
.radarr_data
.indexers
.set_items(vec![indexer()]);
app.data.radarr_data.prompt_confirm = true; app.data.radarr_data.prompt_confirm = true;
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.push_navigation_stack(ActiveRadarrBlock::DeleteIndexerPrompt.into()); app.push_navigation_stack(ActiveRadarrBlock::DeleteIndexerPrompt.into());
@@ -544,11 +540,7 @@ mod tests {
#[test] #[test]
fn test_delete_indexer_prompt_confirm() { fn test_delete_indexer_prompt_confirm() {
let mut app = App::default(); let mut app = App::default();
app app.data.radarr_data.indexers.set_items(vec![indexer()]);
.data
.radarr_data
.indexers
.set_items(vec![indexer()]);
app.push_navigation_stack(ActiveRadarrBlock::Indexers.into()); app.push_navigation_stack(ActiveRadarrBlock::Indexers.into());
app.push_navigation_stack(ActiveRadarrBlock::DeleteIndexerPrompt.into()); app.push_navigation_stack(ActiveRadarrBlock::DeleteIndexerPrompt.into());
@@ -651,7 +643,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::Indexers, ActiveRadarrBlock::Indexers,
None, None,
).extract_indexer_id(); )
.extract_indexer_id();
assert_eq!(indexer_id, 1); assert_eq!(indexer_id, 1);
} }
+3 -8
View File
@@ -35,13 +35,7 @@ impl<'a, 'b> IndexersHandler<'a, 'b> {
handle_table_events!(self, indexers, self.app.data.radarr_data.indexers, Indexer); handle_table_events!(self, indexers, self.app.data.radarr_data.indexers, Indexer);
fn extract_indexer_id(&self) -> i64 { fn extract_indexer_id(&self) -> i64 {
self self.app.data.radarr_data.indexers.current_selection().id
.app
.data
.radarr_data
.indexers
.current_selection()
.id
} }
} }
@@ -200,7 +194,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for IndexersHandler<'a,
ActiveRadarrBlock::DeleteIndexerPrompt => { ActiveRadarrBlock::DeleteIndexerPrompt => {
if key == DEFAULT_KEYBINDINGS.confirm.key { if key == DEFAULT_KEYBINDINGS.confirm.key {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteIndexer(self.extract_indexer_id())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::DeleteIndexer(self.extract_indexer_id()));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
@@ -1,7 +1,9 @@
use crate::app::key_binding::DEFAULT_KEYBINDINGS; use crate::app::key_binding::DEFAULT_KEYBINDINGS;
use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::table_handler::TableHandlingConfig;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::radarr_models::{AddMovieBody, AddMovieOptions, AddMovieSearchResult, CollectionMovie}; use crate::models::radarr_models::{
AddMovieBody, AddMovieOptions, AddMovieSearchResult, CollectionMovie,
};
use crate::models::servarr_data::radarr::modals::AddMovieModal; use crate::models::servarr_data::radarr::modals::AddMovieModal;
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS, ActiveRadarrBlock, ADD_MOVIE_BLOCKS, ADD_MOVIE_SELECTION_BLOCKS,
@@ -54,10 +56,10 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
quality_profile_list, quality_profile_list,
.. ..
} = self.app.data.radarr_data.add_movie_modal.as_ref().unwrap(); } = self.app.data.radarr_data.add_movie_modal.as_ref().unwrap();
let (tmdb_id, title) = if let Some(context) = self.context let (tmdb_id, title) = if let Some(context) = self.context {
{
if context == ActiveRadarrBlock::CollectionDetails { if context == ActiveRadarrBlock::CollectionDetails {
let CollectionMovie { tmdb_id, title, .. } = self.app let CollectionMovie { tmdb_id, title, .. } = self
.app
.data .data
.radarr_data .radarr_data
.collection_movies .collection_movies
@@ -65,7 +67,8 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
.clone(); .clone();
(tmdb_id, title.text) (tmdb_id, title.text)
} else { } else {
let AddMovieSearchResult { tmdb_id, title, .. } = self.app let AddMovieSearchResult { tmdb_id, title, .. } = self
.app
.data .data
.radarr_data .radarr_data
.add_searched_movies .add_searched_movies
@@ -76,7 +79,8 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
(tmdb_id, title.text) (tmdb_id, title.text)
} }
} else { } else {
let AddMovieSearchResult { tmdb_id, title, .. } = self.app let AddMovieSearchResult { tmdb_id, title, .. } = self
.app
.data .data
.radarr_data .radarr_data
.add_searched_movies .add_searched_movies
@@ -87,7 +91,8 @@ impl<'a, 'b> AddMovieHandler<'a, 'b> {
(tmdb_id, title.text) (tmdb_id, title.text)
}; };
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self.app let quality_profile_id = *self
.app
.data .data
.radarr_data .radarr_data
.quality_profile_map .quality_profile_map
@@ -446,7 +451,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
match self.app.data.radarr_data.selected_block.get_active_block() { match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::AddMovieConfirmPrompt => { ActiveRadarrBlock::AddMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddMovie(self.build_add_movie_body())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::AddMovie(self.build_add_movie_body()));
} }
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -546,7 +552,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for AddMovieHandler<'a,
&& key == DEFAULT_KEYBINDINGS.confirm.key && key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddMovie(self.build_add_movie_body())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::AddMovie(self.build_add_movie_body()));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
} }
@@ -22,11 +22,7 @@ impl<'a, 'b> DeleteMovieHandler<'a, 'b> {
let id = self.app.data.radarr_data.movies.current_selection().id; let id = self.app.data.radarr_data.movies.current_selection().id;
let delete_movie_files = self.app.data.radarr_data.delete_movie_files; let delete_movie_files = self.app.data.radarr_data.delete_movie_files;
let add_list_exclusion = self.app.data.radarr_data.add_list_exclusion; let add_list_exclusion = self.app.data.radarr_data.add_list_exclusion;
self self.app.data.radarr_data.reset_delete_movie_preferences();
.app
.data
.radarr_data
.reset_delete_movie_preferences();
DeleteMovieParams { DeleteMovieParams {
id, id,
@@ -92,7 +88,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<'
match self.app.data.radarr_data.selected_block.get_active_block() { match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::DeleteMovieConfirmPrompt => { ActiveRadarrBlock::DeleteMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(self.build_delete_movie_params())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::DeleteMovie(self.build_delete_movie_params()));
self.app.should_refresh = true; self.app.should_refresh = true;
} else { } else {
self.app.data.radarr_data.reset_delete_movie_preferences(); self.app.data.radarr_data.reset_delete_movie_preferences();
@@ -128,7 +125,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for DeleteMovieHandler<'
&& self.key == DEFAULT_KEYBINDINGS.confirm.key && self.key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DeleteMovie(self.build_delete_movie_params())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::DeleteMovie(self.build_delete_movie_params()));
self.app.should_refresh = true; self.app.should_refresh = true;
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -330,7 +330,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::DeleteMoviePrompt, ActiveRadarrBlock::DeleteMoviePrompt,
None, None,
).build_delete_movie_params(); )
.build_delete_movie_params();
assert_eq!(delete_movie_params, expected_delete_movie_params); assert_eq!(delete_movie_params, expected_delete_movie_params);
assert!(!app.data.radarr_data.delete_movie_files); assert!(!app.data.radarr_data.delete_movie_files);
@@ -23,7 +23,16 @@ pub(super) struct EditMovieHandler<'a, 'b> {
impl<'a, 'b> EditMovieHandler<'a, 'b> { impl<'a, 'b> EditMovieHandler<'a, 'b> {
fn build_edit_movie_params(&mut self) -> EditMovieParams { fn build_edit_movie_params(&mut self) -> EditMovieParams {
let movie_id = self.app.data.radarr_data.movies.current_selection().id; let movie_id = self.app.data.radarr_data.movies.current_selection().id;
let tags = self.app.data.radarr_data.edit_movie_modal.as_ref().unwrap().tags.text.clone(); let tags = self
.app
.data
.radarr_data
.edit_movie_modal
.as_ref()
.unwrap()
.tags
.text
.clone();
let params = { let params = {
let EditMovieModal { let EditMovieModal {
monitored, monitored,
@@ -33,7 +42,8 @@ impl<'a, 'b> EditMovieHandler<'a, 'b> {
.. ..
} = self.app.data.radarr_data.edit_movie_modal.as_ref().unwrap(); } = self.app.data.radarr_data.edit_movie_modal.as_ref().unwrap();
let quality_profile = quality_profile_list.current_selection(); let quality_profile = quality_profile_list.current_selection();
let quality_profile_id = *self.app let quality_profile_id = *self
.app
.data .data
.radarr_data .radarr_data
.quality_profile_map .quality_profile_map
@@ -265,7 +275,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
match self.app.data.radarr_data.selected_block.get_active_block() { match self.app.data.radarr_data.selected_block.get_active_block() {
ActiveRadarrBlock::EditMovieConfirmPrompt => { ActiveRadarrBlock::EditMovieConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditMovie(self.build_edit_movie_params())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::EditMovie(self.build_edit_movie_params()));
self.app.should_refresh = true; self.app.should_refresh = true;
} }
@@ -376,7 +387,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for EditMovieHandler<'a,
&& key == DEFAULT_KEYBINDINGS.confirm.key && key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::EditMovie(self.build_edit_movie_params())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::EditMovie(self.build_edit_movie_params()));
self.app.should_refresh = true; self.app.should_refresh = true;
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -1185,7 +1185,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::EditMoviePrompt, ActiveRadarrBlock::EditMoviePrompt,
None, None,
).build_edit_movie_params(); )
.build_edit_movie_params();
assert_eq!(edit_movie_params, expected_edit_movie_params); assert_eq!(edit_movie_params, expected_edit_movie_params);
assert!(app.data.radarr_data.edit_movie_modal.is_none()); assert!(app.data.radarr_data.edit_movie_modal.is_none());
@@ -6,7 +6,9 @@ use crate::event::Key;
use crate::handle_table_events; use crate::handle_table_events;
use crate::handlers::table_handler::TableHandlingConfig; use crate::handlers::table_handler::TableHandlingConfig;
use crate::handlers::{handle_prompt_toggle, KeyEventHandler}; use crate::handlers::{handle_prompt_toggle, KeyEventHandler};
use crate::models::radarr_models::{Credit, MovieHistoryItem, RadarrRelease, RadarrReleaseDownloadBody}; use crate::models::radarr_models::{
Credit, MovieHistoryItem, RadarrRelease, RadarrReleaseDownloadBody,
};
use crate::models::servarr_data::radarr::radarr_data::{ use crate::models::servarr_data::radarr::radarr_data::{
ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS, ActiveRadarrBlock, EDIT_MOVIE_SELECTION_BLOCKS, MOVIE_DETAILS_BLOCKS,
}; };
@@ -84,10 +86,9 @@ impl<'a, 'b> MovieDetailsHandler<'a, 'b> {
let movie_id = self.app.data.radarr_data.movies.current_selection().id; let movie_id = self.app.data.radarr_data.movies.current_selection().id;
let (guid, indexer_id) = { let (guid, indexer_id) = {
let RadarrRelease { let RadarrRelease {
guid, guid, indexer_id, ..
indexer_id, } = self
.. .app
} = self.app
.data .data
.radarr_data .radarr_data
.movie_details_modal .movie_details_modal
@@ -105,6 +106,10 @@ impl<'a, 'b> MovieDetailsHandler<'a, 'b> {
movie_id, movie_id,
} }
} }
fn extract_movie_id(&self) -> i64 {
self.app.data.radarr_data.movies.current_selection().id
}
} }
impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> { impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<'a, 'b> {
@@ -266,7 +271,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
ActiveRadarrBlock::AutomaticallySearchMoviePrompt => { ActiveRadarrBlock::AutomaticallySearchMoviePrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::TriggerAutomaticSearch(None)); Some(RadarrEvent::TriggerAutomaticSearch(self.extract_movie_id()));
} }
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -285,8 +290,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
} }
ActiveRadarrBlock::ManualSearchConfirmPrompt => { ActiveRadarrBlock::ManualSearchConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DownloadRelease(
Some(RadarrEvent::DownloadRelease(self.build_radarr_release_download_body())); self.build_radarr_release_download_body(),
));
} }
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -359,7 +365,7 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::TriggerAutomaticSearch(None)); Some(RadarrEvent::TriggerAutomaticSearch(self.extract_movie_id()));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
@@ -371,7 +377,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
} }
ActiveRadarrBlock::ManualSearchConfirmPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => { ActiveRadarrBlock::ManualSearchConfirmPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DownloadRelease(self.build_radarr_release_download_body())); self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::DownloadRelease(
self.build_radarr_release_download_body(),
));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
@@ -361,7 +361,7 @@ mod tests {
#[rstest] #[rstest]
#[case( #[case(
ActiveRadarrBlock::AutomaticallySearchMoviePrompt, ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
RadarrEvent::TriggerAutomaticSearch(None) RadarrEvent::TriggerAutomaticSearch(1)
)] )]
#[case( #[case(
ActiveRadarrBlock::UpdateAndScanPrompt, ActiveRadarrBlock::UpdateAndScanPrompt,
@@ -388,11 +388,7 @@ mod tests {
.movie_releases .movie_releases
.set_items(vec![release()]); .set_items(vec![release()]);
app.data.radarr_data.movie_details_modal = Some(movie_details_modal); app.data.radarr_data.movie_details_modal = Some(movie_details_modal);
app app.data.radarr_data.movies.set_items(vec![movie()]);
.data
.radarr_data
.movies
.set_items(vec![movie()]);
app.data.radarr_data.prompt_confirm = true; app.data.radarr_data.prompt_confirm = true;
app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into());
app.push_navigation_stack(prompt_block.into()); app.push_navigation_stack(prompt_block.into());
@@ -786,7 +782,7 @@ mod tests {
#[rstest] #[rstest]
#[case( #[case(
ActiveRadarrBlock::AutomaticallySearchMoviePrompt, ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
RadarrEvent::TriggerAutomaticSearch(None) RadarrEvent::TriggerAutomaticSearch(1)
)] )]
#[case( #[case(
ActiveRadarrBlock::UpdateAndScanPrompt, ActiveRadarrBlock::UpdateAndScanPrompt,
@@ -813,11 +809,7 @@ mod tests {
.movie_releases .movie_releases
.set_items(vec![release()]); .set_items(vec![release()]);
app.data.radarr_data.movie_details_modal = Some(movie_details_modal); app.data.radarr_data.movie_details_modal = Some(movie_details_modal);
app app.data.radarr_data.movies.set_items(vec![movie()]);
.data
.radarr_data
.movies
.set_items(vec![movie()]);
app.data.radarr_data.prompt_confirm = true; app.data.radarr_data.prompt_confirm = true;
app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into()); app.push_navigation_stack(ActiveRadarrBlock::MovieDetails.into());
app.push_navigation_stack(prompt_block.into()); app.push_navigation_stack(prompt_block.into());
@@ -850,11 +842,7 @@ mod tests {
.movie_releases .movie_releases
.set_items(vec![release()]); .set_items(vec![release()]);
app.data.radarr_data.movie_details_modal = Some(movie_details_modal); app.data.radarr_data.movie_details_modal = Some(movie_details_modal);
app app.data.radarr_data.movies.set_items(vec![movie()]);
.data
.radarr_data
.movies
.set_items(vec![movie()]);
let expected_body = RadarrReleaseDownloadBody { let expected_body = RadarrReleaseDownloadBody {
guid: "1234".to_owned(), guid: "1234".to_owned(),
indexer_id: 2, indexer_id: 2,
@@ -866,11 +854,28 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::ManualSearchConfirmPrompt, ActiveRadarrBlock::ManualSearchConfirmPrompt,
None, None,
).build_radarr_release_download_body(); )
.build_radarr_release_download_body();
assert_eq!(body, expected_body); assert_eq!(body, expected_body);
} }
#[test]
fn test_extract_movie_id() {
let mut app = App::default();
app.data.radarr_data.movies.set_items(vec![movie()]);
let movie_id = MovieDetailsHandler::with(
DEFAULT_KEYBINDINGS.esc.key,
&mut app,
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
None,
)
.extract_movie_id();
assert_eq!(movie_id, 1);
}
#[test] #[test]
fn test_releases_sorting_options_source() { fn test_releases_sorting_options_source() {
let expected_cmp_fn: fn(&RadarrRelease, &RadarrRelease) -> Ordering = let expected_cmp_fn: fn(&RadarrRelease, &RadarrRelease) -> Ordering =
@@ -30,7 +30,8 @@ impl<'a, 'b> RootFoldersHandler<'a, 'b> {
); );
fn build_add_root_folder_body(&mut self) -> AddRootFolderBody { fn build_add_root_folder_body(&mut self) -> AddRootFolderBody {
let path = self.app let path = self
.app
.data .data
.radarr_data .radarr_data
.edit_root_folder .edit_root_folder
@@ -45,7 +46,8 @@ impl<'a, 'b> RootFoldersHandler<'a, 'b> {
} }
fn extract_root_folder_id(&mut self) -> i64 { fn extract_root_folder_id(&mut self) -> i64 {
self.app self
.app
.data .data
.radarr_data .radarr_data
.root_folders .root_folders
@@ -164,7 +166,9 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for RootFoldersHandler<'
.text .text
.is_empty() => .is_empty() =>
{ {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddRootFolder(self.build_add_root_folder_body())); self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::AddRootFolder(
self.build_add_root_folder_body(),
));
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.should_ignore_quit_key = false; self.app.should_ignore_quit_key = false;
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -252,7 +252,9 @@ mod tests {
#[test] #[test]
fn test_add_root_folder_prompt_confirm_submit() { fn test_add_root_folder_prompt_confirm_submit() {
let mut app = App::default(); let mut app = App::default();
let expected_add_root_folder_body = AddRootFolderBody { path: "Test".to_owned() }; let expected_add_root_folder_body = AddRootFolderBody {
path: "Test".to_owned(),
};
app app
.data .data
.radarr_data .radarr_data
@@ -646,34 +648,38 @@ mod tests {
fn test_build_add_root_folder_body() { fn test_build_add_root_folder_body() {
let mut app = App::default(); let mut app = App::default();
app.data.radarr_data.edit_root_folder = Some("/nfs/test".into()); app.data.radarr_data.edit_root_folder = Some("/nfs/test".into());
let expected_add_root_folder_body = AddRootFolderBody { path: "/nfs/test".to_owned() }; let expected_add_root_folder_body = AddRootFolderBody {
path: "/nfs/test".to_owned(),
};
let actual_add_root_folder_body = RootFoldersHandler::with( let actual_add_root_folder_body = RootFoldersHandler::with(
DEFAULT_KEYBINDINGS.esc.key, DEFAULT_KEYBINDINGS.esc.key,
&mut app, &mut app,
ActiveRadarrBlock::RootFolders, ActiveRadarrBlock::RootFolders,
None, None,
).build_add_root_folder_body(); )
.build_add_root_folder_body();
assert_eq!(actual_add_root_folder_body, expected_add_root_folder_body); assert_eq!(actual_add_root_folder_body, expected_add_root_folder_body);
assert!(app assert!(app.data.radarr_data.edit_root_folder.is_none());
.data
.radarr_data
.edit_root_folder
.is_none());
} }
#[test] #[test]
fn test_extract_root_folder_id() { fn test_extract_root_folder_id() {
let mut app = App::default(); let mut app = App::default();
app.data.radarr_data.root_folders.set_items(vec![root_folder()]); app
.data
.radarr_data
.root_folders
.set_items(vec![root_folder()]);
let root_folder_id = RootFoldersHandler::with( let root_folder_id = RootFoldersHandler::with(
DEFAULT_KEYBINDINGS.esc.key, DEFAULT_KEYBINDINGS.esc.key,
&mut app, &mut app,
ActiveRadarrBlock::RootFolders, ActiveRadarrBlock::RootFolders,
None, None,
).extract_root_folder_id(); )
.extract_root_folder_id();
assert_eq!(root_folder_id, 1); assert_eq!(root_folder_id, 1);
} }
@@ -21,7 +21,13 @@ pub(super) struct SystemDetailsHandler<'a, 'b> {
impl<'a, 'b> SystemDetailsHandler<'a, 'b> { impl<'a, 'b> SystemDetailsHandler<'a, 'b> {
fn extract_task_name(&self) -> RadarrTaskName { fn extract_task_name(&self) -> RadarrTaskName {
self.app.data.radarr_data.tasks.current_selection().task_name self
.app
.data
.radarr_data
.tasks
.current_selection()
.task_name
} }
} }
@@ -144,7 +150,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for SystemDetailsHandler
} }
ActiveRadarrBlock::SystemTaskStartConfirmPrompt => { ActiveRadarrBlock::SystemTaskStartConfirmPrompt => {
if self.app.data.radarr_data.prompt_confirm { if self.app.data.radarr_data.prompt_confirm {
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::StartTask(self.extract_task_name())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::StartTask(self.extract_task_name()));
} }
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
@@ -181,7 +188,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for SystemDetailsHandler
&& self.key == DEFAULT_KEYBINDINGS.confirm.key && self.key == DEFAULT_KEYBINDINGS.confirm.key
{ {
self.app.data.radarr_data.prompt_confirm = true; self.app.data.radarr_data.prompt_confirm = true;
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::StartTask(self.extract_task_name())); self.app.data.radarr_data.prompt_confirm_action =
Some(RadarrEvent::StartTask(self.extract_task_name()));
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
} }
@@ -952,7 +952,8 @@ mod tests {
&mut app, &mut app,
ActiveRadarrBlock::SystemTasks, ActiveRadarrBlock::SystemTasks,
None, None,
).extract_task_name(); )
.extract_task_name();
assert_eq!(task_name, RadarrTaskName::default()); assert_eq!(task_name, RadarrTaskName::default());
} }
+7 -6
View File
@@ -73,7 +73,7 @@ pub enum RadarrEvent {
StartTask(RadarrTaskName), StartTask(RadarrTaskName),
TestIndexer(i64), TestIndexer(i64),
TestAllIndexers, TestAllIndexers,
TriggerAutomaticSearch(Option<i64>), TriggerAutomaticSearch(i64),
UpdateAllMovies, UpdateAllMovies,
UpdateAndScan(Option<i64>), UpdateAndScan(Option<i64>),
UpdateCollections, UpdateCollections,
@@ -1636,7 +1636,9 @@ impl<'a, 'b> Network<'a, 'b> {
info!("Starting Radarr task: {task_name}"); info!("Starting Radarr task: {task_name}");
let body = CommandBody { name: task_name.to_string() }; let body = CommandBody {
name: task_name.to_string(),
};
let request_props = self let request_props = self
.request_props_from(event, RequestMethod::Post, Some(body), None, None) .request_props_from(event, RequestMethod::Post, Some(body), None, None)
@@ -1742,13 +1744,12 @@ impl<'a, 'b> Network<'a, 'b> {
.await .await
} }
async fn trigger_automatic_movie_search(&mut self, movie_id: Option<i64>) -> Result<Value> { async fn trigger_automatic_movie_search(&mut self, movie_id: i64) -> Result<Value> {
let event = RadarrEvent::TriggerAutomaticSearch(movie_id); let event = RadarrEvent::TriggerAutomaticSearch(movie_id);
let (id, _) = self.extract_movie_id(movie_id).await; info!("Searching indexers for movie with ID: {movie_id}");
info!("Searching indexers for movie with ID: {id}");
let body = MovieCommandBody { let body = MovieCommandBody {
name: "MoviesSearch".to_owned(), name: "MoviesSearch".to_owned(),
movie_ids: vec![id], movie_ids: vec![movie_id],
}; };
let request_props = self let request_props = self
+82 -60
View File
@@ -14,15 +14,14 @@ mod test {
use super::super::*; use super::super::*;
use crate::models::radarr_models::{ use crate::models::radarr_models::{
AddMovieOptions, AddMovieOptions, BlocklistItem, BlocklistItemMovie, CollectionMovie, EditCollectionParams,
BlocklistItem, BlocklistItemMovie, CollectionMovie, EditCollectionParams, EditMovieParams, EditMovieParams, IndexerSettings, MediaInfo, MinimumAvailability, MovieCollection, MovieFile,
IndexerSettings, MediaInfo, MinimumAvailability, MovieCollection, MovieFile, RadarrTaskName, Rating, RatingsList RadarrTaskName, Rating, RatingsList,
}; };
use crate::models::servarr_data::radarr::modals::EditMovieModal; use crate::models::servarr_data::radarr::modals::EditMovieModal;
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::models::servarr_models::{ use crate::models::servarr_models::{
EditIndexerParams, EditIndexerParams, HostConfig, IndexerField, Language, Quality, QualityWrapper,
HostConfig, IndexerField, Language, Quality, QualityWrapper,
}; };
use crate::models::stateful_table::SortOption; use crate::models::stateful_table::SortOption;
use crate::models::HorizontallyScrollableText; use crate::models::HorizontallyScrollableText;
@@ -130,14 +129,23 @@ mod test {
#[rstest] #[rstest]
fn test_resource_collection( fn test_resource_collection(
#[values(RadarrEvent::GetCollections, RadarrEvent::EditCollection(EditCollectionParams::default()))] event: RadarrEvent, #[values(
RadarrEvent::GetCollections,
RadarrEvent::EditCollection(EditCollectionParams::default())
)]
event: RadarrEvent,
) { ) {
assert_str_eq!(event.resource(), "/collection"); assert_str_eq!(event.resource(), "/collection");
} }
#[rstest] #[rstest]
fn test_resource_indexer( fn test_resource_indexer(
#[values(RadarrEvent::GetIndexers, RadarrEvent::DeleteIndexer(0), RadarrEvent::EditIndexer(EditIndexerParams::default()))] event: RadarrEvent, #[values(
RadarrEvent::GetIndexers,
RadarrEvent::DeleteIndexer(0),
RadarrEvent::EditIndexer(EditIndexerParams::default())
)]
event: RadarrEvent,
) { ) {
assert_str_eq!(event.resource(), "/indexer"); assert_str_eq!(event.resource(), "/indexer");
} }
@@ -179,7 +187,10 @@ mod test {
#[rstest] #[rstest]
fn test_resource_release( fn test_resource_release(
#[values(RadarrEvent::GetReleases(0), RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody::default()))] #[values(
RadarrEvent::GetReleases(0),
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody::default())
)]
event: RadarrEvent, event: RadarrEvent,
) { ) {
assert_str_eq!(event.resource(), "/release"); assert_str_eq!(event.resource(), "/release");
@@ -204,7 +215,7 @@ mod test {
#[values( #[values(
RadarrEvent::StartTask(RadarrTaskName::default()), RadarrEvent::StartTask(RadarrTaskName::default()),
RadarrEvent::GetQueuedEvents, RadarrEvent::GetQueuedEvents,
RadarrEvent::TriggerAutomaticSearch(None), RadarrEvent::TriggerAutomaticSearch(0),
RadarrEvent::UpdateAndScan(None), RadarrEvent::UpdateAndScan(None),
RadarrEvent::UpdateAllMovies, RadarrEvent::UpdateAllMovies,
RadarrEvent::UpdateDownloads, RadarrEvent::UpdateDownloads,
@@ -670,7 +681,9 @@ mod test {
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
if let RadarrSerdeable::Value(value) = network if let RadarrSerdeable::Value(value) = network
.handle_radarr_event(RadarrEvent::StartTask(RadarrTaskName::ApplicationCheckUpdate)) .handle_radarr_event(RadarrEvent::StartTask(
RadarrTaskName::ApplicationCheckUpdate,
))
.await .await
.unwrap() .unwrap()
{ {
@@ -950,39 +963,7 @@ mod test {
})), })),
Some(json!({})), Some(json!({})),
None, None,
RadarrEvent::TriggerAutomaticSearch(None), RadarrEvent::TriggerAutomaticSearch(1),
None,
None,
)
.await;
app_arc
.lock()
.await
.data
.radarr_data
.movies
.set_items(vec![movie()]);
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
assert!(network
.handle_radarr_event(RadarrEvent::TriggerAutomaticSearch(None))
.await
.is_ok());
async_server.assert_async().await;
}
#[tokio::test]
async fn test_handle_trigger_automatic_movie_search_event_uses_provided_id() {
let (async_server, app_arc, _server) = mock_servarr_api(
RequestMethod::Post,
Some(json!({
"name": "MoviesSearch",
"movieIds": [ 1 ]
})),
Some(json!({})),
None,
RadarrEvent::TriggerAutomaticSearch(None),
None, None,
None, None,
) )
@@ -990,7 +971,7 @@ mod test {
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
assert!(network assert!(network
.handle_radarr_event(RadarrEvent::TriggerAutomaticSearch(Some(1))) .handle_radarr_event(RadarrEvent::TriggerAutomaticSearch(1))
.await .await
.is_ok()); .is_ok());
@@ -2935,7 +2916,9 @@ mod test {
None, None,
) )
.await; .await;
let add_root_folder_body = AddRootFolderBody { path: "/nfs/test".to_owned() }; let add_root_folder_body = AddRootFolderBody {
path: "/nfs/test".to_owned(),
};
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new()); let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
assert!(network assert!(network
@@ -3220,7 +3203,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1?forceSave=true", RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1?forceSave=true",
RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3241,7 +3228,8 @@ mod test {
} }
#[tokio::test] #[tokio::test]
async fn test_handle_edit_radarr_indexer_event_does_not_overwrite_tags_vec_if_tag_input_string_is_none() { async fn test_handle_edit_radarr_indexer_event_does_not_overwrite_tags_vec_if_tag_input_string_is_none(
) {
let indexer_details_json = json!({ let indexer_details_json = json!({
"enableRss": true, "enableRss": true,
"enableAutomaticSearch": true, "enableAutomaticSearch": true,
@@ -3314,7 +3302,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1?forceSave=true", RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1?forceSave=true",
RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3401,7 +3393,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1?forceSave=true", RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1?forceSave=true",
RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3495,7 +3491,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1?forceSave=true", RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1?forceSave=true",
RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3516,8 +3516,7 @@ mod test {
} }
#[tokio::test] #[tokio::test]
async fn test_handle_edit_radarr_indexer_event_defaults_to_previous_values( async fn test_handle_edit_radarr_indexer_event_defaults_to_previous_values() {
) {
let indexer_details_json = json!({ let indexer_details_json = json!({
"enableRss": true, "enableRss": true,
"enableAutomaticSearch": true, "enableAutomaticSearch": true,
@@ -3559,7 +3558,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1?forceSave=true", RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1?forceSave=true",
RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3578,8 +3581,7 @@ mod test {
} }
#[tokio::test] #[tokio::test]
async fn test_handle_edit_radarr_indexer_event_clears_tags_when_clear_tags_is_true( async fn test_handle_edit_radarr_indexer_event_clears_tags_when_clear_tags_is_true() {
) {
let indexer_details_json = json!({ let indexer_details_json = json!({
"enableRss": true, "enableRss": true,
"enableAutomaticSearch": true, "enableAutomaticSearch": true,
@@ -3645,7 +3647,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1?forceSave=true", RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1?forceSave=true",
RadarrEvent::EditIndexer(edit_indexer_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3694,7 +3700,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1", RadarrEvent::EditMovie(edit_movie_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1",
RadarrEvent::EditMovie(edit_movie_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3744,7 +3754,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1", RadarrEvent::EditMovie(edit_movie_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1",
RadarrEvent::EditMovie(edit_movie_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3784,7 +3798,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1", RadarrEvent::EditMovie(edit_movie_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1",
RadarrEvent::EditMovie(edit_movie_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")
@@ -3825,7 +3843,11 @@ mod test {
let async_edit_server = server let async_edit_server = server
.mock( .mock(
"PUT", "PUT",
format!("/api/v3{}/1", RadarrEvent::EditMovie(edit_movie_params.clone()).resource()).as_str(), format!(
"/api/v3{}/1",
RadarrEvent::EditMovie(edit_movie_params.clone()).resource()
)
.as_str(),
) )
.with_status(202) .with_status(202)
.match_header("X-Api-Key", "test1234") .match_header("X-Api-Key", "test1234")