diff --git a/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs new file mode 100644 index 000000000..d7650c204 --- /dev/null +++ b/src/NzbDrone.Core.Test/DiskSpace/DiskSpaceServiceFixture.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Common.Disk; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.DiskSpace; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Core.Tv; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.DiskSpace +{ + [TestFixture] + public class DiskSpaceServiceFixture : CoreTest + { + private string _seriesFolder; + private string _seriesFolder2; + private string _droneFactoryFolder; + + [SetUp] + public void SetUp() + { + _seriesFolder = @"G:\fasdlfsdf\series".AsOsAgnostic(); + _seriesFolder2 = @"G:\fasdlfsdf\series2".AsOsAgnostic(); + _droneFactoryFolder = @"G:\dronefactory".AsOsAgnostic(); + + Mocker.GetMock() + .Setup(v => v.GetMounts()) + .Returns(new List()); + + Mocker.GetMock() + .Setup(v => v.GetPathRoot(It.IsAny())) + .Returns(@"G:\".AsOsAgnostic()); + + Mocker.GetMock() + .Setup(v => v.GetAvailableSpace(It.IsAny())) + .Returns(0); + + Mocker.GetMock() + .Setup(v => v.GetTotalSize(It.IsAny())) + .Returns(0); + + GivenSeries(); + } + + private void GivenSeries(params Series[] series) + { + Mocker.GetMock() + .Setup(v => v.GetAllSeries()) + .Returns(series.ToList()); + } + + private void GivenExistingFolder(string folder) + { + Mocker.GetMock() + .Setup(v => v.FolderExists(folder)) + .Returns(true); + } + + [Test] + public void should_check_diskspace_for_series_folders() + { + GivenSeries(new Series { Path = _seriesFolder }); + + GivenExistingFolder(_seriesFolder); + + var freeSpace = Subject.GetFreeSpace(); + + freeSpace.Should().NotBeEmpty(); + } + + [Test] + public void should_check_diskspace_for_same_root_folder_only_once() + { + GivenSeries(new Series { Path = _seriesFolder }, new Series { Path = _seriesFolder2 }); + + GivenExistingFolder(_seriesFolder); + GivenExistingFolder(_seriesFolder2); + + var freeSpace = Subject.GetFreeSpace(); + + freeSpace.Should().HaveCount(1); + + Mocker.GetMock() + .Verify(v => v.GetAvailableSpace(It.IsAny()), Times.Once()); + } + + [Test] + public void should_not_check_diskspace_for_missing_series_folders() + { + GivenSeries(new Series { Path = _seriesFolder }); + + var freeSpace = Subject.GetFreeSpace(); + + freeSpace.Should().BeEmpty(); + + Mocker.GetMock() + .Verify(v => v.GetAvailableSpace(It.IsAny()), Times.Never()); + } + + [Test] + public void should_check_diskspace_for_dronefactory_folder() + { + Mocker.GetMock() + .SetupGet(v => v.DownloadedEpisodesFolder) + .Returns(_droneFactoryFolder); + + GivenExistingFolder(_droneFactoryFolder); + + var freeSpace = Subject.GetFreeSpace(); + + freeSpace.Should().NotBeEmpty(); + } + + [Test] + public void should_not_check_diskspace_for_missing_dronefactory_folder() + { + Mocker.GetMock() + .SetupGet(v => v.DownloadedEpisodesFolder) + .Returns(_droneFactoryFolder); + + var freeSpace = Subject.GetFreeSpace(); + + freeSpace.Should().BeEmpty(); + + Mocker.GetMock() + .Verify(v => v.GetAvailableSpace(It.IsAny()), Times.Never()); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 72b2b278e..f61558c65 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -165,6 +165,7 @@ + diff --git a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs index 69e8af676..edc641533 100644 --- a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs +++ b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs @@ -42,14 +42,17 @@ namespace NzbDrone.Core.DiskSpace private IEnumerable GetSeriesFreeSpace() { - var seriesRootPaths = _seriesService.GetAllSeries().Select(s => _diskProvider.GetPathRoot(s.Path)).Distinct(); + var seriesRootPaths = _seriesService.GetAllSeries() + .Where(s => _diskProvider.FolderExists(s.Path)) + .Select(s => _diskProvider.GetPathRoot(s.Path)) + .Distinct(); return GetDiskSpace(seriesRootPaths); } private IEnumerable GetDroneFactoryFreeSpace() { - if (!string.IsNullOrWhiteSpace(_configService.DownloadedEpisodesFolder)) + if (_configService.DownloadedEpisodesFolder.IsNotNullOrWhiteSpace() && _diskProvider.FolderExists(_configService.DownloadedEpisodesFolder)) { return GetDiskSpace(new[] { _diskProvider.GetPathRoot(_configService.DownloadedEpisodesFolder) }); }