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.

This commit is contained in:
2024-02-14 12:53:21 -07:00
parent 6cd24be5e4
commit cf14483338
4 changed files with 52 additions and 5 deletions
@@ -685,6 +685,7 @@ mod tests {
app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into()); app.push_navigation_stack(ActiveRadarrBlock::MoviesSortPrompt.into());
let mut expected_vec = movies_vec(); let mut expected_vec = movies_vec();
expected_vec.sort_by(|a, b| a.id.cmp(&b.id));
expected_vec.reverse(); expected_vec.reverse();
LibraryHandler::with( LibraryHandler::with(
@@ -1299,6 +1300,7 @@ mod tests {
fn movies_vec() -> Vec<Movie> { fn movies_vec() -> Vec<Movie> {
vec![ vec![
Movie { Movie {
id: 3,
title: "test 1".into(), title: "test 1".into(),
original_language: Language { original_language: Language {
name: "English".to_owned(), name: "English".to_owned(),
@@ -1314,6 +1316,7 @@ mod tests {
..Movie::default() ..Movie::default()
}, },
Movie { Movie {
id: 2,
title: "test 2".into(), title: "test 2".into(),
original_language: Language { original_language: Language {
name: "Chinese".to_owned(), name: "Chinese".to_owned(),
@@ -1329,6 +1332,7 @@ mod tests {
..Movie::default() ..Movie::default()
}, },
Movie { Movie {
id: 1,
title: "test 3".into(), title: "test 3".into(),
original_language: Language { original_language: Language {
name: "Japanese".to_owned(), name: "Japanese".to_owned(),
@@ -1350,10 +1354,10 @@ mod tests {
vec![SortOption { vec![SortOption {
name: "Test 1", name: "Test 1",
cmp_fn: Some(|a, b| { cmp_fn: Some(|a, b| {
a.title b.title
.text .text
.to_lowercase() .to_lowercase()
.cmp(&b.title.text.to_lowercase()) .cmp(&a.title.text.to_lowercase())
}), }),
}] }]
} }
@@ -267,6 +267,13 @@ impl<'a, 'b> KeyEventHandler<'a, 'b, ActiveRadarrBlock> for LibraryHandler<'a, '
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
} }
ActiveRadarrBlock::MoviesSortPrompt => { 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.data.radarr_data.movies.apply_sorting();
self.app.pop_navigation_stack(); self.app.pop_navigation_stack();
+2 -1
View File
@@ -1190,7 +1190,8 @@ impl<'a, 'b> Network<'a, 'b> {
.await; .await;
self self
.handle_request::<(), Vec<Movie>>(request_props, |movie_vec, mut app| { .handle_request::<(), Vec<Movie>>(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.set_items(movie_vec);
app.data.radarr_data.movies.apply_sorting_toggle(false); app.data.radarr_data.movies.apply_sorting_toggle(false);
}) })
+37 -2
View File
@@ -17,6 +17,7 @@ mod test {
Quality, QualityWrapper, Rating, RatingsList, Quality, QualityWrapper, Rating, RatingsList,
}; };
use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock; use crate::models::servarr_data::radarr::radarr_data::ActiveRadarrBlock;
use crate::models::stateful_table::SortOption;
use crate::models::HorizontallyScrollableText; use crate::models::HorizontallyScrollableText;
use crate::App; use crate::App;
@@ -293,15 +294,49 @@ mod test {
#[tokio::test] #[tokio::test]
async fn test_handle_get_movies_event() { 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( let (async_server, app_arc, _server) = mock_radarr_api(
RequestMethod::Get, RequestMethod::Get,
None, None,
Some(serde_json::from_str(format!("[ {MOVIE_JSON} ]").as_str()).unwrap()), Some(json!([movie_1, movie_2])),
None, None,
RadarrEvent::GetMovies.resource(), RadarrEvent::GetMovies.resource(),
) )
.await; .await;
app_arc.lock().await.data.radarr_data.movies.sort_asc = true; 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()); let mut network = Network::new(&app_arc, CancellationToken::new());
network.handle_radarr_event(RadarrEvent::GetMovies).await; network.handle_radarr_event(RadarrEvent::GetMovies).await;
@@ -309,7 +344,7 @@ mod test {
async_server.assert_async().await; async_server.assert_async().await;
assert_eq!( assert_eq!(
app_arc.lock().await.data.radarr_data.movies.items, app_arc.lock().await.data.radarr_data.movies.items,
vec![movie()] expected_movies
); );
assert!(app_arc.lock().await.data.radarr_data.movies.sort_asc); assert!(app_arc.lock().await.data.radarr_data.movies.sort_asc);
} }