using System.Linq; using FizzWare.NBuilder; using Marr.Data; using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Test.MediaFileTests { public class UpgradeMediaFileServiceFixture : CoreTest { private EpisodeFile _episodeFile; private LocalEpisode _localEpisode; [SetUp] public void Setup() { _localEpisode = new LocalEpisode(); _episodeFile = Builder .CreateNew() .Build(); Mocker.GetMock() .Setup(c => c.FileExists(It.IsAny())) .Returns(true); } private void GivenSingleEpisodeWithSingleEpisodeFile() { _localEpisode.Episodes = Builder.CreateListOfSize(1) .All() .With(e => e.EpisodeFileId = 1) .With(e => e.EpisodeFile = new LazyLoaded( new EpisodeFile { Id = 1, Path = @"C:\Test\30 Rock\Season 01\30.rock.s01e01.avi", })) .Build() .ToList(); } private void GivenMultipleEpisodesWithSingleEpisodeFile() { _localEpisode.Episodes = Builder.CreateListOfSize(2) .All() .With(e => e.EpisodeFileId = 1) .With(e => e.EpisodeFile = new LazyLoaded( new EpisodeFile { Id = 1, Path = @"C:\Test\30 Rock\Season 01\30.rock.s01e01.avi", })) .Build() .ToList(); } private void GivenMultipleEpisodesWithMultipleEpisodeFiles() { _localEpisode.Episodes = Builder.CreateListOfSize(2) .TheFirst(1) .With(e => e.EpisodeFile = new LazyLoaded( new EpisodeFile { Id = 1, Path = @"C:\Test\30 Rock\Season 01\30.rock.s01e01.avi", })) .TheNext(1) .With(e => e.EpisodeFile = new LazyLoaded( new EpisodeFile { Id = 2, Path = @"C:\Test\30 Rock\Season 01\30.rock.s01e02.avi", })) .Build() .ToList(); } [Test] public void should_delete_single_episode_file_once() { GivenSingleEpisodeWithSingleEpisodeFile(); Subject.UpgradeEpisodeFile(_episodeFile, _localEpisode); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny()), Times.Once()); } [Test] public void should_delete_the_same_episode_file_only_once() { GivenMultipleEpisodesWithSingleEpisodeFile(); Subject.UpgradeEpisodeFile(_episodeFile, _localEpisode); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny()), Times.Once()); } [Test] public void should_delete_multiple_different_episode_files() { GivenMultipleEpisodesWithMultipleEpisodeFiles(); Subject.UpgradeEpisodeFile(_episodeFile, _localEpisode); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny()), Times.Exactly(2)); } [Test] public void should_delete_episode_file_from_database() { GivenSingleEpisodeWithSingleEpisodeFile(); Subject.UpgradeEpisodeFile(_episodeFile, _localEpisode); Mocker.GetMock().Verify(v => v.Delete(It.IsAny(), true), Times.Once()); } [Test] public void should_delete_existing_file_fromdb_if_file_doesnt_exist() { GivenSingleEpisodeWithSingleEpisodeFile(); Mocker.GetMock() .Setup(c => c.FileExists(It.IsAny())) .Returns(false); Subject.UpgradeEpisodeFile(_episodeFile, _localEpisode); Mocker.GetMock().Verify(v => v.Delete(_localEpisode.Episodes.Single().EpisodeFile.Value, true), Times.Once()); } [Test] public void should_not_try_to_recyclebin_existing_file_fromdb_if_file_doesnt_exist() { GivenSingleEpisodeWithSingleEpisodeFile(); Mocker.GetMock() .Setup(c => c.FileExists(It.IsAny())) .Returns(false); Subject.UpgradeEpisodeFile(_episodeFile, _localEpisode); Mocker.GetMock().Verify(v => v.DeleteFile(It.IsAny()), Times.Never()); } } }