mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-25 22:36:59 -04:00
Fixed: Extra tests and fixes for new track parser (#632)
* Extra tests and fixes for new track parser * Address review comments, add extra test, fix logging
This commit is contained in:
@@ -53,13 +53,13 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
|
||||
var track = Builder<Track>.CreateListOfSize(10)
|
||||
.TheFirst(1)
|
||||
.With(a => a.TrackFileId = files[0].Id)
|
||||
.TheNext(1)
|
||||
.With(a => a.TrackFileId = files[1].Id)
|
||||
.TheNext(1)
|
||||
.With(a => a.TrackFileId = files[2].Id)
|
||||
.TheNext(1)
|
||||
.With(a => a.TrackFileId = files[3].Id)
|
||||
.TheNext(1)
|
||||
.With(a => a.TrackFileId = files[4].Id)
|
||||
.TheNext(6)
|
||||
.With(a => a.TrackFileId = 0)
|
||||
.All()
|
||||
@@ -115,9 +115,15 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
{
|
||||
foreach (var file in files)
|
||||
{
|
||||
file.Tracks.IsLoaded.Should().BeTrue();
|
||||
file.Tracks.Value.Should().NotBeNull();
|
||||
file.Tracks.Value.Should().NotBeEmpty();
|
||||
file.Album.IsLoaded.Should().BeTrue();
|
||||
file.Album.Value.Should().NotBeNull();
|
||||
file.Artist.IsLoaded.Should().BeTrue();
|
||||
file.Artist.Value.Should().NotBeNull();
|
||||
file.Artist.Value.Metadata.IsLoaded.Should().BeTrue();
|
||||
file.Artist.Value.Metadata.Value.Should().NotBeNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+49
-1
@@ -54,7 +54,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
.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)
|
||||
.With(x => x.Year = (uint)(release.Album.Value.ReleaseDate?.Year ?? 0))
|
||||
.Build();
|
||||
|
||||
var localTrack = Builder<LocalTrack>
|
||||
@@ -212,5 +212,53 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
|
||||
Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().Be(0.0);
|
||||
}
|
||||
|
||||
private static DateTime?[] dates = new DateTime?[] { null, new DateTime(2007, 1, 1), DateTime.Now };
|
||||
|
||||
[TestCaseSource("dates")]
|
||||
public void test_null_album_year(DateTime? releaseDate)
|
||||
{
|
||||
var tracks = GivenTracks(3);
|
||||
var release = GivenAlbumRelease("album", tracks);
|
||||
var localTracks = GivenLocalTracks(tracks, release);
|
||||
var mapping = GivenMapping(localTracks, tracks);
|
||||
|
||||
release.Album.Value.ReleaseDate = null;
|
||||
release.ReleaseDate = releaseDate;
|
||||
|
||||
var result = Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance();
|
||||
|
||||
if (!releaseDate.HasValue || (localTracks[0].FileTrackInfo.Year == (releaseDate?.Year ?? 0)))
|
||||
{
|
||||
result.Should().Be(0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Should().NotBe(0.0);
|
||||
}
|
||||
}
|
||||
|
||||
[TestCaseSource("dates")]
|
||||
public void test_null_release_year(DateTime? albumDate)
|
||||
{
|
||||
var tracks = GivenTracks(3);
|
||||
var release = GivenAlbumRelease("album", tracks);
|
||||
var localTracks = GivenLocalTracks(tracks, release);
|
||||
var mapping = GivenMapping(localTracks, tracks);
|
||||
|
||||
release.Album.Value.ReleaseDate = albumDate;
|
||||
release.ReleaseDate = null;
|
||||
|
||||
var result = Subject.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance();
|
||||
|
||||
if (!albumDate.HasValue || (localTracks[0].FileTrackInfo.Year == (albumDate?.Year ?? 0)))
|
||||
{
|
||||
result.Should().Be(0.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Should().NotBe(0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+56
-9
@@ -17,6 +17,11 @@ using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.Profiles.Metadata;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using NzbDrone.Test.Common;
|
||||
using System.Collections.Generic;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Parser;
|
||||
using NzbDrone.Core.MediaFiles.TrackImport.Aggregation.Aggregators;
|
||||
using NzbDrone.Core.MediaFiles.TrackImport.Aggregation;
|
||||
|
||||
namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
{
|
||||
@@ -62,23 +67,45 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
Mocker.GetMock<IAddArtistValidator>().Setup(x => x.Validate(It.IsAny<Artist>())).Returns(new ValidationResult());
|
||||
|
||||
Mocker.SetConstant<ITrackGroupingService>(Mocker.Resolve<TrackGroupingService>());
|
||||
|
||||
// set up the augmenters
|
||||
List<IAggregate<LocalAlbumRelease>> aggregators = new List<IAggregate<LocalAlbumRelease>> {
|
||||
Mocker.Resolve<AggregateFilenameInfo>()
|
||||
};
|
||||
Mocker.SetConstant<IEnumerable<IAggregate<LocalAlbumRelease>>>(aggregators);
|
||||
Mocker.SetConstant<IAugmentingService>(Mocker.Resolve<AugmentingService>());
|
||||
|
||||
Subject = Mocker.Resolve<IdentificationService>();
|
||||
|
||||
}
|
||||
|
||||
private void GivenMetadataProfile(MetadataProfile profile)
|
||||
{
|
||||
Mocker.GetMock<IMetadataProfileService>().Setup(x => x.Get(It.IsAny<int>())).Returns(profile);
|
||||
Mocker.GetMock<IMetadataProfileService>().Setup(x => x.Get(profile.Id)).Returns(profile);
|
||||
}
|
||||
|
||||
private Artist GivenArtist(string foreignArtistId)
|
||||
private List<Artist> GivenArtists(List<ArtistTestCase> artists)
|
||||
{
|
||||
var outp = new List<Artist>();
|
||||
for (int i = 0; i < artists.Count; i++)
|
||||
{
|
||||
var meta = artists[i].MetadataProfile;
|
||||
meta.Id = i + 1;
|
||||
GivenMetadataProfile(meta);
|
||||
outp.Add(GivenArtist(artists[i].Artist, meta.Id));
|
||||
}
|
||||
|
||||
return outp;
|
||||
}
|
||||
|
||||
private Artist GivenArtist(string foreignArtistId, int metadataProfileId)
|
||||
{
|
||||
var artist = _addArtistService.AddArtist(new Artist {
|
||||
Metadata = new ArtistMetadata {
|
||||
ForeignArtistId = foreignArtistId
|
||||
},
|
||||
Path = @"c:\test".AsOsAgnostic(),
|
||||
MetadataProfileId = 1
|
||||
MetadataProfileId = metadataProfileId
|
||||
});
|
||||
|
||||
var command = new RefreshArtistCommand{
|
||||
@@ -91,6 +118,18 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
return _artistService.FindById(foreignArtistId);
|
||||
}
|
||||
|
||||
private void GivenFingerprints(List<AcoustIdTestCase> fingerprints)
|
||||
{
|
||||
Mocker.GetMock<IConfigService>().Setup(x => x.AllowFingerprinting).Returns(AllowFingerprinting.AllFiles);
|
||||
Mocker.GetMock<IFingerprintingService>().Setup(x => x.IsSetup()).Returns(true);
|
||||
|
||||
Mocker.GetMock<IFingerprintingService>()
|
||||
.Setup(x => x.Lookup(It.IsAny<List<LocalTrack>>(), It.IsAny<double>()))
|
||||
.Callback((List<LocalTrack> track, double thres) => {
|
||||
track.ForEach(x => x.AcoustIdResults = fingerprints.SingleOrDefault(f => f.Path == x.Path).AcoustIdResults);
|
||||
});
|
||||
}
|
||||
|
||||
public static class IdTestCaseFactory
|
||||
{
|
||||
// for some reason using Directory.GetFiles causes nUnit to error
|
||||
@@ -99,7 +138,9 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
"PreferMissingToBadMatch.json",
|
||||
"InconsistentTyposInAlbum.json",
|
||||
"SucceedWhenManyAlbumsHaveSameTitle.json",
|
||||
"PenalizeUnknownMedia.json"
|
||||
"PenalizeUnknownMedia.json",
|
||||
"CorruptFile.json",
|
||||
"FilesWithoutTags.json"
|
||||
};
|
||||
|
||||
public static IEnumerable TestCases
|
||||
@@ -122,19 +163,25 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "Files", "Identification", file);
|
||||
var testcase = JsonConvert.DeserializeObject<IdTestCase>(File.ReadAllText(path));
|
||||
|
||||
GivenMetadataProfile(testcase.MetadataProfile);
|
||||
|
||||
var artist = GivenArtist(testcase.Artist);
|
||||
var artists = GivenArtists(testcase.LibraryArtists);
|
||||
var specifiedArtist = artists.SingleOrDefault(x => x.Metadata.Value.ForeignArtistId == testcase.Artist);
|
||||
|
||||
var tracks = testcase.Tracks.Select(x => new LocalTrack {
|
||||
Path = x.Path.AsOsAgnostic(),
|
||||
FileTrackInfo = x.FileTrackInfo
|
||||
}).ToList();
|
||||
|
||||
var result = Subject.Identify(tracks, artist, null, null, testcase.NewDownload, testcase.SingleRelease);
|
||||
if (testcase.Fingerprints != null)
|
||||
{
|
||||
GivenFingerprints(testcase.Fingerprints);
|
||||
}
|
||||
|
||||
var result = Subject.Identify(tracks, specifiedArtist, null, null, testcase.NewDownload, testcase.SingleRelease);
|
||||
|
||||
TestLogger.Debug($"Found releases:\n{result.Where(x => x.AlbumRelease != null).Select(x => x.AlbumRelease?.ForeignReleaseId).ToJson()}");
|
||||
|
||||
result.Should().HaveCount(testcase.ExpectedMusicBrainzReleaseIds.Count);
|
||||
result.Select(x => x.AlbumRelease.ForeignReleaseId).ShouldBeEquivalentTo(testcase.ExpectedMusicBrainzReleaseIds);
|
||||
result.Where(x => x.AlbumRelease != null).Select(x => x.AlbumRelease.ForeignReleaseId).ShouldBeEquivalentTo(testcase.ExpectedMusicBrainzReleaseIds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+40
-1
@@ -47,7 +47,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
|
||||
protected override string GetString(MemberInfo memberInfo)
|
||||
{
|
||||
int length = generator.Next(0, 100);
|
||||
int length = generator.Next(1, 100);
|
||||
|
||||
char[] chars = new char[length];
|
||||
|
||||
@@ -102,6 +102,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
return outp;
|
||||
}
|
||||
|
||||
[Repeat(100)]
|
||||
private List<LocalTrack> GivenVaTracks(string root, string album, int count)
|
||||
{
|
||||
var settings = new BuilderSettings();
|
||||
@@ -135,7 +136,9 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
||||
}
|
||||
|
||||
// GivenVaTracks uses random names so repeat multiple times to try to prompt any intermittent failures
|
||||
[Test]
|
||||
[Repeat(100)]
|
||||
public void all_different_artists_is_various_artists()
|
||||
{
|
||||
var tracks = GivenVaTracks(@"C:\music\incoming".AsOsAgnostic(), "album", 10);
|
||||
@@ -153,6 +156,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Repeat(100)]
|
||||
public void mostly_different_artists_is_various_artists()
|
||||
{
|
||||
var dir = @"C:\music\incoming".AsOsAgnostic();
|
||||
@@ -172,6 +176,16 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
TrackGroupingService.IsVariousArtists(tracks).Should().Be(true);
|
||||
}
|
||||
|
||||
[TestCase("Va?!")]
|
||||
[TestCase("Va Va Voom")]
|
||||
[TestCase("V.A. Jr.")]
|
||||
[TestCase("Ca Va")]
|
||||
public void va_in_artist_name_is_not_various_artists(string artist)
|
||||
{
|
||||
var tracks = GivenTracks(@"C:\music\incoming".AsOsAgnostic(), artist, "album", 10);
|
||||
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
||||
}
|
||||
|
||||
[TestCase(1)]
|
||||
[TestCase(2)]
|
||||
[TestCase(10)]
|
||||
@@ -308,6 +322,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Repeat(100)]
|
||||
public void should_group_va_release()
|
||||
{
|
||||
var tracks = GivenVaTracks(@"C:\music\incoming".AsOsAgnostic(), "album", 10);
|
||||
@@ -365,5 +380,29 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
|
||||
output.Count.Should().Be(1);
|
||||
output[0].LocalTracks.Count.Should().Be(12);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_cope_with_one_album_in_subfolder_of_another()
|
||||
{
|
||||
var tracks = GivenTracks($"C:\\music\\incoming\\album".AsOsAgnostic(),
|
||||
"artist1", "album", 10);
|
||||
tracks.AddRange(GivenTracks($"C:\\music\\incoming\\album\\anotheralbum".AsOsAgnostic(),
|
||||
"artist2", "album2", 10));
|
||||
|
||||
TrackGroupingService.IsVariousArtists(tracks).Should().Be(false);
|
||||
TrackGroupingService.LooksLikeSingleRelease(tracks).Should().Be(false);
|
||||
|
||||
var output = Subject.GroupTracks(tracks);
|
||||
|
||||
foreach(var group in output)
|
||||
{
|
||||
TestLogger.Debug($"*** group {group} ***");
|
||||
TestLogger.Debug(string.Join("\n", group.LocalTracks.Select(x => x.Path)));
|
||||
}
|
||||
|
||||
output.Count.Should().Be(2);
|
||||
output[0].LocalTracks.Count.Should().Be(10);
|
||||
output[1].LocalTracks.Count.Should().Be(10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user