Fixed a race condition bug with the MovieDetailsModal

This commit is contained in:
2023-11-25 17:50:23 -07:00
parent 76e21e7697
commit 9123067651
2 changed files with 145 additions and 21 deletions
+47 -21
View File
@@ -660,24 +660,40 @@ impl<'a, 'b> Network<'a, 'b> {
.await; .await;
self self
.handle_request::<(), Vec<Credit>>(request_props, |credit_vec, mut app| { .handle_request::<(), Vec<Credit>>(request_props, |credit_vec, mut app| {
let cast_vec: Vec<Credit> = credit_vec let cast_vec: Vec<Credit> = credit_vec
.iter() .iter()
.cloned() .cloned()
.filter(|credit| credit.credit_type == CreditType::Cast) .filter(|credit| credit.credit_type == CreditType::Cast)
.collect(); .collect();
let crew_vec: Vec<Credit> = credit_vec let crew_vec: Vec<Credit> = credit_vec
.iter() .iter()
.cloned() .cloned()
.filter(|credit| credit.credit_type == CreditType::Crew) .filter(|credit| credit.credit_type == CreditType::Crew)
.collect(); .collect();
debug!("Assuming the movie_details_modal is already a Some and was created by the get_movie_details request"); if app.data.radarr_data.movie_details_modal.is_none() {
app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default());
}
app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_cast.set_items(cast_vec); app
app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_crew.set_items(crew_vec); .data
}) .radarr_data
.await; .movie_details_modal
.as_mut()
.unwrap()
.movie_cast
.set_items(cast_vec);
app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_crew
.set_items(crew_vec);
})
.await;
} }
async fn get_diskspace(&mut self) { async fn get_diskspace(&mut self) {
@@ -1076,11 +1092,21 @@ impl<'a, 'b> Network<'a, 'b> {
.await; .await;
self self
.handle_request::<(), Vec<Release>>(request_props, |release_vec, mut app| { .handle_request::<(), Vec<Release>>(request_props, |release_vec, mut app| {
debug!("Assuming the movie_details_modal is already a Some and was created by the get_movie_details request"); if app.data.radarr_data.movie_details_modal.is_none() {
app.data.radarr_data.movie_details_modal.as_mut().unwrap().movie_releases.set_items(release_vec); app.data.radarr_data.movie_details_modal = Some(MovieDetailsModal::default());
}) }
.await;
app
.data
.radarr_data
.movie_details_modal
.as_mut()
.unwrap()
.movie_releases
.set_items(release_vec);
})
.await;
} }
async fn get_root_folders(&mut self) { async fn get_root_folders(&mut self) {
+98
View File
@@ -366,6 +366,59 @@ mod test {
); );
} }
#[tokio::test]
async fn test_handle_get_releases_event_empty_movie_details_modal() {
let release_json = json!([{
"guid": "1234",
"protocol": "torrent",
"age": 1,
"title": "Test Release",
"indexer": "kickass torrents",
"indexerId": 2,
"size": 1234,
"rejected": true,
"rejections": [ "Unknown quality profile", "Release is already mapped" ],
"seeders": 2,
"leechers": 1,
"languages": [ { "name": "English" } ],
"quality": { "quality": { "name": "HD - 1080p" }}
}]);
let resource = format!("{}?movieId=1", RadarrEvent::GetReleases.resource());
let (async_server, app_arc, _server) = mock_radarr_api(
RequestMethod::Get,
None,
Some(release_json),
None,
&resource,
)
.await;
app_arc
.lock()
.await
.data
.radarr_data
.movies
.set_items(vec![movie()]);
let mut network = Network::new(&app_arc, CancellationToken::new());
network.handle_radarr_event(RadarrEvent::GetReleases).await;
async_server.assert_async().await;
assert_eq!(
app_arc
.lock()
.await
.data
.radarr_data
.movie_details_modal
.as_ref()
.unwrap()
.movie_releases
.items,
vec![release()]
);
}
#[tokio::test] #[tokio::test]
async fn test_handle_search_new_movie_event() { async fn test_handle_search_new_movie_event() {
let add_movie_search_result_json = json!([{ let add_movie_search_result_json = json!([{
@@ -1684,6 +1737,51 @@ mod test {
assert_eq!(movie_details_modal.movie_crew.items, vec![crew_credit()]); assert_eq!(movie_details_modal.movie_crew.items, vec![crew_credit()]);
} }
#[tokio::test]
async fn test_handle_get_movie_credits_event_empty_movie_details_modal() {
let credits_json = json!([
{
"personName": "Madison Clarke",
"character": "Johnny Blaze",
"type": "cast",
},
{
"personName": "Alex Clarke",
"department": "Music",
"job": "Composition",
"type": "crew",
}
]);
let resource = format!("{}?movieId=1", RadarrEvent::GetMovieCredits.resource());
let (async_server, app_arc, _server) = mock_radarr_api(
RequestMethod::Get,
None,
Some(credits_json),
None,
&resource,
)
.await;
app_arc
.lock()
.await
.data
.radarr_data
.movies
.set_items(vec![movie()]);
let mut network = Network::new(&app_arc, CancellationToken::new());
network
.handle_radarr_event(RadarrEvent::GetMovieCredits)
.await;
let app = app_arc.lock().await;
let movie_details_modal = app.data.radarr_data.movie_details_modal.as_ref().unwrap();
async_server.assert_async().await;
assert_eq!(movie_details_modal.movie_cast.items, vec![cast_credit()]);
assert_eq!(movie_details_modal.movie_crew.items, vec![crew_credit()]);
}
#[tokio::test] #[tokio::test]
async fn test_handle_delete_movie_event() { async fn test_handle_delete_movie_event() {
let resource = format!( let resource = format!(