fix(radarr): Pass the movie ID alongside all UpdateAndScan events published to the networking channel
This commit is contained in:
@@ -680,7 +680,7 @@ mod tests {
|
||||
mock_network
|
||||
.expect_handle_network_event()
|
||||
.with(eq::<NetworkEvent>(
|
||||
RadarrEvent::UpdateAndScan(Some(expected_movie_id)).into(),
|
||||
RadarrEvent::UpdateAndScan(expected_movie_id).into(),
|
||||
))
|
||||
.times(1)
|
||||
.returning(|_| {
|
||||
|
||||
@@ -88,7 +88,7 @@ impl<'a, 'b> CliCommandHandler<'a, 'b, RadarrRefreshCommand>
|
||||
RadarrRefreshCommand::Movie { movie_id } => {
|
||||
let resp = self
|
||||
.network
|
||||
.handle_network_event(RadarrEvent::UpdateAndScan(Some(movie_id)).into())
|
||||
.handle_network_event(RadarrEvent::UpdateAndScan(movie_id).into())
|
||||
.await?;
|
||||
serde_json::to_string_pretty(&resp)?
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ mod tests {
|
||||
mock_network
|
||||
.expect_handle_network_event()
|
||||
.with(eq::<NetworkEvent>(
|
||||
RadarrEvent::UpdateAndScan(Some(expected_movie_id)).into(),
|
||||
RadarrEvent::UpdateAndScan(expected_movie_id).into(),
|
||||
))
|
||||
.times(1)
|
||||
.returning(|_| {
|
||||
|
||||
@@ -278,7 +278,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
|
||||
}
|
||||
ActiveRadarrBlock::UpdateAndScanPrompt => {
|
||||
if self.app.data.radarr_data.prompt_confirm {
|
||||
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None));
|
||||
self.app.data.radarr_data.prompt_confirm_action =
|
||||
Some(RadarrEvent::UpdateAndScan(self.extract_movie_id()));
|
||||
}
|
||||
|
||||
self.app.pop_navigation_stack();
|
||||
@@ -371,7 +372,8 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for MovieDetailsHandler<
|
||||
}
|
||||
ActiveRadarrBlock::UpdateAndScanPrompt if key == DEFAULT_KEYBINDINGS.confirm.key => {
|
||||
self.app.data.radarr_data.prompt_confirm = true;
|
||||
self.app.data.radarr_data.prompt_confirm_action = Some(RadarrEvent::UpdateAndScan(None));
|
||||
self.app.data.radarr_data.prompt_confirm_action =
|
||||
Some(RadarrEvent::UpdateAndScan(self.extract_movie_id()));
|
||||
|
||||
self.app.pop_navigation_stack();
|
||||
}
|
||||
|
||||
@@ -363,10 +363,7 @@ mod tests {
|
||||
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
|
||||
RadarrEvent::TriggerAutomaticSearch(1)
|
||||
)]
|
||||
#[case(
|
||||
ActiveRadarrBlock::UpdateAndScanPrompt,
|
||||
RadarrEvent::UpdateAndScan(None)
|
||||
)]
|
||||
#[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan(1))]
|
||||
#[case(
|
||||
ActiveRadarrBlock::ManualSearchConfirmPrompt,
|
||||
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody {
|
||||
@@ -784,10 +781,7 @@ mod tests {
|
||||
ActiveRadarrBlock::AutomaticallySearchMoviePrompt,
|
||||
RadarrEvent::TriggerAutomaticSearch(1)
|
||||
)]
|
||||
#[case(
|
||||
ActiveRadarrBlock::UpdateAndScanPrompt,
|
||||
RadarrEvent::UpdateAndScan(None)
|
||||
)]
|
||||
#[case(ActiveRadarrBlock::UpdateAndScanPrompt, RadarrEvent::UpdateAndScan(1))]
|
||||
#[case(
|
||||
ActiveRadarrBlock::ManualSearchConfirmPrompt,
|
||||
RadarrEvent::DownloadRelease(RadarrReleaseDownloadBody {
|
||||
|
||||
@@ -2,10 +2,9 @@
|
||||
#[macro_use]
|
||||
pub(in crate::handlers::radarr_handlers) mod utils {
|
||||
use crate::models::radarr_models::{
|
||||
AddMovieBody, AddMovieOptions, AddMovieSearchResult, BlocklistItem, BlocklistItemMovie,
|
||||
Collection, CollectionMovie, Credit, CreditType, DownloadRecord, DownloadsResponse,
|
||||
IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection, MovieFile,
|
||||
MovieHistoryItem, RadarrRelease, Rating, RatingsList,
|
||||
AddMovieBody, AddMovieOptions, AddMovieSearchResult, Collection, CollectionMovie,
|
||||
DownloadRecord, IndexerSettings, MediaInfo, MinimumAvailability, Movie, MovieCollection,
|
||||
MovieFile, RadarrRelease, Rating, RatingsList,
|
||||
};
|
||||
use crate::models::servarr_models::{
|
||||
Indexer, IndexerField, Language, Quality, QualityWrapper, RootFolder,
|
||||
@@ -305,28 +304,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn blocklist_item() -> BlocklistItem {
|
||||
BlocklistItem {
|
||||
id: 1,
|
||||
movie_id: 1,
|
||||
source_title: "z movie".to_owned(),
|
||||
languages: vec![language()],
|
||||
quality: quality_wrapper(),
|
||||
custom_formats: Some(vec![language()]),
|
||||
date: DateTime::from(DateTime::parse_from_rfc3339("2024-02-10T07:28:45Z").unwrap()),
|
||||
protocol: "usenet".to_owned(),
|
||||
indexer: "DrunkenSlug (Prowlarr)".to_owned(),
|
||||
message: "test message".to_owned(),
|
||||
movie: blocklist_item_movie(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn blocklist_item_movie() -> BlocklistItemMovie {
|
||||
BlocklistItemMovie {
|
||||
title: "Test".into(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn collection() -> Collection {
|
||||
Collection {
|
||||
id: 123,
|
||||
@@ -422,16 +399,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn movie_history_item() -> MovieHistoryItem {
|
||||
MovieHistoryItem {
|
||||
source_title: HorizontallyScrollableText::from("Test"),
|
||||
quality: quality_wrapper(),
|
||||
languages: vec![language()],
|
||||
date: DateTime::from(DateTime::parse_from_rfc3339("2022-12-30T07:37:56Z").unwrap()),
|
||||
event_type: "grabbed".to_owned(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn download_record() -> DownloadRecord {
|
||||
DownloadRecord {
|
||||
title: "Test Download Title".to_owned(),
|
||||
@@ -446,12 +413,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn downloads_response() -> DownloadsResponse {
|
||||
DownloadsResponse {
|
||||
records: vec![download_record()],
|
||||
}
|
||||
}
|
||||
|
||||
pub fn root_folder() -> RootFolder {
|
||||
RootFolder {
|
||||
id: 1,
|
||||
@@ -462,26 +423,6 @@ pub(in crate::handlers::radarr_handlers) mod utils {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn cast_credit() -> Credit {
|
||||
Credit {
|
||||
person_name: "Madison Clarke".to_owned(),
|
||||
character: Some("Johnny Blaze".to_owned()),
|
||||
department: None,
|
||||
job: None,
|
||||
credit_type: CreditType::Cast,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn crew_credit() -> Credit {
|
||||
Credit {
|
||||
person_name: "Alex Clarke".to_owned(),
|
||||
character: None,
|
||||
department: Some("Music".to_owned()),
|
||||
job: Some("Composition".to_owned()),
|
||||
credit_type: CreditType::Crew,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn indexer() -> Indexer {
|
||||
Indexer {
|
||||
enable_rss: true,
|
||||
|
||||
@@ -75,7 +75,7 @@ pub enum RadarrEvent {
|
||||
TestAllIndexers,
|
||||
TriggerAutomaticSearch(i64),
|
||||
UpdateAllMovies,
|
||||
UpdateAndScan(Option<i64>),
|
||||
UpdateAndScan(i64),
|
||||
UpdateCollections,
|
||||
UpdateDownloads,
|
||||
}
|
||||
@@ -1778,13 +1778,12 @@ impl<'a, 'b> Network<'a, 'b> {
|
||||
.await
|
||||
}
|
||||
|
||||
async fn update_and_scan_movie(&mut self, movie_id: Option<i64>) -> Result<Value> {
|
||||
let (id, _) = self.extract_movie_id(movie_id).await;
|
||||
let event = RadarrEvent::UpdateAndScan(None);
|
||||
info!("Updating and scanning movie with ID: {id}");
|
||||
async fn update_and_scan_movie(&mut self, movie_id: i64) -> Result<Value> {
|
||||
let event = RadarrEvent::UpdateAndScan(movie_id);
|
||||
info!("Updating and scanning movie with ID: {movie_id}");
|
||||
let body = MovieCommandBody {
|
||||
name: "RefreshMovie".to_owned(),
|
||||
movie_ids: vec![id],
|
||||
movie_ids: vec![movie_id],
|
||||
};
|
||||
|
||||
let request_props = self
|
||||
@@ -1857,23 +1856,6 @@ impl<'a, 'b> Network<'a, 'b> {
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
async fn extract_movie_id(&mut self, movie_id: Option<i64>) -> (i64, String) {
|
||||
let movie_id = if let Some(id) = movie_id {
|
||||
id
|
||||
} else {
|
||||
self
|
||||
.app
|
||||
.lock()
|
||||
.await
|
||||
.data
|
||||
.radarr_data
|
||||
.movies
|
||||
.current_selection()
|
||||
.id
|
||||
};
|
||||
(movie_id, format!("movieId={movie_id}"))
|
||||
}
|
||||
}
|
||||
|
||||
fn get_movie_status(has_file: bool, downloads_vec: &[DownloadRecord], movie_id: i64) -> String {
|
||||
|
||||
@@ -216,7 +216,7 @@ mod test {
|
||||
RadarrEvent::StartTask(RadarrTaskName::default()),
|
||||
RadarrEvent::GetQueuedEvents,
|
||||
RadarrEvent::TriggerAutomaticSearch(0),
|
||||
RadarrEvent::UpdateAndScan(None),
|
||||
RadarrEvent::UpdateAndScan(0),
|
||||
RadarrEvent::UpdateAllMovies,
|
||||
RadarrEvent::UpdateDownloads,
|
||||
RadarrEvent::UpdateCollections
|
||||
@@ -988,39 +988,7 @@ mod test {
|
||||
})),
|
||||
Some(json!({})),
|
||||
None,
|
||||
RadarrEvent::UpdateAndScan(None),
|
||||
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::UpdateAndScan(None))
|
||||
.await
|
||||
.is_ok());
|
||||
|
||||
async_server.assert_async().await;
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_handle_update_and_scan_movie_event_uses_provied_movie_id() {
|
||||
let (async_server, app_arc, _server) = mock_servarr_api(
|
||||
RequestMethod::Post,
|
||||
Some(json!({
|
||||
"name": "RefreshMovie",
|
||||
"movieIds": [ 1 ]
|
||||
})),
|
||||
Some(json!({})),
|
||||
None,
|
||||
RadarrEvent::UpdateAndScan(None),
|
||||
RadarrEvent::UpdateAndScan(1),
|
||||
None,
|
||||
None,
|
||||
)
|
||||
@@ -1028,7 +996,7 @@ mod test {
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
assert!(network
|
||||
.handle_radarr_event(RadarrEvent::UpdateAndScan(Some(1)))
|
||||
.handle_radarr_event(RadarrEvent::UpdateAndScan(1))
|
||||
.await
|
||||
.is_ok());
|
||||
|
||||
@@ -3954,65 +3922,6 @@ mod test {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_extract_movie_id() {
|
||||
let app_arc = Arc::new(Mutex::new(App::default()));
|
||||
app_arc
|
||||
.lock()
|
||||
.await
|
||||
.data
|
||||
.radarr_data
|
||||
.movies
|
||||
.set_items(vec![Movie {
|
||||
id: 1,
|
||||
..Movie::default()
|
||||
}]);
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
let (id, movie_id_param) = network.extract_movie_id(None).await;
|
||||
|
||||
assert_eq!(id, 1);
|
||||
assert_str_eq!(movie_id_param, "movieId=1");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_extract_movie_id_uses_provided_id() {
|
||||
let app_arc = Arc::new(Mutex::new(App::default()));
|
||||
app_arc
|
||||
.lock()
|
||||
.await
|
||||
.data
|
||||
.radarr_data
|
||||
.movies
|
||||
.set_items(vec![Movie {
|
||||
id: 1,
|
||||
..Movie::default()
|
||||
}]);
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
let (id, movie_id_param) = network.extract_movie_id(Some(2)).await;
|
||||
|
||||
assert_eq!(id, 2);
|
||||
assert_str_eq!(movie_id_param, "movieId=2");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_extract_movie_id_filtered_movies() {
|
||||
let app_arc = Arc::new(Mutex::new(App::default()));
|
||||
let mut filtered_movies = StatefulTable::default();
|
||||
filtered_movies.set_filtered_items(vec![Movie {
|
||||
id: 1,
|
||||
..Movie::default()
|
||||
}]);
|
||||
app_arc.lock().await.data.radarr_data.movies = filtered_movies;
|
||||
let mut network = Network::new(&app_arc, CancellationToken::new(), Client::new());
|
||||
|
||||
let (id, movie_id_param) = network.extract_movie_id(None).await;
|
||||
|
||||
assert_eq!(id, 1);
|
||||
assert_str_eq!(movie_id_param, "movieId=1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_get_movie_status_downloaded() {
|
||||
assert_str_eq!(get_movie_status(true, &[], 0), "Downloaded");
|
||||
|
||||
Reference in New Issue
Block a user