// ReSharper disable InconsistentNaming using System; using System.Collections.Generic; using System.IO; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; using NzbDrone.Test.Common.AutoMoq; namespace NzbDrone.Core.Test.ProviderTests.PostDownloadProviderTests { [TestFixture] public class ProcessDownloadProviderFixture : CoreTest { Series fakeSeries; [SetUp] public void Setup() { fakeSeries = Builder.CreateNew().Build(); } private void WithOldWrite() { Mocker.GetMock() .Setup(c => c.GetLastDirectoryWrite(It.IsAny())) .Returns(DateTime.Now.AddDays(-5)); } private void WithRecentWrite() { Mocker.GetMock() .Setup(c => c.GetLastDirectoryWrite(It.IsAny())) .Returns(DateTime.UtcNow); } private void WithValidSeries() { Mocker.GetMock() .Setup(c => c.FindSeries(It.IsAny())) .Returns(fakeSeries); } private void WithImportableFiles() { Mocker.GetMock() .Setup(c => c.Scan(It.IsAny(), It.IsAny())) .Returns(Builder.CreateListOfSize(1).Build().ToList()); } [Test] public void should_skip_if_folder_is_tagged_and_too_fresh() { WithStrictMocker(); WithRecentWrite(); var droppedFolder = new DirectoryInfo(TempFolder + "\\_test\\"); droppedFolder.Create(); Mocker.Resolve().ProcessDownload(droppedFolder); } [Test] public void should_continue_processing_if_folder_is_tagged_and_not_fresh() { WithOldWrite(); var droppedFolder = new DirectoryInfo(TempFolder + "\\_test\\"); droppedFolder.Create(); //Act Mocker.GetMock().Setup(s => s.FindSeries(It.IsAny())).Returns(null).Verifiable(); Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); ExceptionVerification.IgnoreWarns(); } [Test] public void should_search_for_series_using_title_without_status() { WithOldWrite(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\_unpack_The Office - S01E01 - Episode Title"); Mocker.GetMock().Setup(s => s.FindSeries("office")).Returns(null).Verifiable(); //Act Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); ExceptionVerification.IgnoreWarns(); } [Test] public void should_search_for_series_using_folder_name() { WithOldWrite(); WithValidSeries(); WithImportableFiles(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\The Office - S01E01 - Episode Title"); Mocker.Resolve().ProcessDownload(droppedFolder); Mocker.GetMock() .Verify(c=>c.Scan(fakeSeries, It.IsAny())); } [Test] public void should_search_for_series_using_file_name() { WithOldWrite(); WithValidSeries(); WithImportableFiles(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\The Office - S01E01 - Episode Title"); Mocker.Resolve().ProcessDownload(droppedFolder); Mocker.GetMock() .Verify(c => c.Scan(fakeSeries, It.IsAny())); } [Test] [Ignore("Disabled tagging")] public void when_series_isnt_found_folder_should_be_tagged_as_unknown_series() { //Setup WithStrictMocker(); WithOldWrite(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\The Office - S01E01 - Episode Title"); var taggedFolder = @"C:\Test\Unsorted TV\_UnknownSeries_The Office - S01E01 - Episode Title"; //Act Mocker.GetMock().Setup(s => s.FindSeries("office")).Returns(null); Mocker.GetMock().Setup(s => s.MoveDirectory(droppedFolder.FullName, taggedFolder)); Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); ExceptionVerification.ExpectedWarns(1); } [Test] [Ignore("Disabled tagging")] public void when_no_files_are_imported_folder_should_be_tagged_with_parse_error() { //Setup WithStrictMocker(); WithOldWrite(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\The Office - S01E01 - Episode Title"); var taggedFolder = @"C:\Test\Unsorted TV\_ParseError_The Office - S01E01 - Episode Title"; var fakeSeries = Builder.CreateNew() .With(s => s.Title = "The Office") .Build(); //Act Mocker.GetMock().Setup(s => s.FindSeries("office")).Returns(fakeSeries); Mocker.GetMock().Setup(s => s.Scan(fakeSeries, droppedFolder.FullName)).Returns(new List()); Mocker.GetMock().Setup(s => s.MoveDirectory(droppedFolder.FullName, taggedFolder)); Mocker.GetMock().Setup(s => s.GetDirectorySize(droppedFolder.FullName)).Returns(Constants.IgnoreFileSize + 10.Megabytes()); Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); ExceptionVerification.ExpectedWarns(1); } [Test] [Ignore("Disabled tagging")] public void when_no_file_are_imported_and_folder_size_isnt_small_enought_folder_should_be_tagged_unknown() { //Setup WithStrictMocker(); WithOldWrite(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\The Office - Season 01"); var taggedFolder = PostDownloadProvider.GetTaggedFolderName(droppedFolder, PostDownloadStatusType.Unknown); var fakeSeries = Builder.CreateNew() .With(s => s.Title = "The Office") .Build(); var fakeEpisodeFiles = Builder.CreateListOfSize(2) .All() .With(f => f.SeriesId = fakeSeries.SeriesId) .Build().ToList(); //Act Mocker.GetMock().Setup(s => s.FindSeries("office")).Returns(fakeSeries); Mocker.GetMock().Setup(s => s.MoveDirectory(droppedFolder.FullName, taggedFolder)); Mocker.GetMock().Setup(s => s.GetDirectorySize(droppedFolder.FullName)).Returns(Constants.IgnoreFileSize + 10.Megabytes()); Mocker.GetMock().Setup(s => s.Scan(fakeSeries, droppedFolder.FullName)).Returns(fakeEpisodeFiles); Mocker.GetMock().Setup(s => s.MoveEpisodeFile(It.IsAny(), true)).Returns(true); Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); ExceptionVerification.ExpectedWarns(1); } [TestCase(@"\_UnknownSeries_The Office - S01E01 - Episode Title")] [TestCase(@"\_UnknownSeries_The Office - S01E01 - Episode Title\")] [TestCase("\\Test\\_UnknownSeries_The Office - S01E01 - Episode Title\\")] [TestCase("\\Test\\_UnknownSeries_The Office - S01E01 - Episode Title")] public void folder_shouldnt_be_tagged_with_same_tag_again(string path) { //Setup var droppedFolder = new DirectoryInfo(TempFolder + path); droppedFolder.Create(); WithOldWrite(); //Act Mocker.GetMock().Setup(s => s.FindSeries(It.IsAny())).Returns(null); Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); Mocker.GetMock().Verify(c => c.MoveDirectory(It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void folder_should_not_be_tagged_if_existing_tag_is_diffrent() { //Setup WithOldWrite(); var droppedFolder = new DirectoryInfo(TempFolder + @"\_UnknownEpisode_The Office - S01E01 - Episode Title"); droppedFolder.Create(); droppedFolder.LastWriteTime = DateTime.Now.AddHours(-1); var taggedFolder = TempFolder + @"\_UnknownSeries_The Office - S01E01 - Episode Title"; Mocker.GetMock().Setup(s => s.FindSeries(It.IsAny())).Returns(null); //Act Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); Mocker.GetMock().Verify(c => c.MoveDirectory(droppedFolder.FullName, taggedFolder), Times.Never()); ExceptionVerification.IgnoreWarns(); } [Test] public void when_files_are_imported_and_folder_is_small_enought_dir_should_be_deleted() { //Setup WithStrictMocker(); var droppedFolder = new DirectoryInfo(@"C:\Test\Unsorted TV\The Office - Season 01"); var fakeSeries = Builder.CreateNew() .With(s => s.Title = "The Office") .Build(); var fakeEpisodeFiles = Builder.CreateListOfSize(2) .All() .With(f => f.SeriesId = fakeSeries.SeriesId) .Build().ToList(); Mocker.GetMock().Setup(s => s.FindSeries("office")).Returns(fakeSeries); Mocker.GetMock().Setup(s => s.Scan(fakeSeries, droppedFolder.FullName)).Returns(fakeEpisodeFiles); Mocker.GetMock().Setup(s => s.MoveEpisodeFile(It.IsAny(), true)).Returns(true); Mocker.GetMock().Setup(s => s.GetDirectorySize(droppedFolder.FullName)).Returns(Constants.IgnoreFileSize - 1.Megabytes()); Mocker.GetMock().Setup(s => s.DeleteFolder(droppedFolder.FullName, true)); //Act Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.VerifyAllMocks(); } [Test] public void all_imported_files_should_be_moved() { var droppedFolder = new DirectoryInfo(TempFolder); var fakeSeries = Builder.CreateNew() .Build(); var fakeEpisodeFiles = Builder.CreateListOfSize(2) .Build().ToList(); Mocker.GetMock().Setup(s => s.FindSeries(It.IsAny())).Returns(fakeSeries); Mocker.GetMock().Setup(s => s.Scan(fakeSeries, droppedFolder.FullName)).Returns(fakeEpisodeFiles); //Act Mocker.Resolve().ProcessDownload(droppedFolder); //Assert Mocker.GetMock().Verify(c => c.MoveEpisodeFile(It.IsAny(), true), Times.Exactly(fakeEpisodeFiles.Count)); Mocker.VerifyAllMocks(); } [Test] public void ProcessDropFolder_should_only_process_folders_that_arent_known_series_folders() { var subFolders = new[] { @"c:\drop\episode1", @"c:\drop\episode2", @"c:\drop\episode3", @"c:\drop\episode4" }; Mocker.GetMock() .Setup(c => c.GetDirectories(It.IsAny())) .Returns(subFolders); Mocker.GetMock() .Setup(c => c.SeriesPathExists(subFolders[1])) .Returns(true); Mocker.GetMock() .Setup(c => c.FindSeries(It.IsAny())) .Returns(new Series()); Mocker.GetMock() .Setup(c => c.Scan(It.IsAny(), It.IsAny())) .Returns(new List()); //Act Mocker.Resolve().ProcessDropFolder(@"C:\drop\"); //Assert Mocker.GetMock().Verify(c => c.Scan(It.IsAny(), subFolders[0]), Times.Once()); Mocker.GetMock().Verify(c => c.Scan(It.IsAny(), subFolders[1]), Times.Never()); Mocker.GetMock().Verify(c => c.Scan(It.IsAny(), subFolders[2]), Times.Once()); Mocker.GetMock().Verify(c => c.Scan(It.IsAny(), subFolders[3]), Times.Once()); } } }