using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.DecisionEngine.Specifications.RssSync; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Indexers; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Music; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Profiles.Delay; using NzbDrone.Core.Profiles.Qualities; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.DecisionEngineTests.RssSync { [TestFixture] public class DelaySpecificationFixture : CoreTest { private QualityProfile _profile; private DelayProfile _delayProfile; private RemoteAlbum _remoteAlbum; [SetUp] public void Setup() { _profile = Builder.CreateNew() .Build(); _delayProfile = Builder.CreateNew() .With(d => d.PreferredProtocol = DownloadProtocol.Usenet) .Build(); var artist = Builder.CreateNew() .With(s => s.QualityProfile = _profile) .Build(); _remoteAlbum = Builder.CreateNew() .With(r => r.Artist = artist) .Build(); _profile.Items = new List(); _profile.Items.Add(new QualityProfileQualityItem { Allowed = true, Quality = Quality.MP3_256 }); _profile.Items.Add(new QualityProfileQualityItem { Allowed = true, Quality = Quality.MP3_320 }); _profile.Items.Add(new QualityProfileQualityItem { Allowed = true, Quality = Quality.FLAC }); _profile.Cutoff = Quality.MP3_320.Id; _remoteAlbum.ParsedAlbumInfo = new ParsedAlbumInfo(); _remoteAlbum.Release = new ReleaseInfo(); _remoteAlbum.Release.DownloadProtocol = DownloadProtocol.Usenet; _remoteAlbum.Albums = Builder.CreateListOfSize(1).Build().ToList(); Mocker.GetMock() .Setup(s => s.GetFilesByAlbum(It.IsAny())) .Returns(new List { }); Mocker.GetMock() .Setup(s => s.BestForTags(It.IsAny>())) .Returns(_delayProfile); Mocker.GetMock() .Setup(s => s.GetPendingRemoteAlbums(It.IsAny())) .Returns(new List()); } private void GivenExistingFile(QualityModel quality) { Mocker.GetMock() .Setup(s => s.GetFilesByAlbum(It.IsAny())) .Returns(new List { new TrackFile { Quality = quality } }); } private void GivenUpgradeForExistingFile() { Mocker.GetMock() .Setup(s => s.IsUpgradable(It.IsAny(), It.IsAny>(), It.IsAny>(), It.IsAny(), It.IsAny>())) .Returns(true); } [Test] public void should_be_true_when_user_invoked_search() { Subject.IsSatisfiedBy(new RemoteAlbum(), new AlbumSearchCriteria { UserInvokedSearch = true }).Accepted.Should().BeTrue(); } [Test] public void should_be_false_when_system_invoked_search_and_release_is_younger_than_delay() { _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_192); _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _delayProfile.UsenetDelay = 720; Subject.IsSatisfiedBy(_remoteAlbum, new AlbumSearchCriteria()).Accepted.Should().BeFalse(); } [Test] public void should_be_true_when_profile_does_not_have_a_delay() { _delayProfile.UsenetDelay = 0; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } [Test] public void should_be_false_when_quality_is_last_allowed_in_profile_and_bypass_disabled() { _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_320); _delayProfile.UsenetDelay = 720; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeFalse(); } [Test] public void should_be_true_when_quality_is_last_allowed_in_profile_and_bypass_enabled() { _delayProfile.UsenetDelay = 720; _delayProfile.BypassIfHighestQuality = true; _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.FLAC); Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } [Test] public void should_be_true_when_release_is_older_than_delay() { _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_256); _remoteAlbum.Release.PublishDate = DateTime.UtcNow.AddHours(-10); _delayProfile.UsenetDelay = 60; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } [Test] public void should_be_false_when_release_is_younger_than_delay() { _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_192); _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _delayProfile.UsenetDelay = 720; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeFalse(); } [Test] public void should_be_true_when_release_is_a_proper_for_existing_album() { _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_256, new Revision(version: 2)); _remoteAlbum.Release.PublishDate = DateTime.UtcNow; GivenExistingFile(new QualityModel(Quality.MP3_256)); GivenUpgradeForExistingFile(); Mocker.GetMock() .Setup(s => s.IsRevisionUpgrade(It.IsAny(), It.IsAny())) .Returns(true); _delayProfile.UsenetDelay = 720; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } [Test] public void should_be_true_when_release_is_a_real_for_existing_album() { _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_256, new Revision(real: 1)); _remoteAlbum.Release.PublishDate = DateTime.UtcNow; GivenExistingFile(new QualityModel(Quality.MP3_256)); GivenUpgradeForExistingFile(); Mocker.GetMock() .Setup(s => s.IsRevisionUpgrade(It.IsAny(), It.IsAny())) .Returns(true); _delayProfile.UsenetDelay = 720; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } [Test] public void should_be_false_when_release_is_proper_for_existing_album_of_different_quality() { _remoteAlbum.ParsedAlbumInfo.Quality = new QualityModel(Quality.MP3_320, new Revision(version: 2)); _remoteAlbum.Release.PublishDate = DateTime.UtcNow; GivenExistingFile(new QualityModel(Quality.MP3_256)); _delayProfile.UsenetDelay = 720; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeFalse(); } [Test] public void should_be_false_when_custom_format_score_is_above_minimum_but_bypass_disabled() { _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _remoteAlbum.CustomFormatScore = 100; _delayProfile.UsenetDelay = 720; _delayProfile.MinimumCustomFormatScore = 50; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeFalse(); } [Test] public void should_be_false_when_custom_format_score_is_above_minimum_and_bypass_enabled_but_under_minimum() { _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _remoteAlbum.CustomFormatScore = 5; _delayProfile.UsenetDelay = 720; _delayProfile.BypassIfAboveCustomFormatScore = true; _delayProfile.MinimumCustomFormatScore = 50; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeFalse(); } [Test] public void should_be_true_when_custom_format_score_is_above_minimum_and_bypass_enabled() { _remoteAlbum.Release.PublishDate = DateTime.UtcNow; _remoteAlbum.CustomFormatScore = 100; _delayProfile.UsenetDelay = 720; _delayProfile.BypassIfAboveCustomFormatScore = true; _delayProfile.MinimumCustomFormatScore = 50; Subject.IsSatisfiedBy(_remoteAlbum, null).Accepted.Should().BeTrue(); } } }