From b084a3bc46a3cf3fc2a5698e2cdf0d068fe44053 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Sun, 19 Jun 2011 18:46:32 -0700 Subject: [PATCH] EpisodeProvider GetEpisode(s) returns episodes with EpisodeFiles. --- NzbDrone.Core.Test/EpisodeProviderTest.cs | 154 +++++++++++++++++++-- NzbDrone.Core/Providers/EpisodeProvider.cs | 62 ++++++++- 2 files changed, 198 insertions(+), 18 deletions(-) diff --git a/NzbDrone.Core.Test/EpisodeProviderTest.cs b/NzbDrone.Core.Test/EpisodeProviderTest.cs index c931c8a93..892e8d373 100644 --- a/NzbDrone.Core.Test/EpisodeProviderTest.cs +++ b/NzbDrone.Core.Test/EpisodeProviderTest.cs @@ -41,10 +41,39 @@ namespace NzbDrone.Core.Test var episode = mocker.Resolve().GetEpisode(1); //Assert - episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First()); + episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First()); episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); } + [Test] + public void GetEpisode_with_EpisodeFile() + { + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeSeries = Builder.CreateNew().Build(); + var fakeFile = Builder.CreateNew().With(f => f.EpisodeFileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 1).WhereTheFirst(1).Have(e => e.EpisodeFileId = 1).Have(e => e.EpisodeFile = fakeFile).Build(); + + + db.InsertMany(fakeEpisodes); + db.Insert(fakeFile); + + mocker.GetMock() + .Setup(p => p.GetSeries(1)) + .Returns(fakeSeries); + + //Act + var episode = mocker.Resolve().GetEpisode(1); + + //Assert + episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First()); + episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); + episode.EpisodeFile.Should().NotBeNull(); + } + [Test] [ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Sequence contains no elements")] public void GetEpisodes_invalid_series() @@ -79,7 +108,6 @@ namespace NzbDrone.Core.Test result.Should().HaveCount(0); } - [Test] public void AttachSeries_list_success() { @@ -136,7 +164,6 @@ namespace NzbDrone.Core.Test var returnedEpisode = mocker.Resolve().AttachSeries(fakeEpisodes); } - [Test] public void GetEpisodesBySeason_success() { @@ -196,7 +223,6 @@ namespace NzbDrone.Core.Test mocker.VerifyAllMocks(); } - [Test] public void new_episodes_only_calls_Insert() { @@ -217,7 +243,7 @@ namespace NzbDrone.Core.Test .Returns(tvdbSeries); mocker.GetMock() - .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) + .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) .Returns(currentEpisodes); @@ -231,7 +257,6 @@ namespace NzbDrone.Core.Test mocker.VerifyAllMocks(); } - [Test] public void existing_episodes_only_calls_Update() { @@ -255,7 +280,7 @@ namespace NzbDrone.Core.Test .Returns(tvdbSeries); mocker.GetMock() - .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) + .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) .Returns(currentEpisodes); //Act @@ -267,7 +292,6 @@ namespace NzbDrone.Core.Test mocker.VerifyAllMocks(); } - [Test] public void should_try_to_get_existing_episode_using_tvdbid_first() { @@ -286,7 +310,7 @@ namespace NzbDrone.Core.Test var mocker = new AutoMoqer(); mocker.GetMock() - .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) + .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) .Returns(fakeEpisodeList); mocker.GetMock() @@ -334,7 +358,7 @@ namespace NzbDrone.Core.Test .Returns(tvdbSeries); mocker.GetMock() - .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) + .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) .Returns(new List { localEpisode }); //Act @@ -345,7 +369,6 @@ namespace NzbDrone.Core.Test mocker.GetMock().Verify(c => c.Update(localEpisode), Times.Once()); } - [Test] public void existing_episodes_keep_their_episodeId_file_id() { @@ -371,7 +394,7 @@ namespace NzbDrone.Core.Test var updatedEpisodes = new List(); mocker.GetMock() - .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) + .Setup(d => d.Fetch(It.IsAny(), It.IsAny())) .Returns(currentEpisodes); mocker.GetMock() @@ -389,7 +412,6 @@ namespace NzbDrone.Core.Test updatedEpisodes.Should().OnlyContain(c => c.Ignored == true); } - [Test] public void IsSeasonIgnored_should_return_true_if_all_episodes_ignored() { @@ -497,6 +519,112 @@ namespace NzbDrone.Core.Test episodes.Should().NotBeEmpty(); } + [Test] + public void GetEpisode_by_Season_Episode_with_EpisodeFile() + { + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeSeries = Builder.CreateNew().Build(); + var fakeFile = Builder.CreateNew().With(f => f.EpisodeFileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 1).WhereTheFirst(1).Have(e => e.EpisodeFileId = 1).Have(e => e.EpisodeFile = fakeFile).Build(); + + db.InsertMany(fakeEpisodes); + db.Insert(fakeFile); + + mocker.GetMock() + .Setup(p => p.GetSeries(1)) + .Returns(fakeSeries); + + //Act + var episode = mocker.Resolve().GetEpisode(1, 1, 1); + + //Assert + episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First()); + episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); + episode.EpisodeFile.Should().NotBeNull(); + } + + [Test] + public void GetEpisode_by_Season_Episode_without_EpisodeFile() + { + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeSeries = Builder.CreateNew().Build(); + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 1).WhereTheFirst(1).Have(e => e.EpisodeFileId = 0).Build(); + + db.InsertMany(fakeEpisodes); + + mocker.GetMock() + .Setup(p => p.GetSeries(1)) + .Returns(fakeSeries); + + //Act + var episode = mocker.Resolve().GetEpisode(1, 1, 1); + + //Assert + episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First()); + episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); + episode.EpisodeFile.Should().BeNull(); + } + + [Test] + public void GetEpisode_by_AirDate_with_EpisodeFile() + { + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeSeries = Builder.CreateNew().Build(); + var fakeFile = Builder.CreateNew().With(f => f.EpisodeFileId).Build(); + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 1).WhereTheFirst(1).Have(e => e.EpisodeFileId = 1).Have(e => e.EpisodeFile = fakeFile).Build(); + + db.InsertMany(fakeEpisodes); + db.Insert(fakeFile); + mocker.GetMock() + .Setup(p => p.GetSeries(1)) + .Returns(fakeSeries); + + //Act + var episode = mocker.Resolve().GetEpisode(1, fakeEpisodes[0].AirDate); + + //Assert + episode.ShouldHave().AllPropertiesBut(e => e.Series, e => e.EpisodeFile).EqualTo(fakeEpisodes.First()); + episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); + episode.EpisodeFile.Should().NotBeNull(); + } + + [Test] + public void GetEpisode_by_AirDate_without_EpisodeFile() + { + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + var fakeSeries = Builder.CreateNew().Build(); + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 1).WhereTheFirst(1).Have(e => e.EpisodeFileId = 0).Build(); + + db.InsertMany(fakeEpisodes); + + mocker.GetMock() + .Setup(p => p.GetSeries(1)) + .Returns(fakeSeries); + + //Act + var episode = mocker.Resolve().GetEpisode(1, fakeEpisodes[0].AirDate); + + //Assert + episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First()); + episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); + episode.EpisodeFile.Should().BeNull(); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 10825b9a2..13ca76b1d 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -35,27 +35,73 @@ namespace NzbDrone.Core.Providers public virtual Episode GetEpisode(long id) { - return AttachSeries(_database.Single(id)); + var episode = AttachSeries(_database.Fetch(@"SELECT * FROM Episodes + LEFT JOIN EpisodeFiles ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId + WHERE EpisodeId = @0", id).Single()); + if (episode.EpisodeFileId == 0) + episode.EpisodeFile = null; + + return episode; } public virtual Episode GetEpisode(int seriesId, int seasonNumber, int episodeNumber) { - return AttachSeries(_database.SingleOrDefault("WHERE SeriesId = @0 AND SeasonNumber = @1 AND EpisodeNumber = @2", seriesId, seasonNumber, episodeNumber)); + var episode = AttachSeries(_database.Fetch(@"SELECT * FROM Episodes + LEFT JOIN EpisodeFiles ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId + WHERE Episodes.SeriesId = @0 AND Episodes.SeasonNumber = @1 AND Episodes.EpisodeNumber = @2", seriesId, seasonNumber, episodeNumber).SingleOrDefault()); + + if (episode == null) + return null; + + if (episode.EpisodeFileId == 0) + episode.EpisodeFile = null; + + return episode; } public virtual Episode GetEpisode(int seriesId, DateTime date) { - return AttachSeries(_database.SingleOrDefault("WHERE SeriesId = @0 AND AirDate = @1", seriesId, date.Date)); + var episode = AttachSeries(_database.Fetch(@"SELECT * FROM Episodes + LEFT JOIN EpisodeFiles ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId + WHERE Episodes.SeriesId = @0 AND AirDate = @1", seriesId, date.Date)).SingleOrDefault(); + + if (episode == null) + return null; + + if (episode.EpisodeFileId == 0) + episode.EpisodeFile = null; + + return episode; } public virtual IList GetEpisodeBySeries(long seriesId) { - return AttachSeries(_database.Fetch("WHERE SeriesId = @0", seriesId)); + var episodes = AttachSeries(_database.Fetch(@"SELECT * FROM Episodes + LEFT JOIN EpisodeFiles ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId + WHERE Episodes.SeriesId = @0", seriesId)); + + foreach (var episode in episodes) + { + if (episode.EpisodeFileId == 0) + episode.EpisodeFile = null; + } + + return episodes; } public virtual IList GetEpisodesBySeason(long seriesId, int seasonNumber) { - return AttachSeries(_database.Fetch("WHERE SeriesId = @0 AND SeasonNumber = @1", seriesId, seasonNumber)); + var episodes = AttachSeries(_database.Fetch(@"SELECT * FROM Episodes + LEFT JOIN EpisodeFiles ON Episodes.EpisodeFileId = EpisodeFiles.EpisodeFileId + WHERE Episodes.SeriesId = @0 AND Episodes.SeasonNumber = @1", seriesId, seasonNumber)); + + foreach (var episode in episodes) + { + if (episode.EpisodeFileId == 0) + episode.EpisodeFile = null; + } + + return episodes; } public virtual List GetEpisodes(EpisodeParseResult parseResult) @@ -78,6 +124,12 @@ namespace NzbDrone.Core.Providers episodes.Add(episode); } + foreach (var episode in episodes) + { + if (episode.EpisodeFileId == 0) + episode.EpisodeFile = null; + } + return episodes; }