using System.Collections.Generic; using System.IO; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Core.Messaging.Events; using NzbDrone.Core.Music; using NzbDrone.Core.Music.Commands; using NzbDrone.Core.Music.Events; using NzbDrone.Core.Organizer; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MusicTests { [TestFixture] public class MoveArtistServiceFixture : CoreTest { private Artist _artist; private MoveArtistCommand _command; private BulkMoveArtistCommand _bulkCommand; [SetUp] public void Setup() { _artist = Builder .CreateNew() .Build(); _command = new MoveArtistCommand { ArtistId = _artist.Id, SourcePath = @"C:\Test\Music\Artist".AsOsAgnostic(), DestinationPath = @"C:\Test\Music2\Artist".AsOsAgnostic(), MoveFiles = true }; _bulkCommand = new BulkMoveArtistCommand { Artist = new List { new BulkMoveArtist { ArtistId = _artist.Id, SourcePath = @"C:\Test\Music\Artist".AsOsAgnostic() } }, DestinationRootFolder = @"C:\Test\Music2".AsOsAgnostic(), MoveFiles = true }; Mocker.GetMock() .Setup(s => s.GetArtist(It.IsAny())) .Returns(_artist); Mocker.GetMock() .Setup(s => s.FolderExists(It.IsAny())) .Returns(true); } private void GivenFailedMove() { Mocker.GetMock() .Setup(s => s.TransferFolder(It.IsAny(), It.IsAny(), TransferMode.Move)) .Throws(); } [Test] public void should_log_error_when_move_throws_an_exception() { GivenFailedMove(); Subject.Execute(_command); ExceptionVerification.ExpectedErrors(1); } [Test] public void should_revert_artist_path_on_error() { GivenFailedMove(); Subject.Execute(_command); ExceptionVerification.ExpectedErrors(1); Mocker.GetMock() .Verify(v => v.UpdateArtist(It.IsAny(), It.IsAny()), Times.Once()); } [Test] public void should_use_destination_path() { Subject.Execute(_command); Mocker.GetMock() .Verify( v => v.TransferFolder(_command.SourcePath, _command.DestinationPath, TransferMode.Move), Times.Once()); Mocker.GetMock() .Verify(v => v.GetArtistFolder(It.IsAny(), null), Times.Never()); } [Test] public void should_build_new_path_when_root_folder_is_provided() { var artistFolder = "Artist"; var expectedPath = Path.Combine(_bulkCommand.DestinationRootFolder, artistFolder); Mocker.GetMock() .Setup(s => s.GetArtistFolder(It.IsAny(), null)) .Returns(artistFolder); Subject.Execute(_bulkCommand); Mocker.GetMock() .Verify( v => v.TransferFolder(_bulkCommand.Artist.First().SourcePath, expectedPath, TransferMode.Move), Times.Once()); } [Test] public void should_skip_artist_folder_if_it_does_not_exist() { Mocker.GetMock() .Setup(s => s.FolderExists(It.IsAny())) .Returns(false); Subject.Execute(_command); Mocker.GetMock() .Verify( v => v.TransferFolder(_command.SourcePath, _command.DestinationPath, TransferMode.Move), Times.Never()); Mocker.GetMock() .Verify(v => v.GetArtistFolder(It.IsAny(), null), Times.Never()); } [Test] public void should_raise_artist_moved_event_when_move_files_false() { _command.MoveFiles = false; Subject.Execute(_command); Mocker.GetMock() .Verify(v => v.PublishEvent(It.Is(c => c.Artist.Id == _artist.Id)), Times.Once()); } [Test] public void should_raise_artist_moved_event_when_move_files_false_bulk() { _bulkCommand.MoveFiles = false; var artistFolder = "Artist"; var expectedPath = Path.Combine(_bulkCommand.DestinationRootFolder, artistFolder); Mocker.GetMock() .Setup(s => s.GetArtistFolder(It.IsAny(), null)) .Returns(artistFolder); Subject.Execute(_bulkCommand); Mocker.GetMock() .Verify(v => v.PublishEvent(It.Is(c => c.Artist.Id == _artist.Id)), Times.Once()); } } }