using System; using System.Linq; using System.Net; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Core.Download; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; using NzbDrone.Test.Common; using System.Collections.Generic; namespace NzbDrone.Core.Test.Download { [TestFixture] public class DownloadServiceFixture : CoreTest { private RemoteEpisode _parseResult; private List _downloadClients; [SetUp] public void Setup() { _downloadClients = new List(); Mocker.GetMock() .Setup(v => v.GetDownloadClients()) .Returns(_downloadClients); Mocker.GetMock() .Setup(v => v.GetDownloadClient(It.IsAny())) .Returns(v => _downloadClients.FirstOrDefault(d => d.Protocol == v)); var episodes = Builder.CreateListOfSize(2) .TheFirst(1).With(s => s.Id = 12) .TheNext(1).With(s => s.Id = 99) .All().With(s => s.SeriesId = 5) .Build().ToList(); var releaseInfo = Builder.CreateNew() .With(v => v.DownloadProtocol = Indexers.DownloadProtocol.Usenet) .Build(); _parseResult = Builder.CreateNew() .With(c => c.Series = Builder.CreateNew().Build()) .With(c => c.Release = releaseInfo) .With(c => c.Episodes = episodes) .Build(); } private Mock WithUsenetClient() { var mock = new Mock(Moq.MockBehavior.Default); _downloadClients.Add(mock.Object); mock.SetupGet(v => v.Protocol).Returns(Indexers.DownloadProtocol.Usenet); return mock; } private Mock WithTorrentClient() { var mock = new Mock(Moq.MockBehavior.Default); _downloadClients.Add(mock.Object); mock.SetupGet(v => v.Protocol).Returns(Indexers.DownloadProtocol.Torrent); return mock; } [Test] public void Download_report_should_publish_on_grab_event() { var mock = WithUsenetClient(); mock.Setup(s => s.Download(It.IsAny())); Subject.DownloadReport(_parseResult); VerifyEventPublished(); } [Test] public void Download_report_should_grab_using_client() { var mock = WithUsenetClient(); mock.Setup(s => s.Download(It.IsAny())); Subject.DownloadReport(_parseResult); mock.Verify(s => s.Download(It.IsAny()), Times.Once()); } [Test] public void Download_report_should_not_publish_on_failed_grab_event() { var mock = WithUsenetClient(); mock.Setup(s => s.Download(It.IsAny())) .Throws(new WebException()); Assert.Throws(() => Subject.DownloadReport(_parseResult)); VerifyEventNotPublished(); } [Test] public void should_not_attempt_download_if_client_isnt_configure() { Subject.DownloadReport(_parseResult); Mocker.GetMock().Verify(c => c.Download(It.IsAny()), Times.Never()); VerifyEventNotPublished(); ExceptionVerification.ExpectedWarns(1); } [Test] public void should_send_download_to_correct_usenet_client() { var mockTorrent = WithTorrentClient(); var mockUsenet = WithUsenetClient(); Subject.DownloadReport(_parseResult); mockTorrent.Verify(c => c.Download(It.IsAny()), Times.Never()); mockUsenet.Verify(c => c.Download(It.IsAny()), Times.Once()); } [Test] public void should_send_download_to_correct_torrent_client() { var mockTorrent = WithTorrentClient(); var mockUsenet = WithUsenetClient(); _parseResult.Release.DownloadProtocol = Indexers.DownloadProtocol.Torrent; Subject.DownloadReport(_parseResult); mockTorrent.Verify(c => c.Download(It.IsAny()), Times.Once()); mockUsenet.Verify(c => c.Download(It.IsAny()), Times.Never()); } } }