using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common.Crypto; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Test.Download.Pending.PendingReleaseServiceTests { [TestFixture] public class RemovePendingObsoleteFixture : CoreTest { private List _pending; private Episode _episode; [SetUp] public void Setup() { _pending = new List(); _episode = Builder.CreateNew() .Build(); Mocker.GetMock() .Setup(s => s.AllBySeriesId(It.IsAny())) .Returns(_pending); Mocker.GetMock() .Setup(s => s.All()) .Returns(_pending); Mocker.GetMock() .Setup(s => s.GetSeries(It.IsAny())) .Returns(new Series()); Mocker.GetMock() .Setup(s => s.GetSeries(It.IsAny>())) .Returns(new List { new Series() }); Mocker.GetMock() .Setup(s => s.Map(It.IsAny(), It.IsAny())) .Returns(new RemoteEpisode { Episodes = new List { _episode } }); Mocker.GetMock() .Setup(s => s.GetEpisodes(It.IsAny(), It.IsAny(), It.IsAny(), null)) .Returns(new List { _episode }); } private void AddPending(int id, int seasonNumber, int[] episodes) { _pending.Add(new PendingRelease { Id = id, Title = "Series.Title.S01E05.abc-Sonarr", ParsedEpisodeInfo = new ParsedEpisodeInfo { SeasonNumber = seasonNumber, EpisodeNumbers = episodes }, Release = Builder.CreateNew().Build() }); } [Test] public void should_remove_same_release() { AddPending(id: 1, seasonNumber: 2, episodes: new[] { 3 }); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-ep{1}", 1, _episode.Id)); Subject.RemovePendingQueueItemsObsolete(queueId); AssertRemoved(1); } [Test] public void should_remove_multiple_releases_release() { AddPending(id: 1, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 2, seasonNumber: 2, episodes: new[] { 2 }); AddPending(id: 3, seasonNumber: 2, episodes: new[] { 3 }); AddPending(id: 4, seasonNumber: 2, episodes: new[] { 3 }); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-ep{1}", 3, _episode.Id)); Subject.RemovePendingQueueItemsObsolete(queueId); AssertRemoved(3, 4); } [Test] public void should_not_remove_different_season() { AddPending(id: 1, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 2, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 3, seasonNumber: 3, episodes: new[] { 1 }); AddPending(id: 4, seasonNumber: 3, episodes: new[] { 1 }); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-ep{1}", 1, _episode.Id)); Subject.RemovePendingQueueItemsObsolete(queueId); AssertRemoved(1, 2); } [Test] public void should_not_remove_different_episodes() { AddPending(id: 1, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 2, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 3, seasonNumber: 2, episodes: new[] { 2 }); AddPending(id: 4, seasonNumber: 2, episodes: new[] { 3 }); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-ep{1}", 1, _episode.Id)); Subject.RemovePendingQueueItemsObsolete(queueId); AssertRemoved(1, 2); } [Test] public void should_not_remove_multiepisodes() { AddPending(id: 1, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 2, seasonNumber: 2, episodes: new[] { 1, 2 }); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-ep{1}", 1, _episode.Id)); Subject.RemovePendingQueueItemsObsolete(queueId); AssertRemoved(1); } [Test] public void should_not_remove_singleepisodes() { AddPending(id: 1, seasonNumber: 2, episodes: new[] { 1 }); AddPending(id: 2, seasonNumber: 2, episodes: new[] { 1, 2 }); var queueId = HashConverter.GetHashInt31(string.Format("pending-{0}-ep{1}", 2, _episode.Id)); Subject.RemovePendingQueueItemsObsolete(queueId); AssertRemoved(2); } private void AssertRemoved(params int[] ids) { Mocker.GetMock().Verify(c => c.DeleteMany(It.Is>(s => s.SequenceEqual(ids)))); } } }