diff --git a/src/NzbDrone.Core.Test/NetImport/NetImportSearchServiceFixture.cs b/src/NzbDrone.Core.Test/NetImport/NetImportSearchServiceFixture.cs new file mode 100644 index 000000000..a7dcababb --- /dev/null +++ b/src/NzbDrone.Core.Test/NetImport/NetImportSearchServiceFixture.cs @@ -0,0 +1,405 @@ +using System.Collections.Generic; +using System.Linq; +using FizzWare.NBuilder; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.MetadataSource; +using NzbDrone.Core.Movies; +using NzbDrone.Core.NetImport; +using NzbDrone.Core.NetImport.ImportExclusions; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.NetImport +{ + [TestFixture] + public class NetImportSearchServiceFixture : CoreTest + { + private NetImportFetchResult _netImport1Fetch; + private NetImportFetchResult _netImport2Fetch; + private List _moviesList1; + private List _moviesList2; + private List _netImports; + private NetImportSyncCommand _command; + + [SetUp] + public void Setup() + { + _netImports = new List(); + + _moviesList1 = Builder.CreateListOfSize(5) + .Build().ToList(); + + _moviesList2 = Builder.CreateListOfSize(3) + .TheFirst(1) + .With(s => s.TmdbId = 6) + .With(s => s.ImdbId = "6") + .TheNext(1) + .With(s => s.TmdbId = 7) + .With(s => s.ImdbId = "7") + .TheNext(1) + .With(s => s.TmdbId = 8) + .With(s => s.ImdbId = "8") + .Build().ToList(); + + _netImport1Fetch = new NetImportFetchResult + { + Movies = _moviesList1, + AnyFailure = false + }; + + _netImport2Fetch = new NetImportFetchResult + { + Movies = _moviesList2, + AnyFailure = false + }; + + _command = new NetImportSyncCommand + { + ListId = 0 + }; + + Mocker.GetMock() + .Setup(v => v.GetAvailableProviders()) + .Returns(_netImports); + + Mocker.GetMock() + .Setup(v => v.IsMovieExcluded(It.IsAny())) + .Returns(false); + + Mocker.GetMock() + .Setup(v => v.MapMovieToTmdbMovie(It.IsAny())) + .Returns((Movie movie) => movie); + + Mocker.GetMock() + .Setup(v => v.MovieExists(It.IsAny())) + .Returns(false); + } + + private void GivenListFailure() + { + _netImport1Fetch.AnyFailure = true; + } + + private void GivenCleanLevel(string cleanLevel) + { + Mocker.GetMock() + .SetupGet(v => v.ListSyncLevel) + .Returns(cleanLevel); + } + + private Mock GivenList(int i, bool enabledAuto, NetImportFetchResult fetchResult) + { + var id = i; + + var mockNetImport = new Mock(); + mockNetImport.SetupGet(s => s.Definition).Returns(new NetImportDefinition { Id = id, EnableAuto = enabledAuto }); + mockNetImport.SetupGet(s => s.Enabled).Returns(true); + mockNetImport.SetupGet(s => s.EnableAuto).Returns(enabledAuto); + mockNetImport.Setup(s => s.Fetch()).Returns(fetchResult); + + _netImports.Add(mockNetImport.Object); + + return mockNetImport; + } + + [Test] + public void should_not_clean_library_if_config_value_disable() + { + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.GetAllMovies(), Times.Never()); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(new List()), Times.Once()); + } + + [Test] + public void should_log_only_on_clean_library_if_config_value_logonly() + { + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("logOnly"); + + Mocker.GetMock() + .Setup(v => v.GetAllMovies()) + .Returns(_moviesList2); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.GetAllMovies(), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.DeleteMovie(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(new List()), Times.Once()); + } + + [Test] + public void should_unmonitor_on_clean_library_if_config_value_keepAndUnmonitor() + { + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("keepAndUnmonitor"); + + Mocker.GetMock() + .Setup(v => v.GetAllMovies()) + .Returns(_moviesList2); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.GetAllMovies(), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.DeleteMovie(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(It.Is>(s => s.Count == 3 && s.All(m => !m.Monitored))), Times.Once()); + } + + [Test] + public void should_not_clean_on_clean_library_if_tmdb_match() + { + _netImport1Fetch.Movies[0].TmdbId = 6; + + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("keepAndUnmonitor"); + + Mocker.GetMock() + .Setup(v => v.GetAllMovies()) + .Returns(_moviesList2); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(It.Is>(s => s.Count == 2 && s.All(m => !m.Monitored))), Times.Once()); + } + + [Test] + public void should_fallback_to_imdbid_on_clean_library_if_tmdb_not_found() + { + _netImport1Fetch.Movies[0].TmdbId = 0; + _netImport1Fetch.Movies[0].ImdbId = "6"; + + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("keepAndUnmonitor"); + + Mocker.GetMock() + .Setup(v => v.GetAllMovies()) + .Returns(_moviesList2); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(It.Is>(s => s.Count == 2 && s.All(m => !m.Monitored))), Times.Once()); + } + + [Test] + public void should_delete_movies_not_files_on_clean_library_if_config_value_logonly() + { + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("removeAndKeep"); + + Mocker.GetMock() + .Setup(v => v.GetAllMovies()) + .Returns(_moviesList2); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.GetAllMovies(), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.DeleteMovie(It.IsAny(), false, It.IsAny()), Times.Exactly(3)); + + Mocker.GetMock() + .Verify(v => v.DeleteMovie(It.IsAny(), true, It.IsAny()), Times.Never()); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(new List()), Times.Once()); + } + + [Test] + public void should_delete_movies_and_files_on_clean_library_if_config_value_logonly() + { + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("removeAndDelete"); + + Mocker.GetMock() + .Setup(v => v.GetAllMovies()) + .Returns(_moviesList2); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.GetAllMovies(), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.DeleteMovie(It.IsAny(), false, It.IsAny()), Times.Never()); + + Mocker.GetMock() + .Verify(v => v.DeleteMovie(It.IsAny(), true, It.IsAny()), Times.Exactly(3)); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(new List()), Times.Once()); + } + + [Test] + public void should_not_clean_if_list_failures() + { + GivenListFailure(); + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.UpdateMovie(new List()), Times.Never()); + } + + [Test] + public void should_add_new_movies_from_single_list_to_library() + { + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 5)), Times.Once()); + } + + [Test] + public void should_add_new_movies_from_multiple_list_to_library() + { + GivenList(1, true, _netImport1Fetch); + GivenList(2, true, _netImport2Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 8)), Times.Once()); + } + + [Test] + public void should_add_new_movies_from_enabled_lists_to_library() + { + GivenList(1, true, _netImport1Fetch); + GivenList(2, false, _netImport2Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 5)), Times.Once()); + } + + [Test] + public void should_not_add_duplicate_movies_from_seperate_lists() + { + _netImport2Fetch.Movies[0].TmdbId = 4; + + GivenList(1, true, _netImport1Fetch); + GivenList(2, true, _netImport2Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 7)), Times.Once()); + } + + [Test] + public void should_not_add_movie_from_on_exclusion_list() + { + GivenList(1, true, _netImport1Fetch); + GivenList(2, true, _netImport2Fetch); + + GivenCleanLevel("disabled"); + + Mocker.GetMock() + .Setup(v => v.IsMovieExcluded(_moviesList2[0].TmdbId)) + .Returns(true); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 7 && !s.Any(m => m.TmdbId == _moviesList2[0].TmdbId))), Times.Once()); + } + + [Test] + public void should_not_add_movie_that_exists_in_library() + { + GivenList(1, true, _netImport1Fetch); + GivenList(2, true, _netImport2Fetch); + + GivenCleanLevel("disabled"); + + Mocker.GetMock() + .Setup(v => v.MovieExists(_moviesList2[0])) + .Returns(true); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 7 && !s.Any(m => m.TmdbId == _moviesList2[0].TmdbId))), Times.Once()); + } + + [Test] + public void should_not_tmdb_map_movie_that_has_tmdbid_from_list() + { + GivenList(1, true, _netImport1Fetch); + GivenList(2, true, _netImport2Fetch); + + GivenCleanLevel("disabled"); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.MapMovieToTmdbMovie(It.IsAny()), Times.Never()); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 8)), Times.Once()); + } + + [Test] + public void should_tmdb_map_movie_that_has_no_tmdbid_from_list() + { + _netImport1Fetch.Movies[0].TmdbId = 0; + + GivenList(1, true, _netImport1Fetch); + + GivenCleanLevel("disabled"); + + Mocker.GetMock() + .Setup(v => v.MapMovieToTmdbMovie(It.IsAny())) + .Returns(Builder.CreateNew().Build()); + + Subject.Execute(_command); + + Mocker.GetMock() + .Verify(v => v.MapMovieToTmdbMovie(It.IsAny()), Times.Once()); + + Mocker.GetMock() + .Verify(v => v.AddMovies(It.Is>(s => s.Count == 5)), Times.Once()); + } + } +}