using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.MetadataSource; using NzbDrone.Core.Tv; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.TvTests { [TestFixture] public class RefreshEpisodeServiceFixture : CoreTest { private List _insertedEpisodes; private List _updatedEpisodes; private List _deletedEpisodes; private Tuple> _gameOfThrones; [TestFixtureSetUp] public void TestFixture() { _gameOfThrones = Mocker.Resolve().GetSeriesInfo(121361);//Game of thrones } private List GetEpisodes() { return _gameOfThrones.Item2.JsonClone(); } private Series GetSeries() { var series = _gameOfThrones.Item1.JsonClone(); series.Seasons = new List(); return series; } [SetUp] public void Setup() { _insertedEpisodes = new List(); _updatedEpisodes = new List(); _deletedEpisodes = new List(); Mocker.GetMock().Setup(c => c.InsertMany(It.IsAny>())) .Callback>(e => _insertedEpisodes = e); Mocker.GetMock().Setup(c => c.UpdateMany(It.IsAny>())) .Callback>(e => _updatedEpisodes = e); Mocker.GetMock().Setup(c => c.DeleteMany(It.IsAny>())) .Callback>(e => _deletedEpisodes = e); } [Test] public void should_create_all_when_no_existing_episodes() { Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(new List()); Subject.RefreshEpisodeInfo(GetSeries(), GetEpisodes()); _insertedEpisodes.Should().HaveSameCount(GetEpisodes()); _updatedEpisodes.Should().BeEmpty(); _deletedEpisodes.Should().BeEmpty(); } [Test] public void should_update_all_when_all_existing_episodes() { Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(GetEpisodes()); Subject.RefreshEpisodeInfo(GetSeries(), GetEpisodes()); _insertedEpisodes.Should().BeEmpty(); _updatedEpisodes.Should().HaveSameCount(GetEpisodes()); _deletedEpisodes.Should().BeEmpty(); } [Test] public void should_delete_all_when_all_existing_episodes_are_gone_from_trakt() { Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(GetEpisodes()); Subject.RefreshEpisodeInfo(GetSeries(), new List()); _insertedEpisodes.Should().BeEmpty(); _updatedEpisodes.Should().BeEmpty(); _deletedEpisodes.Should().HaveSameCount(GetEpisodes()); } [Test] public void should_delete_duplicated_episodes_based_on_season_episode_number() { var duplicateEpisodes = GetEpisodes().Skip(5).Take(2).ToList(); Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(GetEpisodes().Union(duplicateEpisodes).ToList()); Subject.RefreshEpisodeInfo(GetSeries(), GetEpisodes()); _insertedEpisodes.Should().BeEmpty(); _updatedEpisodes.Should().HaveSameCount(GetEpisodes()); _deletedEpisodes.Should().HaveSameCount(duplicateEpisodes); } [Test] public void should_update_tvdb_episode_id_when_it_changes() { var existingEpisode = Builder .CreateNew() .With(e => e.TvDbEpisodeId = 55) .Build(); var newEpisode = Builder .CreateNew() .With(e => e.TvDbEpisodeId = 99) .Build(); existingEpisode.ShouldHave().AllPropertiesBut(e => e.TvDbEpisodeId).EqualTo(newEpisode); Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(new List { existingEpisode }); Subject.RefreshEpisodeInfo(GetSeries(), new List { newEpisode }); _insertedEpisodes.Should().BeEmpty(); _updatedEpisodes.Should().Contain(e => e.TvDbEpisodeId == newEpisode.TvDbEpisodeId); _deletedEpisodes.Should().BeEmpty(); } [Test] public void should_not_change_monitored_status_for_existing_episodes() { var series = GetSeries(); series.Seasons = new List(); series.Seasons.Add(new Season { SeasonNumber = 1, Monitored = false }); var episodes = GetEpisodes(); episodes.ForEach(e => e.Monitored = true); Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(episodes); Subject.RefreshEpisodeInfo(series, GetEpisodes()); _updatedEpisodes.Should().HaveSameCount(GetEpisodes()); _updatedEpisodes.Should().OnlyContain(e => e.Monitored == true); } [Test] public void should_remove_duplicate_remote_episodes_before_processing() { Mocker.GetMock().Setup(c => c.GetEpisodeBySeries(It.IsAny())) .Returns(new List()); var episodes = Builder.CreateListOfSize(5) .TheFirst(2) .With(e => e.SeasonNumber = 1) .With(e => e.EpisodeNumber = 1) .Build() .ToList(); Subject.RefreshEpisodeInfo(GetSeries(), episodes); _insertedEpisodes.Should().HaveCount(episodes.Count - 1); _updatedEpisodes.Should().BeEmpty(); _deletedEpisodes.Should().BeEmpty(); } } }