using System; using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Configuration; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.History; using NzbDrone.Core.Indexers; using NzbDrone.Core.Movies; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.DecisionEngineTests { [TestFixture] public class AlreadyImportedSpecificationFixture : CoreTest { private const int FIRST_MOVIE_ID = 1; private const string TITLE = "Movie.Title.2018.720p.HDTV.x264-Radarr"; private Movie _movie; private QualityModel _hdtv720p; private QualityModel _hdtv1080p; private RemoteMovie _remoteMovie; private List _history; [SetUp] public void Setup() { _movie = Builder.CreateNew() .With(m => m.Id = FIRST_MOVIE_ID) .With(m => m.MovieFileId = 1) .Build(); _hdtv720p = new QualityModel(Quality.HDTV720p, new Revision(version: 1)); _hdtv1080p = new QualityModel(Quality.HDTV1080p, new Revision(version: 1)); _remoteMovie = new RemoteMovie { Movie = _movie, ParsedMovieInfo = new ParsedMovieInfo { Quality = _hdtv720p }, Release = Builder.CreateNew() .Build() }; _history = new List(); Mocker.GetMock() .SetupGet(s => s.EnableCompletedDownloadHandling) .Returns(true); Mocker.GetMock() .Setup(s => s.GetByMovieId(It.IsAny(), null)) .Returns(_history); } private void GivenCdhDisabled() { Mocker.GetMock() .SetupGet(s => s.EnableCompletedDownloadHandling) .Returns(false); } private void GivenHistoryItem(string downloadId, string sourceTitle, QualityModel quality, MovieHistoryEventType eventType) { _history.Add(new MovieHistory { DownloadId = downloadId, SourceTitle = sourceTitle, Quality = quality, Date = DateTime.UtcNow, EventType = eventType }); } [Test] public void should_be_accepted_if_CDH_is_disabled() { GivenCdhDisabled(); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_accepted_if_movie_does_not_have_a_file() { _remoteMovie.Movie.MovieFileId = 0; Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_accepted_if_movie_does_not_have_grabbed_event() { Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_accepted_if_movie_does_not_have_imported_event() { GivenHistoryItem(Guid.NewGuid().ToString().ToUpper(), TITLE, _hdtv720p, MovieHistoryEventType.Grabbed); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_accepted_if_grabbed_and_imported_quality_is_the_same() { var downloadId = Guid.NewGuid().ToString().ToUpper(); GivenHistoryItem(downloadId, TITLE, _hdtv720p, MovieHistoryEventType.Grabbed); GivenHistoryItem(downloadId, TITLE, _hdtv720p, MovieHistoryEventType.DownloadFolderImported); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_accepted_if_grabbed_download_id_and_release_torrent_hash_is_unknown() { var downloadId = Guid.NewGuid().ToString().ToUpper(); GivenHistoryItem(downloadId, TITLE, _hdtv720p, MovieHistoryEventType.Grabbed); GivenHistoryItem(downloadId, TITLE, _hdtv1080p, MovieHistoryEventType.DownloadFolderImported); _remoteMovie.Release = Builder.CreateNew() .With(t => t.DownloadProtocol = DownloadProtocol.Torrent) .With(t => t.InfoHash = null) .Build(); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_accepted_if_grabbed_download_does_not_have_an_id() { var downloadId = Guid.NewGuid().ToString().ToUpper(); GivenHistoryItem(null, TITLE, _hdtv720p, MovieHistoryEventType.Grabbed); GivenHistoryItem(downloadId, TITLE, _hdtv1080p, MovieHistoryEventType.DownloadFolderImported); _remoteMovie.Release = Builder.CreateNew() .With(t => t.DownloadProtocol = DownloadProtocol.Torrent) .With(t => t.InfoHash = downloadId) .Build(); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } [Test] public void should_be_rejected_if_grabbed_download_id_matches_release_torrent_hash() { var downloadId = Guid.NewGuid().ToString().ToUpper(); GivenHistoryItem(downloadId, TITLE, _hdtv720p, MovieHistoryEventType.Grabbed); GivenHistoryItem(downloadId, TITLE, _hdtv1080p, MovieHistoryEventType.DownloadFolderImported); _remoteMovie.Release = Builder.CreateNew() .With(t => t.DownloadProtocol = DownloadProtocol.Torrent) .With(t => t.InfoHash = downloadId) .Build(); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); } [Test] public void should_be_rejected_if_release_title_matches_grabbed_event_source_title() { var downloadId = Guid.NewGuid().ToString().ToUpper(); GivenHistoryItem(downloadId, TITLE, _hdtv720p, MovieHistoryEventType.Grabbed); GivenHistoryItem(downloadId, TITLE, _hdtv1080p, MovieHistoryEventType.DownloadFolderImported); _remoteMovie.Release = Builder.CreateNew() .With(t => t.DownloadProtocol = DownloadProtocol.Torrent) .With(t => t.InfoHash = downloadId) .Build(); Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); } } }