using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using Moq; using NUnit.Framework; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Tv; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.ParserTests.ParsingServiceTests { [TestFixture] public class GetEpisodesFixture : TestBase { private Series _series; private List _episodes; private ParsedEpisodeInfo _parsedEpisodeInfo; private SingleEpisodeSearchCriteria _singleEpisodeSearchCriteria; [SetUp] public void Setup() { _series = Builder.CreateNew() .With(s => s.Title = "30 Rock") .With(s => s.CleanTitle = "rock") .Build(); _episodes = Builder.CreateListOfSize(1) .All() .With(e => e.AirDate = DateTime.Today.ToString(Episode.AIR_DATE_FORMAT)) .Build() .ToList(); _parsedEpisodeInfo = new ParsedEpisodeInfo { SeriesTitle = _series.Title, SeasonNumber = 1, EpisodeNumbers = new[] { 1 } }; _singleEpisodeSearchCriteria = new SingleEpisodeSearchCriteria { Series = _series, EpisodeNumber = _episodes.First().EpisodeNumber, SeasonNumber = _episodes.First().SeasonNumber, Episodes = _episodes }; Mocker.GetMock() .Setup(s => s.FindByTitle(It.IsAny())) .Returns(_series); } private void GivenDailySeries() { _series.SeriesType = SeriesTypes.Daily; } private void GivenDailyParseResult() { _parsedEpisodeInfo.AirDate = DateTime.Today; } private void GivenSceneNumberingSeries() { _series.UseSceneNumbering = true; } [Test] public void should_get_daily_episode_episode_when_search_criteria_is_null() { GivenDailySeries(); GivenDailyParseResult(); Subject.Map(_parsedEpisodeInfo, _series.TvRageId); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny()), Times.Once()); } [Test] public void should_use_search_criteria_episode_when_it_matches_daily() { GivenDailySeries(); GivenDailyParseResult(); Subject.Map(_parsedEpisodeInfo, _series.TvRageId, _singleEpisodeSearchCriteria); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny()), Times.Never()); } [Test] public void should_fallback_to_daily_episode_lookup_when_search_criteria_episode_doesnt_match() { GivenDailySeries(); _parsedEpisodeInfo.AirDate = DateTime.Today.AddDays(-5); Subject.Map(_parsedEpisodeInfo, _series.TvRageId, _singleEpisodeSearchCriteria); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny()), Times.Once()); } [Test] public void should_use_scene_numbering_when_series_uses_scene_numbering() { GivenSceneNumberingSeries(); Subject.Map(_parsedEpisodeInfo, _series.TvRageId); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny(), true), Times.Once()); } [Test] public void should_match_search_criteria_by_scene_numbering() { GivenSceneNumberingSeries(); Subject.Map(_parsedEpisodeInfo, _series.TvRageId, _singleEpisodeSearchCriteria); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny(), true), Times.Never()); } [Test] public void should_fallback_to_findEpisode_when_search_criteria_match_fails_for_scene_numbering() { GivenSceneNumberingSeries(); _episodes.First().SceneEpisodeNumber = 10; Subject.Map(_parsedEpisodeInfo, _series.TvRageId, _singleEpisodeSearchCriteria); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny(), true), Times.Once()); } [Test] public void should_find_episode() { Subject.Map(_parsedEpisodeInfo, _series.TvRageId); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny(), false), Times.Once()); } [Test] public void should_match_episode_with_search_criteria() { Subject.Map(_parsedEpisodeInfo, _series.TvRageId, _singleEpisodeSearchCriteria); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny(), false), Times.Never()); } [Test] public void should_fallback_to_findEpisode_when_search_criteria_match_fails() { _episodes.First().EpisodeNumber = 10; Subject.Map(_parsedEpisodeInfo, _series.TvRageId, _singleEpisodeSearchCriteria); Mocker.GetMock() .Verify(v => v.FindEpisode(It.IsAny(), It.IsAny(), It.IsAny(), false), Times.Once()); } } }