From 431d850d32a36e8bed47c1c0d393ae921c6fe3be Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Mon, 20 Jun 2011 00:13:17 -0700 Subject: [PATCH] SeriesProvider gets QualityProfile in single call to DB. SeriesProvider.GetAllSeriesWithEpisodeCount gets seasonCount(with or without specials), total episode count & episodeWithFile count (excluding ignored episodes). Added tests for SeriesWithEpisodeCount. --- NzbDrone.Core.Test/SeriesProviderTest.cs | 141 ++++++++++++++++++- NzbDrone.Core/Providers/SeriesProvider.cs | 46 ++++-- NzbDrone.Core/Repository/Series.cs | 16 ++- NzbDrone.Web/Controllers/SeriesController.cs | 49 +++---- NzbDrone.Web/Models/SeriesModel.cs | 2 + NzbDrone.Web/Views/Series/Index.cshtml | 34 +---- 6 files changed, 197 insertions(+), 91 deletions(-) diff --git a/NzbDrone.Core.Test/SeriesProviderTest.cs b/NzbDrone.Core.Test/SeriesProviderTest.cs index 9064eb8d5..0ce55b3ab 100644 --- a/NzbDrone.Core.Test/SeriesProviderTest.cs +++ b/NzbDrone.Core.Test/SeriesProviderTest.cs @@ -65,11 +65,13 @@ namespace NzbDrone.Core.Test mocker.GetMock() .Setup(c => c.UseSeasonFolder).Returns(useSeasonFolder); - mocker.SetConstant(MockLib.GetEmptyDatabase()); - - + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + var fakeProfiles = Builder.CreateListOfSize(2).Build(); + db.InsertMany(fakeProfiles); + const string path = "C:\\Test\\"; const int tvDbId = 1234; const int qualityProfileId = 2; @@ -78,8 +80,6 @@ namespace NzbDrone.Core.Test var seriesProvider = mocker.Resolve(); seriesProvider.AddSeries(path, tvDbId, qualityProfileId); - - //Assert var series = seriesProvider.GetAllSeries(); series.Should().HaveCount(1); @@ -104,7 +104,6 @@ namespace NzbDrone.Core.Test Assert.IsNull(series); } - [Test] [ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Sequence contains no elements")] public void Get_series_invalid_series_id_should_return_null() @@ -233,6 +232,7 @@ namespace NzbDrone.Core.Test .With(c => c.SeriesId = 11) .Build()); + db.InsertMany(Builder.CreateListOfSize(3).Build()); //Act, Assert var provider = mocker.Resolve(); @@ -240,5 +240,134 @@ namespace NzbDrone.Core.Test Assert.IsFalse(provider.IsMonitored(11)); Assert.IsFalse(provider.IsMonitored(1)); } + + [Test] + public void Get_Series_With_Count() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeQuality = Builder.CreateNew().Build(); + var fakeSeries = Builder.CreateNew().With(e => e.QualityProfileId = fakeQuality.QualityProfileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(10).WhereAll().Have(e => e.SeriesId = fakeSeries.SeriesId).Have(e => e.Ignored = false).WhereRandom(5).Have(e => e.EpisodeFileId = 0).Build(); + + db.Insert(fakeSeries); + db.Insert(fakeQuality); + db.InsertMany(fakeEpisodes); + + //Act + mocker.Resolve(); + var series = mocker.Resolve().GetAllSeriesWithEpisodeCount(true); + + //Assert + series.Should().HaveCount(1); + Assert.AreEqual(10, series[0].EpisodeCount); + Assert.AreEqual(5, series[0].EpisodeFileCount); + } + + [Test] + public void Get_Series_With_Count_AllIgnored() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeQuality = Builder.CreateNew().Build(); + var fakeSeries = Builder.CreateNew().With(e => e.QualityProfileId = fakeQuality.QualityProfileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(10).WhereAll().Have(e => e.SeriesId = fakeSeries.SeriesId).Have(e => e.Ignored = true).WhereRandom(5).Have(e => e.EpisodeFileId = 0).Build(); + + db.Insert(fakeSeries); + db.Insert(fakeQuality); + db.InsertMany(fakeEpisodes); + + //Act + mocker.Resolve(); + var series = mocker.Resolve().GetAllSeriesWithEpisodeCount(true); + + //Assert + series.Should().HaveCount(1); + Assert.AreEqual(0, series[0].EpisodeCount); + Assert.AreEqual(0, series[0].EpisodeFileCount); + } + + [Test] + public void Get_Series_With_Count_AllDownloaded() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeQuality = Builder.CreateNew().Build(); + var fakeSeries = Builder.CreateNew().With(e => e.QualityProfileId = fakeQuality.QualityProfileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(10).WhereAll().Have(e => e.SeriesId = fakeSeries.SeriesId).Have(e => e.Ignored = false).Build(); + + db.Insert(fakeSeries); + db.Insert(fakeQuality); + db.InsertMany(fakeEpisodes); + + //Act + mocker.Resolve(); + var series = mocker.Resolve().GetAllSeriesWithEpisodeCount(true); + + //Assert + series.Should().HaveCount(1); + Assert.AreEqual(10, series[0].EpisodeCount); + Assert.AreEqual(10, series[0].EpisodeFileCount); + } + + [Test] + public void Get_Series_With_Count_Half_Ignored() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeQuality = Builder.CreateNew().Build(); + var fakeSeries = Builder.CreateNew().With(e => e.QualityProfileId = fakeQuality.QualityProfileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(10) + .WhereAll().Have(e => e.SeriesId = fakeSeries.SeriesId) + .WhereTheFirst(5).Have(e => e.Ignored = false) + .WhereTheLast(5).Have(e => e.Ignored = true) + .Build(); + + db.Insert(fakeSeries); + db.Insert(fakeQuality); + db.InsertMany(fakeEpisodes); + + //Act + mocker.Resolve(); + var series = mocker.Resolve().GetAllSeriesWithEpisodeCount(true); + + //Assert + series.Should().HaveCount(1); + Assert.AreEqual(5, series[0].EpisodeCount); + Assert.AreEqual(5, series[0].EpisodeFileCount); + } + + [Test] + public void Get_Single_Series() + { + var mocker = new AutoMoqer(MockBehavior.Strict); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeQuality = Builder.CreateNew().Build(); + var fakeSeries = Builder.CreateNew() + .With(e => e.QualityProfileId = fakeQuality.QualityProfileId) + .With(e => e.SeriesId = 1) + .Build(); + + db.Insert(fakeSeries); + db.Insert(fakeQuality); + + //Act + mocker.Resolve(); + var series = mocker.Resolve().GetSeries(1); + + //Assert + series.QualityProfile.Should().NotBeNull(); + series.QualityProfileId.Should().Be(fakeQuality.QualityProfileId); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index 127e9f08a..611e1e6c4 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -6,6 +6,7 @@ using System.Text.RegularExpressions; using NLog; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; using PetaPoco; using TvdbLib.Data; @@ -17,17 +18,15 @@ namespace NzbDrone.Core.Providers private readonly ConfigProvider _configProvider; private readonly TvDbProvider _tvDbProvider; private readonly IDatabase _database; - private readonly QualityProvider _qualityProvider; private readonly SceneMappingProvider _sceneNameMappingProvider; private static readonly Regex TimeRegex = new Regex(@"^(?