New: Readarr 0.1

This commit is contained in:
ta264
2020-05-06 21:14:11 +01:00
parent 476f2d6047
commit 08496c82af
911 changed files with 14837 additions and 24442 deletions
@@ -17,6 +17,7 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
{
[TestFixture]
[Ignore("Readarr doesn't currently support audio")]
public class AudioTagServiceFixture : CoreTest<AudioTagService>
{
public static class TestCaseFactory
@@ -195,40 +196,6 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
VerifySame(writtentags, _testTags, skipProperties);
}
[Test]
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
public void should_remove_mb_tags(string filename, string[] skipProperties)
{
GivenFileCopy(filename);
var path = _copiedFile;
var track = new TrackFile
{
Path = path
};
_testTags.Write(path);
var withmb = Subject.ReadAudioTag(path);
VerifySame(withmb, _testTags, skipProperties);
Subject.RemoveMusicBrainzTags(track);
var tag = Subject.ReadAudioTag(path);
tag.MusicBrainzReleaseCountry.Should().BeNull();
tag.MusicBrainzReleaseStatus.Should().BeNull();
tag.MusicBrainzReleaseType.Should().BeNull();
tag.MusicBrainzReleaseId.Should().BeNull();
tag.MusicBrainzArtistId.Should().BeNull();
tag.MusicBrainzReleaseArtistId.Should().BeNull();
tag.MusicBrainzReleaseGroupId.Should().BeNull();
tag.MusicBrainzTrackId.Should().BeNull();
tag.MusicBrainzAlbumComment.Should().BeNull();
tag.MusicBrainzReleaseTrackId.Should().BeNull();
}
[Test]
[TestCaseSource(typeof(TestCaseFactory), "TestCases")]
public void should_read_audiotag_from_file_with_no_tags(string filename, string[] skipProperties)
@@ -337,40 +304,19 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
tag.OriginalReleaseDate.HasValue.Should().BeFalse();
}
private TrackFile GivenPopulatedTrackfile(int mediumOffset)
private BookFile GivenPopulatedTrackfile(int mediumOffset)
{
var meta = Builder<ArtistMetadata>.CreateNew().Build();
var artist = Builder<Artist>.CreateNew()
var meta = Builder<AuthorMetadata>.CreateNew().Build();
var artist = Builder<Author>.CreateNew()
.With(x => x.Metadata = meta)
.Build();
var album = Builder<Album>.CreateNew()
.With(x => x.Artist = artist)
var album = Builder<Book>.CreateNew()
.With(x => x.Author = artist)
.Build();
var media = Builder<Medium>.CreateListOfSize(2).Build() as List<Medium>;
media.ForEach(x => x.Number += mediumOffset);
var release = Builder<AlbumRelease>.CreateNew()
var file = Builder<BookFile>.CreateNew()
.With(x => x.Album = album)
.With(x => x.Media = media)
.With(x => x.Country = new List<string>())
.With(x => x.Label = new List<string>())
.Build();
var tracks = Builder<Track>.CreateListOfSize(10)
.All()
.With(x => x.AlbumRelease = release)
.With(x => x.ArtistMetadata = meta)
.TheFirst(5)
.With(x => x.MediumNumber = 1 + mediumOffset)
.TheNext(5)
.With(x => x.MediumNumber = 2 + mediumOffset)
.Build() as List<Track>;
release.Tracks = tracks;
var file = Builder<TrackFile>.CreateNew()
.With(x => x.Tracks = new List<Track> { tracks[0] })
.With(x => x.Artist = artist)
.Build();
@@ -382,8 +328,6 @@ namespace NzbDrone.Core.Test.MediaFiles.AudioTagServiceFixture
{
var file = GivenPopulatedTrackfile(0);
var tag = Subject.GetTrackMetadata(file);
tag.MusicBrainzReleaseCountry.Should().BeNull();
}
[Test]
@@ -24,7 +24,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
[TestFixture]
public class ScanFixture : FileSystemTest<DiskScanService>
{
private Artist _artist;
private Author _artist;
private string _rootFolder;
private string _otherArtistFolder;
@@ -35,7 +35,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
_otherArtistFolder = @"C:\Test\Music\OtherArtist".AsOsAgnostic();
var artistFolder = @"C:\Test\Music\Artist".AsOsAgnostic();
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(s => s.Path = artistFolder)
.Build();
@@ -45,7 +45,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Mocker.GetMock<IArtistService>()
.Setup(s => s.GetArtists(It.IsAny<List<int>>()))
.Returns(new List<Artist>());
.Returns(new List<Author>());
Mocker.GetMock<IMakeImportDecision>()
.Setup(v => v.GetImportDecisions(It.IsAny<List<IFileInfo>>(), It.IsAny<IdentificationOverrides>(), It.IsAny<ImportDecisionMakerInfo>(), It.IsAny<ImportDecisionMakerConfig>()))
@@ -53,11 +53,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Mocker.GetMock<IMediaFileService>()
.Setup(v => v.GetFilesByArtist(It.IsAny<int>()))
.Returns(new List<TrackFile>());
.Returns(new List<BookFile>());
Mocker.GetMock<IMediaFileService>()
.Setup(v => v.GetFilesWithBasePath(It.IsAny<string>()))
.Returns(new List<TrackFile>());
.Returns(new List<BookFile>());
Mocker.GetMock<IMediaFileService>()
.Setup(v => v.FilterUnchangedFiles(It.IsAny<List<IFileInfo>>(), It.IsAny<FilterFilesType>()))
@@ -105,7 +105,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Mocker.GetMock<IMediaFileService>()
.Setup(x => x.GetFilesWithBasePath(_artist.Path))
.Returns(files.Select(x => new TrackFile
.Returns(files.Select(x => new BookFile
{
Path = x,
Modified = lastWrite.Value.UtcDateTime
@@ -168,8 +168,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "file1.flac"),
Path.Combine(_artist.Path, "s01e01.flac")
Path.Combine(_artist.Path, "file1.mobi"),
Path.Combine(_artist.Path, "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -185,11 +185,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "EXTRAS", "file1.flac"),
Path.Combine(_artist.Path, "Extras", "file2.flac"),
Path.Combine(_artist.Path, "EXTRAs", "file3.flac"),
Path.Combine(_artist.Path, "ExTrAs", "file4.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "EXTRAS", "file1.mobi"),
Path.Combine(_artist.Path, "Extras", "file2.mobi"),
Path.Combine(_artist.Path, "EXTRAs", "file3.mobi"),
Path.Combine(_artist.Path, "ExTrAs", "file4.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -205,9 +205,9 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, ".AppleDouble", "file1.flac"),
Path.Combine(_artist.Path, ".appledouble", "file2.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, ".AppleDouble", "file1.mobi"),
Path.Combine(_artist.Path, ".appledouble", "file2.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -225,12 +225,12 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "Extras", "file1.flac"),
Path.Combine(_artist.Path, ".AppleDouble", "file2.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e02.flac"),
Path.Combine(_artist.Path, "Season 2", "s02e01.flac"),
Path.Combine(_artist.Path, "Season 2", "s02e02.flac"),
Path.Combine(_artist.Path, "Extras", "file1.mobi"),
Path.Combine(_artist.Path, ".AppleDouble", "file2.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e02.mobi"),
Path.Combine(_artist.Path, "Season 2", "s02e01.mobi"),
Path.Combine(_artist.Path, "Season 2", "s02e02.mobi"),
});
Subject.Scan(new List<string> { _artist.Path });
@@ -246,7 +246,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "Album 1", ".t01.mp3")
Path.Combine(_artist.Path, "Album 1", ".t01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -262,10 +262,10 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, ".@__thumb", "file1.flac"),
Path.Combine(_artist.Path, ".@__THUMB", "file2.flac"),
Path.Combine(_artist.Path, ".hidden", "file2.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, ".@__thumb", "file1.mobi"),
Path.Combine(_artist.Path, ".@__THUMB", "file2.mobi"),
Path.Combine(_artist.Path, ".hidden", "file2.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -281,11 +281,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "Season 1", ".@__thumb", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", ".@__THUMB", "file2.flac"),
Path.Combine(_artist.Path, "Season 1", ".hidden", "file2.flac"),
Path.Combine(_artist.Path, "Season 1", ".AppleDouble", "s01e01.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", ".@__thumb", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", ".@__THUMB", "file2.mobi"),
Path.Combine(_artist.Path, "Season 1", ".hidden", "file2.mobi"),
Path.Combine(_artist.Path, "Season 1", ".AppleDouble", "s01e01.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -301,8 +301,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "@eaDir", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "@eaDir", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -318,8 +318,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, ".@__thumb", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, ".@__thumb", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -337,8 +337,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -355,8 +355,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
GivenFiles(new List<string>
{
Path.Combine(_artist.Path, ".DS_STORE"),
Path.Combine(_artist.Path, "._24 The Status Quo Combustion.flac"),
Path.Combine(_artist.Path, "24 The Status Quo Combustion.flac")
Path.Combine(_artist.Path, "._24 The Status Quo Combustion.mobi"),
Path.Combine(_artist.Path, "24 The Status Quo Combustion.mobi")
});
Subject.Scan(new List<string> { _artist.Path });
@@ -386,8 +386,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{
var files = new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
};
GivenFiles(files);
@@ -397,7 +397,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Subject.Scan(new List<string> { _artist.Path });
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.AddMany(It.Is<List<TrackFile>>(l => l.Select(t => t.Path).SequenceEqual(files))),
.Verify(x => x.AddMany(It.Is<List<BookFile>>(l => l.Select(t => t.Path).SequenceEqual(files))),
Times.Once());
}
@@ -406,8 +406,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{
var files = new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
};
GivenFiles(files);
@@ -417,7 +417,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Subject.Scan(new List<string> { _artist.Path });
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.AddMany(It.Is<List<TrackFile>>(l => l.Select(t => t.Path).SequenceEqual(files.GetRange(0, 1)))),
.Verify(x => x.AddMany(It.Is<List<BookFile>>(l => l.Select(t => t.Path).SequenceEqual(files.GetRange(0, 1)))),
Times.Once());
}
@@ -426,8 +426,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{
var files = new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
};
GivenFiles(files);
@@ -437,11 +437,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Subject.Scan(new List<string> { _artist.Path });
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.AddMany(It.Is<List<TrackFile>>(l => l.Count == 0)),
.Verify(x => x.AddMany(It.Is<List<BookFile>>(l => l.Count == 0)),
Times.Once());
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.AddMany(It.Is<List<TrackFile>>(l => l.Count > 0)),
.Verify(x => x.AddMany(It.Is<List<BookFile>>(l => l.Count > 0)),
Times.Never());
}
@@ -450,8 +450,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{
var files = new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
};
GivenFiles(files);
@@ -461,11 +461,11 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Subject.Scan(new List<string> { _artist.Path });
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.Update(It.Is<List<TrackFile>>(l => l.Count == 0)),
.Verify(x => x.Update(It.Is<List<BookFile>>(l => l.Count == 0)),
Times.Once());
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.Update(It.Is<List<TrackFile>>(l => l.Count > 0)),
.Verify(x => x.Update(It.Is<List<BookFile>>(l => l.Count > 0)),
Times.Never());
}
@@ -474,8 +474,8 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{
var files = new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "s01e01.flac")
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
Path.Combine(_artist.Path, "Season 1", "s01e01.mobi")
};
GivenFiles(files, new DateTime(2019, 2, 1));
@@ -485,7 +485,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Subject.Scan(new List<string> { _artist.Path });
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.Update(It.Is<List<TrackFile>>(l => l.Count == 2)),
.Verify(x => x.Update(It.Is<List<BookFile>>(l => l.Count == 2)),
Times.Once());
}
@@ -494,7 +494,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
{
var files = new List<string>
{
Path.Combine(_artist.Path, "Season 1", "file1.flac"),
Path.Combine(_artist.Path, "Season 1", "file1.mobi"),
};
GivenKnownFiles(files);
@@ -505,7 +505,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
.With(x => x.Path = files[0])
.With(x => x.Modified = new DateTime(2019, 2, 1))
.With(x => x.Size = 100)
.With(x => x.Quality = new QualityModel(Quality.FLAC))
.With(x => x.Quality = new QualityModel(Quality.MOBI))
.With(x => x.FileTrackInfo = new ParsedTrackInfo
{
MediaInfo = Builder<MediaInfoModel>.CreateNew().Build()
@@ -519,7 +519,7 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests
Subject.Scan(new List<string> { _artist.Path });
Mocker.GetMock<IMediaFileService>()
.Verify(x => x.Update(It.Is<List<TrackFile>>(
.Verify(x => x.Update(It.Is<List<BookFile>>(
l => l.Count == 1 &&
l[0].Path == localTrack.Path &&
l[0].Modified == localTrack.Modified &&
@@ -33,7 +33,7 @@ namespace NzbDrone.Core.Test.MediaFiles
.Returns(new List<ImportResult>());
Mocker.GetMock<IDownloadedTracksImportService>()
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Artist>(), It.IsAny<DownloadClientItem>()))
.Setup(v => v.ProcessPath(It.IsAny<string>(), It.IsAny<ImportMode>(), It.IsAny<Author>(), It.IsAny<DownloadClientItem>()))
.Returns(new List<ImportResult>());
var downloadItem = Builder<DownloadClientItem>.CreateNew()
@@ -42,7 +42,7 @@ namespace NzbDrone.Core.Test.MediaFiles
.Build();
var remoteAlbum = Builder<RemoteAlbum>.CreateNew()
.With(v => v.Artist = new Artist())
.With(v => v.Artist = new Author())
.Build();
_trackedDownload = new TrackedDownload
@@ -50,7 +50,7 @@ namespace NzbDrone.Core.Test.MediaFiles
.Build();
var remoteAlbum = Builder<RemoteAlbum>.CreateNew()
.With(v => v.Artist = new Artist())
.With(v => v.Artist = new Author())
.Build();
_trackedDownload = new TrackedDownload
@@ -73,7 +73,7 @@ namespace NzbDrone.Core.Test.MediaFiles
{
Mocker.GetMock<IParsingService>()
.Setup(s => s.GetArtist(It.IsAny<string>()))
.Returns(Builder<Artist>.CreateNew().Build());
.Returns(Builder<Author>.CreateNew().Build());
}
private void GivenSuccessfulImport()
@@ -125,7 +125,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test]
public void should_skip_if_no_artist_found()
{
Mocker.GetMock<IParsingService>().Setup(c => c.GetArtist("foldername")).Returns((Artist)null);
Mocker.GetMock<IParsingService>().Setup(c => c.GetArtist("foldername")).Returns((Author)null);
Subject.ProcessRootFolder(DiskProvider.GetDirectoryInfo(_droneFactory));
@@ -34,56 +34,41 @@ namespace NzbDrone.Core.Test.MediaFiles
_rejectedDecisions = new List<ImportDecision<LocalTrack>>();
_approvedDecisions = new List<ImportDecision<LocalTrack>>();
var artist = Builder<Artist>.CreateNew()
var artist = Builder<Author>.CreateNew()
.With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() })
.With(s => s.Path = @"C:\Test\Music\Alien Ant Farm".AsOsAgnostic())
.Build();
var album = Builder<Album>.CreateNew()
.With(e => e.Artist = artist)
var album = Builder<Book>.CreateNew()
.With(e => e.Author = artist)
.Build();
var release = Builder<AlbumRelease>.CreateNew()
.With(e => e.AlbumId = album.Id)
.With(e => e.Monitored = true)
.Build();
album.AlbumReleases = new List<AlbumRelease> { release };
var tracks = Builder<Track>.CreateListOfSize(5)
.Build();
_rejectedDecisions.Add(new ImportDecision<LocalTrack>(new LocalTrack(), new Rejection("Rejected!")));
_rejectedDecisions.Add(new ImportDecision<LocalTrack>(new LocalTrack(), new Rejection("Rejected!")));
_rejectedDecisions.Add(new ImportDecision<LocalTrack>(new LocalTrack(), new Rejection("Rejected!")));
foreach (var track in tracks)
{
_approvedDecisions.Add(new ImportDecision<LocalTrack>(
new LocalTrack
_approvedDecisions.Add(new ImportDecision<LocalTrack>(
new LocalTrack
{
Artist = artist,
Album = album,
Path = Path.Combine(artist.Path, "Alien Ant Farm - 01 - Pilot.mp3"),
Quality = new QualityModel(Quality.MP3_320),
FileTrackInfo = new ParsedTrackInfo
{
Artist = artist,
Album = album,
Release = release,
Tracks = new List<Track> { track },
Path = Path.Combine(artist.Path, "Alien Ant Farm - 01 - Pilot.mp3"),
Quality = new QualityModel(Quality.MP3_256),
FileTrackInfo = new ParsedTrackInfo
{
ReleaseGroup = "DRONE"
}
}));
}
ReleaseGroup = "DRONE"
}
}));
Mocker.GetMock<IUpgradeMediaFiles>()
.Setup(s => s.UpgradeTrackFile(It.IsAny<TrackFile>(), It.IsAny<LocalTrack>(), It.IsAny<bool>()))
.Setup(s => s.UpgradeTrackFile(It.IsAny<BookFile>(), It.IsAny<LocalTrack>(), It.IsAny<bool>()))
.Returns(new TrackFileMoveResult());
_downloadClientItem = Builder<DownloadClientItem>.CreateNew().Build();
Mocker.GetMock<IMediaFileService>()
.Setup(s => s.GetFilesByAlbum(It.IsAny<int>()))
.Returns(new List<TrackFile>());
.Returns(new List<BookFile>());
}
[Test]
@@ -91,13 +76,13 @@ namespace NzbDrone.Core.Test.MediaFiles
{
Subject.Import(_rejectedDecisions, false).Where(i => i.Result == ImportResultType.Imported).Should().BeEmpty();
Mocker.GetMock<IMediaFileService>().Verify(v => v.Add(It.IsAny<TrackFile>()), Times.Never());
Mocker.GetMock<IMediaFileService>().Verify(v => v.Add(It.IsAny<BookFile>()), Times.Never());
}
[Test]
public void should_import_each_approved()
{
Subject.Import(_approvedDecisions, false).Should().HaveCount(5);
Subject.Import(_approvedDecisions, false).Should().HaveCount(1);
}
[Test]
@@ -131,7 +116,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Import(new List<ImportDecision<LocalTrack>> { _approvedDecisions.First() }, true);
Mocker.GetMock<IUpgradeMediaFiles>()
.Verify(v => v.UpgradeTrackFile(It.IsAny<TrackFile>(), _approvedDecisions.First().Item, false),
.Verify(v => v.UpgradeTrackFile(It.IsAny<BookFile>(), _approvedDecisions.First().Item, false),
Times.Once());
}
@@ -152,7 +137,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Import(new List<ImportDecision<LocalTrack>> { track }, false);
Mocker.GetMock<IUpgradeMediaFiles>()
.Verify(v => v.UpgradeTrackFile(It.IsAny<TrackFile>(), _approvedDecisions.First().Item, false),
.Verify(v => v.UpgradeTrackFile(It.IsAny<BookFile>(), _approvedDecisions.First().Item, false),
Times.Never());
}
@@ -167,9 +152,8 @@ namespace NzbDrone.Core.Test.MediaFiles
{
Artist = fileDecision.Item.Artist,
Album = fileDecision.Item.Album,
Tracks = new List<Track> { fileDecision.Item.Tracks.First() },
Path = @"C:\Test\Music\Alien Ant Farm\Alien Ant Farm - 01 - Pilot.mp3".AsOsAgnostic(),
Quality = new QualityModel(Quality.MP3_256),
Quality = new QualityModel(Quality.MP3_320),
Size = 80.Megabytes()
});
@@ -190,7 +174,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Import(new List<ImportDecision<LocalTrack>> { _approvedDecisions.First() }, true, new DownloadClientItem { Title = "Alien.Ant.Farm-Truant", CanMoveFiles = false });
Mocker.GetMock<IUpgradeMediaFiles>()
.Verify(v => v.UpgradeTrackFile(It.IsAny<TrackFile>(), _approvedDecisions.First().Item, true), Times.Once());
.Verify(v => v.UpgradeTrackFile(It.IsAny<BookFile>(), _approvedDecisions.First().Item, true), Times.Once());
}
[Test]
@@ -199,7 +183,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Import(new List<ImportDecision<LocalTrack>> { _approvedDecisions.First() }, true, new DownloadClientItem { Title = "Alien.Ant.Farm-Truant", CanMoveFiles = false }, ImportMode.Move);
Mocker.GetMock<IUpgradeMediaFiles>()
.Verify(v => v.UpgradeTrackFile(It.IsAny<TrackFile>(), _approvedDecisions.First().Item, false), Times.Once());
.Verify(v => v.UpgradeTrackFile(It.IsAny<BookFile>(), _approvedDecisions.First().Item, false), Times.Once());
}
[Test]
@@ -207,14 +191,14 @@ namespace NzbDrone.Core.Test.MediaFiles
{
Mocker.GetMock<IMediaFileService>()
.Setup(s => s.GetFileWithPath(It.IsAny<string>()))
.Returns(Builder<TrackFile>.CreateNew().Build());
.Returns(Builder<BookFile>.CreateNew().Build());
var track = _approvedDecisions.First();
track.Item.ExistingFile = true;
Subject.Import(new List<ImportDecision<LocalTrack>> { track }, false);
Mocker.GetMock<IMediaFileService>()
.Verify(v => v.Delete(It.IsAny<TrackFile>(), DeleteMediaFileReason.ManualOverride), Times.Once());
.Verify(v => v.Delete(It.IsAny<BookFile>(), DeleteMediaFileReason.ManualOverride), Times.Once());
}
}
}
@@ -15,17 +15,17 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileDeletionService
public class DeleteTrackFileFixture : CoreTest<Core.MediaFiles.MediaFileDeletionService>
{
private static readonly string RootFolder = @"C:\Test\Music";
private Artist _artist;
private TrackFile _trackFile;
private Author _artist;
private BookFile _trackFile;
[SetUp]
public void Setup()
{
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(s => s.Path = Path.Combine(RootFolder, "Artist Name"))
.Build();
_trackFile = Builder<TrackFile>.CreateNew()
_trackFile = Builder<BookFile>.CreateNew()
.With(f => f.Path = "/Artist Name - Track01")
.Build();
@@ -12,76 +12,43 @@ using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MediaFiles
{
[TestFixture]
public class MediaFileRepositoryFixture : DbTest<MediaFileRepository, TrackFile>
public class MediaFileRepositoryFixture : DbTest<MediaFileRepository, BookFile>
{
private Artist _artist;
private Album _album;
private List<AlbumRelease> _releases;
private Author _artist;
private Book _album;
[SetUp]
public void Setup()
{
var meta = Builder<ArtistMetadata>.CreateNew()
var meta = Builder<AuthorMetadata>.CreateNew()
.With(a => a.Id = 0)
.Build();
Db.Insert(meta);
_artist = Builder<Artist>.CreateNew()
.With(a => a.ArtistMetadataId = meta.Id)
_artist = Builder<Author>.CreateNew()
.With(a => a.AuthorMetadataId = meta.Id)
.With(a => a.Id = 0)
.Build();
Db.Insert(_artist);
_album = Builder<Album>.CreateNew()
_album = Builder<Book>.CreateNew()
.With(a => a.Id = 0)
.With(a => a.ArtistMetadataId = _artist.ArtistMetadataId)
.With(a => a.AuthorMetadataId = _artist.AuthorMetadataId)
.Build();
Db.Insert(_album);
_releases = Builder<AlbumRelease>.CreateListOfSize(2)
.All()
.With(a => a.Id = 0)
.With(a => a.AlbumId = _album.Id)
.TheFirst(1)
.With(a => a.Monitored = true)
.TheNext(1)
.With(a => a.Monitored = false)
.Build().ToList();
Db.InsertMany(_releases);
var files = Builder<TrackFile>.CreateListOfSize(10)
var files = Builder<BookFile>.CreateListOfSize(10)
.All()
.With(c => c.Id = 0)
.With(c => c.Quality = new QualityModel(Quality.MP3_192))
.With(c => c.Quality = new QualityModel(Quality.MP3_320))
.TheFirst(5)
.With(c => c.AlbumId = _album.Id)
.With(c => c.BookId = _album.Id)
.TheFirst(1)
.With(c => c.Path = @"C:\Test\Path\Artist\somefile1.flac".AsOsAgnostic())
.TheNext(1)
.With(c => c.Path = @"C:\Test\Path\Artist\somefile2.flac".AsOsAgnostic())
.BuildListOfNew();
Db.InsertMany(files);
var track = Builder<Track>.CreateListOfSize(10)
.All()
.With(a => a.Id = 0)
.TheFirst(4)
.With(a => a.AlbumReleaseId = _releases[0].Id)
.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)
.With(a => a.AlbumReleaseId = _releases[1].Id)
.TheNext(5)
.With(a => a.TrackFileId = 0)
.Build();
Db.InsertMany(track);
}
[Test]
@@ -104,19 +71,6 @@ namespace NzbDrone.Core.Test.MediaFiles
unmappedfiles.Should().HaveCount(5);
}
[Test]
public void get_files_by_release()
{
VerifyData();
var firstReleaseFiles = Subject.GetFilesByRelease(_releases[0].Id);
var secondReleaseFiles = Subject.GetFilesByRelease(_releases[1].Id);
VerifyEagerLoaded(firstReleaseFiles);
VerifyEagerLoaded(secondReleaseFiles);
firstReleaseFiles.Should().HaveCount(4);
secondReleaseFiles.Should().HaveCount(1);
}
[TestCase("C:\\Test\\Path")]
[TestCase("C:\\Test\\Path\\")]
public void get_files_by_base_path_should_cope_with_trailing_slash(string dir)
@@ -133,10 +87,10 @@ namespace NzbDrone.Core.Test.MediaFiles
{
VerifyData();
var files = Builder<TrackFile>.CreateListOfSize(2)
var files = Builder<BookFile>.CreateListOfSize(2)
.All()
.With(c => c.Id = 0)
.With(c => c.Quality = new QualityModel(Quality.MP3_192))
.With(c => c.Quality = new QualityModel(Quality.MP3_320))
.TheFirst(1)
.With(c => c.Path = @"C:\Test\Path2\Artist\somefile1.flac".AsOsAgnostic())
.TheNext(1)
@@ -155,25 +109,12 @@ namespace NzbDrone.Core.Test.MediaFiles
var file = Subject.GetFileWithPath(@"C:\Test\Path\Artist\somefile2.flac".AsOsAgnostic());
file.Should().NotBeNull();
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();
}
[Test]
public void get_files_by_artist_should_only_return_tracks_for_monitored_releases()
{
VerifyData();
var artistFiles = Subject.GetFilesByArtist(_artist.Id);
VerifyEagerLoaded(artistFiles);
artistFiles.Should().HaveCount(4);
}
[Test]
public void get_files_by_album()
{
@@ -181,34 +122,20 @@ namespace NzbDrone.Core.Test.MediaFiles
var files = Subject.GetFilesByAlbum(_album.Id);
VerifyEagerLoaded(files);
files.Should().OnlyContain(c => c.AlbumId == _album.Id);
}
[Test]
public void get_files_by_album_should_only_return_tracks_for_monitored_releases()
{
VerifyData();
var files = Subject.GetFilesByAlbum(_album.Id);
VerifyEagerLoaded(files);
files.Should().HaveCount(4);
files.Should().OnlyContain(c => c.BookId == _album.Id);
}
private void VerifyData()
{
Db.All<Artist>().Should().HaveCount(1);
Db.All<Album>().Should().HaveCount(1);
Db.All<Track>().Should().HaveCount(10);
Db.All<TrackFile>().Should().HaveCount(10);
Db.All<Author>().Should().HaveCount(1);
Db.All<Book>().Should().HaveCount(1);
Db.All<BookFile>().Should().HaveCount(10);
}
private void VerifyEagerLoaded(List<TrackFile> files)
private void VerifyEagerLoaded(List<BookFile> files)
{
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();
@@ -218,13 +145,10 @@ namespace NzbDrone.Core.Test.MediaFiles
}
}
private void VerifyUnmapped(List<TrackFile> files)
private void VerifyUnmapped(List<BookFile> files)
{
foreach (var file in files)
{
file.Tracks.IsLoaded.Should().BeFalse();
file.Tracks.Value.Should().NotBeNull();
file.Tracks.Value.Should().BeEmpty();
file.Album.IsLoaded.Should().BeFalse();
file.Album.Value.Should().BeNull();
file.Artist.IsLoaded.Should().BeFalse();
@@ -238,7 +162,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Db.Delete(_album);
Subject.DeleteFilesByAlbum(_album.Id);
Db.All<TrackFile>().Where(x => x.AlbumId == _album.Id).Should().HaveCount(0);
Db.All<BookFile>().Where(x => x.BookId == _album.Id).Should().HaveCount(0);
}
}
}
@@ -7,6 +7,7 @@ using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Music;
using NzbDrone.Core.Test.Framework;
@@ -42,7 +43,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>());
.Returns(new List<BookFile>());
Subject.FilterUnchangedFiles(files, filter).Should().BeEquivalentTo(files);
}
@@ -60,7 +61,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(files.Select(f => new TrackFile
.Returns(files.Select(f => new BookFile
{
Path = f.FullName,
Modified = _lastWrite
@@ -82,9 +83,9 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Modified = _lastWrite
@@ -110,9 +111,9 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Modified = _lastWrite
@@ -138,9 +139,9 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Modified = _lastWrite
@@ -161,7 +162,7 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>());
.Returns(new List<BookFile>());
Subject.FilterUnchangedFiles(files, filter).Should().HaveCount(1);
Subject.FilterUnchangedFiles(files, filter).Select(x => x.FullName).Should().NotContain(files.First().FullName.ToLower());
@@ -180,9 +181,9 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Size = 10,
@@ -205,14 +206,14 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Size = 10,
Modified = _lastWrite,
Tracks = new List<Track>()
Album = new LazyLoaded<Book>(null)
}
});
@@ -231,14 +232,14 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Size = 10,
Modified = _lastWrite,
Tracks = Builder<Track>.CreateListOfSize(1).Build() as List<Track>
Album = Builder<Book>.CreateNew().Build()
}
});
@@ -258,9 +259,9 @@ namespace NzbDrone.Core.Test.MediaFiles.MediaFileServiceTests
Mocker.GetMock<IMediaFileRepository>()
.Setup(c => c.GetFileWithPath(It.IsAny<List<string>>()))
.Returns(new List<TrackFile>
.Returns(new List<BookFile>
{
new TrackFile
new BookFile
{
Path = "C:\\file2.avi".AsOsAgnostic(),
Size = 10,
@@ -13,20 +13,20 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackFileMovingServiceTests
[TestFixture]
public class MediaFileServiceFixture : CoreTest<MediaFileService>
{
private Album _album;
private List<TrackFile> _trackFiles;
private Book _album;
private List<BookFile> _trackFiles;
[SetUp]
public void Setup()
{
_album = Builder<Album>.CreateNew()
_album = Builder<Book>.CreateNew()
.Build();
_trackFiles = Builder<TrackFile>.CreateListOfSize(3)
_trackFiles = Builder<BookFile>.CreateListOfSize(3)
.TheFirst(2)
.With(f => f.AlbumId = _album.Id)
.With(f => f.BookId = _album.Id)
.TheNext(1)
.With(f => f.AlbumId = 0)
.With(f => f.BookId = 0)
.Build().ToList();
}
@@ -14,26 +14,22 @@ namespace NzbDrone.Core.Test.MediaFiles
public class MediaFileTableCleanupServiceFixture : CoreTest<MediaFileTableCleanupService>
{
private readonly string _DELETED_PATH = @"c:\ANY FILE STARTING WITH THIS PATH IS CONSIDERED DELETED!".AsOsAgnostic();
private List<Track> _tracks;
private Artist _artist;
private List<Book> _tracks;
private Author _artist;
[SetUp]
public void SetUp()
{
_tracks = Builder<Track>.CreateListOfSize(10)
_tracks = Builder<Book>.CreateListOfSize(10)
.Build()
.ToList();
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(s => s.Path = @"C:\Test\Music\Artist".AsOsAgnostic())
.Build();
Mocker.GetMock<ITrackService>()
.Setup(c => c.GetTracksByFileId(It.IsAny<IEnumerable<int>>()))
.Returns((IEnumerable<int> ids) => _tracks.Where(y => ids.Contains(y.TrackFileId)).ToList());
}
private void GivenTrackFiles(IEnumerable<TrackFile> trackFiles)
private void GivenTrackFiles(IEnumerable<BookFile> trackFiles)
{
Mocker.GetMock<IMediaFileService>()
.Setup(c => c.GetFilesWithBasePath(It.IsAny<string>()))
@@ -42,12 +38,9 @@ namespace NzbDrone.Core.Test.MediaFiles
private void GivenFilesAreNotAttachedToTrack()
{
Mocker.GetMock<ITrackService>()
.Setup(c => c.GetTracksByFileId(It.IsAny<int>()))
.Returns(new List<Track>());
}
private List<string> FilesOnDisk(IEnumerable<TrackFile> trackFiles)
private List<string> FilesOnDisk(IEnumerable<BookFile> trackFiles)
{
return trackFiles.Select(e => e.Path).ToList();
}
@@ -55,7 +48,7 @@ namespace NzbDrone.Core.Test.MediaFiles
[Test]
public void should_skip_files_that_exist_on_disk()
{
var trackFiles = Builder<TrackFile>.CreateListOfSize(10)
var trackFiles = Builder<BookFile>.CreateListOfSize(10)
.All()
.With(x => x.Path = Path.Combine(@"c:\test".AsOsAgnostic(), Path.GetRandomFileName()))
.Build();
@@ -65,13 +58,13 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Clean(_artist.Path, FilesOnDisk(trackFiles));
Mocker.GetMock<IMediaFileService>()
.Verify(c => c.DeleteMany(It.Is<List<TrackFile>>(x => x.Count == 0), DeleteMediaFileReason.MissingFromDisk), Times.Once());
.Verify(c => c.DeleteMany(It.Is<List<BookFile>>(x => x.Count == 0), DeleteMediaFileReason.MissingFromDisk), Times.Once());
}
[Test]
public void should_delete_non_existent_files()
{
var trackFiles = Builder<TrackFile>.CreateListOfSize(10)
var trackFiles = Builder<BookFile>.CreateListOfSize(10)
.All()
.With(x => x.Path = Path.Combine(@"c:\test".AsOsAgnostic(), Path.GetRandomFileName()))
.Random(2)
@@ -83,13 +76,13 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Clean(_artist.Path, FilesOnDisk(trackFiles.Where(e => !e.Path.StartsWith(_DELETED_PATH))));
Mocker.GetMock<IMediaFileService>()
.Verify(c => c.DeleteMany(It.Is<List<TrackFile>>(e => e.Count == 2 && e.All(y => y.Path.StartsWith(_DELETED_PATH))), DeleteMediaFileReason.MissingFromDisk), Times.Once());
.Verify(c => c.DeleteMany(It.Is<List<BookFile>>(e => e.Count == 2 && e.All(y => y.Path.StartsWith(_DELETED_PATH))), DeleteMediaFileReason.MissingFromDisk), Times.Once());
}
[Test]
public void should_unlink_track_when_trackFile_does_not_exist()
{
var trackFiles = Builder<TrackFile>.CreateListOfSize(10)
var trackFiles = Builder<BookFile>.CreateListOfSize(10)
.Random(10)
.With(c => c.Path = Path.Combine(@"c:\test".AsOsAgnostic(), Path.GetRandomFileName()))
.Build();
@@ -97,15 +90,12 @@ namespace NzbDrone.Core.Test.MediaFiles
GivenTrackFiles(trackFiles);
Subject.Clean(_artist.Path, new List<string>());
Mocker.GetMock<ITrackService>()
.Verify(c => c.SetFileIds(It.Is<List<Track>>(e => e.Count == 10 && e.All(y => y.TrackFileId == 0))), Times.Once());
}
[Test]
public void should_not_update_track_when_trackFile_exists()
{
var trackFiles = Builder<TrackFile>.CreateListOfSize(10)
var trackFiles = Builder<BookFile>.CreateListOfSize(10)
.Random(10)
.With(c => c.Path = Path.Combine(@"c:\test".AsOsAgnostic(), Path.GetRandomFileName()))
.Build();
@@ -113,8 +103,6 @@ namespace NzbDrone.Core.Test.MediaFiles
GivenTrackFiles(trackFiles);
Subject.Clean(_artist.Path, FilesOnDisk(trackFiles));
Mocker.GetMock<ITrackService>().Verify(c => c.SetFileIds(It.Is<List<Track>>(x => x.Count == 0)), Times.Once());
}
}
}
@@ -14,16 +14,16 @@ namespace NzbDrone.Core.Test.MediaFiles
{
public class RenameTrackFileServiceFixture : CoreTest<RenameTrackFileService>
{
private Artist _artist;
private List<TrackFile> _trackFiles;
private Author _artist;
private List<BookFile> _trackFiles;
[SetUp]
public void Setup()
{
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.Build();
_trackFiles = Builder<TrackFile>.CreateListOfSize(2)
_trackFiles = Builder<BookFile>.CreateListOfSize(2)
.All()
.With(e => e.Artist = _artist)
.Build()
@@ -38,7 +38,7 @@ namespace NzbDrone.Core.Test.MediaFiles
{
Mocker.GetMock<IMediaFileService>()
.Setup(s => s.Get(It.IsAny<IEnumerable<int>>()))
.Returns(new List<TrackFile>());
.Returns(new List<BookFile>());
}
private void GivenTrackFiles()
@@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.MediaFiles
private void GivenMovedFiles()
{
Mocker.GetMock<IMoveTrackFiles>()
.Setup(s => s.MoveTrackFile(It.IsAny<TrackFile>(), _artist));
.Setup(s => s.MoveTrackFile(It.IsAny<BookFile>(), _artist));
}
[Test]
@@ -71,7 +71,7 @@ namespace NzbDrone.Core.Test.MediaFiles
GivenTrackFiles();
Mocker.GetMock<IMoveTrackFiles>()
.Setup(s => s.MoveTrackFile(It.IsAny<TrackFile>(), It.IsAny<Artist>()))
.Setup(s => s.MoveTrackFile(It.IsAny<BookFile>(), It.IsAny<Author>()))
.Throws(new SameFilenameException("Same file name", "Filename"));
Subject.Execute(new RenameFilesCommand(_artist.Id, new List<int> { 1 }));
@@ -101,7 +101,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.Execute(new RenameFilesCommand(_artist.Id, new List<int> { 1 }));
Mocker.GetMock<IMediaFileService>()
.Verify(v => v.Update(It.IsAny<TrackFile>()), Times.Exactly(2));
.Verify(v => v.Update(It.IsAny<BookFile>()), Times.Exactly(2));
}
[Test]
@@ -21,37 +21,37 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackFileMovingServiceTests
[TestFixture]
public class MoveTrackFileFixture : CoreTest<TrackFileMovingService>
{
private Artist _artist;
private TrackFile _trackFile;
private Author _artist;
private BookFile _trackFile;
private LocalTrack _localtrack;
[SetUp]
public void Setup()
{
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(s => s.Path = @"C:\Test\Music\Artist".AsOsAgnostic())
.Build();
_trackFile = Builder<TrackFile>.CreateNew()
_trackFile = Builder<BookFile>.CreateNew()
.With(f => f.Path = null)
.With(f => f.Path = Path.Combine(_artist.Path, @"Album\File.mp3"))
.Build();
_localtrack = Builder<LocalTrack>.CreateNew()
.With(l => l.Artist = _artist)
.With(l => l.Tracks = Builder<Track>.CreateListOfSize(1).Build().ToList())
.With(l => l.Album = Builder<Book>.CreateNew().Build())
.Build();
Mocker.GetMock<IBuildFileNames>()
.Setup(s => s.BuildTrackFileName(It.IsAny<List<Track>>(), It.IsAny<Artist>(), It.IsAny<Album>(), It.IsAny<TrackFile>(), null, null))
.Setup(s => s.BuildTrackFileName(It.IsAny<Author>(), It.IsAny<Book>(), It.IsAny<BookFile>(), null, null))
.Returns("File Name");
Mocker.GetMock<IBuildFileNames>()
.Setup(s => s.BuildTrackFilePath(It.IsAny<Artist>(), It.IsAny<Album>(), It.IsAny<string>(), It.IsAny<string>()))
.Setup(s => s.BuildTrackFilePath(It.IsAny<Author>(), It.IsAny<Book>(), It.IsAny<string>(), It.IsAny<string>()))
.Returns(@"C:\Test\Music\Artist\Album\File Name.mp3".AsOsAgnostic());
Mocker.GetMock<IBuildFileNames>()
.Setup(s => s.BuildAlbumPath(It.IsAny<Artist>(), It.IsAny<Album>()))
.Setup(s => s.BuildAlbumPath(It.IsAny<Author>(), It.IsAny<Book>()))
.Returns(@"C:\Test\Music\Artist\Album".AsOsAgnostic());
var rootFolder = @"C:\Test\Music\".AsOsAgnostic();
@@ -1,263 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
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 AlbumDistanceFixture : CoreTest
{
private ArtistMetadata _artist;
[SetUp]
public void Setup()
{
_artist = Builder<ArtistMetadata>
.CreateNew()
.With(x => x.Name = "artist")
.Build();
}
private List<Track> GivenTracks(int count)
{
return Builder<Track>
.CreateListOfSize(count)
.All()
.With(x => x.ArtistMetadata = _artist)
.With(x => x.MediumNumber = 1)
.Build()
.ToList();
}
private LocalTrack GivenLocalTrack(Track track, AlbumRelease release)
{
var fileInfo = Builder<ParsedTrackInfo>
.CreateNew()
.With(x => x.Title = track.Title)
.With(x => x.CleanTitle = track.Title.CleanTrackTitle())
.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.DiscCount = release.Media.Count)
.With(x => x.DiscNumber = track.MediumNumber)
.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?.Year ?? 0))
.Build();
var localTrack = Builder<LocalTrack>
.CreateNew()
.With(x => x.FileTrackInfo = fileInfo)
.Build();
return localTrack;
}
private List<LocalTrack> GivenLocalTracks(List<Track> tracks, AlbumRelease release)
{
var output = new List<LocalTrack>();
foreach (var track in tracks)
{
output.Add(GivenLocalTrack(track, release));
}
return output;
}
private AlbumRelease GivenAlbumRelease(string title, List<Track> tracks)
{
var album = Builder<Album>
.CreateNew()
.With(x => x.Title = title)
.With(x => x.ArtistMetadata = _artist)
.Build();
var media = Builder<Medium>
.CreateListOfSize(tracks.Max(x => x.MediumNumber))
.Build()
.ToList();
return Builder<AlbumRelease>
.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<string> { "United States" })
.With(x => x.Label = new List<string> { "label" })
.Build();
}
private TrackMapping GivenMapping(List<LocalTrack> local, List<Track> remote)
{
var mapping = new TrackMapping();
var distances = local.Zip(remote, (l, r) => Tuple.Create(r, DistanceCalculator.TrackDistance(l, r, DistanceCalculator.GetTotalTrackNumber(r, remote))));
mapping.Mapping = local.Zip(distances, (l, r) => new { l, r }).ToDictionary(x => x.l, x => x.r);
mapping.LocalExtra = local.Except(mapping.Mapping.Keys).ToList();
mapping.MBExtra = remote.Except(mapping.Mapping.Values.Select(x => x.Item1)).ToList();
return mapping;
}
[Test]
public void test_identical_albums()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
var mapping = GivenMapping(localTracks, tracks);
DistanceCalculator.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().Be(0.0);
}
[Test]
public void test_incomplete_album()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
localTracks.RemoveAt(1);
var mapping = GivenMapping(localTracks, tracks);
var dist = DistanceCalculator.AlbumReleaseDistance(localTracks, release, mapping);
dist.NormalizedDistance().Should().NotBe(0.0);
dist.NormalizedDistance().Should().BeLessThan(0.2);
}
[Test]
public void test_global_artists_differ()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
var mapping = GivenMapping(localTracks, tracks);
release.Album.Value.ArtistMetadata = Builder<ArtistMetadata>
.CreateNew()
.With(x => x.Name = "different artist")
.Build();
DistanceCalculator.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().NotBe(0.0);
}
[Test]
public void test_comp_track_artists_match()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
var mapping = GivenMapping(localTracks, tracks);
release.Album.Value.ArtistMetadata = Builder<ArtistMetadata>
.CreateNew()
.With(x => x.Name = "Various Artists")
.With(x => x.ForeignArtistId = "89ad4ac3-39f7-470e-963a-56509c546377")
.Build();
DistanceCalculator.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().Be(0.0);
}
// TODO: there are a couple more VA tests in beets but we don't support VA yet anyway
[Test]
public void test_tracks_out_of_order()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
localTracks = new[] { 1, 3, 2 }.Select(x => localTracks[x - 1]).ToList();
var mapping = GivenMapping(localTracks, tracks);
var dist = DistanceCalculator.AlbumReleaseDistance(localTracks, release, mapping);
dist.NormalizedDistance().Should().NotBe(0.0);
dist.NormalizedDistance().Should().BeLessThan(0.2);
}
[Test]
public void test_two_medium_release()
{
var tracks = GivenTracks(3);
tracks[2].AbsoluteTrackNumber = 1;
tracks[2].MediumNumber = 2;
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
var mapping = GivenMapping(localTracks, tracks);
DistanceCalculator.AlbumReleaseDistance(localTracks, release, mapping).NormalizedDistance().Should().Be(0.0);
}
[Test]
public void test_absolute_track_numbering()
{
var tracks = GivenTracks(3);
tracks[2].AbsoluteTrackNumber = 1;
tracks[2].MediumNumber = 2;
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
localTracks[2].FileTrackInfo.DiscNumber = 2;
localTracks[2].FileTrackInfo.TrackNumbers = new[] { 3 };
var mapping = GivenMapping(localTracks, tracks);
DistanceCalculator.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 = DistanceCalculator.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 = DistanceCalculator.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);
}
}
}
}
@@ -1,161 +0,0 @@
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<CandidateService>
{
private ArtistMetadata _artist;
[SetUp]
public void Setup()
{
_artist = Builder<ArtistMetadata>
.CreateNew()
.With(x => x.Name = "artist")
.Build();
}
private List<Track> GivenTracks(int count)
{
return Builder<Track>
.CreateListOfSize(count)
.All()
.With(x => x.ArtistMetadata = _artist)
.Build()
.ToList();
}
private ParsedTrackInfo GivenParsedTrackInfo(Track track, AlbumRelease release)
{
return Builder<ParsedTrackInfo>
.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<LocalTrack> GivenLocalTracks(List<Track> tracks, AlbumRelease release)
{
var output = Builder<LocalTrack>
.CreateListOfSize(tracks.Count)
.Build()
.ToList();
for (int i = 0; i < tracks.Count; i++)
{
output[i].FileTrackInfo = GivenParsedTrackInfo(tracks[i], release);
}
return output;
}
private AlbumRelease GivenAlbumRelease(string title, List<Track> tracks)
{
var album = Builder<Album>
.CreateNew()
.With(x => x.Title = title)
.With(x => x.ArtistMetadata = _artist)
.Build();
var media = Builder<Medium>
.CreateListOfSize(1)
.Build()
.ToList();
return Builder<AlbumRelease>
.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<string>())
.With(x => x.Label = new List<string> { "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<IFingerprintingService>()
.Setup(x => x.Lookup(It.IsAny<List<LocalTrack>>(), It.IsAny<double>()))
.Callback((List<LocalTrack> x, double thres) =>
{
foreach (var track in x)
{
track.AcoustIdResults = null;
}
});
Mocker.GetMock<IReleaseService>()
.Setup(x => x.GetReleasesByRecordingIds(It.IsAny<List<string>>()))
.Returns(new List<AlbumRelease>());
var local = GivenLocalAlbumRelease();
Subject.GetDbCandidatesFromFingerprint(local, null, false).Should().BeEquivalentTo(new List<CandidateAlbumRelease>());
}
[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<CandidateAlbumRelease> { 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<IReleaseService>()
.Setup(x => x.GetReleaseByForeignReleaseId("xxx", true))
.Returns(release);
Subject.GetDbCandidatesFromTags(localAlbumRelease, null, false).Should().BeEquivalentTo(
new List<CandidateAlbumRelease> { new CandidateAlbumRelease(release) });
}
}
}
@@ -46,8 +46,6 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
Mocker.SetConstant<IArtistRepository>(Mocker.Resolve<ArtistRepository>());
Mocker.SetConstant<IArtistMetadataRepository>(Mocker.Resolve<ArtistMetadataRepository>());
Mocker.SetConstant<IAlbumRepository>(Mocker.Resolve<AlbumRepository>());
Mocker.SetConstant<IReleaseRepository>(Mocker.Resolve<ReleaseRepository>());
Mocker.SetConstant<ITrackRepository>(Mocker.Resolve<TrackRepository>());
Mocker.SetConstant<IImportListExclusionRepository>(Mocker.Resolve<ImportListExclusionRepository>());
Mocker.SetConstant<IMediaFileRepository>(Mocker.Resolve<MediaFileRepository>());
@@ -57,23 +55,19 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
Mocker.SetConstant<IArtistService>(_artistService);
Mocker.SetConstant<IArtistMetadataService>(Mocker.Resolve<ArtistMetadataService>());
Mocker.SetConstant<IAlbumService>(Mocker.Resolve<AlbumService>());
Mocker.SetConstant<IReleaseService>(Mocker.Resolve<ReleaseService>());
Mocker.SetConstant<ITrackService>(Mocker.Resolve<TrackService>());
Mocker.SetConstant<IImportListExclusionService>(Mocker.Resolve<ImportListExclusionService>());
Mocker.SetConstant<IMediaFileService>(Mocker.Resolve<MediaFileService>());
Mocker.SetConstant<IConfigService>(Mocker.Resolve<IConfigService>());
Mocker.SetConstant<IProvideArtistInfo>(Mocker.Resolve<SkyHookProxy>());
Mocker.SetConstant<IProvideAlbumInfo>(Mocker.Resolve<SkyHookProxy>());
Mocker.SetConstant<IProvideAuthorInfo>(Mocker.Resolve<SkyHookProxy>());
Mocker.SetConstant<IProvideBookInfo>(Mocker.Resolve<SkyHookProxy>());
_addArtistService = Mocker.Resolve<AddArtistService>();
Mocker.SetConstant<IRefreshTrackService>(Mocker.Resolve<RefreshTrackService>());
Mocker.SetConstant<IRefreshAlbumReleaseService>(Mocker.Resolve<RefreshAlbumReleaseService>());
Mocker.SetConstant<IRefreshAlbumService>(Mocker.Resolve<RefreshAlbumService>());
_refreshArtistService = Mocker.Resolve<RefreshArtistService>();
Mocker.GetMock<IAddArtistValidator>().Setup(x => x.Validate(It.IsAny<Artist>())).Returns(new ValidationResult());
Mocker.GetMock<IAddArtistValidator>().Setup(x => x.Validate(It.IsAny<Author>())).Returns(new ValidationResult());
Mocker.SetConstant<ITrackGroupingService>(Mocker.Resolve<TrackGroupingService>());
Mocker.SetConstant<ICandidateService>(Mocker.Resolve<CandidateService>());
@@ -94,9 +88,9 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
Mocker.GetMock<IMetadataProfileService>().Setup(x => x.Get(profile.Id)).Returns(profile);
}
private List<Artist> GivenArtists(List<ArtistTestCase> artists)
private List<Author> GivenArtists(List<ArtistTestCase> artists)
{
var outp = new List<Artist>();
var outp = new List<Author>();
for (int i = 0; i < artists.Count; i++)
{
var meta = artists[i].MetadataProfile;
@@ -108,13 +102,13 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
return outp;
}
private Artist GivenArtist(string foreignArtistId, int metadataProfileId)
private Author GivenArtist(string foreignAuthorId, int metadataProfileId)
{
var artist = _addArtistService.AddArtist(new Artist
var artist = _addArtistService.AddArtist(new Author
{
Metadata = new ArtistMetadata
Metadata = new AuthorMetadata
{
ForeignArtistId = foreignArtistId
ForeignAuthorId = foreignAuthorId
},
Path = @"c:\test".AsOsAgnostic(),
MetadataProfileId = metadataProfileId
@@ -122,13 +116,13 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
var command = new RefreshArtistCommand
{
ArtistId = artist.Id,
AuthorId = artist.Id,
Trigger = CommandTrigger.Unspecified
};
_refreshArtistService.Execute(command);
return _artistService.FindById(foreignArtistId);
return _artistService.FindById(foreignAuthorId);
}
private void GivenFingerprints(List<AcoustIdTestCase> fingerprints)
@@ -179,7 +173,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
var testcase = JsonConvert.DeserializeObject<IdTestCase>(File.ReadAllText(path));
var artists = GivenArtists(testcase.LibraryArtists);
var specifiedArtist = artists.SingleOrDefault(x => x.Metadata.Value.ForeignArtistId == testcase.Artist);
var specifiedArtist = artists.SingleOrDefault(x => x.Metadata.Value.ForeignAuthorId == testcase.Artist);
var idOverrides = new IdentificationOverrides { Artist = specifiedArtist };
var tracks = testcase.Tracks.Select(x => new LocalTrack
@@ -202,10 +196,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Identification
var result = _Subject.Identify(tracks, idOverrides, config);
TestLogger.Debug($"Found releases:\n{result.Where(x => x.AlbumRelease != null).Select(x => x.AlbumRelease?.ForeignReleaseId).ToJson()}");
result.Should().HaveCount(testcase.ExpectedMusicBrainzReleaseIds.Count);
result.Where(x => x.AlbumRelease != null).Select(x => x.AlbumRelease.ForeignReleaseId).Should().BeEquivalentTo(testcase.ExpectedMusicBrainzReleaseIds);
}
}
}
@@ -1,99 +0,0 @@
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
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 TrackDistanceFixture : CoreTest
{
private Track GivenTrack(string title)
{
var artist = Builder<ArtistMetadata>
.CreateNew()
.With(x => x.Name = "artist")
.Build();
var mbTrack = Builder<Track>
.CreateNew()
.With(x => x.Title = title)
.With(x => x.ArtistMetadata = artist)
.Build();
return mbTrack;
}
private LocalTrack GivenLocalTrack(Track track)
{
var fileInfo = Builder<ParsedTrackInfo>
.CreateNew()
.With(x => x.Title = track.Title)
.With(x => x.CleanTitle = track.Title.CleanTrackTitle())
.With(x => x.ArtistTitle = track.ArtistMetadata.Value.Name)
.With(x => x.TrackNumbers = new[] { 1 })
.With(x => x.RecordingMBId = track.ForeignRecordingId)
.Build();
var localTrack = Builder<LocalTrack>
.CreateNew()
.With(x => x.FileTrackInfo = fileInfo)
.Build();
return localTrack;
}
[Test]
public void test_identical_tracks()
{
var track = GivenTrack("one");
var localTrack = GivenLocalTrack(track);
DistanceCalculator.TrackDistance(localTrack, track, 1, true).NormalizedDistance().Should().Be(0.0);
}
[Test]
public void test_feat_removed_from_localtrack()
{
var track = GivenTrack("one");
var localTrack = GivenLocalTrack(track);
localTrack.FileTrackInfo.Title = "one (feat. two)";
DistanceCalculator.TrackDistance(localTrack, track, 1, true).NormalizedDistance().Should().Be(0.0);
}
[Test]
public void test_different_title()
{
var track = GivenTrack("one");
var localTrack = GivenLocalTrack(track);
localTrack.FileTrackInfo.CleanTitle = "foo";
DistanceCalculator.TrackDistance(localTrack, track, 1, true).NormalizedDistance().Should().NotBe(0.0);
}
[Test]
public void test_different_artist()
{
var track = GivenTrack("one");
var localTrack = GivenLocalTrack(track);
localTrack.FileTrackInfo.ArtistTitle = "foo";
DistanceCalculator.TrackDistance(localTrack, track, 1, true).NormalizedDistance().Should().NotBe(0.0);
}
[Test]
public void test_various_artists_tolerated()
{
var track = GivenTrack("one");
var localTrack = GivenLocalTrack(track);
localTrack.FileTrackInfo.ArtistTitle = "Various Artists";
DistanceCalculator.TrackDistance(localTrack, track, 1, true).NormalizedDistance().Should().Be(0.0);
}
}
}
@@ -1,188 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
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 TrackMappingFixture : CoreTest<IdentificationService>
{
private ArtistMetadata _artist;
[SetUp]
public void Setup()
{
_artist = Builder<ArtistMetadata>
.CreateNew()
.With(x => x.Name = "artist")
.Build();
}
private List<Track> GivenTracks(int count)
{
return Builder<Track>
.CreateListOfSize(count)
.All()
.With(x => x.ArtistMetadata = _artist)
.Build()
.ToList();
}
private ParsedTrackInfo GivenParsedTrackInfo(Track track, AlbumRelease release)
{
return Builder<ParsedTrackInfo>
.CreateNew()
.With(x => x.Title = track.Title)
.With(x => x.CleanTitle = track.Title.CleanTrackTitle())
.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<LocalTrack> GivenLocalTracks(List<Track> tracks, AlbumRelease release)
{
var output = Builder<LocalTrack>
.CreateListOfSize(tracks.Count)
.Build()
.ToList();
for (int i = 0; i < tracks.Count; i++)
{
output[i].FileTrackInfo = GivenParsedTrackInfo(tracks[i], release);
}
return output;
}
private AlbumRelease GivenAlbumRelease(string title, List<Track> tracks)
{
var album = Builder<Album>
.CreateNew()
.With(x => x.Title = title)
.With(x => x.ArtistMetadata = _artist)
.Build();
var media = Builder<Medium>
.CreateListOfSize(1)
.Build()
.ToList();
return Builder<AlbumRelease>
.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<string>())
.With(x => x.Label = new List<string> { "label" })
.Build();
}
[Test]
public void test_reorder_when_track_numbers_incorrect()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
localTracks[2].FileTrackInfo.TrackNumbers = new[] { 2 };
localTracks[1].FileTrackInfo.TrackNumbers = new[] { 3 };
localTracks = new[] { 0, 2, 1 }.Select(x => localTracks[x]).ToList();
var result = Subject.MapReleaseTracks(localTracks, tracks);
result.Mapping
.ToDictionary(x => x.Key, y => y.Value.Item1)
.Should().BeEquivalentTo(new Dictionary<LocalTrack, Track>
{
{ localTracks[0], tracks[0] },
{ localTracks[1], tracks[2] },
{ localTracks[2], tracks[1] },
});
result.LocalExtra.Should().BeEmpty();
result.MBExtra.Should().BeEmpty();
}
[Test]
public void test_order_works_with_invalid_track_numbers()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
foreach (var track in localTracks)
{
track.FileTrackInfo.TrackNumbers = new[] { 1 };
}
var result = Subject.MapReleaseTracks(localTracks, tracks);
result.Mapping
.ToDictionary(x => x.Key, y => y.Value.Item1)
.Should().BeEquivalentTo(new Dictionary<LocalTrack, Track>
{
{ localTracks[0], tracks[0] },
{ localTracks[1], tracks[1] },
{ localTracks[2], tracks[2] },
});
result.LocalExtra.Should().BeEmpty();
result.MBExtra.Should().BeEmpty();
}
[Test]
public void test_order_works_with_missing_tracks()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
localTracks.RemoveAt(1);
var result = Subject.MapReleaseTracks(localTracks, tracks);
result.Mapping
.ToDictionary(x => x.Key, y => y.Value.Item1)
.Should().BeEquivalentTo(new Dictionary<LocalTrack, Track>
{
{ localTracks[0], tracks[0] },
{ localTracks[1], tracks[2] }
});
result.LocalExtra.Should().BeEmpty();
result.MBExtra.Should().BeEquivalentTo(new List<Track> { tracks[1] });
}
[Test]
public void test_order_works_with_extra_tracks()
{
var tracks = GivenTracks(3);
var release = GivenAlbumRelease("album", tracks);
var localTracks = GivenLocalTracks(tracks, release);
tracks.RemoveAt(1);
var result = Subject.MapReleaseTracks(localTracks, tracks);
result.Mapping
.ToDictionary(x => x.Key, y => y.Value.Item1)
.Should().BeEquivalentTo(new Dictionary<LocalTrack, Track>
{
{ localTracks[0], tracks[0] },
{ localTracks[2], tracks[1] }
});
result.LocalExtra.Should().BeEquivalentTo(new List<LocalTrack> { localTracks[1] });
result.MBExtra.Should().BeEmpty();
}
}
}
@@ -26,9 +26,8 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport
{
private List<IFileInfo> _fileInfos;
private LocalTrack _localTrack;
private Artist _artist;
private Album _album;
private AlbumRelease _albumRelease;
private Author _artist;
private Book _album;
private QualityModel _quality;
private IdentificationOverrides _idOverrides;
@@ -85,26 +84,22 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport
_fail2.Setup(c => c.IsSatisfiedBy(It.IsAny<LocalTrack>(), It.IsAny<DownloadClientItem>())).Returns(Decision.Reject("_fail2"));
_fail3.Setup(c => c.IsSatisfiedBy(It.IsAny<LocalTrack>(), It.IsAny<DownloadClientItem>())).Returns(Decision.Reject("_fail3"));
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(e => e.QualityProfileId = 1)
.With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() })
.Build();
_album = Builder<Album>.CreateNew()
.With(x => x.Artist = _artist)
_album = Builder<Book>.CreateNew()
.With(x => x.Author = _artist)
.Build();
_albumRelease = Builder<AlbumRelease>.CreateNew()
.With(x => x.Album = _album)
.Build();
_quality = new QualityModel(Quality.MP3_256);
_quality = new QualityModel(Quality.MP3_320);
_localTrack = new LocalTrack
{
Artist = _artist,
Quality = _quality,
Tracks = new List<Track> { new Track() },
Album = new Book(),
Path = @"C:\Test\Unsorted\The.Office.S03E115.DVDRip.XviD-OSiTV.avi".AsOsAgnostic()
};
@@ -122,7 +117,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport
.Returns((List<LocalTrack> tracks, IdentificationOverrides idOverrides, ImportDecisionMakerConfig config) =>
{
var ret = new LocalAlbumRelease(tracks);
ret.AlbumRelease = _albumRelease;
ret.Book = _album;
return new List<LocalAlbumRelease> { ret };
});
@@ -154,7 +149,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport
.Setup(s => s.Augment(It.IsAny<LocalTrack>(), It.IsAny<bool>()))
.Callback<LocalTrack, bool>((localTrack, otherFiles) =>
{
localTrack.Tracks = _localTrack.Tracks;
localTrack.Album = _localTrack.Album;
});
}
@@ -1,5 +1,4 @@
using System.IO;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
@@ -17,7 +16,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
[TestFixture]
public class FreeSpaceSpecificationFixture : CoreTest<FreeSpaceSpecification>
{
private Artist _artist;
private Author _artist;
private LocalTrack _localTrack;
private string _rootFolder;
@@ -26,19 +25,14 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
{
_rootFolder = @"C:\Test\Music".AsOsAgnostic();
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(s => s.Path = Path.Combine(_rootFolder, "Alice in Chains"))
.Build();
var tracks = Builder<Track>.CreateListOfSize(1)
.All()
.Build()
.ToList();
_localTrack = new LocalTrack
{
Path = @"C:\Test\Unsorted\Alice in Chains\Alice in Chains - track1.mp3".AsOsAgnostic(),
Tracks = tracks,
Album = new Book(),
Artist = _artist
};
}
@@ -29,7 +29,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
{
Path = @"C:\Test\Unsorted Music\Kid.Rock\Kid.Rock.Cowboy.mp3".AsOsAgnostic(),
Size = 100,
Artist = Builder<Artist>.CreateNew().Build()
Artist = Builder<Author>.CreateNew().Build()
};
}
@@ -1,4 +1,4 @@
using System.Linq;
using System.Collections.Generic;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
@@ -27,14 +27,13 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
[Test]
public void should_be_accepted_if_no_existing_file()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(1)
.TheFirst(1)
.With(e => e.TrackFileId = 0)
.BuildList();
_localTrack.Album = Builder<Book>.CreateNew()
.Build();
Subject.IsSatisfiedBy(_localTrack, null).Accepted.Should().BeTrue();
}
/*
[Test]
public void should_be_accepted_if_multiple_existing_files()
{
@@ -57,21 +56,21 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
.ToList();
Subject.IsSatisfiedBy(_localTrack, null).Accepted.Should().BeTrue();
}
}*/
[Test]
public void should_be_accepted_if_file_size_is_different()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(1)
.TheFirst(1)
.With(e => e.TrackFileId = 1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Size = _localTrack.Size + 100.Megabytes()
}))
.Build()
.ToList();
_localTrack.Album = Builder<Book>.CreateNew()
.With(e => e.BookFiles = new LazyLoaded<List<BookFile>>(
new List<BookFile>
{
new BookFile
{
Size = _localTrack.Size + 100.Megabytes()
}
}))
.Build();
Subject.IsSatisfiedBy(_localTrack, null).Accepted.Should().BeTrue();
}
@@ -79,16 +78,16 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
[Test]
public void should_be_reject_if_file_size_is_the_same()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(1)
.TheFirst(1)
.With(e => e.TrackFileId = 1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Size = _localTrack.Size
}))
.Build()
.ToList();
_localTrack.Album = Builder<Book>.CreateNew()
.With(e => e.BookFiles = new LazyLoaded<List<BookFile>>(
new List<BookFile>
{
new BookFile
{
Size = _localTrack.Size
}
}))
.Build();
Subject.IsSatisfiedBy(_localTrack, null).Accepted.Should().BeFalse();
}
@@ -17,25 +17,26 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
[TestFixture]
public class UpgradeSpecificationFixture : CoreTest<UpgradeSpecification>
{
private Artist _artist;
private Album _album;
/*
private Author _artist;
private Book _album;
private LocalTrack _localTrack;
[SetUp]
public void Setup()
{
_artist = Builder<Artist>.CreateNew()
_artist = Builder<Author>.CreateNew()
.With(e => e.QualityProfile = new QualityProfile
{
Items = Qualities.QualityFixture.GetDefaultQualities(),
}).Build();
_album = Builder<Album>.CreateNew().Build();
_album = Builder<Book>.CreateNew().Build();
_localTrack = new LocalTrack
{
Path = @"C:\Test\Imagine Dragons\Imagine.Dragons.Song.1.mp3",
Quality = new QualityModel(Quality.MP3_256, new Revision(version: 1)),
Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1)),
Artist = _artist,
Album = _album
};
@@ -76,7 +77,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Quality = new QualityModel(Quality.MP3_192, new Revision(version: 1))
Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1))
}))
.Build()
.ToList();
@@ -93,7 +94,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Quality = new QualityModel(Quality.MP3_192, new Revision(version: 1))
Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1))
}))
.Build()
.ToList();
@@ -144,7 +145,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Quality = new QualityModel(Quality.MP3_192, new Revision(version: 1))
Quality = new QualityModel(Quality.MP3_320, new Revision(version: 1))
}))
.TheNext(1)
.With(e => e.TrackFileId = 2)
@@ -172,7 +173,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Quality = new QualityModel(Quality.MP3_256, new Revision(version: 2))
Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2))
}))
.Build()
.ToList();
@@ -193,7 +194,7 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Quality = new QualityModel(Quality.MP3_256, new Revision(version: 2))
Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2))
}))
.Build()
.ToList();
@@ -236,5 +237,6 @@ namespace NzbDrone.Core.Test.MediaFiles.TrackImport.Specifications
Subject.IsSatisfiedBy(_localTrack, null).Accepted.Should().BeTrue();
}
*/
}
}
@@ -1,5 +1,5 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using Moq;
@@ -9,6 +9,7 @@ using NzbDrone.Core.Datastore;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Music;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Core.RootFolders;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common;
@@ -16,7 +17,7 @@ namespace NzbDrone.Core.Test.MediaFiles
{
public class UpgradeMediaFileServiceFixture : CoreTest<UpgradeMediaFileService>
{
private TrackFile _trackFile;
private BookFile _trackFile;
private LocalTrack _localTrack;
private string _rootPath = @"C:\Test\Music\Artist".AsOsAgnostic();
@@ -24,12 +25,12 @@ namespace NzbDrone.Core.Test.MediaFiles
public void Setup()
{
_localTrack = new LocalTrack();
_localTrack.Artist = new Artist
_localTrack.Artist = new Author
{
Path = _rootPath
};
_trackFile = Builder<TrackFile>
_trackFile = Builder<BookFile>
.CreateNew()
.Build();
@@ -44,57 +45,25 @@ namespace NzbDrone.Core.Test.MediaFiles
Mocker.GetMock<IDiskProvider>()
.Setup(c => c.GetParentFolder(It.IsAny<string>()))
.Returns<string>(c => Path.GetDirectoryName(c));
Mocker.GetMock<IRootFolderService>()
.Setup(c => c.GetBestRootFolder(It.IsAny<string>()))
.Returns(new RootFolder());
}
private void GivenSingleTrackWithSingleTrackFile()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(1)
.All()
.With(e => e.TrackFileId = 1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Id = 1,
Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"),
}))
.Build()
.ToList();
}
private void GivenMultipleTracksWithSingleTrackFile()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(2)
.All()
.With(e => e.TrackFileId = 1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Id = 1,
Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"),
}))
.Build()
.ToList();
}
private void GivenMultipleTracksWithMultipleTrackFiles()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(2)
.TheFirst(1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Id = 1,
Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"),
}))
.TheNext(1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(
new TrackFile
{
Id = 2,
Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e02.avi"),
}))
.Build()
.ToList();
_localTrack.Album = Builder<Book>.CreateNew()
.With(e => e.BookFiles = new LazyLoaded<List<BookFile>>(
new List<BookFile>
{
new BookFile
{
Id = 1,
Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"),
}
}))
.Build();
}
[Test]
@@ -107,26 +76,6 @@ namespace NzbDrone.Core.Test.MediaFiles
Mocker.GetMock<IRecycleBinProvider>().Verify(v => v.DeleteFile(It.IsAny<string>(), It.IsAny<string>()), Times.Once());
}
[Test]
public void should_delete_the_same_track_file_only_once()
{
GivenMultipleTracksWithSingleTrackFile();
Subject.UpgradeTrackFile(_trackFile, _localTrack);
Mocker.GetMock<IRecycleBinProvider>().Verify(v => v.DeleteFile(It.IsAny<string>(), It.IsAny<string>()), Times.Once());
}
[Test]
public void should_delete_multiple_different_track_files()
{
GivenMultipleTracksWithMultipleTrackFiles();
Subject.UpgradeTrackFile(_trackFile, _localTrack);
Mocker.GetMock<IRecycleBinProvider>().Verify(v => v.DeleteFile(It.IsAny<string>(), It.IsAny<string>()), Times.Exactly(2));
}
[Test]
public void should_delete_track_file_from_database()
{
@@ -134,7 +83,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.UpgradeTrackFile(_trackFile, _localTrack);
Mocker.GetMock<IMediaFileService>().Verify(v => v.Delete(It.IsAny<TrackFile>(), DeleteMediaFileReason.Upgrade), Times.Once());
Mocker.GetMock<IMediaFileService>().Verify(v => v.Delete(It.IsAny<BookFile>(), DeleteMediaFileReason.Upgrade), Times.Once());
}
[Test]
@@ -148,7 +97,7 @@ namespace NzbDrone.Core.Test.MediaFiles
Subject.UpgradeTrackFile(_trackFile, _localTrack);
Mocker.GetMock<IMediaFileService>().Verify(v => v.Delete(_localTrack.Tracks.Single().TrackFile.Value, DeleteMediaFileReason.Upgrade), Times.Once());
// Mocker.GetMock<IMediaFileService>().Verify(v => v.Delete(_localTrack.Album.BookFiles.Value, DeleteMediaFileReason.Upgrade), Times.Once());
}
[Test]
@@ -174,26 +123,16 @@ namespace NzbDrone.Core.Test.MediaFiles
}
[Test]
public void should_return_old_track_files_in_oldFiles()
{
GivenMultipleTracksWithMultipleTrackFiles();
Subject.UpgradeTrackFile(_trackFile, _localTrack).OldFiles.Count.Should().Be(2);
}
[Test]
[Ignore("Pending readarr fix")]
public void should_import_if_existing_file_doesnt_exist_in_db()
{
_localTrack.Tracks = Builder<Track>.CreateListOfSize(1)
.All()
.With(e => e.TrackFileId = 1)
.With(e => e.TrackFile = new LazyLoaded<TrackFile>(null))
.Build()
.ToList();
_localTrack.Album = Builder<Book>.CreateNew()
.With(e => e.BookFiles = new LazyLoaded<List<BookFile>>())
.Build();
Subject.UpgradeTrackFile(_trackFile, _localTrack);
Mocker.GetMock<IMediaFileService>().Verify(v => v.Delete(_localTrack.Tracks.Single().TrackFile.Value, It.IsAny<DeleteMediaFileReason>()), Times.Never());
// Mocker.GetMock<IMediaFileService>().Verify(v => v.Delete(_localTrack.Album.BookFiles.Value, It.IsAny<DeleteMediaFileReason>()), Times.Never());
}
}
}