Fixed: Anime season searches rejecting season packs

pull/3061/head
Mark McDowall 6 years ago
parent d320017e3c
commit e359347a3b

@ -0,0 +1,47 @@
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.DecisionEngine.Specifications.Search;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.DecisionEngineTests.Search.SingleEpisodeSearchMatchSpecificationTests
{
[TestFixture]
public class AnimeSearchFixture : TestBase<SingleEpisodeSearchMatchSpecification>
{
private RemoteEpisode _remoteEpisode = new RemoteEpisode();
private AnimeEpisodeSearchCriteria _searchCriteria = new AnimeEpisodeSearchCriteria();
[SetUp]
public void Setup()
{
_remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
}
[Test]
public void should_return_false_if_full_season_result_for_single_episode_search()
{
_remoteEpisode.ParsedEpisodeInfo.FullSeason = true;
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeFalse();
}
[Test]
public void should_return_true_if_not_a_full_season_result()
{
_remoteEpisode.ParsedEpisodeInfo.FullSeason = false;
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeTrue();
}
[Test]
public void should_return_true_if_full_season_result_for_full_season_search()
{
_remoteEpisode.ParsedEpisodeInfo.FullSeason = true;
_searchCriteria.IsSeasonSearch = true;
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeTrue();
}
}
}

@ -0,0 +1,58 @@
using System;
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Core.DecisionEngine.Specifications.Search;
using NzbDrone.Core.IndexerSearch.Definitions;
using NzbDrone.Core.Parser.Model;
using NzbDrone.Test.Common;
namespace NzbDrone.Core.Test.DecisionEngineTests.Search.SingleEpisodeSearchMatchSpecificationTests
{
[TestFixture]
public class StandardEpisodeSearch : TestBase<SingleEpisodeSearchMatchSpecification>
{
private RemoteEpisode _remoteEpisode = new RemoteEpisode();
private SingleEpisodeSearchCriteria _searchCriteria = new SingleEpisodeSearchCriteria();
[SetUp]
public void Setup()
{
_remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
_remoteEpisode.ParsedEpisodeInfo.SeasonNumber = 5;
_remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers = new[] { 1 };
_searchCriteria.SeasonNumber = 5;
_searchCriteria.EpisodeNumber = 1;
}
[Test]
public void should_return_false_if_season_does_not_match()
{
_remoteEpisode.ParsedEpisodeInfo.SeasonNumber = 10;
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeFalse();
}
[Test]
public void should_return_false_if_full_season_result_for_single_episode_search()
{
_remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers = Array.Empty<int>();
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeFalse();
}
[Test]
public void should_return_false_if_episode_number_does_not_match_search_criteria()
{
_remoteEpisode.ParsedEpisodeInfo.EpisodeNumbers = new []{ 2 };
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeFalse();
}
[Test]
public void should_return_true_if_full_season_result_for_full_season_search()
{
Subject.IsSatisfiedBy(_remoteEpisode, _searchCriteria).Accepted.Should().BeTrue();
}
}
}

@ -281,6 +281,24 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
criteria.Count.Should().Be(0); criteria.Count.Should().Be(0);
} }
[Test]
public void season_search_for_anime_should_set_isSeasonSearch_flag()
{
WithEpisodes();
_xemSeries.SeriesType = SeriesTypes.Anime;
_xemEpisodes.ForEach(e => e.EpisodeFileId = 0);
var seasonNumber = 1;
var allCriteria = WatchForSearchCriteria();
Subject.SeasonSearch(_xemSeries.Id, seasonNumber, true, true, false);
var criteria = allCriteria.OfType<AnimeEpisodeSearchCriteria>().ToList();
criteria.Count.Should().Be(_xemEpisodes.Count(e => e.SeasonNumber == seasonNumber));
criteria.ForEach(c => c.IsSeasonSearch.Should().BeTrue());
}
[Test] [Test]
public void season_search_for_daily_should_search_multiple_years() public void season_search_for_daily_should_search_multiple_years()
{ {

@ -162,6 +162,8 @@
<Compile Include="DecisionEngineTests\AnimeVersionUpgradeSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\AnimeVersionUpgradeSpecificationFixture.cs" />
<Compile Include="DecisionEngineTests\RepackSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\RepackSpecificationFixture.cs" />
<Compile Include="DecisionEngineTests\MultiSeasonSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\MultiSeasonSpecificationFixture.cs" />
<Compile Include="DecisionEngineTests\Search\SingleEpisodeSearchMatchSpecificationTests\AnimeSearchFixture.cs" />
<Compile Include="DecisionEngineTests\Search\SingleEpisodeSearchMatchSpecificationTests\StandardEpisodeSearch.cs" />
<Compile Include="DecisionEngineTests\UpgradeAllowedSpecificationFixture .cs" /> <Compile Include="DecisionEngineTests\UpgradeAllowedSpecificationFixture .cs" />
<Compile Include="DecisionEngineTests\FullSeasonSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\FullSeasonSpecificationFixture.cs" />
<Compile Include="DecisionEngineTests\MaximumSizeSpecificationFixture.cs" /> <Compile Include="DecisionEngineTests\MaximumSizeSpecificationFixture.cs" />

@ -56,9 +56,9 @@ namespace NzbDrone.Core.DecisionEngine.Specifications.Search
return Decision.Accept(); return Decision.Accept();
} }
private Decision IsSatisfiedBy(RemoteEpisode remoteEpisode, AnimeEpisodeSearchCriteria singleEpisodeSpec) private Decision IsSatisfiedBy(RemoteEpisode remoteEpisode, AnimeEpisodeSearchCriteria animeEpisodeSpec)
{ {
if (remoteEpisode.ParsedEpisodeInfo.FullSeason) if (remoteEpisode.ParsedEpisodeInfo.FullSeason && !animeEpisodeSpec.IsSeasonSearch)
{ {
_logger.Debug("Full season result during single episode search, skipping."); _logger.Debug("Full season result during single episode search, skipping.");
return Decision.Reject("Full season pack"); return Decision.Reject("Full season pack");

@ -3,6 +3,7 @@
public class AnimeEpisodeSearchCriteria : SearchCriteriaBase public class AnimeEpisodeSearchCriteria : SearchCriteriaBase
{ {
public int AbsoluteEpisodeNumber { get; set; } public int AbsoluteEpisodeNumber { get; set; }
public bool IsSeasonSearch { get; set; }
public override string ToString() public override string ToString()
{ {

@ -193,10 +193,12 @@ namespace NzbDrone.Core.IndexerSearch
return Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec); return Dispatch(indexer => indexer.Fetch(searchSpec), searchSpec);
} }
private List<DownloadDecision> SearchAnime(Series series, Episode episode, bool userInvokedSearch, bool interactiveSearch) private List<DownloadDecision> SearchAnime(Series series, Episode episode, bool userInvokedSearch, bool interactiveSearch, bool isSeasonSearch = false)
{ {
var searchSpec = Get<AnimeEpisodeSearchCriteria>(series, new List<Episode> { episode }, userInvokedSearch, interactiveSearch); var searchSpec = Get<AnimeEpisodeSearchCriteria>(series, new List<Episode> { episode }, userInvokedSearch, interactiveSearch);
searchSpec.IsSeasonSearch = isSeasonSearch;
if (episode.SceneAbsoluteEpisodeNumber.HasValue) if (episode.SceneAbsoluteEpisodeNumber.HasValue)
{ {
searchSpec.AbsoluteEpisodeNumber = episode.SceneAbsoluteEpisodeNumber.Value; searchSpec.AbsoluteEpisodeNumber = episode.SceneAbsoluteEpisodeNumber.Value;
@ -232,7 +234,7 @@ namespace NzbDrone.Core.IndexerSearch
// Only search for aired episodes when performing a season anime search // Only search for aired episodes when performing a season anime search
foreach (var episode in episodes.Where(e => e.Monitored && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow))) foreach (var episode in episodes.Where(e => e.Monitored && e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)))
{ {
downloadDecisions.AddRange(SearchAnime(series, episode, userInvokedSearch, interactiveSearch)); downloadDecisions.AddRange(SearchAnime(series, episode, userInvokedSearch, interactiveSearch, true));
} }
return downloadDecisions; return downloadDecisions;

Loading…
Cancel
Save