2019-06-14 03:54:25 +00:00
|
|
|
using System;
|
2013-06-19 05:44:50 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using FizzWare.NBuilder;
|
|
|
|
using FluentAssertions;
|
|
|
|
using Moq;
|
|
|
|
using NUnit.Framework;
|
2014-06-08 08:22:55 +00:00
|
|
|
using NzbDrone.Core.DecisionEngine;
|
2013-06-19 05:44:50 +00:00
|
|
|
using NzbDrone.Core.Download;
|
2014-07-27 00:39:28 +00:00
|
|
|
using NzbDrone.Core.Download.Pending;
|
2013-06-19 05:44:50 +00:00
|
|
|
using NzbDrone.Core.Parser.Model;
|
2014-06-08 08:22:55 +00:00
|
|
|
using NzbDrone.Core.Profiles;
|
2013-06-19 05:44:50 +00:00
|
|
|
using NzbDrone.Core.Qualities;
|
|
|
|
using NzbDrone.Core.Test.Framework;
|
2018-03-14 20:41:36 +00:00
|
|
|
using NzbDrone.Core.Movies;
|
2013-06-19 05:44:50 +00:00
|
|
|
using NzbDrone.Test.Common;
|
2019-07-10 02:05:32 +00:00
|
|
|
using NzbDrone.Core.Exceptions;
|
|
|
|
using NzbDrone.Core.Indexers;
|
|
|
|
using NzbDrone.Core.Download.Clients;
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
|
|
|
|
{
|
|
|
|
[TestFixture]
|
2014-06-08 08:22:55 +00:00
|
|
|
public class DownloadApprovedFixture : CoreTest<ProcessDownloadDecisions>
|
2013-06-19 05:44:50 +00:00
|
|
|
{
|
2014-07-15 19:03:53 +00:00
|
|
|
[SetUp]
|
|
|
|
public void SetUp()
|
|
|
|
{
|
|
|
|
Mocker.GetMock<IPrioritizeDownloadDecision>()
|
2017-03-06 21:23:25 +00:00
|
|
|
.Setup(v => v.PrioritizeDecisionsForMovies(It.IsAny<List<DownloadDecision>>()))
|
2014-07-15 19:03:53 +00:00
|
|
|
.Returns<List<DownloadDecision>>(v => v);
|
|
|
|
}
|
|
|
|
|
2017-03-06 21:23:25 +00:00
|
|
|
private Movie GetMovie(int id)
|
2013-06-19 05:44:50 +00:00
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
return Builder<Movie>.CreateNew()
|
2013-06-19 05:44:50 +00:00
|
|
|
.With(e => e.Id = id)
|
2019-12-22 21:24:10 +00:00
|
|
|
.With(m => m.Tags = new HashSet<int>())
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2017-03-06 21:23:25 +00:00
|
|
|
.Build();
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
|
2019-12-22 21:24:10 +00:00
|
|
|
private RemoteMovie GetRemoteMovie(QualityModel quality, Movie movie = null, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet)
|
|
|
|
{
|
|
|
|
if (movie == null)
|
|
|
|
{
|
|
|
|
movie = GetMovie(1);
|
|
|
|
}
|
2017-03-06 21:23:25 +00:00
|
|
|
|
2019-12-22 21:24:10 +00:00
|
|
|
movie.Profile = new Profile { Items = Qualities.QualityFixture.GetDefaultQualities(), PreferredTags = new List<string>() };
|
2017-03-06 21:23:25 +00:00
|
|
|
|
|
|
|
var remoteMovie = new RemoteMovie()
|
|
|
|
{
|
|
|
|
ParsedMovieInfo = new ParsedMovieInfo()
|
|
|
|
{
|
|
|
|
Quality = quality,
|
|
|
|
Year = 1998,
|
|
|
|
MovieTitle = "A Movie",
|
|
|
|
},
|
|
|
|
Movie = movie,
|
2019-12-22 21:24:11 +00:00
|
|
|
|
2017-03-06 21:23:25 +00:00
|
|
|
Release = new ReleaseInfo()
|
|
|
|
{
|
|
|
|
PublishDate = DateTime.UtcNow,
|
|
|
|
Title = "A.Movie.1998",
|
2019-07-10 02:05:32 +00:00
|
|
|
Size = 200,
|
|
|
|
DownloadProtocol = downloadProtocol
|
2017-03-06 21:23:25 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-12-22 21:24:10 +00:00
|
|
|
return remoteMovie;
|
|
|
|
}
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
[Test]
|
2017-03-06 21:23:25 +00:00
|
|
|
public void should_download_report_if_movie_was_not_already_downloaded()
|
2013-06-19 05:44:50 +00:00
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2014-06-08 08:22:55 +00:00
|
|
|
Subject.ProcessDecisions(decisions);
|
2019-06-14 03:54:25 +00:00
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Once());
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
2017-03-06 21:23:25 +00:00
|
|
|
public void should_only_download_movie_once()
|
2013-06-19 05:44:50 +00:00
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2014-06-08 08:22:55 +00:00
|
|
|
Subject.ProcessDecisions(decisions);
|
2019-06-14 03:54:25 +00:00
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Once());
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
|
2019-07-10 02:05:32 +00:00
|
|
|
[Test]
|
|
|
|
public void should_not_download_if_any_movie_was_already_downloaded()
|
|
|
|
{
|
|
|
|
var remoteMovie1 = GetRemoteMovie(
|
|
|
|
new QualityModel(Quality.HDTV720p)
|
|
|
|
);
|
|
|
|
|
|
|
|
var remoteMovie2 = GetRemoteMovie(
|
|
|
|
new QualityModel(Quality.HDTV720p)
|
|
|
|
);
|
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie1));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie2));
|
|
|
|
|
|
|
|
Subject.ProcessDecisions(decisions);
|
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Once());
|
|
|
|
}
|
|
|
|
|
2013-06-19 05:44:50 +00:00
|
|
|
[Test]
|
|
|
|
public void should_return_downloaded_reports()
|
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2014-06-08 08:22:55 +00:00
|
|
|
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(1);
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_return_all_downloaded_reports()
|
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie1 = GetRemoteMovie(
|
2019-12-22 21:24:10 +00:00
|
|
|
new QualityModel(Quality.HDTV720p),
|
|
|
|
GetMovie(1)
|
|
|
|
);
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie2 = GetRemoteMovie(
|
2019-12-22 21:24:10 +00:00
|
|
|
new QualityModel(Quality.HDTV720p),
|
|
|
|
GetMovie(2)
|
|
|
|
);
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie1));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie2));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2014-06-08 08:22:55 +00:00
|
|
|
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_only_return_downloaded_reports()
|
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie1 = GetRemoteMovie(
|
2019-12-22 21:24:10 +00:00
|
|
|
new QualityModel(Quality.HDTV720p),
|
|
|
|
GetMovie(1)
|
|
|
|
);
|
2017-03-06 21:23:25 +00:00
|
|
|
|
|
|
|
var remoteMovie2 = GetRemoteMovie(
|
2019-12-22 21:24:10 +00:00
|
|
|
new QualityModel(Quality.HDTV720p),
|
|
|
|
GetMovie(2)
|
|
|
|
);
|
2017-03-06 21:23:25 +00:00
|
|
|
|
|
|
|
var remoteMovie3 = GetRemoteMovie(
|
|
|
|
new QualityModel(Quality.HDTV720p),
|
2019-12-22 21:24:10 +00:00
|
|
|
GetMovie(2)
|
2013-06-19 05:44:50 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie1));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie2));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie3));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2014-06-08 08:22:55 +00:00
|
|
|
Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_not_add_to_downloaded_list_when_download_fails()
|
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
2013-06-19 05:44:50 +00:00
|
|
|
|
2019-06-14 03:54:25 +00:00
|
|
|
Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.IsAny<RemoteMovie>())).Throws(new Exception());
|
2014-06-08 08:22:55 +00:00
|
|
|
Subject.ProcessDecisions(decisions).Grabbed.Should().BeEmpty();
|
2013-06-19 05:44:50 +00:00
|
|
|
ExceptionVerification.ExpectedWarns(1);
|
|
|
|
}
|
2014-07-15 19:03:53 +00:00
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_return_an_empty_list_when_none_are_appproved()
|
|
|
|
{
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
RemoteMovie remoteMovie = null;
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!")));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!")));
|
2014-07-15 19:03:53 +00:00
|
|
|
|
|
|
|
Subject.GetQualifiedReports(decisions).Should().BeEmpty();
|
|
|
|
}
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_not_grab_if_pending()
|
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie, new Rejection("Failure!", RejectionType.Temporary)));
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
Subject.ProcessDecisions(decisions);
|
2019-06-14 03:54:25 +00:00
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Never());
|
2014-07-27 00:39:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
2017-03-06 21:23:25 +00:00
|
|
|
public void should_not_add_to_pending_if_movie_was_grabbed()
|
2014-07-27 00:39:28 +00:00
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var removeMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2017-03-06 21:23:25 +00:00
|
|
|
decisions.Add(new DownloadDecision(removeMovie));
|
|
|
|
decisions.Add(new DownloadDecision(removeMovie, new Rejection("Failure!", RejectionType.Temporary)));
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
Subject.ProcessDecisions(decisions);
|
2019-06-14 03:54:25 +00:00
|
|
|
Mocker.GetMock<IPendingReleaseService>().Verify(v => v.AddMany(It.IsAny<List<Tuple<DownloadDecision, PendingReleaseReason>>>()), Times.Never());
|
2014-07-27 00:39:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_add_to_pending_even_if_already_added_to_pending()
|
|
|
|
{
|
2019-07-10 02:05:32 +00:00
|
|
|
var remoteEpisode = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
|
|
|
decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
|
|
|
|
decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
|
|
|
|
|
|
|
|
Subject.ProcessDecisions(decisions);
|
|
|
|
Mocker.GetMock<IPendingReleaseService>().Verify(v => v.AddMany(It.IsAny<List<Tuple<DownloadDecision, PendingReleaseReason>>>()), Times.Once());
|
|
|
|
}
|
2018-08-05 14:28:05 +00:00
|
|
|
|
2019-07-10 02:05:32 +00:00
|
|
|
[Test]
|
|
|
|
public void should_add_to_failed_if_already_failed_for_that_protocol()
|
|
|
|
{
|
2017-03-06 21:23:25 +00:00
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
2019-07-10 02:05:32 +00:00
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
|
|
|
|
|
|
|
Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.IsAny<RemoteMovie>()))
|
|
|
|
.Throws(new DownloadClientUnavailableException("Download client failed"));
|
|
|
|
|
|
|
|
Subject.ProcessDecisions(decisions);
|
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteMovie>()), Times.Once());
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_not_add_to_failed_if_failed_for_a_different_protocol()
|
|
|
|
{
|
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p), null, DownloadProtocol.Usenet);
|
|
|
|
var remoteMovie2 = GetRemoteMovie(new QualityModel(Quality.HDTV720p), null, DownloadProtocol.Torrent);
|
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie2));
|
|
|
|
|
|
|
|
Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.Is<RemoteMovie>(r => r.Release.DownloadProtocol == DownloadProtocol.Usenet)))
|
|
|
|
.Throws(new DownloadClientUnavailableException("Download client failed"));
|
2014-07-27 00:39:28 +00:00
|
|
|
|
|
|
|
Subject.ProcessDecisions(decisions);
|
2019-07-10 02:05:32 +00:00
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.Is<RemoteMovie>(r => r.Release.DownloadProtocol == DownloadProtocol.Usenet)), Times.Once());
|
|
|
|
Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.Is<RemoteMovie>(r => r.Release.DownloadProtocol == DownloadProtocol.Torrent)), Times.Once());
|
|
|
|
}
|
|
|
|
|
|
|
|
[Test]
|
|
|
|
public void should_add_to_rejected_if_release_unavailable_on_indexer()
|
|
|
|
{
|
|
|
|
var remoteMovie = GetRemoteMovie(new QualityModel(Quality.HDTV720p));
|
|
|
|
|
|
|
|
var decisions = new List<DownloadDecision>();
|
|
|
|
decisions.Add(new DownloadDecision(remoteMovie));
|
|
|
|
|
|
|
|
Mocker.GetMock<IDownloadService>()
|
|
|
|
.Setup(s => s.DownloadReport(It.IsAny<RemoteMovie>()))
|
|
|
|
.Throws(new ReleaseUnavailableException(remoteMovie.Release, "That 404 Error is not just a Quirk"));
|
|
|
|
|
|
|
|
var result = Subject.ProcessDecisions(decisions);
|
|
|
|
|
|
|
|
result.Grabbed.Should().BeEmpty();
|
|
|
|
result.Rejected.Should().NotBeEmpty();
|
|
|
|
|
|
|
|
ExceptionVerification.ExpectedWarns(1);
|
2014-07-27 00:39:28 +00:00
|
|
|
}
|
2013-06-19 05:44:50 +00:00
|
|
|
}
|
|
|
|
}
|