From d4817e9ff2b6450b3b1318ee6ceb400ff243d219 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 27 Mar 2020 15:24:20 -0700 Subject: [PATCH] Improve root folder health check Co-Authored-By: Mark McDowall --- .../GetBestRootFolderPathFixture.cs | 48 +++++++++++++++++++ .../RootFolderServiceFixture.cs | 1 - .../HealthCheck/Checks/RootFolderCheck.cs | 16 ++++--- .../RootFolders/RootFolderService.cs | 2 +- 4 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/NzbDrone.Core.Test/RootFolderTests/GetBestRootFolderPathFixture.cs diff --git a/src/NzbDrone.Core.Test/RootFolderTests/GetBestRootFolderPathFixture.cs b/src/NzbDrone.Core.Test/RootFolderTests/GetBestRootFolderPathFixture.cs new file mode 100644 index 0000000000..cf8f7648da --- /dev/null +++ b/src/NzbDrone.Core.Test/RootFolderTests/GetBestRootFolderPathFixture.cs @@ -0,0 +1,48 @@ +using System.Linq; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Common.Disk; +using NzbDrone.Core.RootFolders; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.RootFolderTests +{ + [TestFixture] + public class GetBestRootFolderPathFixture : CoreTest + { + private void GivenRootFolders(params string[] paths) + { + Mocker.GetMock() + .Setup(s => s.All()) + .Returns(paths.Select(p => new RootFolder { Path = p })); + } + + [Test] + public void should_return_root_folder_that_is_parent_path() + { + GivenRootFolders(@"C:\Test\Movies".AsOsAgnostic(), @"D:\Test\Movies".AsOsAgnostic()); + Subject.GetBestRootFolderPath(@"C:\Test\Movies\Movie Title".AsOsAgnostic()).Should().Be(@"C:\Test\Movies".AsOsAgnostic()); + } + + [Test] + public void should_return_root_folder_that_is_grandparent_path() + { + GivenRootFolders(@"C:\Test\Movies".AsOsAgnostic(), @"D:\Test\Movies".AsOsAgnostic()); + Subject.GetBestRootFolderPath(@"C:\Test\Movies\M\Movie Title".AsOsAgnostic()).Should().Be(@"C:\Test\Movies".AsOsAgnostic()); + } + + [Test] + public void should_get_parent_path_from_diskProvider_if_matching_root_folder_is_not_found() + { + var moviePath = @"T:\Test\Movies\Movie Title".AsOsAgnostic(); + + GivenRootFolders(@"C:\Test\Movies".AsOsAgnostic(), @"D:\Test\Movies".AsOsAgnostic()); + Subject.GetBestRootFolderPath(moviePath); + + Mocker.GetMock() + .Verify(v => v.GetParentFolder(moviePath), Times.Once); + } + } +} diff --git a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs index 0909b69eff..870c9147b4 100644 --- a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs +++ b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs @@ -16,7 +16,6 @@ namespace NzbDrone.Core.Test.RootFolderTests { [TestFixture] - public class RootFolderServiceFixture : CoreTest { [SetUp] diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs index c1e9b4d8e4..4149132f2f 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs @@ -3,6 +3,7 @@ using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Movies; using NzbDrone.Core.Movies.Events; +using NzbDrone.Core.RootFolders; namespace NzbDrone.Core.HealthCheck.Checks { @@ -14,20 +15,23 @@ public class RootFolderCheck : HealthCheckBase { private readonly IMovieService _movieService; private readonly IDiskProvider _diskProvider; + private readonly IRootFolderService _rootFolderService; - public RootFolderCheck(IMovieService movieService, IDiskProvider diskProvider) + public RootFolderCheck(IMovieService movieService, IDiskProvider diskProvider, IRootFolderService rootFolderService) { _movieService = movieService; _diskProvider = diskProvider; + _rootFolderService = rootFolderService; } public override HealthCheck Check() { - var missingRootFolders = _movieService.AllMoviePaths() - .Select(s => _diskProvider.GetParentFolder(s)) - .Distinct() - .Where(s => !_diskProvider.FolderExists(s)) - .ToList(); + var rootFolders = _movieService.GetAllMovies() + .Select(s => _rootFolderService.GetBestRootFolderPath(s.Path)) + .Distinct(); + + var missingRootFolders = rootFolders.Where(s => !_diskProvider.FolderExists(s)) + .ToList(); if (missingRootFolders.Any()) { diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index 0e0c2ad715..cd16873b64 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -177,7 +177,7 @@ public string GetBestRootFolderPath(string path) if (possibleRootFolder == null) { - return Path.GetDirectoryName(path); + return _diskProvider.GetParentFolder(path); } return possibleRootFolder.Path;