using System.IO; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Core.Datastore; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MediaFiles { public class UpgradeMediaFileServiceFixture : CoreTest { private TrackFile _trackFile; private LocalTrack _localTrack; private string _rootPath = @"C:\Test\Music\Artist".AsOsAgnostic(); [SetUp] public void Setup() { _localTrack = new LocalTrack(); _localTrack.Artist = new Artist { Path = _rootPath }; _trackFile = Builder .CreateNew() .Build(); Mocker.GetMock() .Setup(c => c.FileExists(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.FolderExists(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.GetParentFolder(It.IsAny())) .Returns(c => Path.GetDirectoryName(c)); } private void GivenSingleTrackWithSingleTrackFile() { _localTrack.Tracks = Builder.CreateListOfSize(1) .All() .With(e => e.TrackFileId = 1) .With(e => e.TrackFile = new LazyLoaded( new TrackFile { Id = 1, Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"), })) .Build() .ToList(); } private void GivenMultipleTracksWithSingleTrackFile() { _localTrack.Tracks = Builder.CreateListOfSize(2) .All() .With(e => e.TrackFileId = 1) .With(e => e.TrackFile = new LazyLoaded( new TrackFile { Id = 1, Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"), })) .Build() .ToList(); } private void GivenMultipleTracksWithMultipleTrackFiles() { _localTrack.Tracks = Builder.CreateListOfSize(2) .TheFirst(1) .With(e => e.TrackFile = new LazyLoaded( new TrackFile { Id = 1, Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e01.avi"), })) .TheNext(1) .With(e => e.TrackFile = new LazyLoaded( new TrackFile { Id = 2, Path = Path.Combine(_rootPath, @"Season 01\30.rock.s01e02.avi"), })) .Build() .ToList(); } [Test] public void should_delete_single_track_file_once() { GivenSingleTrackWithSingleTrackFile(); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny(), It.IsAny()), Times.Once()); } [Test] public void should_delete_the_same_track_file_only_once() { GivenMultipleTracksWithSingleTrackFile(); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny(), It.IsAny()), Times.Once()); } [Test] public void should_delete_multiple_different_track_files() { GivenMultipleTracksWithMultipleTrackFiles(); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny(), It.IsAny()), Times.Exactly(2)); } [Test] public void should_delete_track_file_from_database() { GivenSingleTrackWithSingleTrackFile(); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.Delete(It.IsAny(), DeleteMediaFileReason.Upgrade), Times.Once()); } [Test] public void should_delete_existing_file_fromdb_if_file_doesnt_exist() { GivenSingleTrackWithSingleTrackFile(); Mocker.GetMock() .Setup(c => c.FileExists(It.IsAny())) .Returns(false); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.Delete(_localTrack.Tracks.Single().TrackFile.Value, DeleteMediaFileReason.Upgrade), Times.Once()); } [Test] public void should_not_try_to_recyclebin_existing_file_if_file_doesnt_exist() { GivenSingleTrackWithSingleTrackFile(); Mocker.GetMock() .Setup(c => c.FileExists(It.IsAny())) .Returns(false); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void should_return_old_track_file_in_oldFiles() { GivenSingleTrackWithSingleTrackFile(); Subject.UpgradeTrackFile(_trackFile, _localTrack).OldFiles.Count.Should().Be(1); } [Test] public void should_return_old_track_files_in_oldFiles() { GivenMultipleTracksWithMultipleTrackFiles(); Subject.UpgradeTrackFile(_trackFile, _localTrack).OldFiles.Count.Should().Be(2); } [Test] public void should_import_if_existing_file_doesnt_exist_in_db() { _localTrack.Tracks = Builder.CreateListOfSize(1) .All() .With(e => e.TrackFileId = 1) .With(e => e.TrackFile = new LazyLoaded(null)) .Build() .ToList(); Subject.UpgradeTrackFile(_trackFile, _localTrack); Mocker.GetMock().Verify(v => v.Delete(_localTrack.Tracks.Single().TrackFile.Value, It.IsAny()), Times.Never()); } } }