diff --git a/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Episode.cs b/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Episode.cs index 12d640eeb..e052c5bae 100644 --- a/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Episode.cs +++ b/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Episode.cs @@ -26,9 +26,18 @@ namespace NzbDrone.Core.Test.ProviderTests public void processResults_ParseResult_should_return_after_match() { var parseResults = Builder.CreateListOfSize(5) + .TheFirst(1) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List{1}) .Build(); - var episode = Builder.CreateNew().Build(); + var series = Builder.CreateNew().Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -39,7 +48,9 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(c => c.DownloadReport(It.IsAny())).Returns(true); - + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); @@ -51,16 +62,24 @@ namespace NzbDrone.Core.Test.ProviderTests Times.Once()); } - [Test] public void processResults_higher_quality_should_be_called_first() { var parseResults = Builder.CreateListOfSize(10) .All().With(c => c.Quality = new Quality(QualityTypes.DVD, true)) - .Random(1).With(c => c.Quality = new Quality(QualityTypes.Bluray1080p, true)) + .Random(1) + .With(c => c.Quality = new Quality(QualityTypes.Bluray1080p, true)) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) .Build(); - var episode = Builder.CreateNew().Build(); + var series = Builder.CreateNew().Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -76,6 +95,9 @@ namespace NzbDrone.Core.Test.ProviderTests c.DownloadReport(It.Is(d => d.Quality.QualityType == QualityTypes.Bluray1080p))) .Returns(true); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); @@ -87,18 +109,26 @@ namespace NzbDrone.Core.Test.ProviderTests Times.Once()); } - [Test] public void processResults_when_same_quality_proper_should_be_called_first() { var parseResults = Builder.CreateListOfSize(20) - .All().With(c => c.Quality = new Quality(QualityTypes.DVD, false)) + .All() + .With(c => c.Quality = new Quality(QualityTypes.DVD, false)) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) .Random(1).With(c => c.Quality = new Quality(QualityTypes.DVD, true)) .Build(); parseResults.Where(c => c.Quality.Proper).Should().HaveCount(1); - var episode = Builder.CreateNew().Build(); + var series = Builder.CreateNew().Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -108,6 +138,8 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(c => c.DownloadReport(It.Is(p => p.Quality.Proper))).Returns(true); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); //Act mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); @@ -120,20 +152,31 @@ namespace NzbDrone.Core.Test.ProviderTests Times.Once()); } - [Test] - public void processResults_when_not_needed_should_check_the_rest() + public void processResults_when_quality_is_not_needed_should_check_the_rest() { var parseResults = Builder.CreateListOfSize(4) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) .Build(); - var episode = Builder.CreateNew().Build(); + var series = Builder.CreateNew().Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); mocker.GetMock() .Setup(c => c.IsQualityNeeded(It.IsAny())).Returns(false); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); @@ -144,20 +187,31 @@ namespace NzbDrone.Core.Test.ProviderTests ExceptionVerification.ExcpectedWarns(1); } - [Test] public void processResults_failed_IsNeeded_should_check_the_rest() { var parseResults = Builder.CreateListOfSize(4) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) .Build(); - var episode = Builder.CreateNew().Build(); + var series = Builder.CreateNew().Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); mocker.GetMock() .Setup(c => c.IsQualityNeeded(It.IsAny())).Throws(new Exception()); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); @@ -173,9 +227,18 @@ namespace NzbDrone.Core.Test.ProviderTests public void processResults_failed_download_should_not_check_the_rest() { var parseResults = Builder.CreateListOfSize(4) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) .Build(); - var episode = Builder.CreateNew().Build(); + var series = Builder.CreateNew().Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -185,6 +248,9 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(c => c.DownloadReport(It.IsAny())).Throws(new Exception()); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); @@ -205,8 +271,11 @@ namespace NzbDrone.Core.Test.ProviderTests var parseResults = Builder.CreateListOfSize(4) .Build(); + var series = Builder.CreateNew() + .Build(); + var episode = Builder.CreateNew() - .With(c => c.Series = Builder.CreateNew().Build()) + .With(c => c.Series = series) .With(c => c.SeasonNumber = 12) .Build(); @@ -216,6 +285,9 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetEpisode(episode.EpisodeId)) .Returns(episode); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + var indexer1 = new Mock(); indexer1.Setup(c => c.FetchEpisode(episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber)) .Returns(parseResults).Verifiable(); @@ -234,9 +306,6 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetSeries(It.IsAny())) .Returns(episode.Series); - mocker.GetMock() - .Setup(c => c.IsQualityNeeded(It.IsAny())).Returns(false); - mocker.GetMock() .Setup(s => s.GetSceneName(It.IsAny())).Returns(""); @@ -246,8 +315,7 @@ namespace NzbDrone.Core.Test.ProviderTests //Assert mocker.VerifyAllMocks(); - mocker.GetMock().Verify(c => c.IsQualityNeeded(It.IsAny()), - Times.Exactly(8)); + ExceptionVerification.ExcpectedWarns(1); indexer1.VerifyAll(); indexer2.VerifyAll(); @@ -259,8 +327,11 @@ namespace NzbDrone.Core.Test.ProviderTests var parseResults = Builder.CreateListOfSize(4) .Build(); + var series = Builder.CreateNew().With(s => s.SeriesId = 71256) + .Build(); + var episode = Builder.CreateNew() - .With(c => c.Series = Builder.CreateNew().With(s => s.SeriesId = 71256).Build()) + .With(c => c.Series = series) .With(c => c.SeasonNumber = 12) .Build(); @@ -270,6 +341,9 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetEpisode(episode.EpisodeId)) .Returns(episode); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + var indexer1 = new Mock(); indexer1.Setup(c => c.FetchEpisode("The Daily Show", episode.SeasonNumber, episode.EpisodeNumber)) .Returns(parseResults).Verifiable(); @@ -288,20 +362,14 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetSeries(It.IsAny())) .Returns(episode.Series); - mocker.GetMock() - .Setup(c => c.IsQualityNeeded(It.IsAny())).Returns(false); - mocker.GetMock() .Setup(s => s.GetSceneName(71256)).Returns("The Daily Show"); //Act mocker.Resolve().EpisodeSearch(new ProgressNotification("Test"), episode.EpisodeId); - //Assert mocker.VerifyAllMocks(); - mocker.GetMock().Verify(c => c.IsQualityNeeded(It.IsAny()), - Times.Exactly(8)); ExceptionVerification.ExcpectedWarns(1); indexer1.VerifyAll(); indexer2.VerifyAll(); @@ -348,9 +416,6 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetSeries(It.IsAny())) .Returns(episode.Series); - mocker.GetMock() - .Setup(c => c.IsQualityNeeded(It.IsAny())).Returns(false); - mocker.GetMock() .Setup(s => s.GetSceneName(It.IsAny())).Returns(""); @@ -360,8 +425,6 @@ namespace NzbDrone.Core.Test.ProviderTests //Assert mocker.VerifyAllMocks(); - mocker.GetMock().Verify(c => c.IsQualityNeeded(It.IsAny()), - Times.Exactly(8)); ExceptionVerification.ExcpectedWarns(1); ExceptionVerification.ExcpectedErrors(1); @@ -394,8 +457,10 @@ namespace NzbDrone.Core.Test.ProviderTests var parseResults = Builder.CreateListOfSize(4) .Build(); + var series = Builder.CreateNew().Build(); + var episode = Builder.CreateNew() - .With(c => c.Series = Builder.CreateNew().Build()) + .With(c => c.Series = series) .With(c => c.SeasonNumber = 12) .Build(); @@ -405,6 +470,9 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetEpisode(episode.EpisodeId)) .Returns(episode); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + var indexer1 = new Mock(); indexer1.Setup(c => c.FetchEpisode(episode.Series.Title, episode.SeasonNumber, episode.EpisodeNumber)) .Returns(parseResults).Verifiable(); @@ -415,9 +483,6 @@ namespace NzbDrone.Core.Test.ProviderTests .Setup(c => c.GetEnabledIndexers()) .Returns(indexers); - mocker.GetMock() - .Setup(c => c.IsQualityNeeded(It.IsAny())).Returns(false); - mocker.GetMock() .Setup(s => s.GetSceneName(It.IsAny())).Returns(""); @@ -433,5 +498,134 @@ namespace NzbDrone.Core.Test.ProviderTests ExceptionVerification.ExcpectedWarns(1); indexer1.VerifyAll(); } + + [Test] + public void processResults_should_return_false_when_series_is_null() + { + var parseResults = Builder.CreateListOfSize(1) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) + .Build(); + + Series series = null; + + var episode = Builder.CreateNew() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); + + var mocker = new AutoMoqer(MockBehavior.Strict); + + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + + //Act + var result = mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); + + //Assert + mocker.VerifyAllMocks(); + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + } + + [Test] + public void processResults_should_return_false_when_seriesId_doesnt_match() + { + var parseResults = Builder.CreateListOfSize(1) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) + .Build(); + + var series = Builder.CreateNew() + .With(s => s.SeriesId = 100) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = 1) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 1) + .Build(); + + var mocker = new AutoMoqer(MockBehavior.Strict); + + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + + //Act + var result = mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); + + //Assert + mocker.VerifyAllMocks(); + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + } + + [Test] + public void processResults_should_return_false_when_seasonNumber_doesnt_match() + { + var parseResults = Builder.CreateListOfSize(1) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) + .Build(); + + var series = Builder.CreateNew() + .With(s => s.SeriesId = 100) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 2) + .With(e => e.EpisodeNumber = 1) + .Build(); + + var mocker = new AutoMoqer(MockBehavior.Strict); + + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + + //Act + var result = mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); + + //Assert + mocker.VerifyAllMocks(); + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + } + + [Test] + public void processResults_should_return_false_when_episodeNumber_doesnt_match() + { + var parseResults = Builder.CreateListOfSize(1) + .All() + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumbers = new List { 1 }) + .Build(); + + var series = Builder.CreateNew() + .With(s => s.SeriesId = 100) + .Build(); + + var episode = Builder.CreateNew() + .With(e => e.SeriesId = series.SeriesId) + .With(e => e.SeasonNumber = 1) + .With(e => e.EpisodeNumber = 2) + .Build(); + + var mocker = new AutoMoqer(MockBehavior.Strict); + + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + + //Act + var result = mocker.Resolve().ProcessEpisodeSearchResults(new ProgressNotification("Test"), episode, parseResults); + + //Assert + mocker.VerifyAllMocks(); + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_PartialSeason.cs b/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_PartialSeason.cs index cfb761ca0..89c8ca072 100644 --- a/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_PartialSeason.cs +++ b/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_PartialSeason.cs @@ -39,6 +39,7 @@ namespace NzbDrone.Core.Test.ProviderTests var parseResults = Builder.CreateListOfSize(4) .All() .With(e => e.EpisodeNumbers = Builder.CreateListOfSize(2).Build().ToList()) + .With(e => e.SeasonNumber = 1) .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -74,6 +75,9 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())).Returns(true); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act var result = mocker.Resolve().PartialSeasonSearch(notification, 1, 1); @@ -152,6 +156,8 @@ namespace NzbDrone.Core.Test.ProviderTests .All() .With(e => e.EpisodeNumbers = Builder.CreateListOfSize(2).Build().ToList()) .With(e => e.Series = series) + .With(e => e.CleanTitle = "title") + .With(e => e.SeasonNumber = 1) .Build(); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -164,8 +170,11 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())).Returns(true); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act - var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults); + var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults, series, 1); //Assert result.Should().HaveCount(8); @@ -175,7 +184,7 @@ namespace NzbDrone.Core.Test.ProviderTests } [Test] - public void ProcessPartialSeasonSearchResults_failure() + public void ProcessPartialSeasonSearchResults_should_return_empty_list_when_quality_is_not_wanted() { var series = Builder.CreateNew() .With(s => s.SeriesId = 1) @@ -197,8 +206,114 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny())).Returns(false); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act - var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults); + var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults, series, 1); + + //Assert + result.Should().HaveCount(0); + mocker.VerifyAllMocks(); + mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); + } + + [Test] + public void ProcessPartialSeasonSearchResults_should_return_empty_list_when_is_wrong_season() + { + 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 = 2) + .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.FindSeries(It.IsAny())).Returns(series); + + //Act + var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults, series, 1); + + //Assert + result.Should().HaveCount(0); + mocker.VerifyAllMocks(); + mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); + } + + [Test] + public void ProcessPartialSeasonSearchResults_should_return_empty_list_when_series_is_null() + { + var series = Builder.CreateNew() + .With(s => s.SeriesId = 1) + .With(s => s.Title = "Title1") + .Build(); + + Series findSeries = null; + + 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.FindSeries(It.IsAny())).Returns(findSeries); + + //Act + var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults, series, 1); + + //Assert + result.Should().HaveCount(0); + mocker.VerifyAllMocks(); + mocker.GetMock().Verify(c => c.DownloadReport(It.IsAny()), Times.Never()); + } + + [Test] + public void ProcessPartialSeasonSearchResults_should_return_empty_list_when_series_mismatch() + { + var series = Builder.CreateNew() + .With(s => s.SeriesId = 1) + .With(s => s.Title = "Title1") + .Build(); + + var findSeries = Builder.CreateNew() + .With(s => s.SeriesId = 2) + .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.FindSeries(It.IsAny())).Returns(findSeries); + + //Act + var result = mocker.Resolve().ProcessPartialSeasonSearchResults(notification, parseResults, series, 1); //Assert result.Should().HaveCount(0); diff --git a/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Season.cs b/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Season.cs index f71bc1b99..1c784f2c7 100644 --- a/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Season.cs +++ b/NzbDrone.Core.Test/ProviderTests/SearchProviderTest_Season.cs @@ -78,6 +78,9 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())).Returns(true); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act var result = mocker.Resolve().SeasonSearch(notification, 1, 1); @@ -167,6 +170,9 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(s => s.DownloadReport(It.IsAny())).Returns(true); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + //Act var result = mocker.Resolve().ProcessSeasonSearchResults(notification, series, 1, parseResults); @@ -176,7 +182,7 @@ namespace NzbDrone.Core.Test.ProviderTests } [Test] - public void ProcessSeasonSearchResults_failure() + public void ProcessSeasonSearchResults_should_return_false_when_quality_is_not_wanted() { var series = Builder.CreateNew() .With(s => s.SeriesId = 1) @@ -198,6 +204,113 @@ namespace NzbDrone.Core.Test.ProviderTests mocker.GetMock() .Setup(s => s.IsQualityNeeded(It.IsAny())).Returns(false); + mocker.GetMock() + .Setup(s => s.FindSeries(It.IsAny())).Returns(series); + + //Act + var result = mocker.Resolve().ProcessSeasonSearchResults(notification, series, 1, parseResults); + + //Assert + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + mocker.VerifyAllMocks(); + } + + [Test] + public void ProcessSeasonSearchResults_should_return_false_when_series_is_null() + { + var series = Builder.CreateNew() + .With(s => s.SeriesId = 1) + .With(s => s.Title = "Title1") + .Build(); + + Series findSeries = null; + + 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.FindSeries(It.IsAny())).Returns(findSeries); + + //Act + var result = mocker.Resolve().ProcessSeasonSearchResults(notification, series, 1, parseResults); + + //Assert + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + mocker.VerifyAllMocks(); + } + + [Test] + public void ProcessSeasonSearchResults_should_return_false_when_series_doesnt_match() + { + var series = Builder.CreateNew() + .With(s => s.SeriesId = 1) + .With(s => s.Title = "Title1") + .Build(); + + Series findSeries = Builder.CreateNew() + .With(s => s.SeriesId = 2) + .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.FindSeries(It.IsAny())).Returns(findSeries); + + //Act + var result = mocker.Resolve().ProcessSeasonSearchResults(notification, series, 1, parseResults); + + //Assert + result.Should().BeFalse(); + ExceptionVerification.ExcpectedWarns(1); + mocker.VerifyAllMocks(); + } + + [Test] + public void ProcessSeasonSearchResults_should_return_false_when_seasonNumber_doesnt_match() + { + var series = Builder.CreateNew() + .With(s => s.SeriesId = 1) + .With(s => s.Title = "Title1") + .Build(); + + var parseResults = Builder.CreateListOfSize(4) + .All() + .With(p => p.SeasonNumber = 2) + .TheFirst(1) + .With(p => p.CleanTitle = "title") + .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.FindSeries(It.IsAny())).Returns(series); + //Act var result = mocker.Resolve().ProcessSeasonSearchResults(notification, series, 1, parseResults); diff --git a/NzbDrone.Core/Providers/Indexer/Newznab.cs b/NzbDrone.Core/Providers/Indexer/Newznab.cs index 9f12c1f6a..8c2ac0784 100644 --- a/NzbDrone.Core/Providers/Indexer/Newznab.cs +++ b/NzbDrone.Core/Providers/Indexer/Newznab.cs @@ -49,7 +49,9 @@ namespace NzbDrone.Core.Providers.Indexer if (searchModel.SearchType == SearchType.SeasonSearch) { - searchUrls.Add(String.Format("{0}&limit=100&q={1}&season{2}", url, searchModel.SeriesTitle, searchModel.SeasonNumber)); + //Todo: Allow full season searching to process individual episodes + //searchUrls.Add(String.Format("{0}&limit=100&q={1}&season{2}", url, searchModel.SeriesTitle, searchModel.SeasonNumber)); + searchUrls.Add(String.Format("{0}&limit=100&q={1}+Season", url, searchModel.SeriesTitle)); } } diff --git a/NzbDrone.Core/Providers/SearchProvider.cs b/NzbDrone.Core/Providers/SearchProvider.cs index 353a05ef1..ee2eaa727 100644 --- a/NzbDrone.Core/Providers/SearchProvider.cs +++ b/NzbDrone.Core/Providers/SearchProvider.cs @@ -92,15 +92,15 @@ namespace NzbDrone.Core.Providers notification.CurrentMessage = "Processing search results"; - var reportsToProcess = reports.Where(p => p.FullSeason && p.SeasonNumber == seasonNumber).ToList(); + var fullSeasonReportsToProcess = reports.Where(p => p.FullSeason && p.SeasonNumber == seasonNumber).ToList(); - reportsToProcess.ForEach(c => + fullSeasonReportsToProcess.ForEach(c => { - c.Series = series; c.EpisodeNumbers = episodeNumbers.ToList(); }); - return ProcessSeasonSearchResults(notification, series, seasonNumber, reportsToProcess); + //Todo: Handle non-full season reports + return ProcessSeasonSearchResults(notification, series, seasonNumber, fullSeasonReportsToProcess); } public bool ProcessSeasonSearchResults(ProgressNotification notification, Series series, int seasonNumber, IEnumerable reports) @@ -110,6 +110,18 @@ namespace NzbDrone.Core.Providers try { Logger.Trace("Analysing report " + episodeParseResult); + + //Get the matching series + episodeParseResult.Series = _seriesProvider.FindSeries(episodeParseResult.CleanTitle); + + //If series is null or doesn't match the series we're looking for return + if (episodeParseResult.Series == null || episodeParseResult.Series.SeriesId != series.SeriesId) + continue; + + //If SeasonNumber doesn't match or episode is not in the in the list in the parse result, skip it. + if (episodeParseResult.SeasonNumber != seasonNumber) + continue; + if (_inventoryProvider.IsQualityNeeded(episodeParseResult)) { Logger.Debug("Found '{0}'. Adding to download queue.", episodeParseResult); @@ -200,6 +212,18 @@ namespace NzbDrone.Core.Providers try { Logger.Trace("Analysing report " + episodeParseResult); + + //Get the matching series + var series = _seriesProvider.FindSeries(episodeParseResult.CleanTitle); + + //If series is null or doesn't match the series we're looking for return + if (series == null || series.SeriesId != episode.SeriesId) + continue; + + //If SeasonNumber doesn't match or episode is not in the in the list in the parse result, skip it. + if (episodeParseResult.SeasonNumber != episode.SeasonNumber || !episodeParseResult.EpisodeNumbers.Contains(episode.EpisodeNumber)) + continue; + if (_inventoryProvider.IsQualityNeeded(episodeParseResult)) { Logger.Debug("Found '{0}'. Adding to download queue.", episodeParseResult); @@ -285,15 +309,10 @@ namespace NzbDrone.Core.Providers notification.CurrentMessage = "Processing search results"; - reports.ForEach(c => - { - c.Series = series; - }); - - return ProcessPartialSeasonSearchResults(notification, reports); + return ProcessPartialSeasonSearchResults(notification, reports, series, seasonNumber); } - public List ProcessPartialSeasonSearchResults(ProgressNotification notification, IEnumerable reports) + public List ProcessPartialSeasonSearchResults(ProgressNotification notification, IEnumerable reports, Series series, int seasonNumber) { var successes = new List(); @@ -302,6 +321,18 @@ namespace NzbDrone.Core.Providers try { Logger.Trace("Analysing report " + episodeParseResult); + + //Get the matching series + episodeParseResult.Series = _seriesProvider.FindSeries(episodeParseResult.CleanTitle); + + //If series is null or doesn't match the series we're looking for return + if (episodeParseResult.Series == null || episodeParseResult.Series.SeriesId != series.SeriesId) + continue; + + //If SeasonNumber doesn't match or episode is not in the in the list in the parse result, skip it. + if (episodeParseResult.SeasonNumber != seasonNumber) + continue; + if (_inventoryProvider.IsQualityNeeded(episodeParseResult)) { Logger.Debug("Found '{0}'. Adding to download queue.", episodeParseResult);