using System; using System.Collections.Generic; using System.Data.SQLite; using FizzWare.NBuilder; using FluentAssertions; using Npgsql; using NUnit.Framework; using NzbDrone.Common.Extensions; using NzbDrone.Core.Books; using NzbDrone.Core.Datastore; using NzbDrone.Core.Profiles.Metadata; using NzbDrone.Core.Profiles.Qualities; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.MusicTests.AuthorRepositoryTests { [TestFixture] public class AuthorRepositoryFixture : DbTest { private AuthorRepository _authorRepo; private AuthorMetadataRepository _authorMetadataRepo; [SetUp] public void Setup() { _authorRepo = Mocker.Resolve(); _authorMetadataRepo = Mocker.Resolve(); } private void AddAuthor(string name, string foreignId, List oldIds = null) { if (oldIds == null) { oldIds = new List(); } var metadata = Builder.CreateNew() .With(a => a.Id = 0) .With(a => a.Name = name) .With(a => a.TitleSlug = foreignId) .BuildNew(); var author = Builder.CreateNew() .With(a => a.Id = 0) .With(a => a.Metadata = metadata) .With(a => a.CleanName = Parser.Parser.CleanAuthorName(name)) .With(a => a.ForeignAuthorId = foreignId) .BuildNew(); _authorMetadataRepo.Insert(metadata); author.AuthorMetadataId = metadata.Id; _authorRepo.Insert(author); } private void GivenAuthors() { AddAuthor("The Black Eyed Peas", "d5be5333-4171-427e-8e12-732087c6b78e"); AddAuthor("The Black Keys", "d15721d8-56b4-453d-b506-fc915b14cba2", new List { "6f2ed437-825c-4cea-bb58-bf7688c6317a" }); } [Test] public void should_lazyload_profiles() { var profile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities(Quality.FLAC, Quality.MP3, Quality.MP3), Cutoff = Quality.FLAC.Id, Name = "TestProfile" }; var metaProfile = new MetadataProfile { Name = "TestProfile" }; Mocker.Resolve().Insert(profile); Mocker.Resolve().Insert(metaProfile); var author = Builder.CreateNew().BuildNew(); author.QualityProfileId = profile.Id; author.MetadataProfileId = metaProfile.Id; Subject.Insert(author); StoredModel.QualityProfile.Should().NotBeNull(); StoredModel.MetadataProfile.Should().NotBeNull(); } [TestCase("The Black Eyed Peas")] [TestCase("The Black Keys")] public void should_find_author_in_db_by_name(string name) { GivenAuthors(); var author = _authorRepo.FindByName(Parser.Parser.CleanAuthorName(name)); author.Should().NotBeNull(); author.Name.Should().Be(name); } [Test] public void should_find_author_in_by_id() { GivenAuthors(); var author = _authorRepo.FindById("d5be5333-4171-427e-8e12-732087c6b78e"); author.Should().NotBeNull(); author.ForeignAuthorId.Should().Be("d5be5333-4171-427e-8e12-732087c6b78e"); } [Test] public void should_not_find_author_if_multiple_authors_have_same_name() { GivenAuthors(); string name = "Alice Cooper"; AddAuthor(name, "ee58c59f-8e7f-4430-b8ca-236c4d3745ae"); AddAuthor(name, "4d7928cd-7ed2-4282-8c29-c0c9f966f1bd"); _authorRepo.All().Should().HaveCount(4); var author = _authorRepo.FindByName(Parser.Parser.CleanAuthorName(name)); author.Should().BeNull(); } [Test] public void should_throw_sql_exception_adding_duplicate_author() { var name = "test"; var metadata = Builder.CreateNew() .With(a => a.Id = 0) .With(a => a.Name = name) .BuildNew(); var author1 = Builder.CreateNew() .With(a => a.Id = 0) .With(a => a.Metadata = metadata) .With(a => a.CleanName = Parser.Parser.CleanAuthorName(name)) .BuildNew(); var author2 = author1.JsonClone(); author2.Metadata = metadata; _authorMetadataRepo.Insert(metadata); _authorRepo.Insert(author1); Action insertDupe = () => _authorRepo.Insert(author2); if (Db.DatabaseType == DatabaseType.PostgreSQL) { insertDupe.Should().Throw(); } else { insertDupe.Should().Throw(); } } } }