using System; using System.Collections.Generic; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.Download; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Qualities; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests { [TestFixture] public class DownloadApprovedFixture : CoreTest { private Episode GetEpisode(int id) { return Builder.CreateNew() .With(e => e.Id = id) .With(e => e.EpisodeNumber = id) .Build(); } private RemoteEpisode GetRemoteEpisode(List episodes, QualityModel quality) { var remoteEpisode = new RemoteEpisode(); remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo(); remoteEpisode.ParsedEpisodeInfo.Quality = quality; remoteEpisode.Episodes = new List(); remoteEpisode.Episodes.AddRange(episodes); remoteEpisode.Report = new ReportInfo(); remoteEpisode.Report.Age = 0; return remoteEpisode; } [Test] public void should_download_report_if_epsiode_was_not_already_downloaded() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode)); Subject.DownloadApproved(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny()), Times.Once()); } [Test] public void should_only_download_episode_once() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode)); decisions.Add(new DownloadDecision(remoteEpisode)); Subject.DownloadApproved(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny()), Times.Once()); } [Test] public void should_not_download_if_any_episode_was_already_downloaded() { var remoteEpisode1 = GetRemoteEpisode( new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p) ); var remoteEpisode2 = GetRemoteEpisode( new List { GetEpisode(1), GetEpisode(2) }, new QualityModel(Quality.HDTV720p) ); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode1)); decisions.Add(new DownloadDecision(remoteEpisode2)); Subject.DownloadApproved(decisions); Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny()), Times.Once()); } [Test] public void should_return_downloaded_reports() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode)); Subject.DownloadApproved(decisions).Should().HaveCount(1); } [Test] public void should_return_all_downloaded_reports() { var remoteEpisode1 = GetRemoteEpisode( new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p) ); var remoteEpisode2 = GetRemoteEpisode( new List { GetEpisode(2) }, new QualityModel(Quality.HDTV720p) ); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode1)); decisions.Add(new DownloadDecision(remoteEpisode2)); Subject.DownloadApproved(decisions).Should().HaveCount(2); } [Test] public void should_only_return_downloaded_reports() { var remoteEpisode1 = GetRemoteEpisode( new List { GetEpisode(1) }, new QualityModel(Quality.HDTV720p) ); var remoteEpisode2 = GetRemoteEpisode( new List { GetEpisode(2) }, new QualityModel(Quality.HDTV720p) ); var remoteEpisode3 = GetRemoteEpisode( new List { GetEpisode(2) }, new QualityModel(Quality.HDTV720p) ); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode1)); decisions.Add(new DownloadDecision(remoteEpisode2)); decisions.Add(new DownloadDecision(remoteEpisode3)); Subject.DownloadApproved(decisions).Should().HaveCount(2); } [Test] public void should_not_add_to_downloaded_list_when_download_fails() { var episodes = new List { GetEpisode(1) }; var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p)); var decisions = new List(); decisions.Add(new DownloadDecision(remoteEpisode)); Mocker.GetMock().Setup(s => s.DownloadReport(It.IsAny())).Throws(new Exception()); Subject.DownloadApproved(decisions).Should().BeEmpty(); ExceptionVerification.ExpectedWarns(1); } } }