using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NzbDrone.Common.Extensions; using NzbDrone.Core.Languages; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Qualities; using NzbDrone.Core.SeriesStats; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Test.SeriesStatsTests { [TestFixture] public class SeriesStatisticsFixture : DbTest { private Series _series; private Episode _episode; private EpisodeFile _episodeFile; [SetUp] public void Setup() { _series = Builder.CreateNew() .With(s => s.Runtime = 30) .BuildNew(); _series.Id = Db.Insert(_series).Id; _episode = Builder.CreateNew() .With(e => e.EpisodeFileId = 0) .With(e => e.Monitored = false) .With(e => e.SeriesId = _series.Id) .With(e => e.AirDateUtc = DateTime.Today.AddDays(5)) .BuildNew(); _episodeFile = Builder.CreateNew() .With(e => e.SeriesId = _series.Id) .With(e => e.Quality = new QualityModel(Quality.HDTV720p)) .With(e => e.Languages = new List { Language.English }) .BuildNew(); } private void GivenEpisodeWithFile() { _episode.EpisodeFileId = 1; } private void GivenOldEpisode() { _episode.AirDateUtc = DateTime.Now.AddSeconds(-10); } private void GivenMonitoredEpisode() { _episode.Monitored = true; } private void GivenEpisode() { Db.Insert(_episode); } private void GivenEpisodeFile() { Db.Insert(_episodeFile); } [Test] public void should_get_stats_for_series() { GivenMonitoredEpisode(); GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().NextAiring.Should().BeCloseTo(_episode.AirDateUtc.Value, TimeSpan.FromMilliseconds(1000)); stats.First().PreviousAiring.Should().NotHaveValue(); } [Test] public void should_not_have_next_airing_for_episode_with_file() { GivenEpisodeWithFile(); GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().NextAiring.Should().NotHaveValue(); } [Test] public void should_have_previous_airing_for_old_episode_with_file() { GivenEpisodeWithFile(); GivenOldEpisode(); GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().NextAiring.Should().NotHaveValue(); stats.First().PreviousAiring.Should().BeCloseTo(_episode.AirDateUtc.Value, TimeSpan.FromMilliseconds(1000)); } [Test] public void should_have_previous_airing_for_old_episode_without_file_monitored() { GivenMonitoredEpisode(); GivenOldEpisode(); GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().NextAiring.Should().NotHaveValue(); stats.First().PreviousAiring.Should().BeCloseTo(_episode.AirDateUtc.Value, TimeSpan.FromMilliseconds(1000)); } [Test] public void should_not_have_previous_airing_for_old_episode_without_file_unmonitored() { GivenOldEpisode(); GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().NextAiring.Should().NotHaveValue(); stats.First().PreviousAiring.Should().NotHaveValue(); } [Test] public void should_not_include_unmonitored_episode_in_episode_count() { GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().EpisodeCount.Should().Be(0); } [Test] public void should_include_unmonitored_episode_with_file_in_episode_count() { GivenEpisodeWithFile(); GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().EpisodeCount.Should().Be(1); } [Test] public void should_have_size_on_disk_of_zero_when_no_episode_file() { GivenEpisode(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().SizeOnDisk.Should().Be(0); } [Test] public void should_have_size_on_disk_when_episode_file_exists() { GivenEpisodeWithFile(); GivenEpisode(); GivenEpisodeFile(); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().SizeOnDisk.Should().Be(_episodeFile.Size); } [Test] public void should_not_duplicate_size_for_multi_episode_files() { GivenEpisodeWithFile(); GivenEpisode(); GivenEpisodeFile(); var episode2 = _episode.JsonClone(); episode2.Id = 0; episode2.EpisodeNumber += 1; Db.Insert(episode2); var stats = Subject.SeriesStatistics(); stats.Should().HaveCount(1); stats.First().SizeOnDisk.Should().Be(_episodeFile.Size); } } }