using System; using System.Collections.Generic; using System.Linq; 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.Repository.Quality; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; using NzbDrone.Test.Common.AutoMoq; namespace NzbDrone.Core.Test.ProviderTests.SearchProviderTests { [TestFixture] // ReSharper disable InconsistentNaming public class ProcessDailySearchResultsFixture : CoreTest { private Series _matchingSeries = null; private Series _mismatchedSeries = null; private Series _nullSeries = null; [SetUp] public void setup() { _matchingSeries = Builder.CreateNew() .With(s => s.SeriesId = 79488) .With(s => s.Title = "30 Rock") .Build(); _mismatchedSeries = Builder.CreateNew() .With(s => s.SeriesId = 12345) .With(s => s.Title = "Not 30 Rock") .Build(); } private void WithMatchingSeries() { Mocker.GetMock() .Setup(s => s.FindSeries(It.IsAny())).Returns(_matchingSeries); } private void WithMisMatchedSeries() { Mocker.GetMock() .Setup(s => s.FindSeries(It.IsAny())).Returns(_mismatchedSeries); } private void WithNullSeries() { Mocker.GetMock() .Setup(s => s.FindSeries(It.IsAny())).Returns(_nullSeries); } private void WithSuccessfulDownload() { Mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())) .Returns(true); } private void WithFailingDownload() { Mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())) .Returns(false); } private void WithQualityNeeded() { Mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny(), true)) .Returns(true); } private void WithQualityNotNeeded() { Mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny(), true)) .Returns(false); } [Test] public void processSearchResults_higher_quality_should_be_called_first() { var parseResults = Builder.CreateListOfSize(5) .All() .With(c => c.AirDate = DateTime.Today) .With(c => c.Quality = new Quality(QualityTypes.DVD, true)) .Random(1) .With(c => c.Quality = new Quality(QualityTypes.Bluray1080p, true)) .Build(); WithMatchingSeries(); WithSuccessfulDownload(); Mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.Is(d => d.Quality.QualityType == QualityTypes.Bluray1080p), true)) .Returns(true); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeTrue(); Mocker.GetMock().Verify(c => c.IsQualityNeeded(It.IsAny(), true), Times.Once()); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Once()); } [Test] public void processSearchResults_when_quality_is_not_needed_should_check_the_rest() { var parseResults = Builder.CreateListOfSize(5) .All() .With(c => c.AirDate = DateTime.Today) .With(c => c.Quality = new Quality(QualityTypes.DVD, true)) .Build(); WithMatchingSeries(); WithQualityNotNeeded(); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeFalse(); Mocker.GetMock().Verify(c => c.IsQualityNeeded(It.IsAny(), true), Times.Exactly(5)); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } [Test] public void processSearchResults_should_skip_if_series_is_null() { var parseResults = Builder.CreateListOfSize(5) .All() .With(e => e.AirDate = DateTime.Today) .Build(); WithNullSeries(); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeFalse(); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } [Test] public void processSearchResults_should_skip_if_series_is_mismatched() { var parseResults = Builder.CreateListOfSize(5) .All() .With(e => e.AirDate = DateTime.Today) .Build(); WithMisMatchedSeries(); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeFalse(); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } [Test] public void processSearchResults_should_return_after_successful_download() { var parseResults = Builder.CreateListOfSize(2) .All() .With(e => e.AirDate = DateTime.Today) .With(c => c.Quality = new Quality(QualityTypes.DVD, true)) .Build(); WithMatchingSeries(); WithQualityNeeded(); WithSuccessfulDownload(); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeTrue(); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Once()); } [Test] public void processSearchResults_should_try_next_if_download_fails() { var parseResults = Builder.CreateListOfSize(2) .All() .With(e => e.AirDate = DateTime.Today) .With(c => c.Quality = new Quality(QualityTypes.DVD, true)) .TheLast(1) .With(c => c.Quality = new Quality(QualityTypes.SDTV, true)) .Build(); WithMatchingSeries(); WithQualityNeeded(); Mocker.GetMock() .Setup(s => s.DownloadReport(It.Is(d => d.Quality.QualityType == QualityTypes.DVD))) .Returns(false); Mocker.GetMock() .Setup(s => s.DownloadReport(It.Is(d => d.Quality.QualityType == QualityTypes.SDTV))) .Returns(true); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeTrue(); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Exactly(2)); } [Test] public void processSearchResults_should_skip_if_parseResult_does_not_have_airdate() { var parseResults = Builder.CreateListOfSize(5) .All() .With(e => e.AirDate = null) .Build(); WithMatchingSeries(); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeFalse(); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } [Test] public void processSearchResults_should_skip_if_parseResult_airdate_does_not_match() { var parseResults = Builder.CreateListOfSize(5) .All() .With(e => e.AirDate = DateTime.Today.AddDays(10)) .Build(); WithMatchingSeries(); //Act var result = Mocker.Resolve().ProcessSearchResults(MockNotification, parseResults, _matchingSeries, DateTime.Today); //Assert result.Should().BeFalse(); Mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); } } }