using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.MediaFiles.TrackImport; using NzbDrone.Core.MediaFiles.TrackImport.Identification; using NzbDrone.Core.Music; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification { [TestFixture] public class GetCandidatesFixture : CoreTest { private ArtistMetadata _artist; [SetUp] public void Setup() { _artist = Builder .CreateNew() .With(x => x.Name = "artist") .Build(); } private List GivenTracks(int count) { return Builder .CreateListOfSize(count) .All() .With(x => x.ArtistMetadata = _artist) .Build() .ToList(); } private ParsedTrackInfo GivenParsedTrackInfo(Track track, AlbumRelease release) { return Builder .CreateNew() .With(x => x.Title = track.Title) .With(x => x.AlbumTitle = release.Title) .With(x => x.Disambiguation = release.Disambiguation) .With(x => x.ReleaseMBId = release.ForeignReleaseId) .With(x => x.ArtistTitle = track.ArtistMetadata.Value.Name) .With(x => x.TrackNumbers = new[] { track.AbsoluteTrackNumber }) .With(x => x.RecordingMBId = track.ForeignRecordingId) .With(x => x.Country = IsoCountries.Find("US")) .With(x => x.Label = release.Label.First()) .With(x => x.Year = (uint)release.Album.Value.ReleaseDate.Value.Year) .Build(); } private List GivenLocalTracks(List tracks, AlbumRelease release) { var output = Builder .CreateListOfSize(tracks.Count) .Build() .ToList(); for (var i = 0; i < tracks.Count; i++) { output[i].FileTrackInfo = GivenParsedTrackInfo(tracks[i], release); } return output; } private AlbumRelease GivenAlbumRelease(string title, List tracks) { var album = Builder .CreateNew() .With(x => x.Title = title) .With(x => x.ArtistMetadata = _artist) .Build(); var media = Builder .CreateListOfSize(1) .Build() .ToList(); return Builder .CreateNew() .With(x => x.Tracks = tracks) .With(x => x.Title = title) .With(x => x.Album = album) .With(x => x.Media = media) .With(x => x.Country = new List()) .With(x => x.Label = new List { "label" }) .With(x => x.ForeignReleaseId = null) .Build(); } private LocalAlbumRelease GivenLocalAlbumRelease() { var tracks = GivenTracks(3); var release = GivenAlbumRelease("album", tracks); var localTracks = GivenLocalTracks(tracks, release); return new LocalAlbumRelease(localTracks); } [Test] public void get_candidates_by_fingerprint_should_not_fail_if_fingerprint_lookup_returned_null() { Mocker.GetMock() .Setup(x => x.Lookup(It.IsAny>(), It.IsAny())) .Callback((List x, double thres) => { foreach (var track in x) { track.AcoustIdResults = null; } }); Mocker.GetMock() .Setup(x => x.GetReleasesByRecordingIds(It.IsAny>())) .Returns(new List()); var local = GivenLocalAlbumRelease(); Subject.GetDbCandidatesFromFingerprint(local, null, false).Should().BeEquivalentTo(new List()); } [Test] public void get_candidates_should_only_return_specified_release_if_set() { var tracks = GivenTracks(3); var release = GivenAlbumRelease("album", tracks); var localTracks = GivenLocalTracks(tracks, release); var localAlbumRelease = new LocalAlbumRelease(localTracks); var idOverrides = new IdentificationOverrides { AlbumRelease = release }; Subject.GetDbCandidatesFromTags(localAlbumRelease, idOverrides, false).Should().BeEquivalentTo( new List { new CandidateAlbumRelease(release) }); } [Test] public void get_candidates_should_use_consensus_release_id() { var tracks = GivenTracks(3); var release = GivenAlbumRelease("album", tracks); release.ForeignReleaseId = "xxx"; var localTracks = GivenLocalTracks(tracks, release); var localAlbumRelease = new LocalAlbumRelease(localTracks); Mocker.GetMock() .Setup(x => x.GetReleaseByForeignReleaseId("xxx", true)) .Returns(release); Subject.GetDbCandidatesFromTags(localAlbumRelease, null, false).Should().BeEquivalentTo( new List { new CandidateAlbumRelease(release) }); } } }