/src/NzbDrone.Core.Test/Download/TrackedDownloads/TrackedDownloadServiceFixture.cs

https://github.com/NzbDrone/NzbDrone · C# · 329 lines · 280 code · 49 blank · 0 comment · 8 complexity · ea63afb96f0e1b15086e77fc992236a0 MD5 · raw file

  1. using System.Collections.Generic;
  2. using FluentAssertions;
  3. using Moq;
  4. using NUnit.Framework;
  5. using NzbDrone.Core.Download;
  6. using NzbDrone.Core.Download.TrackedDownloads;
  7. using NzbDrone.Core.History;
  8. using NzbDrone.Core.Parser;
  9. using NzbDrone.Core.Parser.Model;
  10. using NzbDrone.Core.Test.Framework;
  11. using NzbDrone.Core.Tv;
  12. using NzbDrone.Core.Indexers;
  13. using System.Linq;
  14. using NzbDrone.Core.Tv.Events;
  15. namespace NzbDrone.Core.Test.Download.TrackedDownloads
  16. {
  17. [TestFixture]
  18. public class TrackedDownloadServiceFixture : CoreTest<TrackedDownloadService>
  19. {
  20. private void GivenDownloadHistory()
  21. {
  22. Mocker.GetMock<IHistoryService>()
  23. .Setup(s => s.FindByDownloadId(It.Is<string>(sr => sr == "35238")))
  24. .Returns(new List<EpisodeHistory>(){
  25. new EpisodeHistory(){
  26. DownloadId = "35238",
  27. SourceTitle = "TV Series S01",
  28. SeriesId = 5,
  29. EpisodeId = 4
  30. }
  31. });
  32. }
  33. [Test]
  34. public void should_track_downloads_using_the_source_title_if_it_cannot_be_found_using_the_download_title()
  35. {
  36. GivenDownloadHistory();
  37. var remoteEpisode = new RemoteEpisode
  38. {
  39. Series = new Series() { Id = 5 },
  40. Episodes = new List<Episode> { new Episode { Id = 4 } },
  41. ParsedEpisodeInfo = new ParsedEpisodeInfo()
  42. {
  43. SeriesTitle = "TV Series",
  44. SeasonNumber = 1
  45. },
  46. MappedSeasonNumber = 1
  47. };
  48. Mocker.GetMock<IParsingService>()
  49. .Setup(s => s.Map(It.Is<ParsedEpisodeInfo>(i => i.SeasonNumber == 1 && i.SeriesTitle == "TV Series"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>()))
  50. .Returns(remoteEpisode);
  51. var client = new DownloadClientDefinition()
  52. {
  53. Id = 1,
  54. Protocol = DownloadProtocol.Torrent
  55. };
  56. var item = new DownloadClientItem()
  57. {
  58. Title = "The torrent release folder",
  59. DownloadId = "35238",
  60. DownloadClientInfo = new DownloadClientItemClientInfo
  61. {
  62. Protocol = client.Protocol,
  63. Id = client.Id,
  64. Name = client.Name
  65. }
  66. };
  67. var trackedDownload = Subject.TrackDownload(client, item);
  68. trackedDownload.Should().NotBeNull();
  69. trackedDownload.RemoteEpisode.Should().NotBeNull();
  70. trackedDownload.RemoteEpisode.Series.Should().NotBeNull();
  71. trackedDownload.RemoteEpisode.Series.Id.Should().Be(5);
  72. trackedDownload.RemoteEpisode.Episodes.First().Id.Should().Be(4);
  73. trackedDownload.RemoteEpisode.ParsedEpisodeInfo.SeasonNumber.Should().Be(1);
  74. trackedDownload.RemoteEpisode.MappedSeasonNumber.Should().Be(1);
  75. }
  76. [Test]
  77. public void should_parse_as_special_when_source_title_parsing_fails()
  78. {
  79. var remoteEpisode = new RemoteEpisode
  80. {
  81. Series = new Series() { Id = 5 },
  82. Episodes = new List<Episode> { new Episode { Id = 4 } },
  83. ParsedEpisodeInfo = new ParsedEpisodeInfo()
  84. {
  85. SeriesTitle = "TV Series",
  86. SeasonNumber = 0,
  87. EpisodeNumbers = new []{ 1 }
  88. },
  89. MappedSeasonNumber = 0
  90. };
  91. Mocker.GetMock<IHistoryService>()
  92. .Setup(s => s.FindByDownloadId(It.Is<string>(sr => sr == "35238")))
  93. .Returns(new List<EpisodeHistory>(){
  94. new EpisodeHistory(){
  95. DownloadId = "35238",
  96. SourceTitle = "TV Series Special",
  97. SeriesId = 5,
  98. EpisodeId = 4
  99. }
  100. });
  101. Mocker.GetMock<IParsingService>()
  102. .Setup(s => s.Map(It.Is<ParsedEpisodeInfo>(i => i.SeasonNumber == 0 && i.SeriesTitle == "TV Series"), It.IsAny<int>(), It.IsAny<IEnumerable<int>>()))
  103. .Returns(remoteEpisode);
  104. Mocker.GetMock<IParsingService>()
  105. .Setup(s => s.ParseSpecialEpisodeTitle(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<int>(), null))
  106. .Returns(remoteEpisode.ParsedEpisodeInfo);
  107. var client = new DownloadClientDefinition()
  108. {
  109. Id = 1,
  110. Protocol = DownloadProtocol.Torrent
  111. };
  112. var item = new DownloadClientItem()
  113. {
  114. Title = "The torrent release folder",
  115. DownloadId = "35238",
  116. DownloadClientInfo = new DownloadClientItemClientInfo
  117. {
  118. Protocol = client.Protocol,
  119. Id = client.Id,
  120. Name = client.Name
  121. }
  122. };
  123. var trackedDownload = Subject.TrackDownload(client, item);
  124. trackedDownload.Should().NotBeNull();
  125. trackedDownload.RemoteEpisode.Should().NotBeNull();
  126. trackedDownload.RemoteEpisode.Series.Should().NotBeNull();
  127. trackedDownload.RemoteEpisode.Series.Id.Should().Be(5);
  128. trackedDownload.RemoteEpisode.Episodes.First().Id.Should().Be(4);
  129. trackedDownload.RemoteEpisode.ParsedEpisodeInfo.SeasonNumber.Should().Be(0);
  130. trackedDownload.RemoteEpisode.MappedSeasonNumber.Should().Be(0);
  131. }
  132. [Test]
  133. public void should_unmap_tracked_download_if_episode_deleted()
  134. {
  135. GivenDownloadHistory();
  136. var remoteEpisode = new RemoteEpisode
  137. {
  138. Series = new Series() { Id = 5 },
  139. Episodes = new List<Episode> { new Episode { Id = 4 } },
  140. ParsedEpisodeInfo = new ParsedEpisodeInfo()
  141. {
  142. SeriesTitle = "TV Series",
  143. SeasonNumber = 1,
  144. EpisodeNumbers = new[] { 1 }
  145. },
  146. MappedSeasonNumber = 0
  147. };
  148. Mocker.GetMock<IParsingService>()
  149. .Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), null))
  150. .Returns(remoteEpisode);
  151. Mocker.GetMock<IHistoryService>()
  152. .Setup(s => s.FindByDownloadId(It.IsAny<string>()))
  153. .Returns(new List<EpisodeHistory>());
  154. var client = new DownloadClientDefinition()
  155. {
  156. Id = 1,
  157. Protocol = DownloadProtocol.Torrent
  158. };
  159. var item = new DownloadClientItem()
  160. {
  161. Title = "TV Series - S01E01",
  162. DownloadId = "12345",
  163. DownloadClientInfo = new DownloadClientItemClientInfo
  164. {
  165. Id = 1,
  166. Type = "Blackhole",
  167. Name = "Blackhole Client",
  168. Protocol = DownloadProtocol.Torrent
  169. }
  170. };
  171. Subject.TrackDownload(client, item);
  172. Subject.GetTrackedDownloads().Should().HaveCount(1);
  173. Mocker.GetMock<IParsingService>()
  174. .Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), null))
  175. .Returns(default(RemoteEpisode));
  176. Subject.Handle(new EpisodeInfoRefreshedEvent(remoteEpisode.Series, new List<Episode>(), new List<Episode>(), remoteEpisode.Episodes));
  177. var trackedDownloads = Subject.GetTrackedDownloads();
  178. trackedDownloads.Should().HaveCount(1);
  179. trackedDownloads.First().RemoteEpisode.Should().BeNull();
  180. }
  181. [Test]
  182. public void should_not_throw_when_processing_deleted_episodes()
  183. {
  184. GivenDownloadHistory();
  185. var remoteEpisode = new RemoteEpisode
  186. {
  187. Series = new Series() { Id = 5 },
  188. Episodes = new List<Episode> { new Episode { Id = 4 } },
  189. ParsedEpisodeInfo = new ParsedEpisodeInfo()
  190. {
  191. SeriesTitle = "TV Series",
  192. SeasonNumber = 1,
  193. EpisodeNumbers = new[] { 1 }
  194. },
  195. MappedSeasonNumber = 0
  196. };
  197. Mocker.GetMock<IParsingService>()
  198. .Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), null))
  199. .Returns(default(RemoteEpisode));
  200. Mocker.GetMock<IHistoryService>()
  201. .Setup(s => s.FindByDownloadId(It.IsAny<string>()))
  202. .Returns(new List<EpisodeHistory>());
  203. var client = new DownloadClientDefinition()
  204. {
  205. Id = 1,
  206. Protocol = DownloadProtocol.Torrent
  207. };
  208. var item = new DownloadClientItem()
  209. {
  210. Title = "TV Series - S01E01",
  211. DownloadId = "12345",
  212. DownloadClientInfo = new DownloadClientItemClientInfo
  213. {
  214. Id = 1,
  215. Type = "Blackhole",
  216. Name = "Blackhole Client",
  217. Protocol = DownloadProtocol.Torrent
  218. }
  219. };
  220. Subject.TrackDownload(client, item);
  221. Subject.GetTrackedDownloads().Should().HaveCount(1);
  222. Mocker.GetMock<IParsingService>()
  223. .Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), null))
  224. .Returns(default(RemoteEpisode));
  225. Subject.Handle(new EpisodeInfoRefreshedEvent(remoteEpisode.Series, new List<Episode>(), new List<Episode>(), remoteEpisode.Episodes));
  226. var trackedDownloads = Subject.GetTrackedDownloads();
  227. trackedDownloads.Should().HaveCount(1);
  228. trackedDownloads.First().RemoteEpisode.Should().BeNull();
  229. }
  230. [Test]
  231. public void should_not_throw_when_processing_deleted_series()
  232. {
  233. GivenDownloadHistory();
  234. var remoteEpisode = new RemoteEpisode
  235. {
  236. Series = new Series() { Id = 5 },
  237. Episodes = new List<Episode> { new Episode { Id = 4 } },
  238. ParsedEpisodeInfo = new ParsedEpisodeInfo()
  239. {
  240. SeriesTitle = "TV Series",
  241. SeasonNumber = 1,
  242. EpisodeNumbers = new[] { 1 }
  243. },
  244. MappedSeasonNumber = 0
  245. };
  246. Mocker.GetMock<IParsingService>()
  247. .Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), null))
  248. .Returns(default(RemoteEpisode));
  249. Mocker.GetMock<IHistoryService>()
  250. .Setup(s => s.FindByDownloadId(It.IsAny<string>()))
  251. .Returns(new List<EpisodeHistory>());
  252. var client = new DownloadClientDefinition()
  253. {
  254. Id = 1,
  255. Protocol = DownloadProtocol.Torrent
  256. };
  257. var item = new DownloadClientItem()
  258. {
  259. Title = "TV Series - S01E01",
  260. DownloadId = "12345",
  261. DownloadClientInfo = new DownloadClientItemClientInfo
  262. {
  263. Id = 1,
  264. Type = "Blackhole",
  265. Name = "Blackhole Client",
  266. Protocol = DownloadProtocol.Torrent
  267. }
  268. };
  269. Subject.TrackDownload(client, item);
  270. Subject.GetTrackedDownloads().Should().HaveCount(1);
  271. Mocker.GetMock<IParsingService>()
  272. .Setup(s => s.Map(It.IsAny<ParsedEpisodeInfo>(), It.IsAny<int>(), It.IsAny<int>(), null))
  273. .Returns(default(RemoteEpisode));
  274. Subject.Handle(new SeriesDeletedEvent(remoteEpisode.Series, true, true));
  275. var trackedDownloads = Subject.GetTrackedDownloads();
  276. trackedDownloads.Should().HaveCount(1);
  277. trackedDownloads.First().RemoteEpisode.Should().BeNull();
  278. }
  279. }
  280. }