diff --git a/src/tui/app/machine/match_state.rs b/src/tui/app/machine/match_state.rs index 8d7dc6d..7c2f202 100644 --- a/src/tui/app/machine/match_state.rs +++ b/src/tui/app/machine/match_state.rs @@ -330,9 +330,12 @@ mod tests { machine::tests::{inner, inner_with_mb, input_event, music_hoard}, IApp, IAppAccess, IAppInput, }, - lib::interface::musicbrainz::{ - api::Entity, - daemon::{MbParams, MockIMbJobSender}, + lib::{ + interface::musicbrainz::{ + api::Entity, + daemon::{MbParams, MockIMbJobSender}, + }, + MockIMusicHoard, }, }; @@ -660,14 +663,34 @@ mod tests { // (3) An album with a different album_id than the selected one. // (4) This album has an MBID that is identical to that of the selected match. let mb_ref = AlbumMbRef::Some(mbid().into()); - let removed = Album::new(AlbumId::new("Not the Same").with_mb_ref(mb_ref)); + let removed = Album::new(AlbumId::new("Album: Not the Same").with_mb_ref(mb_ref.clone())); artist.albums.push(removed.clone()); + // (5) An album after the one that will be removed. Selection must remain on it. + let selected = Album::new(AlbumId::new("Album: Z")); + artist.albums.push(selected.clone()); + let (_tx, rx) = mpsc::channel(); let app_matches = MatchState::new(matches_info.clone(), FetchState::search(rx)); let collection = vec![artist]; - let mut music_hoard = music_hoard(collection.clone()); + let mut reduced = collection.clone(); + reduced[0].albums.retain(|a| a.meta.id.mb_ref != mb_ref); + + // We need a custom music_hoard to override the get_filtered expectations. + let mut music_hoard = MockIMusicHoard::new(); + let mut seq = Sequence::new(); + music_hoard + .expect_get_filtered() + .times(2) + .in_sequence(&mut seq) + .return_const(collection.clone()); + music_hoard + .expect_get_filtered() + .times(1) + .in_sequence(&mut seq) + .return_const(reduced.clone()); + match matches_info { EntityMatches::Artist(_) => panic!(), EntityMatches::Album(matches) => { @@ -678,7 +701,7 @@ mod tests { .expect_get_collection() .times(1) .in_sequence(&mut seq) - .return_const(collection); + .return_const(collection.clone()); music_hoard .expect_remove_album() .times(1) @@ -698,8 +721,26 @@ mod tests { } } - let matches = AppMachine::match_state(inner(music_hoard), app_matches); - matches.select().unwrap_fetch(); + let mut matches = AppMachine::match_state(inner(music_hoard), app_matches); + + // Make sure the last album is selected. + let selection = &mut matches.inner.selection; + selection.increment_category(); + selection.increment_selection(&collection, Delta::Line); + selection.increment_selection(&collection, Delta::Line); + + // Check that the correct album is selected. + let state = selection.state_album(&collection).unwrap(); + let album = &collection[0].albums[state.index]; + assert_eq!(album.meta, selected.meta); + + let mut fetch = matches.select().unwrap_fetch(); + + // Check that the correct album is still selected in the reduced collection. + let selection = &mut fetch.inner.selection; + let state = selection.state_album(&reduced).unwrap(); + let album = &reduced[0].albums[state.index]; + assert_eq!(album.meta, selected.meta); } #[test]