Fixed series refresh repeated too often if Sonarr is killed before Scheduled task finishes.

Fixes #735
pull/2/head
Taloth Saldono 9 years ago
parent 408991e03c
commit 7991a3f1c3

@ -17,7 +17,16 @@ namespace NzbDrone.Core.Test.TvTests
public void Setup() public void Setup()
{ {
_series = Builder<Series>.CreateNew() _series = Builder<Series>.CreateNew()
.With(v => v.Status == SeriesStatusType.Continuing)
.Build(); .Build();
Mocker.GetMock<IEpisodeService>()
.Setup(s => s.GetEpisodeBySeries(_series.Id))
.Returns(Builder<Episode>.CreateListOfSize(2)
.All()
.With(e => e.AirDateUtc = DateTime.Today.AddDays(-100))
.Build()
.ToList());
} }
private void GivenSeriesIsEnded() private void GivenSeriesIsEnded()
@ -25,56 +34,95 @@ namespace NzbDrone.Core.Test.TvTests
_series.Status = SeriesStatusType.Ended; _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); _series.LastInfoSync = DateTime.UtcNow.AddDays(-1);
} }
[Test] private void GivenSeriesLastRefreshedRecently()
public void should_return_true_if_series_is_continuing()
{ {
_series.Status = SeriesStatusType.Continuing; _series.LastInfoSync = DateTime.UtcNow.AddHours(-1);
}
private void GivenRecentlyAired()
{
Mocker.GetMock<IEpisodeService>()
.Setup(s => s.GetEpisodeBySeries(_series.Id))
.Returns(Builder<Episode>.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(); 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] [Test]
public void should_return_true_if_series_last_refreshed_more_than_30_days_ago() public void should_return_true_if_series_last_refreshed_more_than_30_days_ago()
{ {
GivenSeriesIsEnded(); GivenSeriesIsEnded();
_series.LastInfoSync = DateTime.UtcNow.AddDays(-100); GivenSeriesLastRefreshedMonthsAgo();
Subject.ShouldRefresh(_series).Should().BeTrue(); Subject.ShouldRefresh(_series).Should().BeTrue();
} }
[Test] [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<IEpisodeService>() GivenSeriesIsEnded();
.Setup(s => s.GetEpisodeBySeries(_series.Id)) GivenSeriesLastRefreshedYesterday();
.Returns(Builder<Episode>.CreateListOfSize(2)
.TheFirst(1) GivenRecentlyAired();
.With(e => e.AirDateUtc = DateTime.Today.AddDays(-7))
.TheLast(1)
.With(e => e.AirDateUtc = DateTime.Today.AddDays(-100))
.Build()
.ToList());
Subject.ShouldRefresh(_series).Should().BeTrue(); Subject.ShouldRefresh(_series).Should().BeTrue();
} }
[Test] [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<IEpisodeService>() GivenSeriesIsEnded();
.Setup(s => s.GetEpisodeBySeries(_series.Id)) GivenSeriesLastRefreshedYesterday();
.Returns(Builder<Episode>.CreateListOfSize(2)
.All()
.With(e => e.AirDateUtc = DateTime.Today.AddDays(-100))
.Build()
.ToList());
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();
} }
} }
} }

@ -22,15 +22,21 @@ namespace NzbDrone.Core.Tv
public bool ShouldRefresh(Series series) 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; 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; return true;
} }
@ -42,7 +48,7 @@ namespace NzbDrone.Core.Tv
return true; 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; return false;
} }
} }

Loading…
Cancel
Save