using System; using System.Collections.Generic; using System.IO; using FizzWare.NBuilder; using FluentAssertions; using FluentValidation; using FluentValidation.Results; using Moq; using NUnit.Framework; using NzbDrone.Core.Exceptions; using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Organizer; using NzbDrone.Core.Music; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MusicTests { [TestFixture] public class AddArtistFixture : CoreTest { private Artist _fakeArtist; [SetUp] public void Setup() { _fakeArtist = Builder .CreateNew() .With(s => s.Path = null) .Build(); } private void GivenValidArtist(string lidarrId) { Mocker.GetMock() .Setup(s => s.GetArtistInfo(lidarrId)) .Returns(new Tuple>(_fakeArtist, new List())); } private void GivenValidPath() { Mocker.GetMock() .Setup(s => s.GetArtistFolder(It.IsAny(), null)) .Returns((c, n) => c.Name); Mocker.GetMock() .Setup(s => s.Validate(It.IsAny())) .Returns(new ValidationResult()); } [Test] public void should_be_able_to_add_a_artist_without_passing_in_name() { var newArtist = new Artist { ForeignArtistId = "123456", RootFolderPath = @"C:\Test\Music" }; GivenValidArtist(newArtist.ForeignArtistId); GivenValidPath(); var artist = Subject.AddArtist(newArtist); artist.Name.Should().Be(_fakeArtist.Name); } [Test] public void should_have_proper_path() { var newArtist = new Artist { ForeignArtistId = "123456", RootFolderPath = @"C:\Test\Music" }; GivenValidArtist(newArtist.ForeignArtistId); GivenValidPath(); var artist = Subject.AddArtist(newArtist); artist.Path.Should().Be(Path.Combine(newArtist.RootFolderPath, _fakeArtist.Name)); } [Test] public void should_throw_if_artist_validation_fails() { var newArtist = new Artist { ForeignArtistId = "123456", Path = @"C:\Test\Music\Name1" }; GivenValidArtist(newArtist.ForeignArtistId); Mocker.GetMock() .Setup(s => s.Validate(It.IsAny())) .Returns(new ValidationResult(new List { new ValidationFailure("Path", "Test validation failure") })); Assert.Throws(() => Subject.AddArtist(newArtist)); } [Test] public void should_throw_if_artist_cannot_be_found() { var newArtist = new Artist { ForeignArtistId = "123456", Path = @"C:\Test\Music\Name1" }; Mocker.GetMock() .Setup(s => s.GetArtistInfo(newArtist.ForeignArtistId)) .Throws(new ArtistNotFoundException(newArtist.ForeignArtistId)); Mocker.GetMock() .Setup(s => s.Validate(It.IsAny())) .Returns(new ValidationResult(new List { new ValidationFailure("Path", "Test validation failure") })); Assert.Throws(() => Subject.AddArtist(newArtist)); ExceptionVerification.ExpectedErrors(1); } } }