From e16f83c4332e85947e08b5f432db0c3043f7faab Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Fri, 25 Nov 2011 18:20:50 -0800 Subject: [PATCH] Added ReferenceDataProvider to provide lookups (and refreshing) of IsDaily - which will check if the series is a daily series. --- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 1 + .../ReferenceDataProviderTest.cs | 187 ++++++++++++++++++ .../Datastore/Migrations/Migration20111125.cs | 21 ++ NzbDrone.Core/NzbDrone.Core.csproj | 2 + NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs | 2 +- .../Providers/ReferenceDataProvider.cs | 73 +++++++ NzbDrone.Core/Repository/Series.cs | 2 + 7 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 NzbDrone.Core.Test/ProviderTests/ReferenceDataProviderTest.cs create mode 100644 NzbDrone.Core/Datastore/Migrations/Migration20111125.cs create mode 100644 NzbDrone.Core/Providers/ReferenceDataProvider.cs diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index ad6b33b72..7c45300f8 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -97,6 +97,7 @@ + diff --git a/NzbDrone.Core.Test/ProviderTests/ReferenceDataProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/ReferenceDataProviderTest.cs new file mode 100644 index 000000000..d1a50f068 --- /dev/null +++ b/NzbDrone.Core.Test/ProviderTests/ReferenceDataProviderTest.cs @@ -0,0 +1,187 @@ +using System; +using System.Linq; + +using FizzWare.NBuilder; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.Providers; +using NzbDrone.Core.Providers.Core; +using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; +using NzbDrone.Test.Common.AutoMoq; +using PetaPoco; + +namespace NzbDrone.Core.Test.ProviderTests +{ + [TestFixture] + // ReSharper disable InconsistentNaming + public class ReferenceDataProviderTest : CoreTest + { + private string validSeriesIds = String.Format("1{0}2{0}3{0}4{0}5", Environment.NewLine); + private string invalidSeriesIds = String.Format("1{0}2{0}NaN{0}4{0}5", Environment.NewLine); + + [Test] + public void GetDailySeriesIds_should_return_list_of_int_when_all_are_valid() + { + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(validSeriesIds); + + //Act + var result = Mocker.Resolve().GetDailySeriesIds(); + + //Assert + result.Should().HaveCount(5); + } + + [Test] + public void GetDailySeriesIds_should_return_list_of_int_when_any_are_valid() + { + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(invalidSeriesIds); + + //Act + var result = Mocker.Resolve().GetDailySeriesIds(); + + //Assert + result.Should().HaveCount(4); + } + + [Test] + public void GetDailySeriesIds_should_return_empty_list_of_int_when_server_is_unavailable() + { + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Throws(new Exception()); + + //Act + var result = Mocker.Resolve().GetDailySeriesIds(); + + //Assert + result.Should().HaveCount(0); + ExceptionVerification.ExcpectedWarns(1); + } + + [Test] + public void IsDailySeries_should_return_true() + { + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(validSeriesIds); + + //Act + var result = Mocker.Resolve().IsSeriesDaily(1); + + //Assert + result.Should().BeTrue(); + } + + [Test] + public void IsDailySeries_should_return_false() + { + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(validSeriesIds); + + //Act + var result = Mocker.Resolve().IsSeriesDaily(10); + + //Assert + result.Should().BeFalse(); + } + + [Test] + public void UpdateDailySeries_should_update_series_that_match_daily_series_list() + { + WithRealDb(); + + var fakeSeries = Builder.CreateListOfSize(5) + .All() + .With(s => s.IsDaily = false) + .Build(); + + Db.InsertMany(fakeSeries); + + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(validSeriesIds); + + //Act + Mocker.Resolve().UpdateDailySeries(); + + //Assert + var result = Db.Fetch(); + + result.Where(s => s.IsDaily).Should().HaveCount(5); + } + + [Test] + public void UpdateDailySeries_should_update_series_should_skip_series_that_dont_match() + { + WithRealDb(); + + var fakeSeries = Builder.CreateListOfSize(5) + .All() + .With(s => s.IsDaily = false) + .TheFirst(1) + .With(s => s.SeriesId = 10) + .TheNext(1) + .With(s => s.SeriesId = 11) + .TheNext(1) + .With(s => s.SeriesId = 12) + .Build(); + + Db.InsertMany(fakeSeries); + + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(validSeriesIds); + + //Act + Mocker.Resolve().UpdateDailySeries(); + + //Assert + var result = Db.Fetch(); + + result.Where(s => !s.IsDaily).Should().HaveCount(3); + result.Where(s => s.IsDaily).Should().HaveCount(2); + } + + [Test] + public void UpdateDailySeries_should_update_series_should_not_overwrite_existing_isDaily() + { + WithRealDb(); + + var fakeSeries = Builder.CreateListOfSize(5) + .All() + .With(s => s.IsDaily = false) + .TheFirst(1) + .With(s => s.SeriesId = 10) + .With(s => s.IsDaily = true) + .TheNext(1) + .With(s => s.SeriesId = 11) + .TheNext(1) + .With(s => s.SeriesId = 12) + .Build(); + + Db.InsertMany(fakeSeries); + + //Setup + Mocker.GetMock().Setup(s => s.DownloadString("http://www.nzbdrone.com/DailySeries.csv")) + .Returns(validSeriesIds); + + //Act + Mocker.Resolve().UpdateDailySeries(); + + //Assert + var result = Db.Fetch(); + + result.Where(s => s.IsDaily).Should().HaveCount(3); + result.Where(s => !s.IsDaily).Should().HaveCount(2); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs b/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs new file mode 100644 index 000000000..4a46828bf --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/Migration20111125.cs @@ -0,0 +1,21 @@ +using System; +using System.Data; +using Migrator.Framework; + +namespace NzbDrone.Core.Datastore.Migrations +{ + + [Migration(20111125)] + public class Migration2011125 : Migration + { + public override void Up() + { + Database.AddColumn("Series", "IsDaily", DbType.Boolean, ColumnProperty.Null); + } + + public override void Down() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index f4f155d70..22fcbc2dc 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -199,6 +199,7 @@ + @@ -256,6 +257,7 @@ + diff --git a/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs b/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs index a0161b950..e0307692a 100644 --- a/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs +++ b/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs @@ -31,7 +31,7 @@ namespace NzbDrone.Core.Providers.Jobs public int DefaultInterval { - get { return 1440; } //Daily + get { return 720; } //Daily } public virtual void Start(ProgressNotification notification, int targetId, int secondaryTargetId) diff --git a/NzbDrone.Core/Providers/ReferenceDataProvider.cs b/NzbDrone.Core/Providers/ReferenceDataProvider.cs new file mode 100644 index 000000000..f80d4dacb --- /dev/null +++ b/NzbDrone.Core/Providers/ReferenceDataProvider.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using NLog; +using NzbDrone.Core.Providers.Core; +using PetaPoco; + +namespace NzbDrone.Core.Providers +{ + public class ReferenceDataProvider + { + private readonly IDatabase _database; + private readonly HttpProvider _httpProvider; + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public ReferenceDataProvider(IDatabase database, HttpProvider httpProvider) + { + _database = database; + _httpProvider = httpProvider; + } + + public virtual void UpdateDailySeries() + { + //Update all series in DB + //DailySeries.csv + + var seriesIds = GetDailySeriesIds(); + + var dailySeriesString = String.Join(", ", seriesIds); + var sql = String.Format("UPDATE Series SET IsDaily = 1 WHERE SeriesId in ({0})", dailySeriesString); + + _database.Execute(sql); + } + + public virtual bool IsSeriesDaily(int seriesId) + { + return GetDailySeriesIds().Contains(seriesId); + } + + public List GetDailySeriesIds() + { + try + { + var dailySeries = _httpProvider.DownloadString("http://www.nzbdrone.com/DailySeries.csv"); + + var seriesIds = new List(); + + using (var reader = new StringReader(dailySeries)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + int seriesId; + + if (Int32.TryParse(line, out seriesId)) + seriesIds.Add(seriesId); + } + } + + return seriesIds; + } + catch(Exception ex) + { + Logger.WarnException("Failed to get Daily Series", ex); + return new List(); + } + + } + } +} diff --git a/NzbDrone.Core/Repository/Series.cs b/NzbDrone.Core/Repository/Series.cs index 1d6a702c9..454179487 100644 --- a/NzbDrone.Core/Repository/Series.cs +++ b/NzbDrone.Core/Repository/Series.cs @@ -41,6 +41,8 @@ namespace NzbDrone.Core.Repository public string BannerUrl { get; set; } + public bool IsDaily { get; set; } + /// /// Gets or sets a value indicating whether this is hidden. ///