diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs index f47ca2265..7f1ec040b 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/CutoffSpecificationFixture.cs @@ -80,7 +80,13 @@ private void GivenCustomFormatHigher() [Test] public void should_return_true_if_current_episode_is_less_than_cutoff() { - GivenProfile(new Profile { Cutoff = Quality.Bluray1080p.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }); + GivenProfile(new Profile + { + Cutoff = Quality.Bluray1080p.Id, + Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = true + }); + GivenFileQuality(new QualityModel(Quality.DVD, new Revision(version: 2))); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } @@ -88,7 +94,13 @@ public void should_return_true_if_current_episode_is_less_than_cutoff() [Test] public void should_return_false_if_current_episode_is_equal_to_cutoff() { - GivenProfile(new Profile { Cutoff = Quality.HDTV720p.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }); + GivenProfile(new Profile + { + Cutoff = Quality.HDTV720p.Id, + Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = true + }); + GivenFileQuality(new QualityModel(Quality.HDTV720p, new Revision(version: 2))); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); } @@ -96,7 +108,13 @@ public void should_return_false_if_current_episode_is_equal_to_cutoff() [Test] public void should_return_false_if_current_episode_is_greater_than_cutoff() { - GivenProfile(new Profile { Cutoff = Quality.HDTV720p.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }); + GivenProfile(new Profile + { + Cutoff = Quality.HDTV720p.Id, + Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = true + }); + GivenFileQuality(new QualityModel(Quality.Bluray1080p, new Revision(version: 2))); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); } @@ -104,7 +122,13 @@ public void should_return_false_if_current_episode_is_greater_than_cutoff() [Test] public void should_return_true_when_new_episode_is_proper_but_existing_is_not() { - GivenProfile(new Profile { Cutoff = Quality.HDTV720p.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }); + GivenProfile(new Profile + { + Cutoff = Quality.HDTV720p.Id, + Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = true + }); + GivenFileQuality(new QualityModel(Quality.HDTV720p, new Revision(version: 1))); GivenNewQuality(new QualityModel(Quality.HDTV720p, new Revision(version: 2))); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); @@ -113,7 +137,13 @@ public void should_return_true_when_new_episode_is_proper_but_existing_is_not() [Test] public void should_return_false_if_cutoff_is_met_and_quality_is_higher() { - GivenProfile(new Profile { Cutoff = Quality.HDTV720p.Id, Items = Qualities.QualityFixture.GetDefaultQualities() }); + GivenProfile(new Profile + { + Cutoff = Quality.HDTV720p.Id, + Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = true + }); + GivenFileQuality(new QualityModel(Quality.HDTV720p, new Revision(version: 2))); GivenNewQuality(new QualityModel(Quality.Bluray1080p, new Revision(version: 2))); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); @@ -127,7 +157,8 @@ public void should_return_false_if_custom_formats_is_met_and_quality_and_format_ Cutoff = Quality.HDTV720p.Id, Items = Qualities.QualityFixture.GetDefaultQualities(), MinFormatScore = 0, - FormatItems = CustomFormatsFixture.GetSampleFormatItems("My Format") + FormatItems = CustomFormatsFixture.GetSampleFormatItems("My Format"), + UpgradeAllowed = true }); GivenFileQuality(new QualityModel(Quality.HDTV720p)); @@ -148,6 +179,7 @@ public void should_return_true_if_cutoffs_are_met_but_is_a_revision_upgrade() { Cutoff = Quality.HDTV1080p.Id, Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = true }); GivenFileQuality(new QualityModel(Quality.WEBDL1080p, new Revision(version: 1))); @@ -155,5 +187,21 @@ public void should_return_true_if_cutoffs_are_met_but_is_a_revision_upgrade() Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } + + [Test] + public void should_return_false_if_quality_profile_does_not_allow_upgrades_but_cutoff_is_set_to_highest_quality() + { + GivenProfile(new Profile + { + Cutoff = Quality.RAWHD.Id, + Items = Qualities.QualityFixture.GetDefaultQualities(), + UpgradeAllowed = false + }); + + GivenFileQuality(new QualityModel(Quality.WEBDL1080p)); + GivenNewQuality(new QualityModel(Quality.Bluray1080p)); + + Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs index bf5c7a1ca..aaaa9c342 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/UpgradableSpecification.cs @@ -81,7 +81,8 @@ public bool IsUpgradable(Profile profile, QualityModel currentQuality, List q.Allowed); + + if (firstAllowed.Quality != null) + { + return firstAllowed.Quality; + } + + // Returning any item from the group will work, + // returning the first because it's the true first quality. + return firstAllowed.Items.First().Quality; + } + public Quality LastAllowedQuality() { var lastAllowed = Items.Last(q => q.Allowed);