diff --git a/README.md b/README.md index e88046b..c2aeb62 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ grcov codecov/debug/profraw \ --ignore "tests/*" \ --ignore "src/main.rs" \ --ignore "src/bin/musichoard-edit.rs" \ - --excl-line "^#\[derive" \ + --excl-line "^#\[derive|unimplemented\!\(\)" \ --excl-start "GRCOV_EXCL_START|mod tests \{" \ --excl-stop "GRCOV_EXCL_STOP" \ --output-path ./codecov/debug/coverage/ diff --git a/src/external/musicbrainz/api/mod.rs b/src/external/musicbrainz/api/mod.rs index a16da76..dc86686 100644 --- a/src/external/musicbrainz/api/mod.rs +++ b/src/external/musicbrainz/api/mod.rs @@ -61,7 +61,7 @@ impl MusicBrainzClient { } } -#[derive(Debug, Default)] +#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] pub struct PageSettings { limit: Option, offset: Option, @@ -80,7 +80,7 @@ impl PageSettings { } pub fn with_offset(mut self, offset: usize) -> Self { - self.offset = Some(offset); + self.set_offset(offset); self } diff --git a/src/tui/lib/external/musicbrainz/daemon/mod.rs b/src/tui/lib/external/musicbrainz/daemon/mod.rs index fa29297..744b75a 100644 --- a/src/tui/lib/external/musicbrainz/daemon/mod.rs +++ b/src/tui/lib/external/musicbrainz/daemon/mod.rs @@ -467,6 +467,12 @@ mod tests { ]) } + fn browse_albums_requests() -> VecDeque { + let mbref = mb_ref_opt_as_ref(&COLLECTION[1].meta.info.musicbrainz); + let arid = mb_ref_opt_unwrap(mbref).mbid().clone(); + VecDeque::from([MbParams::browse_release_group(arid)]) + } + fn album_artist_id() -> ArtistId { COLLECTION[1].meta.id.clone() } @@ -609,6 +615,9 @@ mod tests { let result = daemon.execute_next_job(); assert_eq!(result, Ok(())); + let result = daemon.execute_next_job(); + assert_eq!(result, Err(JobError::JobQueueEmpty)); + let result = result_receiver.try_recv().unwrap(); assert_eq!( result, @@ -657,6 +666,9 @@ mod tests { let result = daemon.execute_next_job(); assert_eq!(result, Ok(())); + let result = daemon.execute_next_job(); + assert_eq!(result, Err(JobError::JobQueueEmpty)); + let result = result_receiver.try_recv().unwrap(); let artist_id = album_artist_id(); assert_eq!( @@ -703,6 +715,9 @@ mod tests { let result = daemon.execute_next_job(); assert_eq!(result, Ok(())); + let result = daemon.execute_next_job(); + assert_eq!(result, Err(JobError::JobQueueEmpty)); + let result = result_receiver.try_recv().unwrap(); assert_eq!( result, @@ -759,6 +774,9 @@ mod tests { let result = daemon.execute_next_job(); assert_eq!(result, Ok(())); + let result = daemon.execute_next_job(); + assert_eq!(result, Err(JobError::JobQueueEmpty)); + let artist_id = album_artist_id(); let result = result_receiver.try_recv().unwrap(); @@ -828,6 +846,75 @@ mod tests { assert_eq!(result, Err(JobError::EventChannelDisconnected)); } + fn browse_release_group_expectation( + musicbrainz: &mut MockIMusicBrainz, + seq: &mut Sequence, + mbid: &Mbid, + page: Option, + matches: &[Entity], + next_page: Option, + ) { + let result = Ok(matches.to_owned()); + musicbrainz + .expect_browse_release_group() + .with(predicate::eq(mbid.clone()), predicate::eq(page)) + .times(1) + .in_sequence(seq) + .return_once(move |_, paging| { + *paging = next_page; + result + }); + } + + #[test] + fn execute_browse_release_groups() { + let mut musicbrainz = musicbrainz(); + let arid = album_arid_expectation(); + let (_, matches_1) = search_album_expectations_1(); + let (_, matches_4) = search_album_expectations_4(); + + let mut seq = Sequence::new(); + + let page = Some(PageSettings::with_max_limit()); + let next = Some(PageSettings::with_max_limit().with_offset(10)); + browse_release_group_expectation(&mut musicbrainz, &mut seq, &arid, page, &matches_1, next); + + let page = next; + let next = None; + browse_release_group_expectation(&mut musicbrainz, &mut seq, &arid, page, &matches_4, next); + + let mut event_sender = event_sender(); + fetch_complete_expectation(&mut event_sender, 2); + + let (job_sender, job_receiver) = job_channel(); + let mut daemon = daemon_with(musicbrainz, job_receiver, event_sender); + + let requests = browse_albums_requests(); + let (result_sender, result_receiver) = mpsc::channel(); + let result = job_sender.submit_background_job(result_sender, requests); + assert_eq!(result, Ok(())); + + let result = daemon.enqueue_all_pending_jobs(); + assert_eq!(result, Ok(())); + + let result = daemon.execute_next_job(); + assert_eq!(result, Ok(())); + + let result = daemon.execute_next_job(); + assert_eq!(result, Ok(())); + + let result = daemon.execute_next_job(); + assert_eq!(result, Err(JobError::JobQueueEmpty)); + + let result = result_receiver.try_recv().unwrap(); + let fetch = EntityList::Album(matches_1.into_iter().map(|m| m.entity).collect()); + assert_eq!(result, Ok(MbReturn::Fetch(fetch))); + + let result = result_receiver.try_recv().unwrap(); + let fetch = EntityList::Album(matches_4.into_iter().map(|m| m.entity).collect()); + assert_eq!(result, Ok(MbReturn::Fetch(fetch))); + } + #[test] fn job_queue() { let mut queue = JobQueue::new(); diff --git a/src/tui/lib/interface/musicbrainz/daemon/mod.rs b/src/tui/lib/interface/musicbrainz/daemon/mod.rs index 24d0ff6..1c54b80 100644 --- a/src/tui/lib/interface/musicbrainz/daemon/mod.rs +++ b/src/tui/lib/interface/musicbrainz/daemon/mod.rs @@ -135,6 +135,13 @@ impl MbParams { album, })) } + + #[allow(dead_code)] // TODO: to be removed by completion of #160 + pub fn browse_release_group(artist: Mbid) -> Self { + MbParams::Browse(BrowseParams::ReleaseGroup(BrowseReleaseGroupParams { + artist, + })) + } } #[cfg(test)]