using System.Collections.Generic; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Core.Books; using NzbDrone.Core.Configuration; using NzbDrone.Core.Download; using NzbDrone.Core.IndexerSearch; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test.Download { [TestFixture] public class RedownloadFailedDownloadServiceFixture : CoreTest { [SetUp] public void Setup() { Mocker.GetMock() .Setup(x => x.AutoRedownloadFailed) .Returns(true); Mocker.GetMock() .Setup(x => x.GetBooksByAuthor(It.IsAny())) .Returns(Builder.CreateListOfSize(3).Build() as List); } [Test] public void should_skip_redownload_if_event_has_skipredownload_set() { var failedEvent = new DownloadFailedEvent { AuthorId = 1, BookIds = new List { 1 }, SkipReDownload = true }; Subject.Handle(failedEvent); Mocker.GetMock() .Verify(x => x.Push(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void should_skip_redownload_if_redownload_failed_disabled() { var failedEvent = new DownloadFailedEvent { AuthorId = 1, BookIds = new List { 1 } }; Mocker.GetMock() .Setup(x => x.AutoRedownloadFailed) .Returns(false); Subject.Handle(failedEvent); Mocker.GetMock() .Verify(x => x.Push(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void should_redownload_book_on_failure() { var failedEvent = new DownloadFailedEvent { AuthorId = 1, BookIds = new List { 2 } }; Subject.Handle(failedEvent); Mocker.GetMock() .Verify(x => x.Push(It.Is(c => c.BookIds.Count == 1 && c.BookIds[0] == 2), It.IsAny(), It.IsAny()), Times.Once()); Mocker.GetMock() .Verify(x => x.Push(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void should_redownload_multiple_books_on_failure() { var failedEvent = new DownloadFailedEvent { AuthorId = 1, BookIds = new List { 2, 3 } }; Subject.Handle(failedEvent); Mocker.GetMock() .Verify(x => x.Push(It.Is(c => c.BookIds.Count == 2 && c.BookIds[0] == 2 && c.BookIds[1] == 3), It.IsAny(), It.IsAny()), Times.Once()); Mocker.GetMock() .Verify(x => x.Push(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void should_redownload_author_on_failure() { // note that author is set to have 3 books in setup var failedEvent = new DownloadFailedEvent { AuthorId = 2, BookIds = new List { 1, 2, 3 } }; Subject.Handle(failedEvent); Mocker.GetMock() .Verify(x => x.Push(It.Is(c => c.AuthorId == failedEvent.AuthorId), It.IsAny(), It.IsAny()), Times.Once()); Mocker.GetMock() .Verify(x => x.Push(It.IsAny(), It.IsAny(), It.IsAny()), Times.Never()); } } }