using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Common.Extensions; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Test.TvTests.SeriesAddedHandlerTests { [TestFixture] public class SetEpisodeMontitoredFixture : CoreTest { private Series _series; private List _episodes; [SetUp] public void Setup() { var seasons = 4; _series = Builder.CreateNew() .With(s => s.Seasons = Builder.CreateListOfSize(seasons) .All() .With(n => n.Monitored = true) .Build() .ToList()) .Build(); _episodes = Builder.CreateListOfSize(seasons) .All() .With(e => e.Monitored = true) .With(e => e.AirDateUtc = DateTime.UtcNow.AddDays(-7)) //Missing .TheFirst(1) .With(e => e.EpisodeFileId = 0) //Has File .TheNext(1) .With(e => e.EpisodeFileId = 1) //Future .TheNext(1) .With(e => e.EpisodeFileId = 0) .With(e => e.AirDateUtc = DateTime.UtcNow.AddDays(7)) //Future/TBA .TheNext(1) .With(e => e.EpisodeFileId = 0) .With(e => e.AirDateUtc = null) .Build() .ToList(); Mocker.GetMock() .Setup(s => s.GetEpisodeBySeries(It.IsAny())) .Returns(_episodes); } private void WithSeriesAddedEvent(AddSeriesOptions options) { _series.AddOptions = options; } private void TriggerSeriesScannedEvent() { Subject.Handle(new SeriesScannedEvent(_series)); } private void GivenSpecials() { foreach (var episode in _episodes) { episode.SeasonNumber = 0; } _series.Seasons = new List{new Season { Monitored = false, SeasonNumber = 0 }}; } [Test] public void should_be_able_to_monitor_all_episodes() { WithSeriesAddedEvent(new AddSeriesOptions()); TriggerSeriesScannedEvent(); Mocker.GetMock() .Verify(v => v.UpdateEpisodes(It.Is>(l => l.All(e => e.Monitored)))); } [Test] public void should_be_able_to_monitor_missing_episodes_only() { WithSeriesAddedEvent(new AddSeriesOptions { IgnoreEpisodesWithFiles = true, IgnoreEpisodesWithoutFiles = false }); TriggerSeriesScannedEvent(); VerifyMonitored(e => !e.HasFile); VerifyNotMonitored(e => e.HasFile); } [Test] public void should_be_able_to_monitor_new_episodes_only() { WithSeriesAddedEvent(new AddSeriesOptions { IgnoreEpisodesWithFiles = true, IgnoreEpisodesWithoutFiles = true }); TriggerSeriesScannedEvent(); VerifyMonitored(e => e.AirDateUtc.HasValue && e.AirDateUtc.Value.After(DateTime.UtcNow)); VerifyMonitored(e => !e.AirDateUtc.HasValue); VerifyNotMonitored(e => e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)); } [Test] public void should_not_monitor_missing_specials() { GivenSpecials(); WithSeriesAddedEvent(new AddSeriesOptions { IgnoreEpisodesWithFiles = true, IgnoreEpisodesWithoutFiles = false }); TriggerSeriesScannedEvent(); VerifyMonitored(e => !e.HasFile); VerifyNotMonitored(e => e.HasFile); } [Test] public void should_not_monitor_new_specials() { GivenSpecials(); WithSeriesAddedEvent(new AddSeriesOptions { IgnoreEpisodesWithFiles = true, IgnoreEpisodesWithoutFiles = true }); TriggerSeriesScannedEvent(); VerifyMonitored(e => e.AirDateUtc.HasValue && e.AirDateUtc.Value.After(DateTime.UtcNow)); VerifyMonitored(e => !e.AirDateUtc.HasValue); VerifyNotMonitored(e => e.AirDateUtc.HasValue && e.AirDateUtc.Value.Before(DateTime.UtcNow)); } [Test] public void should_not_monitor_season_when_all_episodes_are_monitored_except_latest_season() { _series.Seasons = Builder.CreateListOfSize(2) .All() .With(n => n.Monitored = true) .Build() .ToList(); _episodes = Builder.CreateListOfSize(5) .All() .With(e => e.SeasonNumber = 1) .With(e => e.EpisodeFileId = 0) .With(e => e.AirDateUtc = DateTime.UtcNow.AddDays(-5)) .TheLast(1) .With(e => e.SeasonNumber = 2) .Build() .ToList(); Mocker.GetMock() .Setup(s => s.GetEpisodeBySeries(It.IsAny())) .Returns(_episodes); WithSeriesAddedEvent(new AddSeriesOptions { IgnoreEpisodesWithoutFiles = true }); TriggerSeriesScannedEvent(); VerifySeasonMonitored(n => n.SeasonNumber == 2); VerifySeasonNotMonitored(n => n.SeasonNumber == 1); } private void VerifyMonitored(Func predicate) { Mocker.GetMock() .Verify(v => v.UpdateEpisodes(It.Is>(l => l.Where(predicate).All(e => e.Monitored)))); } private void VerifyNotMonitored(Func predicate) { Mocker.GetMock() .Verify(v => v.UpdateEpisodes(It.Is>(l => l.Where(predicate).All(e => !e.Monitored)))); } private void VerifySeasonMonitored(Func predicate) { Mocker.GetMock() .Verify(v => v.UpdateSeries(It.Is(s => s.Seasons.Where(predicate).All(n => n.Monitored)))); } private void VerifySeasonNotMonitored(Func predicate) { Mocker.GetMock() .Verify(v => v.UpdateSeries(It.Is(s => s.Seasons.Where(predicate).All(n => !n.Monitored)))); } } }