mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-25 22:36:59 -04:00
New: Unmapped files view (#888)
* New: Unmapped files view Displays all trackfiles that haven't been matched to a track. Generalised the file details component and adds it to the album details screen. * Add sorting by quality * New: MediaServiceTests & MediaRepoTests
This commit is contained in:
@@ -15,6 +15,7 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
{
|
||||
private Artist artist;
|
||||
private Album album;
|
||||
private List<AlbumRelease> releases;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
@@ -36,7 +37,7 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
.Build();
|
||||
Db.Insert(album);
|
||||
|
||||
var releases = Builder<AlbumRelease>.CreateListOfSize(2)
|
||||
releases = Builder<AlbumRelease>.CreateListOfSize(2)
|
||||
.All()
|
||||
.With(a => a.Id = 0)
|
||||
.With(a => a.AlbumId = album.Id)
|
||||
@@ -44,7 +45,7 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
.With(a => a.Monitored = true)
|
||||
.TheNext(1)
|
||||
.With(a => a.Monitored = false)
|
||||
.Build();
|
||||
.Build().ToList();
|
||||
Db.InsertMany(releases);
|
||||
|
||||
var files = Builder<TrackFile>.CreateListOfSize(10)
|
||||
@@ -53,6 +54,10 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
.With(c => c.Quality =new QualityModel(Quality.MP3_192))
|
||||
.TheFirst(5)
|
||||
.With(c => c.AlbumId = album.Id)
|
||||
.TheFirst(1)
|
||||
.With(c => c.Path = "/Test/Path/Artist/somefile1.flac")
|
||||
.TheNext(1)
|
||||
.With(c => c.Path = "/Test/Path/Artist/somefile2.flac")
|
||||
.BuildListOfNew();
|
||||
Db.InsertMany(files);
|
||||
|
||||
@@ -88,6 +93,55 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
artistFiles.Should().OnlyContain(c => c.Artist.Value.Id == artist.Id);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void get_unmapped_files()
|
||||
{
|
||||
VerifyData();
|
||||
var unmappedfiles = Subject.GetUnmappedFiles();
|
||||
VerifyUnmapped(unmappedfiles);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void get_files_by_base_path()
|
||||
{
|
||||
VerifyData();
|
||||
var firstReleaseFiles = Subject.GetFilesWithBasePath("/Test/Path");
|
||||
VerifyEagerLoaded(firstReleaseFiles);
|
||||
|
||||
firstReleaseFiles.Should().HaveCount(2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void get_file_by_path()
|
||||
{
|
||||
VerifyData();
|
||||
var file = Subject.GetFileWithPath("/Test/Path/Artist/somefile2.flac");
|
||||
|
||||
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()
|
||||
{
|
||||
@@ -142,6 +196,20 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
}
|
||||
}
|
||||
|
||||
private void VerifyUnmapped(List<TrackFile> 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();
|
||||
file.Artist.Value.Should().BeNull();
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void delete_files_by_album_should_work_if_join_fails()
|
||||
{
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using FizzWare.NBuilder;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.MediaFiles;
|
||||
using NzbDrone.Core.MediaFiles.Events;
|
||||
using NzbDrone.Core.Test.Framework;
|
||||
using NzbDrone.Core.Music;
|
||||
|
||||
namespace NzbDrone.Core.Test.MediaFiles.TrackFileMovingServiceTests
|
||||
{
|
||||
[TestFixture]
|
||||
public class MediaFileServiceFixture : CoreTest<MediaFileService>
|
||||
{
|
||||
private Album _album;
|
||||
private List<TrackFile> _trackFiles;
|
||||
|
||||
[SetUp]
|
||||
public void Setup()
|
||||
{
|
||||
_album = Builder<Album>.CreateNew()
|
||||
.Build();
|
||||
|
||||
_trackFiles = Builder<TrackFile>.CreateListOfSize(3)
|
||||
.TheFirst(2)
|
||||
.With(f => f.AlbumId = _album.Id)
|
||||
.TheNext(1)
|
||||
.With(f => f.AlbumId = 0)
|
||||
.Build().ToList();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_throw_trackFileDeletedEvent_for_each_mapped_track_on_deletemany()
|
||||
{
|
||||
Subject.DeleteMany(_trackFiles, DeleteMediaFileReason.Manual);
|
||||
|
||||
VerifyEventPublished<TrackFileDeletedEvent>(Times.Exactly(2));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_throw_trackFileDeletedEvent_for_mapped_track_on_delete()
|
||||
{
|
||||
Subject.Delete(_trackFiles[0], DeleteMediaFileReason.Manual);
|
||||
|
||||
VerifyEventPublished<TrackFileDeletedEvent>(Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_throw_trackFileAddedEvent_for_each_track_added_on_addmany()
|
||||
{
|
||||
Subject.AddMany(_trackFiles);
|
||||
|
||||
VerifyEventPublished<TrackFileAddedEvent>(Times.Exactly(3));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_throw_trackFileAddedEvent_for_track_added()
|
||||
{
|
||||
Subject.Add(_trackFiles[0]);
|
||||
|
||||
VerifyEventPublished<TrackFileAddedEvent>(Times.Once());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
{
|
||||
public class MediaFileTableCleanupServiceFixture : CoreTest<MediaFileTableCleanupService>
|
||||
{
|
||||
private readonly string DELETED_PATH = @"c:\ANY FILE WITH THIS PATH IS CONSIDERED DELETED!".AsOsAgnostic();
|
||||
private readonly string DELETED_PATH = @"c:\ANY FILE STARTING WITH THIS PATH IS CONSIDERED DELETED!".AsOsAgnostic();
|
||||
private List<Track> _tracks;
|
||||
private Artist _artist;
|
||||
|
||||
@@ -29,29 +29,23 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
.With(s => s.Path = @"C:\Test\Music\Artist".AsOsAgnostic())
|
||||
.Build();
|
||||
|
||||
Mocker.GetMock<IDiskProvider>()
|
||||
.Setup(e => e.FileExists(It.Is<string>(c => !c.Contains(DELETED_PATH))))
|
||||
.Returns(true);
|
||||
|
||||
Mocker.GetMock<ITrackService>()
|
||||
.Setup(c => c.GetTracksByArtist(It.IsAny<int>()))
|
||||
.Returns(_tracks);
|
||||
.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)
|
||||
{
|
||||
Mocker.GetMock<IMediaFileService>()
|
||||
.Setup(c => c.GetFilesByArtist(It.IsAny<int>()))
|
||||
.Setup(c => c.GetFilesWithBasePath(It.IsAny<string>()))
|
||||
.Returns(trackFiles.ToList());
|
||||
}
|
||||
|
||||
private void GivenFilesAreNotAttachedToTrack()
|
||||
{
|
||||
_tracks.ForEach(e => e.TrackFileId = 0);
|
||||
|
||||
Mocker.GetMock<ITrackService>()
|
||||
.Setup(c => c.GetTracksByArtist(It.IsAny<int>()))
|
||||
.Returns(_tracks);
|
||||
.Setup(c => c.GetTracksByFileId(It.IsAny<int>()))
|
||||
.Returns(new List<Track>());
|
||||
}
|
||||
|
||||
private List<string> FilesOnDisk(IEnumerable<TrackFile> trackFiles)
|
||||
@@ -71,7 +65,8 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
|
||||
Subject.Clean(_artist, FilesOnDisk(trackFiles));
|
||||
|
||||
Mocker.GetMock<ITrackService>().Verify(c => c.UpdateTrack(It.IsAny<Track>()), Times.Never());
|
||||
Mocker.GetMock<IMediaFileService>()
|
||||
.Verify(c => c.DeleteMany(It.Is<List<TrackFile>>(x => x.Count == 0), DeleteMediaFileReason.MissingFromDisk), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -81,24 +76,31 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
.All()
|
||||
.With(x => x.Path = Path.Combine(@"c:\test".AsOsAgnostic(), Path.GetRandomFileName()))
|
||||
.Random(2)
|
||||
.With(c => c.Path = DELETED_PATH)
|
||||
.With(c => c.Path = Path.Combine(DELETED_PATH, Path.GetRandomFileName()))
|
||||
.Build();
|
||||
|
||||
GivenTrackFiles(trackFiles);
|
||||
|
||||
Subject.Clean(_artist, FilesOnDisk(trackFiles.Where(e => e.Path != DELETED_PATH)));
|
||||
Subject.Clean(_artist, FilesOnDisk(trackFiles.Where(e => !e.Path.StartsWith(DELETED_PATH))));
|
||||
|
||||
Mocker.GetMock<IMediaFileService>().Verify(c => c.Delete(It.Is<TrackFile>(e => e.Path == DELETED_PATH), DeleteMediaFileReason.MissingFromDisk), Times.Exactly(2));
|
||||
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());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_unlink_track_when_trackFile_does_not_exist()
|
||||
{
|
||||
GivenTrackFiles(new List<TrackFile>());
|
||||
var trackFiles = Builder<TrackFile>.CreateListOfSize(10)
|
||||
.Random(10)
|
||||
.With(c => c.Path = Path.Combine(@"c:\test".AsOsAgnostic(), Path.GetRandomFileName()))
|
||||
.Build();
|
||||
|
||||
GivenTrackFiles(trackFiles);
|
||||
|
||||
Subject.Clean(_artist, new List<string>());
|
||||
|
||||
Mocker.GetMock<ITrackService>().Verify(c => c.UpdateTrack(It.Is<Track>(e => e.TrackFileId == 0)), Times.Exactly(10));
|
||||
Mocker.GetMock<ITrackService>()
|
||||
.Verify(c => c.SetFileIds(It.Is<List<Track>>(e => e.Count == 10 && e.All(y => y.TrackFileId == 0))), Times.Once());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -113,7 +115,7 @@ namespace NzbDrone.Core.Test.MediaFiles
|
||||
|
||||
Subject.Clean(_artist, FilesOnDisk(trackFiles));
|
||||
|
||||
Mocker.GetMock<ITrackService>().Verify(c => c.UpdateTrack(It.IsAny<Track>()), Times.Never());
|
||||
Mocker.GetMock<ITrackService>().Verify(c => c.SetFileIds(It.Is<List<Track>>(x => x.Count == 0)), Times.Once());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user