using System.IO; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common.Disk; using NzbDrone.Core.Exceptions; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MediaFiles.MediaFileDeletionService { [TestFixture] public class DeleteEpisodeFileFixture : CoreTest { private static readonly string RootFolder = @"C:\Test\TV"; private Series _series; private EpisodeFile _episodeFile; [SetUp] public void Setup() { _series = Builder.CreateNew() .With(s => s.Path = Path.Combine(RootFolder, "Series Title")) .Build(); _episodeFile = Builder.CreateNew() .With(f => f.RelativePath = "Series Title - S01E01") .With(f => f.Path = Path.Combine(_series.Path, "Series Title - S01E01")) .Build(); Mocker.GetMock() .Setup(s => s.GetParentFolder(_series.Path)) .Returns(RootFolder); Mocker.GetMock() .Setup(s => s.GetParentFolder(_episodeFile.Path)) .Returns(_series.Path); } private void GivenRootFolderExists() { Mocker.GetMock() .Setup(s => s.FolderExists(RootFolder)) .Returns(true); } private void GivenRootFolderHasFolders() { Mocker.GetMock() .Setup(s => s.GetDirectories(RootFolder)) .Returns(new[] { _series.Path }); } private void GivenSeriesFolderExists() { Mocker.GetMock() .Setup(s => s.FolderExists(_series.Path)) .Returns(true); } [Test] public void should_throw_if_root_folder_does_not_exist() { Assert.Throws(() => Subject.DeleteEpisodeFile(_series, _episodeFile)); ExceptionVerification.ExpectedWarns(1); } [Test] public void should_should_throw_if_root_folder_is_empty() { GivenRootFolderExists(); Assert.Throws(() => Subject.DeleteEpisodeFile(_series, _episodeFile)); ExceptionVerification.ExpectedWarns(1); } [Test] public void should_delete_from_db_if_series_folder_does_not_exist() { GivenRootFolderExists(); GivenRootFolderHasFolders(); Subject.DeleteEpisodeFile(_series, _episodeFile); Mocker.GetMock().Verify(v => v.Delete(_episodeFile, DeleteMediaFileReason.Manual), Times.Once()); Mocker.GetMock().Verify(v => v.DeleteFile(_episodeFile.Path, It.IsAny()), Times.Never()); } [Test] public void should_delete_from_db_if_episode_file_does_not_exist() { GivenRootFolderExists(); GivenRootFolderHasFolders(); GivenSeriesFolderExists(); Subject.DeleteEpisodeFile(_series, _episodeFile); Mocker.GetMock().Verify(v => v.Delete(_episodeFile, DeleteMediaFileReason.Manual), Times.Once()); Mocker.GetMock().Verify(v => v.DeleteFile(_episodeFile.Path, It.IsAny()), Times.Never()); } [Test] public void should_delete_from_disk_and_db_if_episode_file_exists() { GivenRootFolderExists(); GivenRootFolderHasFolders(); GivenSeriesFolderExists(); Mocker.GetMock() .Setup(s => s.FileExists(_episodeFile.Path)) .Returns(true); Subject.DeleteEpisodeFile(_series, _episodeFile); Mocker.GetMock().Verify(v => v.DeleteFile(_episodeFile.Path, "Series Title"), Times.Once()); Mocker.GetMock().Verify(v => v.Delete(_episodeFile, DeleteMediaFileReason.Manual), Times.Once()); } [Test] public void should_handle_error_deleting_episode_file() { GivenRootFolderExists(); GivenRootFolderHasFolders(); GivenSeriesFolderExists(); Mocker.GetMock() .Setup(s => s.FileExists(_episodeFile.Path)) .Returns(true); Mocker.GetMock() .Setup(s => s.DeleteFile(_episodeFile.Path, "Series Title")) .Throws(new IOException()); Assert.Throws(() => Subject.DeleteEpisodeFile(_series, _episodeFile)); ExceptionVerification.ExpectedErrors(1); Mocker.GetMock().Verify(v => v.DeleteFile(_episodeFile.Path, "Series Title"), Times.Once()); Mocker.GetMock().Verify(v => v.Delete(_episodeFile, DeleteMediaFileReason.Manual), Times.Never()); } } }