diff --git a/src/tui/app/machine/browse.rs b/src/tui/app/machine/browse.rs index 9410c00..a8cb175 100644 --- a/src/tui/app/machine/browse.rs +++ b/src/tui/app/machine/browse.rs @@ -89,16 +89,11 @@ impl IAppInteractBrowse for AppMachine { #[cfg(test)] mod tests { - use mockall::{predicate, Sequence}; - use musichoard::collection::{album::AlbumMeta, artist::ArtistMeta, musicbrainz::Mbid}; - use crate::tui::{ app::{ - machine::tests::{inner, inner_with_mb, music_hoard}, - AppAlbumMatches, AppArtistMatches, AppMatchesInfo, Category, IAppAccess, IAppInteract, - IAppInteractMatches, MatchOption, + machine::tests::{inner, music_hoard}, + Category, IAppInteract, }, - lib::interface::musicbrainz::{self, Match, MockIMusicBrainz}, testmod::COLLECTION, }; @@ -174,208 +169,12 @@ mod tests { app.unwrap_search(); } - // #[test] - // fn fetch_musicbrainz() { - // let mut mb_api = MockIMusicBrainz::new(); - - // let arid: Mbid = "11111111-1111-1111-1111-111111111111".try_into().unwrap(); - // let album_1 = COLLECTION[1].albums[0].meta.clone(); - // let album_4 = COLLECTION[1].albums[3].meta.clone(); - - // let album_match_1_1 = Match::new(100, album_1.clone()); - // let album_match_1_2 = Match::new(50, album_4.clone()); - // let album_match_4_1 = Match::new(100, album_4.clone()); - // let album_match_4_2 = Match::new(30, album_1.clone()); - // let matches_1 = vec![album_match_1_1.clone(), album_match_1_2.clone()]; - // let matches_4 = vec![album_match_4_1.clone(), album_match_4_2.clone()]; - - // let result_1: Result>, musicbrainz::Error> = Ok(matches_1.clone()); - // let result_4: Result>, musicbrainz::Error> = Ok(matches_4.clone()); - - // // Other albums have an MBID and so they will be skipped. - // let mut seq = Sequence::new(); - - // mb_api - // .expect_search_release_group() - // .with(predicate::eq(arid.clone()), predicate::eq(album_1.clone())) - // .times(1) - // .in_sequence(&mut seq) - // .return_once(|_, _| result_1); - // mb_api - // .expect_search_release_group() - // .with(predicate::eq(arid.clone()), predicate::eq(album_4.clone())) - // .times(1) - // .in_sequence(&mut seq) - // .return_once(|_, _| result_4); - - // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); - - // // Use the second artist for this test. - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - // let mut app = browse.fetch_musicbrainz(); - - // let public = app.get(); - // assert!(matches!(public.state, AppState::Matches(_))); - - // let public_matches = public.state.unwrap_matches(); - - // let mut matches_1: Vec> = - // matches_1.into_iter().map(Into::into).collect(); - // matches_1.push(MatchOption::CannotHaveMbid); - // let expected = Some(AppMatchesInfo::Album(AppAlbumMatches { - // matching: album_1.clone(), - // list: matches_1.clone(), - // })); - // assert_eq!(public_matches.matches, expected.as_ref()); - - // let mut app = app.unwrap_matches().select(); - - // let public = app.get(); - // assert!(matches!(public.state, AppState::Matches(_))); - - // let public_matches = public.state.unwrap_matches(); - - // let mut matches_4: Vec> = - // matches_4.into_iter().map(Into::into).collect(); - // matches_4.push(MatchOption::CannotHaveMbid); - // let expected = Some(AppMatchesInfo::Album(AppAlbumMatches { - // matching: album_4.clone(), - // list: matches_4.clone(), - // })); - // assert_eq!(public_matches.matches, expected.as_ref()); - - // let app = app.unwrap_matches().select(); - // app.unwrap_browse(); - // } - - // #[test] - // fn fetch_musicbrainz_no_artist() { - // let browse = AppMachine::browse(inner(music_hoard(vec![]))); - // let app = browse.fetch_musicbrainz(); - // app.unwrap_error(); - // } - - // #[test] - // fn fetch_musicbrainz_no_artist_mbid() { - // let mut mb_api = MockIMusicBrainz::new(); - - // let artist = COLLECTION[3].meta.clone(); - - // let artist_match_1 = Match::new(100, artist.clone()); - // let artist_match_2 = Match::new(50, artist.clone()); - // let matches = vec![artist_match_1.clone(), artist_match_2.clone()]; - - // let result: Result>, musicbrainz::Error> = Ok(matches.clone()); - - // mb_api - // .expect_search_artist() - // .with(predicate::eq(artist.clone())) - // .times(1) - // .return_once(|_| result); - - // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); - - // // Use the fourth artist for this test as they have no MBID. - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - // let mut app = browse.fetch_musicbrainz(); - - // let public = app.get(); - // assert!(matches!(public.state, AppState::Matches(_))); - - // let public_matches = public.state.unwrap_matches(); - - // let mut matches: Vec> = - // matches.into_iter().map(Into::into).collect(); - // matches.push(MatchOption::CannotHaveMbid); - // let expected = Some(AppMatchesInfo::Artist(AppArtistMatches { - // matching: artist.clone(), - // list: matches.clone(), - // })); - // assert_eq!(public_matches.matches, expected.as_ref()); - - // let app = app.unwrap_matches().select(); - // app.unwrap_browse(); - // } - - // #[test] - // fn fetch_musicbrainz_artist_api_error() { - // let mut mb_api = MockIMusicBrainz::new(); - - // let error = Err(musicbrainz::Error::RateLimit); - - // mb_api - // .expect_search_artist() - // .times(1) - // .return_once(|_| error); - - // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); - - // // Use the fourth artist for this test as they have no MBID. - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); - - // let app = browse.fetch_musicbrainz(); - // app.unwrap_error(); - // } - - // #[test] - // fn fetch_musicbrainz_album_api_error() { - // let mut mb_api = MockIMusicBrainz::new(); - - // let error = Err(musicbrainz::Error::RateLimit); - - // mb_api - // .expect_search_release_group() - // .times(1) - // .return_once(|_, _| error); - - // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); - - // let app = browse.fetch_musicbrainz(); - // app.unwrap_error(); - // } - - // #[test] - // fn fetch_musicbrainz_artist_receiver_disconnect() { - // let (tx, rx) = mpsc::channel::(); - // drop(rx); - - // let mut mb_api = MockIMusicBrainz::new(); - - // mb_api - // .expect_search_artist() - // .times(1) - // .return_once(|_| Ok(vec![])); - - // // We only check it does not panic and that it doesn't call the API more than once. - // AppMachine::fetch_artist(Arc::new(Mutex::new(mb_api)), tx, COLLECTION[3].meta.clone()); - // } - - // #[test] - // fn fetch_musicbrainz_albums_receiver_disconnect() { - // let (tx, rx) = mpsc::channel::(); - // drop(rx); - - // let mut mb_api = MockIMusicBrainz::new(); - - // mb_api - // .expect_search_release_group() - // .times(1) - // .return_once(|_, _| Ok(vec![])); - - // // We only check it does not panic and that it doesn't call the API more than once. - // let mbref = &COLLECTION[1].meta.musicbrainz; - // let albums = &COLLECTION[1].albums; - // AppMachine::fetch_albums( - // Arc::new(Mutex::new(mb_api)), - // tx, - // mbref.as_ref().unwrap().mbid().clone(), - // albums.iter().map(|a| &a.meta).cloned().collect(), - // ); - // } + #[test] + fn fetch_musicbrainz() { + let browse = AppMachine::browse(inner(music_hoard(vec![]))); + let app = browse.fetch_musicbrainz(); + app.unwrap_error(); + } #[test] fn no_op() { diff --git a/src/tui/app/machine/fetch.rs b/src/tui/app/machine/fetch.rs index 36f2620..b985c9b 100644 --- a/src/tui/app/machine/fetch.rs +++ b/src/tui/app/machine/fetch.rs @@ -200,6 +200,209 @@ mod tests { // use super::*; + // #[test] + // fn fetch_musicbrainz() { + // let mut mb_api = MockIMusicBrainz::new(); + + // let arid: Mbid = "11111111-1111-1111-1111-111111111111".try_into().unwrap(); + // let album_1 = COLLECTION[1].albums[0].meta.clone(); + // let album_4 = COLLECTION[1].albums[3].meta.clone(); + + // let album_match_1_1 = Match::new(100, album_1.clone()); + // let album_match_1_2 = Match::new(50, album_4.clone()); + // let album_match_4_1 = Match::new(100, album_4.clone()); + // let album_match_4_2 = Match::new(30, album_1.clone()); + // let matches_1 = vec![album_match_1_1.clone(), album_match_1_2.clone()]; + // let matches_4 = vec![album_match_4_1.clone(), album_match_4_2.clone()]; + + // let result_1: Result>, musicbrainz::Error> = Ok(matches_1.clone()); + // let result_4: Result>, musicbrainz::Error> = Ok(matches_4.clone()); + + // // Other albums have an MBID and so they will be skipped. + // let mut seq = Sequence::new(); + + // mb_api + // .expect_search_release_group() + // .with(predicate::eq(arid.clone()), predicate::eq(album_1.clone())) + // .times(1) + // .in_sequence(&mut seq) + // .return_once(|_, _| result_1); + // mb_api + // .expect_search_release_group() + // .with(predicate::eq(arid.clone()), predicate::eq(album_4.clone())) + // .times(1) + // .in_sequence(&mut seq) + // .return_once(|_, _| result_4); + + // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); + + // // Use the second artist for this test. + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + // let mut app = browse.fetch_musicbrainz(); + + // let public = app.get(); + // assert!(matches!(public.state, AppState::Matches(_))); + + // let public_matches = public.state.unwrap_matches(); + + // let mut matches_1: Vec> = + // matches_1.into_iter().map(Into::into).collect(); + // matches_1.push(MatchOption::CannotHaveMbid); + // let expected = Some(AppMatchesInfo::Album(AppAlbumMatches { + // matching: album_1.clone(), + // list: matches_1.clone(), + // })); + // assert_eq!(public_matches.matches, expected.as_ref()); + + // let mut app = app.unwrap_matches().select(); + + // let public = app.get(); + // assert!(matches!(public.state, AppState::Matches(_))); + + // let public_matches = public.state.unwrap_matches(); + + // let mut matches_4: Vec> = + // matches_4.into_iter().map(Into::into).collect(); + // matches_4.push(MatchOption::CannotHaveMbid); + // let expected = Some(AppMatchesInfo::Album(AppAlbumMatches { + // matching: album_4.clone(), + // list: matches_4.clone(), + // })); + // assert_eq!(public_matches.matches, expected.as_ref()); + + // let app = app.unwrap_matches().select(); + // app.unwrap_browse(); + // } + + // #[test] + // fn fetch_musicbrainz_no_artist() { + // let browse = AppMachine::browse(inner(music_hoard(vec![]))); + // let app = browse.fetch_musicbrainz(); + // app.unwrap_error(); + // } + + // #[test] + // fn fetch_musicbrainz_no_artist_mbid() { + // let mut mb_api = MockIMusicBrainz::new(); + + // let artist = COLLECTION[3].meta.clone(); + + // let artist_match_1 = Match::new(100, artist.clone()); + // let artist_match_2 = Match::new(50, artist.clone()); + // let matches = vec![artist_match_1.clone(), artist_match_2.clone()]; + + // let result: Result>, musicbrainz::Error> = Ok(matches.clone()); + + // mb_api + // .expect_search_artist() + // .with(predicate::eq(artist.clone())) + // .times(1) + // .return_once(|_| result); + + // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); + + // // Use the fourth artist for this test as they have no MBID. + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + // let mut app = browse.fetch_musicbrainz(); + + // let public = app.get(); + // assert!(matches!(public.state, AppState::Matches(_))); + + // let public_matches = public.state.unwrap_matches(); + + // let mut matches: Vec> = + // matches.into_iter().map(Into::into).collect(); + // matches.push(MatchOption::CannotHaveMbid); + // let expected = Some(AppMatchesInfo::Artist(AppArtistMatches { + // matching: artist.clone(), + // list: matches.clone(), + // })); + // assert_eq!(public_matches.matches, expected.as_ref()); + + // let app = app.unwrap_matches().select(); + // app.unwrap_browse(); + // } + + // #[test] + // fn fetch_musicbrainz_artist_api_error() { + // let mut mb_api = MockIMusicBrainz::new(); + + // let error = Err(musicbrainz::Error::RateLimit); + + // mb_api + // .expect_search_artist() + // .times(1) + // .return_once(|_| error); + + // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); + + // // Use the fourth artist for this test as they have no MBID. + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + // let browse = browse.increment_selection(Delta::Line).unwrap_browse(); + + // let app = browse.fetch_musicbrainz(); + // app.unwrap_error(); + // } + + // #[test] + // fn fetch_musicbrainz_album_api_error() { + // let mut mb_api = MockIMusicBrainz::new(); + + // let error = Err(musicbrainz::Error::RateLimit); + + // mb_api + // .expect_search_release_group() + // .times(1) + // .return_once(|_, _| error); + + // let browse = AppMachine::browse(inner_with_mb(music_hoard(COLLECTION.to_owned()), mb_api)); + + // let app = browse.fetch_musicbrainz(); + // app.unwrap_error(); + // } + + // #[test] + // fn fetch_musicbrainz_artist_receiver_disconnect() { + // let (tx, rx) = mpsc::channel::(); + // drop(rx); + + // let mut mb_api = MockIMusicBrainz::new(); + + // mb_api + // .expect_search_artist() + // .times(1) + // .return_once(|_| Ok(vec![])); + + // // We only check it does not panic and that it doesn't call the API more than once. + // AppMachine::fetch_artist(Arc::new(Mutex::new(mb_api)), tx, COLLECTION[3].meta.clone()); + // } + + // #[test] + // fn fetch_musicbrainz_albums_receiver_disconnect() { + // let (tx, rx) = mpsc::channel::(); + // drop(rx); + + // let mut mb_api = MockIMusicBrainz::new(); + + // mb_api + // .expect_search_release_group() + // .times(1) + // .return_once(|_, _| Ok(vec![])); + + // // We only check it does not panic and that it doesn't call the API more than once. + // let mbref = &COLLECTION[1].meta.musicbrainz; + // let albums = &COLLECTION[1].albums; + // AppMachine::fetch_albums( + // Arc::new(Mutex::new(mb_api)), + // tx, + // mbref.as_ref().unwrap().mbid().clone(), + // albums.iter().map(|a| &a.meta).cloned().collect(), + // ); + // } + // impl Match { // pub fn new(score: u8, item: T) -> Self { // Match {