using System; using System.IO; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.MediaFiles.EpisodeImport.Specifications; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.MediaFiles.EpisodeImport.Specifications { [TestFixture] public class FreeSpaceSpecificationFixture : CoreTest { private Series _series; private LocalEpisode _localEpisode; private String _rootFolder; [SetUp] public void Setup() { _rootFolder = @"C:\Test\TV".AsOsAgnostic(); _series = Builder.CreateNew() .With(s => s.SeriesType = SeriesTypes.Standard) .With(s => s.Path = Path.Combine(_rootFolder, "30 Rock")) .Build(); var episodes = Builder.CreateListOfSize(1) .All() .With(e => e.SeasonNumber = 1) .Build() .ToList(); _localEpisode = new LocalEpisode { Path = @"C:\Test\Unsorted\30 Rock\30.rock.s01e01.avi".AsOsAgnostic(), Episodes = episodes, Series = _series }; } private void GivenFileSize(long size) { _localEpisode.Size = size; } private void GivenFreeSpace(long? size) { Mocker.GetMock() .Setup(s => s.GetAvailableSpace(It.IsAny())) .Returns(size); } [Test] public void should_reject_when_there_isnt_enough_disk_space() { GivenFileSize(100.Megabytes()); GivenFreeSpace(80.Megabytes()); Subject.IsSatisfiedBy(_localEpisode).Should().BeFalse(); ExceptionVerification.ExpectedWarns(1); } [Test] public void should_reject_when_there_isnt_enough_space_for_file_plus_100mb_padding() { GivenFileSize(100.Megabytes()); GivenFreeSpace(150.Megabytes()); Subject.IsSatisfiedBy(_localEpisode).Should().BeFalse(); ExceptionVerification.ExpectedWarns(1); } [Test] public void should_accept_when_there_is_enough_disk_space() { GivenFileSize(100.Megabytes()); GivenFreeSpace(1.Gigabytes()); Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); } [Test] public void should_use_series_paths_parent_for_free_space_check() { GivenFileSize(100.Megabytes()); GivenFreeSpace(1.Gigabytes()); Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); Mocker.GetMock() .Verify(v => v.GetAvailableSpace(_rootFolder), Times.Once()); } [Test] public void should_pass_if_free_space_is_null() { GivenFileSize(100.Megabytes()); GivenFreeSpace(null); Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); } [Test] public void should_pass_if_exception_is_thrown() { GivenFileSize(100.Megabytes()); Mocker.GetMock() .Setup(s => s.GetAvailableSpace(It.IsAny())) .Throws(new TestException()); Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); ExceptionVerification.ExpectedErrors(1); } [Test] public void should_skip_check_for_files_under_series_folder() { Mocker.GetMock() .Setup(s => s.IsParent(It.IsAny(), It.IsAny())) .Returns(true); Subject.IsSatisfiedBy(_localEpisode).Should().BeTrue(); Mocker.GetMock() .Verify(s => s.GetAvailableSpace(It.IsAny()), Times.Never()); } } }