using System; using System.Collections.Generic; using System.Linq; using AutoMoq; 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; namespace NzbDrone.Core.Test.ProviderTests { [TestFixture] // ReSharper disable InconsistentNaming public class SearchProviderTest_PartialSeason : TestBase { [Test] public void SeasonPartialSearch_season_success() { var series = Builder.CreateNew() .With(s => s.SeriesId = 1) .With(s => s.Title = "Title1") .Build(); var episodes = Builder.CreateListOfSize(5) .All() .With(e => e.Series = series) .With(e => e.SeriesId = 1) .With(e => e.SeasonNumber = 1) .With(e => e.Ignored = false) .Build(); var parseResults = Builder.CreateListOfSize(4) .All() .With(e => e.EpisodeNumbers = Builder.CreateListOfSize(2).Build().ToList()) .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); var notification = new ProgressNotification("Season Search"); var indexer1 = new Mock(); indexer1.Setup(c => c.FetchPartialSeason(episodes[0].Series.Title, episodes[0].SeasonNumber, 0)) .Returns(parseResults).Verifiable(); var indexer2 = new Mock(); indexer2.Setup(c => c.FetchPartialSeason(episodes[0].Series.Title, episodes[0].SeasonNumber, 0)) .Returns(parseResults).Verifiable(); var indexers = new List { indexer1.Object, indexer2.Object }; mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(indexers); mocker.GetMock() .Setup(c => c.GetSeries(1)).Returns(series); mocker.GetMock() .Setup(c => c.GetEpisodesBySeason(1, 1)).Returns(episodes); mocker.GetMock() .Setup(s => s.GetSceneName(1)).Returns(String.Empty); mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny())).Returns(true); mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())).Returns(true); //Act var result = mocker.Resolve().PartialSeasonSearch(notification, 1, 1); //Assert result.Should().HaveCount(16); mocker.VerifyAllMocks(); mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Exactly(8)); } [Test] public void SeasonPartialSearch_season_no_results() { var series = Builder.CreateNew() .With(s => s.SeriesId = 1) .With(s => s.Title = "Title1") .Build(); var episodes = Builder.CreateListOfSize(5) .All() .With(e => e.Series = series) .With(e => e.SeriesId = 1) .With(e => e.SeasonNumber = 1) .With(e => e.Ignored = false) .Build(); var parseResults = Builder.CreateListOfSize(4) .All() .With(e => e.EpisodeNumbers = Builder.CreateListOfSize(2).Build().ToList()) .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); var notification = new ProgressNotification("Season Search"); var indexer1 = new Mock(); indexer1.Setup(c => c.FetchPartialSeason(episodes[0].Series.Title, episodes[0].SeasonNumber, 0)) .Returns(new List()).Verifiable(); var indexer2 = new Mock(); indexer2.Setup(c => c.FetchPartialSeason(episodes[0].Series.Title, episodes[0].SeasonNumber, 0)) .Returns(new List()).Verifiable(); var indexers = new List { indexer1.Object, indexer2.Object }; mocker.GetMock() .Setup(c => c.GetEnabledIndexers()) .Returns(indexers); mocker.GetMock() .Setup(c => c.GetSeries(1)).Returns(series); mocker.GetMock() .Setup(c => c.GetEpisodesBySeason(1, 1)).Returns(episodes); mocker.GetMock() .Setup(s => s.GetSceneName(1)).Returns(String.Empty); //Act var result = mocker.Resolve().PartialSeasonSearch(notification, 1, 1); //Assert result.Should().HaveCount(0); mocker.VerifyAllMocks(); mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } [Test] public void ProcessPartialSeasonSearchResults_success() { var series = Builder.CreateNew() .With(s => s.SeriesId = 1) .With(s => s.Title = "Title1") .Build(); var parseResults = Builder.CreateListOfSize(4) .All() .With(e => e.EpisodeNumbers = Builder.CreateListOfSize(2).Build().ToList()) .With(e => e.Series = series) .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); var notification = new ProgressNotification("Season Search"); mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny())).Returns(true); mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())).Returns(true); //Act var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults); //Assert result.Should().HaveCount(8); mocker.VerifyAllMocks(); mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Exactly(4)); } [Test] public void ProcessPartialSeasonSearchResults_failure() { var series = Builder.CreateNew() .With(s => s.SeriesId = 1) .With(s => s.Title = "Title1") .Build(); var parseResults = Builder.CreateListOfSize(4) .TheFirst(1) .With(p => p.CleanTitle = "title") .With(p => p.SeasonNumber = 1) .With(p => p.FullSeason = true) .With(p => p.EpisodeNumbers = null) .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); var notification = new ProgressNotification("Season Search"); mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny())).Returns(false); //Act var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults); //Assert result.Should().HaveCount(0); mocker.VerifyAllMocks(); mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } } }