using System; using System.Collections.Generic; using System.Linq; using System.Text; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; using NzbDrone.Test.Common.AutoMoq; namespace NzbDrone.Core.Test.ProviderTests.SearchProviderTests { public class PerformSearchFixture : CoreTest { private Mock _episodeIndexer1 = null; private Mock _episodeIndexer2 = null; private Mock _seasonIndexer1 = null; private Mock _seasonIndexer2 = null; private Mock _partialSeasonIndexer1 = null; private Mock _partialSeasonIndexer2 = null; private Mock _brokenIndexer = null; private Mock _nullIndexer = null; private List _indexers; private IList _parseResults; private Series _series; private IList _episodes = null; [SetUp] public void Setup() { _parseResults = Builder.CreateListOfSize(10) .Build(); _series = Builder.CreateNew() .Build(); BuildIndexers(); } private void BuildIndexers() { _episodeIndexer1 = new Mock(); _episodeIndexer1.Setup(c => c.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(_parseResults); _episodeIndexer2 = new Mock(); _episodeIndexer2.Setup(c => c.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(_parseResults); _seasonIndexer1 = new Mock(); _seasonIndexer1.Setup(c => c.FetchSeason(It.IsAny(), It.IsAny())) .Returns(_parseResults); _seasonIndexer2 = new Mock(); _seasonIndexer2.Setup(c => c.FetchSeason(It.IsAny(), It.IsAny())) .Returns(_parseResults); _partialSeasonIndexer1 = new Mock(); _partialSeasonIndexer1.Setup(c => c.FetchPartialSeason(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(_parseResults); _partialSeasonIndexer2 = new Mock(); _partialSeasonIndexer2.Setup(c => c.FetchPartialSeason(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(_parseResults); _brokenIndexer = new Mock(); _brokenIndexer.Setup(c => c.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny())) .Throws(new Exception()); List nullResult = null; _nullIndexer = new Mock(); _nullIndexer.Setup(c => c.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny())) .Returns(nullResult); } private void WithEpisodeIndexers() { _indexers = new List{ _episodeIndexer1.Object, _episodeIndexer2.Object }; Mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(_indexers); } private void WithPartialSeasonIndexers() { _indexers = new List { _partialSeasonIndexer1.Object, _partialSeasonIndexer2.Object }; Mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(_indexers); } private void WithSeasonIndexers() { _indexers = new List { _seasonIndexer1.Object, _seasonIndexer2.Object }; Mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(_indexers); } private void WithBrokenIndexer() { _indexers = new List { _episodeIndexer1.Object, _brokenIndexer.Object, _episodeIndexer2.Object }; Mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(_indexers); } private void WithNullIndexers() { _indexers = new List { _nullIndexer.Object, _nullIndexer.Object }; Mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(_indexers); } private void WithSceneName() { Mocker.GetMock() .Setup(s => s.GetSceneName(It.IsAny())).Returns("Scene Name"); } private void WithSingleEpisode() { _episodes = Builder.CreateListOfSize(1) .Build(); } private void WithMultipleEpisodes() { _episodes = Builder.CreateListOfSize(30) .Build(); } private void WithNullEpisodes() { _episodes = null; } private void VerifyFetchEpisode(Times times) { _episodeIndexer1.Verify(v => v.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny()) , times); _episodeIndexer2.Verify(v => v.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny()) , times); } private void VerifyFetchEpisodeBrokenIndexer(Times times) { _brokenIndexer.Verify(v => v.FetchEpisode(It.IsAny(), It.IsAny(), It.IsAny()) , times); } private void VerifyFetchPartialSeason(Times times) { _partialSeasonIndexer1.Verify(v => v.FetchPartialSeason(It.IsAny(), It.IsAny(), It.IsAny()) , times); _partialSeasonIndexer2.Verify(v => v.FetchPartialSeason(It.IsAny(), It.IsAny(), It.IsAny()) , times); } private void VerifyFetchSeason(Times times) { _seasonIndexer1.Verify(v => v.FetchSeason(It.IsAny(), It.IsAny()) , times); _seasonIndexer1.Verify(v => v.FetchSeason(It.IsAny(), It.IsAny()) , times); } [Test] public void PerformSearch_should_search_all_enabled_providers() { //Setup WithEpisodeIndexers(); WithSingleEpisode(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert VerifyFetchEpisode(Times.Once()); result.Should().HaveCount(20); } [Test] public void PerformSearch_should_look_for_scene_name_to_search() { //Setup WithSceneName(); WithEpisodeIndexers(); WithSingleEpisode(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert Mocker.GetMock().Verify(c => c.GetSceneName(It.IsAny()), Times.Once()); } [Test] public void PerformSearch_broken_indexer_should_not_break_job() { //Setup WithBrokenIndexer(); WithSingleEpisode(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert result.Should().HaveCount(20); ExceptionVerification.ExcpectedErrors(1); VerifyFetchEpisode(Times.Once()); VerifyFetchEpisodeBrokenIndexer(Times.Once()); Mocker.GetMock().Verify(c => c.GetSceneName(It.IsAny()), Times.Once()); } [Test] public void PerformSearch_for_episode_should_call_FetchEpisode() { //Setup WithEpisodeIndexers(); WithSingleEpisode(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert result.Should().HaveCount(20); VerifyFetchEpisode(Times.Once()); } [Test] public void PerformSearch_for_partial_season_should_call_FetchPartialSeason() { //Setup WithPartialSeasonIndexers(); WithMultipleEpisodes(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert result.Should().HaveCount(80); VerifyFetchPartialSeason(Times.Exactly(4)); } [Test] public void PerformSearch_for_season_should_call_FetchSeason() { //Setup WithSeasonIndexers(); WithNullEpisodes(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert result.Should().HaveCount(20); VerifyFetchSeason(Times.Once()); } [Test] public void PerformSearch_should_return_empty_list_when_results_from_indexers_are_null() { //Setup WithNullIndexers(); WithSingleEpisode(); //Act var result = Mocker.Resolve().PerformSearch(new ProgressNotification("Test"), _series, 1, _episodes); //Assert ExceptionVerification.ExcpectedErrors(2); result.Should().HaveCount(0); } } }