You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Readarr/src/NzbDrone.Core.Test/MediaFiles/MediaFileRepositoryFixture.cs

178 lines
5.7 KiB

using System.Collections.Generic;
using System.Linq;
using FizzWare.NBuilder;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.Books;
using NzbDrone.Core.MediaFiles;
using NzbDrone.Core.Qualities;
using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.MediaFiles
{
[TestFixture]
public class MediaFileRepositoryFixture : DbTest<MediaFileRepository, BookFile>
{
private Author _author;
private Book _book;
private Edition _edition;
[SetUp]
public void Setup()
{
var meta = Builder<AuthorMetadata>.CreateNew()
.With(a => a.Id = 0)
.Build();
Db.Insert(meta);
_author = Builder<Author>.CreateNew()
.With(a => a.AuthorMetadataId = meta.Id)
.With(a => a.Id = 0)
.Build();
Db.Insert(_author);
_book = Builder<Book>.CreateNew()
.With(a => a.Id = 0)
.With(a => a.AuthorMetadataId = _author.AuthorMetadataId)
.Build();
Db.Insert(_book);
_edition = Builder<Edition>.CreateNew()
.With(a => a.Id = 0)
.With(a => a.BookId = _book.Id)
.Build();
Db.Insert(_edition);
var files = Builder<BookFile>.CreateListOfSize(10)
.All()
.With(c => c.Id = 0)
.With(c => c.Quality = new QualityModel(Quality.MP3))
.TheFirst(5)
.With(c => c.EditionId = _edition.Id)
.TheRest()
.With(c => c.EditionId = 0)
.TheFirst(1)
.With(c => c.Path = @"C:\Test\Path\Author\somefile1.flac".AsOsAgnostic())
.TheNext(1)
.With(c => c.Path = @"C:\Test\Path\Author\somefile2.flac".AsOsAgnostic())
.BuildListOfNew();
Db.InsertMany(files);
}
[Test]
public void get_files_by_author()
{
VerifyData();
var authorFiles = Subject.GetFilesByAuthor(_author.Id);
VerifyEagerLoaded(authorFiles);
authorFiles.Should().OnlyContain(c => c.Author.Value.Id == _author.Id);
}
[Test]
public void get_unmapped_files()
{
VerifyData();
var unmappedfiles = Subject.GetUnmappedFiles();
VerifyUnmapped(unmappedfiles);
unmappedfiles.Should().HaveCount(5);
}
[TestCase("C:\\Test\\Path")]
[TestCase("C:\\Test\\Path\\")]
public void get_files_by_base_path_should_cope_with_trailing_slash(string dir)
{
VerifyData();
var firstReleaseFiles = Subject.GetFilesWithBasePath(dir.AsOsAgnostic());
firstReleaseFiles.Should().HaveCount(2);
}
[TestCase("C:\\Test\\Path")]
[TestCase("C:\\Test\\Path\\")]
public void get_files_by_base_path_should_not_get_files_for_partial_path(string dir)
{
VerifyData();
var files = Builder<BookFile>.CreateListOfSize(2)
.All()
.With(c => c.Id = 0)
.With(c => c.Quality = new QualityModel(Quality.MP3))
.TheFirst(1)
.With(c => c.Path = @"C:\Test\Path2\Author\somefile1.flac".AsOsAgnostic())
.TheNext(1)
.With(c => c.Path = @"C:\Test\Path2\Author\somefile2.flac".AsOsAgnostic())
.BuildListOfNew();
Db.InsertMany(files);
var firstReleaseFiles = Subject.GetFilesWithBasePath(dir.AsOsAgnostic());
firstReleaseFiles.Should().HaveCount(2);
}
[Test]
public void get_file_by_path()
{
VerifyData();
var file = Subject.GetFileWithPath(@"C:\Test\Path\Author\somefile2.flac".AsOsAgnostic());
file.Should().NotBeNull();
file.Edition.IsLoaded.Should().BeTrue();
file.Edition.Value.Should().NotBeNull();
file.Author.IsLoaded.Should().BeTrue();
file.Author.Value.Should().NotBeNull();
}
[Test]
public void get_files_by_book()
{
VerifyData();
var files = Subject.GetFilesByBook(_book.Id);
VerifyEagerLoaded(files);
files.Should().OnlyContain(c => c.EditionId == _book.Id);
}
private void VerifyData()
{
Db.All<Author>().Should().HaveCount(1);
Db.All<Book>().Should().HaveCount(1);
Db.All<BookFile>().Should().HaveCount(10);
}
private void VerifyEagerLoaded(List<BookFile> files)
{
foreach (var file in files)
{
file.Edition.IsLoaded.Should().BeTrue();
file.Edition.Value.Should().NotBeNull();
file.Author.IsLoaded.Should().BeTrue();
file.Author.Value.Should().NotBeNull();
file.Author.Value.Metadata.IsLoaded.Should().BeTrue();
file.Author.Value.Metadata.Value.Should().NotBeNull();
}
}
private void VerifyUnmapped(List<BookFile> files)
{
foreach (var file in files)
{
file.Edition.IsLoaded.Should().BeFalse();
file.Edition.Value.Should().BeNull();
file.Author.IsLoaded.Should().BeFalse();
file.Author.Value.Should().BeNull();
}
}
[Test]
public void delete_files_by_book_should_work_if_join_fails()
{
Db.Delete(_book);
Subject.DeleteFilesByBook(_book.Id);
Db.All<BookFile>().Where(x => x.EditionId == _book.Id).Should().HaveCount(0);
}
}
}