// ReSharper disable RedundantUsingDirective using System.Linq; using System; using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.DecisionEngineTests { [TestFixture] // ReSharper disable InconsistentNaming public class AllowedDownloadSpecificationFixture : CoreTest { private AllowedDownloadSpecification spec; private EpisodeParseResult parseResult; [SetUp] public void Setup() { spec = Mocker.Resolve(); parseResult = new EpisodeParseResult(); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); } private void WithProfileNotAllowed() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); } private void WithNotAcceptableSize() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); } private void WithNoDiskUpgrade() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); } private void WithEpisodeAlreadyInQueue() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(true); } private void WithOverRetention() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); } private void WithAiredBeforeCustomStartDateCutoff() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); } private void WithLanguageNotWanted() { Mocker.GetMock() .Setup(c => c.IsSatisfiedBy(It.IsAny())) .Returns(false); } [Test] public void should_be_allowed_if_all_conditions_are_met() { spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.None); } [Test] public void should_not_be_allowed_if_profile_is_not_allowed() { WithProfileNotAllowed(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.QualityNotWanted); } [Test] public void should_not_be_allowed_if_size_is_not_allowed() { WithNotAcceptableSize(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.Size); } [Test] public void should_not_be_allowed_if_disk_is_not_upgrade() { WithNoDiskUpgrade(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.ExistingQualityIsEqualOrBetter); } [Test] public void should_not_be_allowed_if_episode_is_already_in_queue() { WithEpisodeAlreadyInQueue(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.AlreadyInQueue); } [Test] public void should_not_be_allowed_if_report_is_over_retention() { WithOverRetention(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.Retention); } [Test] public void should_not_be_allowed_if_episode_aired_before_cutoff() { WithAiredBeforeCustomStartDateCutoff(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.AiredAfterCustomStartDate); } [Test] public void should_not_be_allowed_if_none_of_conditions_are_met() { WithNoDiskUpgrade(); WithNotAcceptableSize(); WithProfileNotAllowed(); WithOverRetention(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.QualityNotWanted); } [Test] public void should_not_be_allowed_if_language_is_not_wanted() { WithLanguageNotWanted(); spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.LanguageNotWanted); } } }