diff --git a/NzbDrone.Core.Test/TvTests/EpisodeRepositoryTests/EpisodesWithoutFilesFixture.cs b/NzbDrone.Core.Test/TvTests/EpisodeRepositoryTests/EpisodesWithoutFilesFixture.cs index 2b1559a9b..135d6d8c6 100644 --- a/NzbDrone.Core.Test/TvTests/EpisodeRepositoryTests/EpisodesWithoutFilesFixture.cs +++ b/NzbDrone.Core.Test/TvTests/EpisodeRepositoryTests/EpisodesWithoutFilesFixture.cs @@ -1,4 +1,5 @@ -using FizzWare.NBuilder; +using System; +using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Datastore; @@ -10,41 +11,71 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeRepositoryTests [TestFixture] public class EpisodesWithoutFilesFixture : DbTest { + private Series _monitoredSeries; + private Series _unmonitoredSeries; + private PagingSpec _pagingSpec; + [SetUp] public void Setup() { - var series = Builder.CreateNew() + _monitoredSeries = Builder.CreateNew() .With(s => s.Id = 0) .With(s => s.Runtime = 30) .With(s => s.Monitored = true) .Build(); - series.Id = Db.Insert(series).Id; + _unmonitoredSeries = Builder.CreateNew() + .With(s => s.Id = 0) + .With(s => s.Runtime = 30) + .With(s => s.Monitored = false) + .Build(); + + _monitoredSeries.Id = Db.Insert(_monitoredSeries).Id; + _unmonitoredSeries.Id = Db.Insert(_unmonitoredSeries).Id; - var episodes = Builder.CreateListOfSize(2) + _pagingSpec = new PagingSpec + { + Page = 1, + PageSize = 10, + SortKey = "AirDate", + SortDirection = SortDirection.Ascending + }; + + var monitoredSeriesEpisodes = Builder.CreateListOfSize(3) .All() .With(e => e.Id = 0) - .With(e => e.SeriesId = series.Id) + .With(e => e.SeriesId = _monitoredSeries.Id) .With(e => e.EpisodeFileId = 0) + .With(e => e.AirDate = DateTime.Now.AddDays(-5)) .With(e => e.Monitored = true) + .TheFirst(1) + .With(e => e.Monitored = false) .TheLast(1) .With(e => e.SeasonNumber = 0) .Build(); - Db.InsertMany(episodes); + var unmonitoredSeriesEpisodes = Builder.CreateListOfSize(3) + .All() + .With(e => e.Id = 0) + .With(e => e.SeriesId = _unmonitoredSeries.Id) + .With(e => e.EpisodeFileId = 0) + .With(e => e.AirDate = DateTime.Now.AddDays(-5)) + .With(e => e.Monitored = true) + .TheFirst(1) + .With(e => e.Monitored = false) + .TheLast(1) + .With(e => e.SeasonNumber = 0) + .Build(); + + Db.InsertMany(monitoredSeriesEpisodes); + Db.InsertMany(unmonitoredSeriesEpisodes); } [Test] - public void should_get_episodes() + public void should_get_monitored_episodes() { - var episodes = - Subject.EpisodesWithoutFiles(new PagingSpec - { - Page = 1, - PageSize = 10, - SortKey = "AirDate", - SortDirection = SortDirection.Ascending - }, false); + var episodes = Subject.EpisodesWithoutFiles(_pagingSpec, false); + episodes.Records.Should().HaveCount(1); } @@ -52,15 +83,33 @@ namespace NzbDrone.Core.Test.TvTests.EpisodeRepositoryTests [Ignore("Specials not implemented")] public void should_get_episode_including_specials() { - var episodes = - Subject.EpisodesWithoutFiles(new PagingSpec - { - Page = 1, - PageSize = 10, - SortKey = "AirDate", - SortDirection = SortDirection.Ascending - }, true); + var episodes = Subject.EpisodesWithoutFiles(_pagingSpec, true); + episodes.Records.Should().HaveCount(2); } + + [Test] + public void should_not_include_unmonitored_episodes() + { + var episodes = Subject.EpisodesWithoutFiles(_pagingSpec, false); + + episodes.Records.Should().NotContain(e => e.Monitored == false); + } + + [Test] + public void should_not_contain_unmonitored_series() + { + var episodes = Subject.EpisodesWithoutFiles(_pagingSpec, false); + + episodes.Records.Should().NotContain(e => e.SeriesId == _unmonitoredSeries.Id); + } + + [Test] + public void should_have_count_of_one() + { + var episodes = Subject.EpisodesWithoutFiles(_pagingSpec, false); + + episodes.TotalRecords.Should().Be(1); + } } } diff --git a/NzbDrone.Core/Tv/EpisodeRepository.cs b/NzbDrone.Core/Tv/EpisodeRepository.cs index 2b7934b9d..b7545cd21 100644 --- a/NzbDrone.Core/Tv/EpisodeRepository.cs +++ b/NzbDrone.Core/Tv/EpisodeRepository.cs @@ -82,20 +82,8 @@ namespace NzbDrone.Core.Tv startingSeasonNumber = 0; } - var pagingQuery = Query.Join(JoinType.Inner, e => e.Series, (e, s) => e.SeriesId == s.Id) - .Where(e => e.EpisodeFileId == 0) - .AndWhere(e => e.SeasonNumber >= startingSeasonNumber) - .AndWhere(e => e.AirDate <= currentTime) - .AndWhere(e => e.Monitored) - .AndWhere(e => e.Series.Monitored) - .OrderBy(pagingSpec.OrderByClause(), pagingSpec.ToSortDirection()) - .Skip(pagingSpec.PagingOffset()) - .Take(pagingSpec.PageSize); - - pagingSpec.Records = pagingQuery.ToList(); - - //TODO: Use the same query for count and records - pagingSpec.TotalRecords = Query.Count(e => e.EpisodeFileId == 0 && e.SeasonNumber >= startingSeasonNumber && e.AirDate <= currentTime); + pagingSpec.Records = GetEpisodesWithoutFilesQuery(pagingSpec, currentTime, startingSeasonNumber).ToList(); + pagingSpec.TotalRecords = GetEpisodesWithoutFilesQuery(pagingSpec, currentTime, startingSeasonNumber).GetRowCount(); return pagingSpec; } @@ -151,5 +139,18 @@ namespace NzbDrone.Core.Tv { SetFields(new Episode { Id = episodeId, EpisodeFileId = fileId }, episode => episode.EpisodeFileId); } + + private SortBuilder GetEpisodesWithoutFilesQuery(PagingSpec pagingSpec, DateTime currentTime, int startingSeasonNumber) + { + return Query.Join(JoinType.Inner, e => e.Series, (e, s) => e.SeriesId == s.Id) + .Where(e => e.EpisodeFileId == 0) + .AndWhere(e => e.SeasonNumber >= startingSeasonNumber) + .AndWhere(e => e.AirDate <= currentTime) + .AndWhere(e => e.Monitored) + .AndWhere(e => e.Series.Monitored) + .OrderBy(pagingSpec.OrderByClause(), pagingSpec.ToSortDirection()) + .Skip(pagingSpec.PagingOffset()) + .Take(pagingSpec.PageSize); + } } }