/src/NzbDrone.Core.Test/Download/DownloadApprovedReportsTests/DownloadApprovedFixture.cs

https://github.com/NzbDrone/NzbDrone · C# · 289 lines · 232 code · 57 blank · 0 comment · 3 complexity · 302e9c783915702b8c40ac9844edde08 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using FizzWare.NBuilder;
  4. using FluentAssertions;
  5. using Moq;
  6. using NUnit.Framework;
  7. using NzbDrone.Core.DecisionEngine;
  8. using NzbDrone.Core.Download;
  9. using NzbDrone.Core.Download.Clients;
  10. using NzbDrone.Core.Download.Pending;
  11. using NzbDrone.Core.Exceptions;
  12. using NzbDrone.Core.Indexers;
  13. using NzbDrone.Core.Parser.Model;
  14. using NzbDrone.Core.Profiles.Qualities;
  15. using NzbDrone.Core.Qualities;
  16. using NzbDrone.Core.Test.Framework;
  17. using NzbDrone.Core.Tv;
  18. using NzbDrone.Test.Common;
  19. namespace NzbDrone.Core.Test.Download.DownloadApprovedReportsTests
  20. {
  21. [TestFixture]
  22. public class DownloadApprovedFixture : CoreTest<ProcessDownloadDecisions>
  23. {
  24. [SetUp]
  25. public void SetUp()
  26. {
  27. Mocker.GetMock<IPrioritizeDownloadDecision>()
  28. .Setup(v => v.PrioritizeDecisions(It.IsAny<List<DownloadDecision>>()))
  29. .Returns<List<DownloadDecision>>(v => v);
  30. }
  31. private Episode GetEpisode(int id)
  32. {
  33. return Builder<Episode>.CreateNew()
  34. .With(e => e.Id = id)
  35. .With(e => e.EpisodeNumber = id)
  36. .Build();
  37. }
  38. private RemoteEpisode GetRemoteEpisode(List<Episode> episodes, QualityModel quality, DownloadProtocol downloadProtocol = DownloadProtocol.Usenet)
  39. {
  40. var remoteEpisode = new RemoteEpisode();
  41. remoteEpisode.ParsedEpisodeInfo = new ParsedEpisodeInfo();
  42. remoteEpisode.ParsedEpisodeInfo.Quality = quality;
  43. remoteEpisode.Episodes = new List<Episode>();
  44. remoteEpisode.Episodes.AddRange(episodes);
  45. remoteEpisode.Release = new ReleaseInfo();
  46. remoteEpisode.Release.DownloadProtocol = downloadProtocol;
  47. remoteEpisode.Release.PublishDate = DateTime.UtcNow;
  48. remoteEpisode.Series = Builder<Series>.CreateNew()
  49. .With(e => e.QualityProfile = new QualityProfile { Items = Qualities.QualityFixture.GetDefaultQualities() })
  50. .Build();
  51. return remoteEpisode;
  52. }
  53. [Test]
  54. public void should_download_report_if_epsiode_was_not_already_downloaded()
  55. {
  56. var episodes = new List<Episode> { GetEpisode(1) };
  57. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  58. var decisions = new List<DownloadDecision>();
  59. decisions.Add(new DownloadDecision(remoteEpisode));
  60. Subject.ProcessDecisions(decisions);
  61. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
  62. }
  63. [Test]
  64. public void should_only_download_episode_once()
  65. {
  66. var episodes = new List<Episode> { GetEpisode(1) };
  67. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  68. var decisions = new List<DownloadDecision>();
  69. decisions.Add(new DownloadDecision(remoteEpisode));
  70. decisions.Add(new DownloadDecision(remoteEpisode));
  71. Subject.ProcessDecisions(decisions);
  72. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
  73. }
  74. [Test]
  75. public void should_not_download_if_any_episode_was_already_downloaded()
  76. {
  77. var remoteEpisode1 = GetRemoteEpisode(
  78. new List<Episode> { GetEpisode(1) },
  79. new QualityModel(Quality.HDTV720p)
  80. );
  81. var remoteEpisode2 = GetRemoteEpisode(
  82. new List<Episode> { GetEpisode(1), GetEpisode(2) },
  83. new QualityModel(Quality.HDTV720p)
  84. );
  85. var decisions = new List<DownloadDecision>();
  86. decisions.Add(new DownloadDecision(remoteEpisode1));
  87. decisions.Add(new DownloadDecision(remoteEpisode2));
  88. Subject.ProcessDecisions(decisions);
  89. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
  90. }
  91. [Test]
  92. public void should_return_downloaded_reports()
  93. {
  94. var episodes = new List<Episode> { GetEpisode(1) };
  95. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  96. var decisions = new List<DownloadDecision>();
  97. decisions.Add(new DownloadDecision(remoteEpisode));
  98. Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(1);
  99. }
  100. [Test]
  101. public void should_return_all_downloaded_reports()
  102. {
  103. var remoteEpisode1 = GetRemoteEpisode(
  104. new List<Episode> { GetEpisode(1) },
  105. new QualityModel(Quality.HDTV720p)
  106. );
  107. var remoteEpisode2 = GetRemoteEpisode(
  108. new List<Episode> { GetEpisode(2) },
  109. new QualityModel(Quality.HDTV720p)
  110. );
  111. var decisions = new List<DownloadDecision>();
  112. decisions.Add(new DownloadDecision(remoteEpisode1));
  113. decisions.Add(new DownloadDecision(remoteEpisode2));
  114. Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
  115. }
  116. [Test]
  117. public void should_only_return_downloaded_reports()
  118. {
  119. var remoteEpisode1 = GetRemoteEpisode(
  120. new List<Episode> { GetEpisode(1) },
  121. new QualityModel(Quality.HDTV720p)
  122. );
  123. var remoteEpisode2 = GetRemoteEpisode(
  124. new List<Episode> { GetEpisode(2) },
  125. new QualityModel(Quality.HDTV720p)
  126. );
  127. var remoteEpisode3 = GetRemoteEpisode(
  128. new List<Episode> { GetEpisode(2) },
  129. new QualityModel(Quality.HDTV720p)
  130. );
  131. var decisions = new List<DownloadDecision>();
  132. decisions.Add(new DownloadDecision(remoteEpisode1));
  133. decisions.Add(new DownloadDecision(remoteEpisode2));
  134. decisions.Add(new DownloadDecision(remoteEpisode3));
  135. Subject.ProcessDecisions(decisions).Grabbed.Should().HaveCount(2);
  136. }
  137. [Test]
  138. public void should_not_add_to_downloaded_list_when_download_fails()
  139. {
  140. var episodes = new List<Episode> { GetEpisode(1) };
  141. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  142. var decisions = new List<DownloadDecision>();
  143. decisions.Add(new DownloadDecision(remoteEpisode));
  144. Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.IsAny<RemoteEpisode>())).Throws(new Exception());
  145. Subject.ProcessDecisions(decisions).Grabbed.Should().BeEmpty();
  146. ExceptionVerification.ExpectedWarns(1);
  147. }
  148. [Test]
  149. public void should_return_an_empty_list_when_none_are_approved()
  150. {
  151. var decisions = new List<DownloadDecision>();
  152. decisions.Add(new DownloadDecision(null, new Rejection("Failure!")));
  153. decisions.Add(new DownloadDecision(null, new Rejection("Failure!")));
  154. Subject.GetQualifiedReports(decisions).Should().BeEmpty();
  155. }
  156. [Test]
  157. public void should_not_grab_if_pending()
  158. {
  159. var episodes = new List<Episode> { GetEpisode(1) };
  160. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  161. var decisions = new List<DownloadDecision>();
  162. decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
  163. Subject.ProcessDecisions(decisions);
  164. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Never());
  165. }
  166. [Test]
  167. public void should_not_add_to_pending_if_episode_was_grabbed()
  168. {
  169. var episodes = new List<Episode> { GetEpisode(1) };
  170. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  171. var decisions = new List<DownloadDecision>();
  172. decisions.Add(new DownloadDecision(remoteEpisode));
  173. decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
  174. Subject.ProcessDecisions(decisions);
  175. Mocker.GetMock<IPendingReleaseService>().Verify(v => v.AddMany(It.IsAny<List<Tuple<DownloadDecision, PendingReleaseReason>>>()), Times.Never());
  176. }
  177. [Test]
  178. public void should_add_to_pending_even_if_already_added_to_pending()
  179. {
  180. var episodes = new List<Episode> { GetEpisode(1) };
  181. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  182. var decisions = new List<DownloadDecision>();
  183. decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
  184. decisions.Add(new DownloadDecision(remoteEpisode, new Rejection("Failure!", RejectionType.Temporary)));
  185. Subject.ProcessDecisions(decisions);
  186. Mocker.GetMock<IPendingReleaseService>().Verify(v => v.AddMany(It.IsAny<List<Tuple<DownloadDecision, PendingReleaseReason>>>()), Times.Once());
  187. }
  188. [Test]
  189. public void should_add_to_failed_if_already_failed_for_that_protocol()
  190. {
  191. var episodes = new List<Episode> { GetEpisode(1) };
  192. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  193. var decisions = new List<DownloadDecision>();
  194. decisions.Add(new DownloadDecision(remoteEpisode));
  195. decisions.Add(new DownloadDecision(remoteEpisode));
  196. Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.IsAny<RemoteEpisode>()))
  197. .Throws(new DownloadClientUnavailableException("Download client failed"));
  198. Subject.ProcessDecisions(decisions);
  199. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.IsAny<RemoteEpisode>()), Times.Once());
  200. }
  201. [Test]
  202. public void should_not_add_to_failed_if_failed_for_a_different_protocol()
  203. {
  204. var episodes = new List<Episode> { GetEpisode(1) };
  205. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p), DownloadProtocol.Usenet);
  206. var remoteEpisode2 = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p), DownloadProtocol.Torrent);
  207. var decisions = new List<DownloadDecision>();
  208. decisions.Add(new DownloadDecision(remoteEpisode));
  209. decisions.Add(new DownloadDecision(remoteEpisode2));
  210. Mocker.GetMock<IDownloadService>().Setup(s => s.DownloadReport(It.Is<RemoteEpisode>(r => r.Release.DownloadProtocol == DownloadProtocol.Usenet)))
  211. .Throws(new DownloadClientUnavailableException("Download client failed"));
  212. Subject.ProcessDecisions(decisions);
  213. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.Is<RemoteEpisode>(r => r.Release.DownloadProtocol == DownloadProtocol.Usenet)), Times.Once());
  214. Mocker.GetMock<IDownloadService>().Verify(v => v.DownloadReport(It.Is<RemoteEpisode>(r => r.Release.DownloadProtocol == DownloadProtocol.Torrent)), Times.Once());
  215. }
  216. [Test]
  217. public void should_add_to_rejected_if_release_unavailable_on_indexer()
  218. {
  219. var episodes = new List<Episode> { GetEpisode(1) };
  220. var remoteEpisode = GetRemoteEpisode(episodes, new QualityModel(Quality.HDTV720p));
  221. var decisions = new List<DownloadDecision>();
  222. decisions.Add(new DownloadDecision(remoteEpisode));
  223. Mocker.GetMock<IDownloadService>()
  224. .Setup(s => s.DownloadReport(It.IsAny<RemoteEpisode>()))
  225. .Throws(new ReleaseUnavailableException(remoteEpisode.Release, "That 404 Error is not just a Quirk"));
  226. var result = Subject.ProcessDecisions(decisions);
  227. result.Grabbed.Should().BeEmpty();
  228. result.Rejected.Should().NotBeEmpty();
  229. ExceptionVerification.ExpectedWarns(1);
  230. }
  231. }
  232. }