using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Common; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.Metadata; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common.AutoMoq; using NzbDrone.Test.Common; using TvdbLib.Data; using TvdbLib.Data.Banner; namespace NzbDrone.Core.Test.ProviderTests.Metadata { [TestFixture] // ReSharper disable InconsistentNaming public class Xbmc_ForEpisoddeFile_Fixture : CoreTest { private Series series; private EpisodeFile episodeFile; private TvdbSeries tvdbSeries; [SetUp] public void Setup() { WithTempAsAppPath(); series = Builder .CreateNew() .With(s => s.SeriesId == 79488) .With(s => s.Title == "30 Rock") .Build(); episodeFile = Builder.CreateNew() .With(f => f.SeriesId = 79488) .With(f => f.SeasonNumber = 1) .With(f => f.Path = @"C:\Test\30 Rock\Season 01\30 Rock - S01E01 - Pilot.avi") .Build(); var tvdbEpisodes = Builder.CreateListOfSize(2) .All() .With(e => e.SeriesId = 79488) .With(e => e.SeasonNumber = 1) .With(e => e.Directors = new List{ "Fake Director" }) .With(e => e.Writer = new List{ "Fake Writer" }) .With(e => e.GuestStars = new List { "Guest Star 1", "Guest Star 2", "Guest Star 3", "" }) .Build(); var seasonBanners = Builder .CreateListOfSize(4) .TheFirst(2) .With(b => b.Season = 1) .TheLast(2) .With(b => b.Season = 2) .TheFirst(1) .With(b => b.BannerType = TvdbSeasonBanner.Type.season) .With(b => b.BannerPath = "seasons/79488-1-1.jpg") .TheNext(2) .With(b => b.BannerType = TvdbSeasonBanner.Type.seasonwide) .With(b => b.BannerPath = "banners/seasons/79488-test.jpg") .TheLast(1) .With(b => b.BannerType = TvdbSeasonBanner.Type.season) .With(b => b.BannerPath = "seasons/79488-2-1.jpg") .Build(); var seriesActors = Builder .CreateListOfSize(5) .All() .With(a => a.ActorImage = Builder.CreateNew().Build()) .Build(); tvdbSeries = Builder .CreateNew() .With(s => s.Id = 79488) .With(s => s.SeriesName = "30 Rock") .With(s => s.TvdbActors = seriesActors.ToList()) .With(s => s.Episodes = tvdbEpisodes.ToList()) .Build(); tvdbSeries.Banners.AddRange(seasonBanners); } private void WithUseBanners() { Mocker.GetMock().SetupGet(s => s.MetadataUseBanners).Returns(true); } private void WithSingleEpisodeFile() { var episode = Builder.CreateNew() .With(e => e.SeasonNumber = 1) .With(e => e.SeriesId = 79488) .With(e => e.EpisodeNumber = 1) .Build(); Mocker.GetMock() .Setup(s => s.GetEpisodesByFileId(episodeFile.EpisodeFileId)) .Returns(new List { episode }); } private void WithMultiEpisodeFile() { var episodes = Builder.CreateListOfSize(2) .All() .With(e => e.SeriesId = 79488) .With(e => e.SeasonNumber = 1) .Build(); Mocker.GetMock() .Setup(s => s.GetEpisodesByFileId(episodeFile.EpisodeFileId)) .Returns(episodes.ToList()); } private void WithNoDirectors() { tvdbSeries.Episodes.ForEach(e => e.Directors = new List()); } private void WithNoWriters() { tvdbSeries.Episodes.ForEach(e => e.Writer = new List()); } [Test] public void should_not_blowup() { WithSingleEpisodeFile(); Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); } [Test] public void should_call_diskprovider_writeAllText_once_for_single_episode() { WithSingleEpisodeFile(); Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); Mocker.GetMock().Verify(v => v.WriteAllText(episodeFile.Path.Replace("avi", "nfo"), It.IsAny()), Times.Once()); } [Test] public void should_call_diskprovider_writeAllText_once_for_multi_episode() { WithMultiEpisodeFile(); Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); Mocker.GetMock().Verify(v => v.WriteAllText(episodeFile.Path.Replace("avi", "nfo"), It.IsAny()), Times.Once()); } [Test] public void should_download_thumbnail_when_thumbnail_path_is_not_null() { WithSingleEpisodeFile(); Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); Mocker.GetMock().Verify(v => v.Download(tvdbSeries.Episodes.First().BannerPath, episodeFile.Path.Replace("avi", "tbn")), Times.Once()); } [Test] public void should_not_blowup_when_director_is_not_found() { WithSingleEpisodeFile(); WithNoDirectors(); Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); } [Test] public void should_not_blowup_when_writer_is_not_found() { WithSingleEpisodeFile(); WithNoWriters(); Mocker.Resolve().CreateForEpisodeFile(episodeFile, tvdbSeries); } } }