From 7991a3f1c3badda123d70c744994f6f34f7765a8 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Tue, 11 Aug 2015 22:03:28 +0200 Subject: [PATCH] Fixed series refresh repeated too often if Sonarr is killed before Scheduled task finishes. Fixes #735 --- .../TvTests/ShouldRefreshSeriesFixture.cs | 96 ++++++++++++++----- src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs | 16 +++- 2 files changed, 83 insertions(+), 29 deletions(-) diff --git a/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs b/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs index d0876b3aa..ac793077b 100644 --- a/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs +++ b/src/NzbDrone.Core.Test/TvTests/ShouldRefreshSeriesFixture.cs @@ -17,7 +17,16 @@ namespace NzbDrone.Core.Test.TvTests public void Setup() { _series = Builder.CreateNew() + .With(v => v.Status == SeriesStatusType.Continuing) .Build(); + + Mocker.GetMock() + .Setup(s => s.GetEpisodeBySeries(_series.Id)) + .Returns(Builder.CreateListOfSize(2) + .All() + .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) + .Build() + .ToList()); } private void GivenSeriesIsEnded() @@ -25,56 +34,95 @@ namespace NzbDrone.Core.Test.TvTests _series.Status = SeriesStatusType.Ended; } - private void GivenSeriesLastRefreshedRecently() + private void GivenSeriesLastRefreshedMonthsAgo() + { + _series.LastInfoSync = DateTime.UtcNow.AddDays(-90); + } + + private void GivenSeriesLastRefreshedYesterday() { _series.LastInfoSync = DateTime.UtcNow.AddDays(-1); } - [Test] - public void should_return_true_if_series_is_continuing() + private void GivenSeriesLastRefreshedRecently() { - _series.Status = SeriesStatusType.Continuing; + _series.LastInfoSync = DateTime.UtcNow.AddHours(-1); + } + private void GivenRecentlyAired() + { + Mocker.GetMock() + .Setup(s => s.GetEpisodeBySeries(_series.Id)) + .Returns(Builder.CreateListOfSize(2) + .TheFirst(1) + .With(e => e.AirDateUtc = DateTime.Today.AddDays(-7)) + .TheLast(1) + .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) + .Build() + .ToList()); + } + + [Test] + public void should_return_true_if_running_series_last_refreshed_more_than_6_hours_ago() + { Subject.ShouldRefresh(_series).Should().BeTrue(); } + [Test] + public void should_return_false_if_running_series_last_refreshed_less_than_6_hours_ago() + { + GivenSeriesLastRefreshedRecently(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); + } + + [Test] + public void should_return_false_if_ended_series_last_refreshed_yesterday() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedYesterday(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); + } + [Test] public void should_return_true_if_series_last_refreshed_more_than_30_days_ago() { GivenSeriesIsEnded(); - _series.LastInfoSync = DateTime.UtcNow.AddDays(-100); + GivenSeriesLastRefreshedMonthsAgo(); Subject.ShouldRefresh(_series).Should().BeTrue(); } [Test] - public void should_should_return_true_if_episode_aired_in_last_30_days() + public void should_return_true_if_episode_aired_in_last_30_days() { - Mocker.GetMock() - .Setup(s => s.GetEpisodeBySeries(_series.Id)) - .Returns(Builder.CreateListOfSize(2) - .TheFirst(1) - .With(e => e.AirDateUtc = DateTime.Today.AddDays(-7)) - .TheLast(1) - .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) - .Build() - .ToList()); + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedYesterday(); + + GivenRecentlyAired(); Subject.ShouldRefresh(_series).Should().BeTrue(); } [Test] - public void should_should_return_false_when_recently_refreshed_ended_show_has_not_aired_for_30_days() + public void should_return_false_when_recently_refreshed_ended_show_has_not_aired_for_30_days() { - Mocker.GetMock() - .Setup(s => s.GetEpisodeBySeries(_series.Id)) - .Returns(Builder.CreateListOfSize(2) - .All() - .With(e => e.AirDateUtc = DateTime.Today.AddDays(-100)) - .Build() - .ToList()); + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedYesterday(); - Subject.ShouldRefresh(_series).Should().BeTrue(); + Subject.ShouldRefresh(_series).Should().BeFalse(); + } + + [Test] + public void should_return_false_when_recently_refreshed_ended_show_aired_in_last_30_days() + { + GivenSeriesIsEnded(); + GivenSeriesLastRefreshedRecently(); + + GivenRecentlyAired(); + + Subject.ShouldRefresh(_series).Should().BeFalse(); } } } diff --git a/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs b/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs index a052935b4..bbf48cbb8 100644 --- a/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs +++ b/src/NzbDrone.Core/Tv/ShouldRefreshSeries.cs @@ -22,15 +22,21 @@ namespace NzbDrone.Core.Tv public bool ShouldRefresh(Series series) { - if (series.Status == SeriesStatusType.Continuing) + if (series.LastInfoSync < DateTime.UtcNow.AddDays(-30)) { - _logger.Trace("Series {0} is continuing, should refresh.", series.Title); + _logger.Trace("Series {0} last updated more than 30 days ago, should refresh.", series.Title); return true; } - if (series.LastInfoSync < DateTime.UtcNow.AddDays(-30)) + if (series.LastInfoSync >= DateTime.UtcNow.AddHours(-6)) { - _logger.Trace("Series {0} last updated more than 30 days ago, should refresh.", series.Title); + _logger.Trace("Series {0} last updated less than 6 hours ago, should not be refreshed.", series.Title); + return false; + } + + if (series.Status == SeriesStatusType.Continuing) + { + _logger.Trace("Series {0} is continuing, should refresh.", series.Title); return true; } @@ -42,7 +48,7 @@ namespace NzbDrone.Core.Tv return true; } - _logger.Trace("Series {0} should not be refreshed.", series.Title); + _logger.Trace("Series {0} ended long ago, should not be refreshed.", series.Title); return false; } }