using System; using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.Languages; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Profiles.Qualities; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.CustomFormats; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Test.DecisionEngineTests { [TestFixture] public class UpgradeDiskSpecificationFixture : CoreTest { private UpgradeDiskSpecification _upgradeDisk; private RemoteEpisode _parseResultMulti; private RemoteEpisode _parseResultSingle; private EpisodeFile _firstFile; private EpisodeFile _secondFile; [SetUp] public void Setup() { Mocker.Resolve(); _upgradeDisk = Mocker.Resolve(); CustomFormatsTestHelpers.GivenCustomFormats(); _firstFile = new EpisodeFile { Quality = new QualityModel(Quality.Bluray1080p, new Revision(version: 2)), DateAdded = DateTime.Now, Languages = new List { Language.English } }; _secondFile = new EpisodeFile { Quality = new QualityModel(Quality.Bluray1080p, new Revision(version: 2)), DateAdded = DateTime.Now, Languages = new List { Language.English } }; var singleEpisodeList = new List { new Episode { EpisodeFile = _firstFile, EpisodeFileId = 1 }, new Episode { EpisodeFile = null } }; var doubleEpisodeList = new List { new Episode { EpisodeFile = _firstFile, EpisodeFileId = 1 }, new Episode { EpisodeFile = _secondFile, EpisodeFileId = 1 }, new Episode { EpisodeFile = null } }; var fakeSeries = Builder.CreateNew() .With(c => c.QualityProfile = new QualityProfile { UpgradeAllowed = true, Cutoff = Quality.Bluray1080p.Id, Items = Qualities.QualityFixture.GetDefaultQualities(), FormatItems = CustomFormatsTestHelpers.GetSampleFormatItems("None"), MinFormatScore = 0, }) .Build(); _parseResultMulti = new RemoteEpisode { Series = fakeSeries, ParsedEpisodeInfo = new ParsedEpisodeInfo { Quality = new QualityModel(Quality.DVD, new Revision(version: 2)), Languages = new List { Language.English } }, Episodes = doubleEpisodeList, CustomFormats = new List() }; _parseResultSingle = new RemoteEpisode { Series = fakeSeries, ParsedEpisodeInfo = new ParsedEpisodeInfo { Quality = new QualityModel(Quality.DVD, new Revision(version: 2)), Languages = new List { Language.English } }, Episodes = singleEpisodeList, CustomFormats = new List() }; Mocker.GetMock() .Setup(x => x.ParseCustomFormat(It.IsAny())) .Returns(new List()); } private void WithFirstFileUpgradable() { _firstFile.Quality = new QualityModel(Quality.SDTV); } private void WithSecondFileUpgradable() { _secondFile.Quality = new QualityModel(Quality.SDTV); } [Test] public void should_return_true_if_episode_has_no_existing_file() { _parseResultSingle.Episodes.ForEach(c => c.EpisodeFileId = 0); _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue(); } [Test] public void should_return_true_if_single_episode_doesnt_exist_on_disk() { _parseResultSingle.Episodes = new List(); _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue(); } [Test] public void should_be_upgradable_if_only_episode_is_upgradable() { WithFirstFileUpgradable(); _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeTrue(); } [Test] public void should_be_upgradable_if_both_episodes_are_upgradable() { WithFirstFileUpgradable(); WithSecondFileUpgradable(); _upgradeDisk.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeTrue(); } [Test] public void should_be_not_upgradable_if_both_episodes_are_not_upgradable() { _upgradeDisk.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); } [Test] public void should_be_not_upgradable_if_only_first_episodes_is_upgradable() { WithFirstFileUpgradable(); _upgradeDisk.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); } [Test] public void should_be_not_upgradable_if_only_second_episodes_is_upgradable() { WithSecondFileUpgradable(); _upgradeDisk.IsSatisfiedBy(_parseResultMulti, null).Accepted.Should().BeFalse(); } [Test] public void should_not_be_upgradable_if_qualities_are_the_same() { _firstFile.Quality = new QualityModel(Quality.WEBDL1080p); _parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.WEBDL1080p); _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); } [Test] public void should_not_be_upgradable_if_revision_downgrade_and_preferred_word_upgrade_if_propers_are_preferred() { Mocker.GetMock() .Setup(s => s.ParseCustomFormat(It.IsAny())) .Returns(new List()); _parseResultSingle.CustomFormatScore = 10; _firstFile.Quality = new QualityModel(Quality.WEBDL1080p, new Revision(2)); _parseResultSingle.ParsedEpisodeInfo.Quality = new QualityModel(Quality.WEBDL1080p); _upgradeDisk.IsSatisfiedBy(_parseResultSingle, null).Accepted.Should().BeFalse(); } } }