From cf14483338e2b0061af66d2a6e40ac099c8e5dde Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Wed, 14 Feb 2024 12:53:21 -0700 Subject: [PATCH] Fixed a small bug with sorting the main library table. On refreshes it would reset the data and because of stable sorts, the data would change. Fixed by pre-sorting everything by ID as it is naturally when coming from Radarr prior to any subsequent sorts. --- .../library/library_handler_tests.rs | 8 +++- src/handlers/radarr_handlers/library/mod.rs | 7 ++++ src/network/radarr_network.rs | 3 +- src/network/radarr_network_tests.rs | 39 ++++++++++++++++++- 4 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/handlers/radarr_handlers/library/library_handler_tests.rs b/src/handlers/radarr_handlers/library/library_handler_tests.rs index e9c47c0..4d9dac7 100644 --- a/src/handlers/radarr_handlers/library/library_handler_tests.rs +++ b/src/handlers/radarr_handlers/library/library_handler_tests.rs @@ -685,6 +685,7 @@ mod tests { app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); let mut expected_vec = movies_vec(); + expected_vec.sort_by(|a, b| a.id.cmp(&b.id)); expected_vec.reverse(); LibraryHandler::with( @@ -1299,6 +1300,7 @@ mod tests { fn movies_vec() -> Vec { vec![ Movie { + id: 3, title: "test 1".into(), original_language: Language { name: "English".to_owned(), @@ -1314,6 +1316,7 @@ mod tests { ..Movie::default() }, Movie { + id: 2, title: "test 2".into(), original_language: Language { name: "Chinese".to_owned(), @@ -1329,6 +1332,7 @@ mod tests { ..Movie::default() }, Movie { + id: 1, title: "test 3".into(), original_language: Language { name: "Japanese".to_owned(), @@ -1350,10 +1354,10 @@ mod tests { vec![SortOption { name: "Test 1", cmp_fn: Some(|a, b| { - a.title + b.title .text .to_lowercase() - .cmp(&b.title.text.to_lowercase()) + .cmp(&a.title.text.to_lowercase()) }), }] } diff --git a/src/handlers/radarr_handlers/library/mod.rs b/src/handlers/radarr_handlers/library/mod.rs index c173552..420635d 100644 --- a/src/handlers/radarr_handlers/library/mod.rs +++ b/src/handlers/radarr_handlers/library/mod.rs @@ -267,6 +267,13 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for LibraryHandler<'a, ' self.app.pop_navigation_stack(); } ActiveRadarrBlock::MoviesSortPrompt => { + self + .app + .data + .radarr_data + .movies + .items + .sort_by(|a, b| a.id.cmp(&b.id)); self.app.data.radarr_data.movies.apply_sorting(); self.app.pop_navigation_stack(); diff --git a/src/network/radarr_network.rs b/src/network/radarr_network.rs index 6109dec..c8af63a 100644 --- a/src/network/radarr_network.rs +++ b/src/network/radarr_network.rs @@ -1190,7 +1190,8 @@ impl<'a, 'b> Network<'a, 'b> { .await; self - .handle_request::<(), Vec>(request_props, |movie_vec, mut app| { + .handle_request::<(), Vec>(request_props, |mut movie_vec, mut app| { + movie_vec.sort_by(|a, b| a.id.cmp(&b.id)); app.data.radarr_data.movies.set_items(movie_vec); app.data.radarr_data.movies.apply_sorting_toggle(false); }) diff --git a/src/network/radarr_network_tests.rs b/src/network/radarr_network_tests.rs index 98119a0..4a39686 100644 --- a/src/network/radarr_network_tests.rs +++ b/src/network/radarr_network_tests.rs @@ -17,6 +17,7 @@ mod test { Quality, QualityWrapper, Rating, RatingsList, }; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; + use crate::models::stateful_table::SortOption; use crate::models::HorizontallyScrollableText; use crate::App; @@ -293,15 +294,49 @@ mod test { #[tokio::test] async fn test_handle_get_movies_event() { + let mut movie_1: Value = serde_json::from_str(MOVIE_JSON).unwrap(); + let mut movie_2: Value = serde_json::from_str(MOVIE_JSON).unwrap(); + *movie_1.get_mut("id").unwrap() = json!(1); + *movie_1.get_mut("title").unwrap() = json!("z test"); + *movie_2.get_mut("id").unwrap() = json!(2); + *movie_2.get_mut("title").unwrap() = json!("A test"); + let expected_movies = vec![ + Movie { + id: 2, + title: "A test".into(), + ..movie() + }, + Movie { + id: 1, + title: "z test".into(), + ..movie() + }, + ]; let (async_server, app_arc, _server) = mock_radarr_api( RequestMethod::Get, None, - Some(serde_json::from_str(format!("[ {MOVIE_JSON} ]").as_str()).unwrap()), + Some(json!([movie_1, movie_2])), None, RadarrEvent::GetMovies.resource(), ) .await; app_arc.lock().await.data.radarr_data.movies.sort_asc = true; + let title_sort_option = SortOption { + name: "Title", + cmp_fn: Some(|a: &Movie, b: &Movie| { + a.title + .text + .to_lowercase() + .cmp(&b.title.text.to_lowercase()) + }), + }; + app_arc + .lock() + .await + .data + .radarr_data + .movies + .sorting(vec![title_sort_option]); let mut network = Network::new(&app_arc, CancellationToken::new()); network.handle_radarr_event(RadarrEvent::GetMovies).await; @@ -309,7 +344,7 @@ mod test { async_server.assert_async().await; assert_eq!( app_arc.lock().await.data.radarr_data.movies.items, - vec![movie()] + expected_movies ); assert!(app_arc.lock().await.data.radarr_data.movies.sort_asc); }