From a990fb91d50a5e28c78459a7cb03a89faf2b65de Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sat, 18 Jun 2011 22:56:52 -0700 Subject: [PATCH 01/10] SeriesProvider.GetSeries(int seriesId) will now fail if series is not found. --- NzbDrone.Core.Test/SeriesProviderTest.cs | 1 + NzbDrone.Core/Providers/SeriesProvider.cs | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/NzbDrone.Core.Test/SeriesProviderTest.cs b/NzbDrone.Core.Test/SeriesProviderTest.cs index 1597e4ad8..9064eb8d5 100644 --- a/NzbDrone.Core.Test/SeriesProviderTest.cs +++ b/NzbDrone.Core.Test/SeriesProviderTest.cs @@ -106,6 +106,7 @@ namespace NzbDrone.Core.Test [Test] + [ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Sequence contains no elements")] public void Get_series_invalid_series_id_should_return_null() { var mocker = new AutoMoqer(); diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index 1eab2b3bd..127e9f08a 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -44,11 +44,9 @@ namespace NzbDrone.Core.Providers public virtual Series GetSeries(int seriesId) { - var series = _database.SingleOrDefault("WHERE seriesId= @0", seriesId); - if (series != null) - { - series.QualityProfile = _qualityProvider.Get(series.QualityProfileId); - } + var series = _database.Single("WHERE seriesId= @0", seriesId); + series.QualityProfile = _qualityProvider.Get(series.QualityProfileId); + return series; } From 3d3e864094251f26571528b7682a917d8e5ddd86 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sat, 18 Jun 2011 22:57:24 -0700 Subject: [PATCH 02/10] EpisodeProvider now fills Series property for all episodes returned. --- NzbDrone.Core.Test/EpisodeProviderTest.cs | 119 ++++++++++++++++++++- NzbDrone.Core.Test/dbBenchmark.cs | 4 +- NzbDrone.Core/Providers/EpisodeProvider.cs | 38 +++++-- 3 files changed, 149 insertions(+), 12 deletions(-) diff --git a/NzbDrone.Core.Test/EpisodeProviderTest.cs b/NzbDrone.Core.Test/EpisodeProviderTest.cs index 16289c50f..c931c8a93 100644 --- a/NzbDrone.Core.Test/EpisodeProviderTest.cs +++ b/NzbDrone.Core.Test/EpisodeProviderTest.cs @@ -19,6 +19,123 @@ namespace NzbDrone.Core.Test // ReSharper disable InconsistentNaming public class EpisodeProviderTest : TestBase { + [Test] + public void GetEpisodes_exists() + { + 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).Build(); + + + db.InsertMany(fakeEpisodes); + + mocker.GetMock() + .Setup(p => p.GetSeries(1)) + .Returns(fakeSeries); + + //Act + var episode = mocker.Resolve().GetEpisode(1); + + //Assert + episode.ShouldHave().AllPropertiesBut(e => e.Series).EqualTo(fakeEpisodes.First()); + episode.Series.ShouldHave().AllProperties().EqualTo(fakeSeries); + } + + [Test] + [ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Sequence contains no elements")] + public void GetEpisodes_invalid_series() + { + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + mocker.Resolve(); + + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 1).Build(); + + + db.InsertMany(fakeEpisodes); + + + //Act + mocker.Resolve().GetEpisode(1); + } + + [Test] + public void AttachSeries_empty_list() + { + var mocker = new AutoMoqer(); + + + //Act + var result = mocker.Resolve().AttachSeries(new List()); + + //Assert + result.Should().HaveCount(0); + } + + + [Test] + public void AttachSeries_list_success() + { + var mocker = new AutoMoqer(); + + var fakeSeries = Builder.CreateNew().With(s => s.SeriesId = 12).Build(); + var fakeEpisodes = Builder.CreateListOfSize(5) + .WhereAll().Have(e => e.SeriesId = 12).Build(); + + mocker.GetMock() + .Setup(c => c.GetSeries(12)) + .Returns(fakeSeries); + + //Act + + fakeEpisodes.Should().OnlyContain(e => e.Series == null); + var returnedSeries = mocker.Resolve().AttachSeries(fakeEpisodes); + + //Assert + fakeEpisodes.Should().OnlyContain(e => e.Series == fakeSeries); + returnedSeries.Should().BeEquivalentTo(fakeEpisodes); + } + + [Test] + public void AttachSeries_single_success() + { + var mocker = new AutoMoqer(); + + var fakeSeries = Builder.CreateNew().With(s => s.SeriesId = 12).Build(); + var fakeEpisodes = Builder.CreateNew().With(e => e.SeriesId = 12).Build(); + + mocker.GetMock() + .Setup(c => c.GetSeries(12)) + .Returns(fakeSeries); + + //Act + var returnedEpisode = mocker.Resolve().AttachSeries(fakeEpisodes); + + //Assert + fakeEpisodes.Series.Should().Be(fakeSeries); + returnedEpisode.Should().Be(fakeEpisodes); + } + + [Test] + [ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Sequence contains no elements")] + public void AttachSeries_single_invalid_series() + { + var mocker = new AutoMoqer(); + mocker.SetConstant(MockLib.GetEmptyDatabase()); + mocker.Resolve(); + var fakeEpisodes = Builder.CreateNew().With(e => e.SeriesId = 12).Build(); + + //Act + var returnedEpisode = mocker.Resolve().AttachSeries(fakeEpisodes); + } + [Test] public void GetEpisodesBySeason_success() @@ -311,7 +428,7 @@ namespace NzbDrone.Core.Test .Build(); episodes.ToList().ForEach(c => db.Insert(c)); - + //Act var result = mocker.Resolve().IsIgnored(10, 2); diff --git a/NzbDrone.Core.Test/dbBenchmark.cs b/NzbDrone.Core.Test/dbBenchmark.cs index 7ca88b1b9..1de9d634f 100644 --- a/NzbDrone.Core.Test/dbBenchmark.cs +++ b/NzbDrone.Core.Test/dbBenchmark.cs @@ -91,7 +91,7 @@ namespace NzbDrone.Core.Test [Test] public void get_episode_by_series_seasons_episode_x5000() { - var epProvider = new EpisodeProvider(null, null); + var epProvider = new EpisodeProvider(null, null, null); Thread.Sleep(1000); @@ -115,7 +115,7 @@ namespace NzbDrone.Core.Test [Test] public void get_episode_by_series_seasons_x1000() { - var epProvider = new EpisodeProvider( null, null); + var epProvider = new EpisodeProvider(null, null, null); Thread.Sleep(1000); diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index cf065a301..10825b9a2 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading; using Ninject; using NLog; using NzbDrone.Core.Model; @@ -15,12 +14,14 @@ namespace NzbDrone.Core.Providers private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly TvDbProvider _tvDbProvider; private readonly IDatabase _database; + private readonly SeriesProvider _seriesProvider; [Inject] - public EpisodeProvider(TvDbProvider tvDbProviderProvider, IDatabase database) + public EpisodeProvider(IDatabase database, SeriesProvider seriesProvider, TvDbProvider tvDbProviderProvider) { _tvDbProvider = tvDbProviderProvider; _database = database; + _seriesProvider = seriesProvider; } public EpisodeProvider() @@ -34,27 +35,27 @@ namespace NzbDrone.Core.Providers public virtual Episode GetEpisode(long id) { - return _database.Single(id); + return AttachSeries(_database.Single(id)); } public virtual Episode GetEpisode(int seriesId, int seasonNumber, int episodeNumber) { - return _database.SingleOrDefault("WHERE SeriesId = @0 AND SeasonNumber = @1 AND EpisodeNumber = @2", seriesId, seasonNumber, episodeNumber); + return AttachSeries(_database.SingleOrDefault("WHERE SeriesId = @0 AND SeasonNumber = @1 AND EpisodeNumber = @2", seriesId, seasonNumber, episodeNumber)); } public virtual Episode GetEpisode(int seriesId, DateTime date) { - return _database.SingleOrDefault("WHERE SeriesId = @0 AND AirDate = @1", seriesId, date.Date); + return AttachSeries(_database.SingleOrDefault("WHERE SeriesId = @0 AND AirDate = @1", seriesId, date.Date)); } public virtual IList GetEpisodeBySeries(long seriesId) { - return _database.Fetch("WHERE SeriesId = @0", seriesId); + return AttachSeries(_database.Fetch("WHERE SeriesId = @0", seriesId)); } public virtual IList GetEpisodesBySeason(long seriesId, int seasonNumber) { - return _database.Fetch("WHERE SeriesId = @0 AND SeasonNumber = @1", seriesId, seasonNumber); + return AttachSeries(_database.Fetch("WHERE SeriesId = @0 AND SeasonNumber = @1", seriesId, seasonNumber)); } public virtual List GetEpisodes(EpisodeParseResult parseResult) @@ -87,12 +88,12 @@ namespace NzbDrone.Core.Providers if (includeSpecials) return episodes.Where(e => e.SeasonNumber > 0).ToList(); - return episodes.ToList(); + return AttachSeries(episodes.ToList()); } public virtual IList EpisodesByFileId(int episodeFileId) { - return _database.Fetch("WHERE EpisodeFileId = @0", episodeFileId); + return AttachSeries(_database.Fetch("WHERE EpisodeFileId = @0", episodeFileId)); } public virtual void RefreshEpisodeInfo(Series series) @@ -219,5 +220,24 @@ namespace NzbDrone.Core.Providers } + + public IList AttachSeries(IList episodes) + { + if (episodes.Count == 0) return episodes; + + if (episodes.Select(c => c.SeriesId).Distinct().Count() > 1) + throw new ArgumentException("Episodes belong to more than one series."); + + var series = _seriesProvider.GetSeries(episodes.First().SeriesId); + episodes.ToList().ForEach(c => c.Series = series); + + return episodes; + } + + public Episode AttachSeries(Episode episode) + { + episode.Series = _seriesProvider.GetSeries(episode.SeriesId); + return episode; + } } } \ No newline at end of file From 7560a70dd41754745e7fbff7a35be466d33ff704 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 10:56:54 -0700 Subject: [PATCH 03/10] fixed duplicated episodes coming in from Tvdb --- NzbDrone.Core.Test/TvDbProviderTest.cs | 15 +++++++++++++++ NzbDrone.Core/Providers/TvDbProvider.cs | 7 +++++++ 2 files changed, 22 insertions(+) diff --git a/NzbDrone.Core.Test/TvDbProviderTest.cs b/NzbDrone.Core.Test/TvDbProviderTest.cs index 4930a5bba..f196ca64b 100644 --- a/NzbDrone.Core.Test/TvDbProviderTest.cs +++ b/NzbDrone.Core.Test/TvDbProviderTest.cs @@ -84,6 +84,21 @@ namespace NzbDrone.Core.Test Assert.IsNull(result); } + [Test] + public void none_unique_season_episode_number() + { + //setup + var tvdbProvider = new TvDbProvider(); + + //act + var result = tvdbProvider.GetSeries(75978, true);//Family guy + + //Asserts that when episodes are grouped by Season/Episode each group contains maximum of + //one item. + result.Episodes.GroupBy(e => e.SeasonNumber.ToString("000") + e.EpisodeNumber.ToString("000")) + .Max(e => e.Count()).Should().Be(1); + + } [Test] public void American_dad_fix() diff --git a/NzbDrone.Core/Providers/TvDbProvider.cs b/NzbDrone.Core/Providers/TvDbProvider.cs index ccfa19edf..7b3a91ac1 100644 --- a/NzbDrone.Core/Providers/TvDbProvider.cs +++ b/NzbDrone.Core/Providers/TvDbProvider.cs @@ -105,6 +105,13 @@ namespace NzbDrone.Core.Providers } } + //Remove duplicated episodes + var episodes = result.Episodes.OrderByDescending(e => e.FirstAired).ThenByDescending(e => e.EpisodeName) + .GroupBy(e => e.SeriesId.ToString("000000") + e.SeasonNumber.ToString("000") + e.EpisodeNumber.ToString("000")) + .Select(e => e.First()); + + result.Episodes = episodes.ToList(); + return result; } } From f211f999608bf742e94eb6bd923b7094171156e9 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 10:57:35 -0700 Subject: [PATCH 04/10] Fix issue on in ImportFile --- NzbDrone.Core/Providers/MediaFileProvider.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 8b2c39aad..9d936f2c6 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -49,7 +49,7 @@ namespace NzbDrone.Core.Providers return new List(); } - var mediaFileList = GetMediaFileList(series.Path); + var mediaFileList = GetVideoFiles(series.Path); var fileList = new List(); foreach (var filePath in mediaFileList) @@ -137,7 +137,7 @@ namespace NzbDrone.Core.Providers episodeFile.Quality = parseResult.Quality.QualityType; episodeFile.Proper = parseResult.Quality.Proper; episodeFile.SeasonNumber = parseResult.SeasonNumber; - var fileId = (int)_database.Insert(episodeFile); + var fileId = Convert.ToInt32(_database.Insert(episodeFile)); //This is for logging + updating the episodes that are linked to this EpisodeFile string episodeList = String.Empty; @@ -192,7 +192,7 @@ namespace NzbDrone.Core.Providers public virtual void Update(EpisodeFile episodeFile) { _database.Update(episodeFile); - } + } public virtual EpisodeFile GetEpisodeFile(int episodeFileId) { @@ -219,7 +219,7 @@ namespace NzbDrone.Core.Providers return new Tuple(avilableEpisodes.Count, episodeTotal.Count); } - private List GetMediaFileList(string path) + private List GetVideoFiles(string path) { Logger.Debug("Scanning '{0}' for episodes", path); @@ -236,7 +236,7 @@ namespace NzbDrone.Core.Providers var result = new List(); //Get all the files except those that are considered samples - var files = GetMediaFileList(path).Where(f => _diskProvider.GetSize(f) > 40000000 || !f.ToLower().Contains("sample")).ToList(); + var files = GetVideoFiles(path).Where(f => _diskProvider.GetSize(f) > 40000000 || !f.ToLower().Contains("sample")).ToList(); foreach (var file in files) { From ec949be7890dc5e77cc98df86c0d0b9603bd2e9a Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 11:28:18 -0700 Subject: [PATCH 05/10] Removing "Histories" on migration. --- .../{Migration.cs => Migration20110616.cs} | 0 .../Datastore/Migrations/Migration20110619.cs | 24 +++++++++++++++++++ 2 files changed, 24 insertions(+) rename NzbDrone.Core/Datastore/Migrations/{Migration.cs => Migration20110616.cs} (100%) create mode 100644 NzbDrone.Core/Datastore/Migrations/Migration20110619.cs diff --git a/NzbDrone.Core/Datastore/Migrations/Migration.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110616.cs similarity index 100% rename from NzbDrone.Core/Datastore/Migrations/Migration.cs rename to NzbDrone.Core/Datastore/Migrations/Migration20110616.cs diff --git a/NzbDrone.Core/Datastore/Migrations/Migration20110619.cs b/NzbDrone.Core/Datastore/Migrations/Migration20110619.cs new file mode 100644 index 000000000..9be21b431 --- /dev/null +++ b/NzbDrone.Core/Datastore/Migrations/Migration20110619.cs @@ -0,0 +1,24 @@ +using System; +using System.Data; +using Migrator.Framework; + +namespace NzbDrone.Core.Datastore.Migrations +{ + + [Migration(20110619)] + public class Migration20110619 : Migration + { + public override void Up() + { + if (Database.TableExists("Histories")) + { + Database.RemoveTable("Histories"); + } + } + + public override void Down() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file From d2f32a0b54c4bce475ddd5c3d00738d9d60db886 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 11:30:34 -0700 Subject: [PATCH 06/10] Fixed compile error --- NzbDrone.Core/NzbDrone.Core.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index afcb1b07e..d1daa6c0d 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -163,7 +163,8 @@ - + + From 8c128724336711010af8bc338cd6ec105f162283 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 11:38:04 -0700 Subject: [PATCH 07/10] fixed americandad's broken test --- NzbDrone.Core.Test/TvDbProviderTest.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/NzbDrone.Core.Test/TvDbProviderTest.cs b/NzbDrone.Core.Test/TvDbProviderTest.cs index f196ca64b..f0e12e882 100644 --- a/NzbDrone.Core.Test/TvDbProviderTest.cs +++ b/NzbDrone.Core.Test/TvDbProviderTest.cs @@ -112,11 +112,11 @@ namespace NzbDrone.Core.Test var seasonsNumbers = result.Episodes.Select(e => e.SeasonNumber) .Distinct().ToList(); - var seasons = new List>(seasonsNumbers.Count); + var seasons = new Dictionary>(seasonsNumbers.Count); foreach (var season in seasonsNumbers) { - seasons.Insert(season, result.Episodes.Where(e => e.SeasonNumber == season).ToList()); + seasons.Add(season, result.Episodes.Where(e => e.SeasonNumber == season).ToList()); } foreach (var episode in result.Episodes) @@ -134,16 +134,16 @@ namespace NzbDrone.Core.Test foreach (var season in seasons) { - season.Should().OnlyHaveUniqueItems(); + season.Value.Should().OnlyHaveUniqueItems(); } //Make sure no episode number is skipped foreach (var season in seasons) { - for (int i = 1; i < season.Count; i++) + for (int i = 1; i < season.Value.Count; i++) { - season.Should().Contain(c => c.EpisodeNumber == i, "Can't find Episode S{0:00}E{1:00}", - season[0].SeasonNumber, i); + season.Value.Should().Contain(c => c.EpisodeNumber == i, "Can't find Episode S{0:00}E{1:00}", + season.Value[0].SeasonNumber, i); } } From ea643630ed9bb3833fc6b2f5e0c3c1496b08c425 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 11:56:32 -0700 Subject: [PATCH 08/10] Fixed dbBenchmark tests --- NzbDrone.Core.Test/dbBenchmark.cs | 72 +++++++++++++++++++------------ 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/NzbDrone.Core.Test/dbBenchmark.cs b/NzbDrone.Core.Test/dbBenchmark.cs index 1de9d634f..60eb37b88 100644 --- a/NzbDrone.Core.Test/dbBenchmark.cs +++ b/NzbDrone.Core.Test/dbBenchmark.cs @@ -8,13 +8,14 @@ using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; +using PetaPoco; namespace NzbDrone.Core.Test { [TestFixture] // ReSharper disable InconsistentNaming - [Ignore] public class DbBenchmark : TestBase { const int Episodes_Per_Season = 20; @@ -22,6 +23,7 @@ namespace NzbDrone.Core.Test private readonly List seriesIds = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; private readonly List episodes = new List(); private readonly List files = new List(); + private IDatabase db; [TestFixtureSetUp] @@ -30,8 +32,18 @@ namespace NzbDrone.Core.Test base.Setup(); + db = MockLib.GetEmptyDatabase(); int currentFileId = 0; + + var qulityProfile = new QualityProfile + { + Name = "TestProfile", + Allowed = new List { QualityTypes.DVD, QualityTypes.Bluray1080p }, + Cutoff = QualityTypes.DVD + }; + db.Insert(qulityProfile); + foreach (var _seriesId in seriesIds) { int seriesId = _seriesId; @@ -40,7 +52,7 @@ namespace NzbDrone.Core.Test .With(s => s.Monitored = true) .Build(); - //repo.Add(series); + db.Insert(series); foreach (var _seasonNumber in seasonsNumbers) { @@ -52,8 +64,7 @@ namespace NzbDrone.Core.Test { var epFile = Builder.CreateNew() .With(e => e.SeriesId = seriesId) - .With(e => e.SeriesId = seriesId) - .And(e => e.SeasonNumber = _seasonNumber) + .And(e => e.SeasonNumber = _seasonNumber) .And(e => e.Path = Guid.NewGuid().ToString()) .Build(); @@ -83,30 +94,32 @@ namespace NzbDrone.Core.Test } - //repo.AddMany(episodes); - //repo.AddMany(files); + db.InsertMany(episodes); + db.InsertMany(files); } [Test] public void get_episode_by_series_seasons_episode_x5000() { - var epProvider = new EpisodeProvider(null, null, null); + var mocker = new AutoMoqer(); + mocker.SetConstant(db); + mocker.Resolve(); + var epProvider = mocker.Resolve(); Thread.Sleep(1000); - var random = new Random(); Console.WriteLine("Starting Test"); var sw = Stopwatch.StartNew(); for (int i = 0; i < 5000; i++) { - epProvider.GetEpisode(6, random.Next(2, 5), random.Next(2, Episodes_Per_Season - 10)).Should().NotBeNull(); + var ep = epProvider.GetEpisode(6, random.Next(2, 5), random.Next(2, Episodes_Per_Season - 10)); + ep.Series.Should().NotBeNull(); } - sw.Stop(); Console.WriteLine("Took " + sw.Elapsed); @@ -115,7 +128,11 @@ namespace NzbDrone.Core.Test [Test] public void get_episode_by_series_seasons_x1000() { - var epProvider = new EpisodeProvider(null, null, null); + var mocker = new AutoMoqer(); + mocker.SetConstant(db); + mocker.Resolve(); + + var epProvider = mocker.Resolve(); Thread.Sleep(1000); @@ -140,8 +157,9 @@ namespace NzbDrone.Core.Test public void get_episode_file_count_x100() { var mocker = new AutoMoqer(); - //mocker.SetConstant(repo); - mocker.SetConstant(mocker.Resolve()); + mocker.SetConstant(db); + mocker.Resolve(); + mocker.Resolve(); var mediaProvider = mocker.Resolve(); @@ -163,13 +181,14 @@ namespace NzbDrone.Core.Test Console.WriteLine("Took " + sw.Elapsed); } - [Test] - public void get_season_count_x5000() + public void get_episode_file_count_x1000() { var mocker = new AutoMoqer(); - //mocker.SetConstant(repo); - var provider = mocker.Resolve(); + mocker.SetConstant(db); + mocker.Resolve(); + mocker.Resolve(); + var mediaProvider = mocker.Resolve(); Thread.Sleep(1000); @@ -179,9 +198,9 @@ namespace NzbDrone.Core.Test Console.WriteLine("Starting Test"); var sw = Stopwatch.StartNew(); - for (int i = 0; i < 5000; i++) + for (int i = 0; i < 1000; i++) { - provider.GetSeasons(random.Next(1, 10)).Should().HaveSameCount(seasonsNumbers); + mediaProvider.GetEpisodeFilesCount(random.Next(1, 5)).Should().NotBeNull(); } @@ -192,12 +211,11 @@ namespace NzbDrone.Core.Test [Test] - public void get_episode_file_count_x10() + public void get_season_count_x5000() { var mocker = new AutoMoqer(); - //mocker.SetConstant(repo); - mocker.SetConstant(mocker.Resolve()); - var provider = mocker.Resolve(); + mocker.SetConstant(db); + var provider = mocker.Resolve(); Thread.Sleep(1000); @@ -207,11 +225,9 @@ namespace NzbDrone.Core.Test Console.WriteLine("Starting Test"); var sw = Stopwatch.StartNew(); - for (int i = 0; i < 100; i++) + for (int i = 0; i < 5000; i++) { - var result = provider.GetEpisodeFilesCount(random.Next(1, 10)); - result.Item1.Should().NotBe(0); - result.Item2.Should().NotBe(0); + provider.GetSeasons(random.Next(1, 10)).Should().HaveSameCount(seasonsNumbers); } @@ -220,5 +236,7 @@ namespace NzbDrone.Core.Test Console.WriteLine("Took " + sw.Elapsed); } + + } } From a853f80f9e8b544087c6dfe5f1685f6cdc051f7f Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 13:43:33 -0700 Subject: [PATCH 09/10] Fixed season ignore --- NzbDrone.Core.Test/ImportNewSeriesJobTest.cs | 128 ++++++++++++++---- .../Providers/Jobs/ImportNewSeriesJob.cs | 14 +- NzbDrone.Core/Providers/MediaFileProvider.cs | 2 +- 3 files changed, 108 insertions(+), 36 deletions(-) diff --git a/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs b/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs index 488a3a0c9..0a0fe7597 100644 --- a/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs +++ b/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs @@ -26,8 +26,6 @@ namespace NzbDrone.Core.Test .AndTheNext(1).Has(s => s.SeriesId = 15) .Build(); - var episodes = Builder.CreateListOfSize(10).Build(); - var notification = new ProgressNotification("Test"); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -39,23 +37,21 @@ namespace NzbDrone.Core.Test mocker.GetMock() .Setup(j => j.Start(notification, series[0].SeriesId)) - .Callback(() => series[0].LastDiskSync = DateTime.Now) - .AtMostOnce(); + .Callback(() => series[0].LastDiskSync = DateTime.Now); + mocker.GetMock() .Setup(j => j.Start(notification, series[1].SeriesId)) - .Callback(() => series[1].LastDiskSync = DateTime.Now) - .AtMostOnce(); + .Callback(() => series[1].LastDiskSync = DateTime.Now); + mocker.GetMock() .Setup(j => j.Start(notification, series[0].SeriesId)) - .Callback(() => series[0].LastInfoSync = DateTime.Now) - .AtMostOnce(); + .Callback(() => series[0].LastInfoSync = DateTime.Now); mocker.GetMock() .Setup(j => j.Start(notification, series[1].SeriesId)) - .Callback(() => series[1].LastInfoSync = DateTime.Now) - .AtMostOnce(); + .Callback(() => series[1].LastInfoSync = DateTime.Now); mocker.GetMock() .Setup(s => s.GetSeries(series[0].SeriesId)).Returns(series[0]); @@ -63,13 +59,6 @@ namespace NzbDrone.Core.Test mocker.GetMock() .Setup(s => s.GetSeries(series[1].SeriesId)).Returns(series[1]); - - mocker.GetMock() - .Setup(s => s.GetEpisodeBySeries(series[0].SeriesId)).Returns(episodes); - - mocker.GetMock() - .Setup(s => s.GetEpisodeBySeries(series[1].SeriesId)).Returns(episodes); - mocker.GetMock() .Setup(s => s.GetSeriesFiles(It.IsAny())).Returns(new List()); @@ -78,6 +67,13 @@ namespace NzbDrone.Core.Test //Assert mocker.VerifyAllMocks(); + + mocker.GetMock().Verify(j => j.Start(notification, series[0].SeriesId), Times.Once()); + mocker.GetMock().Verify(j => j.Start(notification, series[1].SeriesId), Times.Once()); + + mocker.GetMock().Verify(j => j.Start(notification, series[0].SeriesId), Times.Once()); + mocker.GetMock().Verify(j => j.Start(notification, series[1].SeriesId), Times.Once()); + } @@ -93,8 +89,6 @@ namespace NzbDrone.Core.Test .AndTheNext(1).Has(s => s.SeriesId = 15) .Build(); - var episodes = Builder.CreateListOfSize(10).Build(); - var notification = new ProgressNotification("Test"); var mocker = new AutoMoqer(MockBehavior.Strict); @@ -105,18 +99,15 @@ namespace NzbDrone.Core.Test mocker.GetMock() .Setup(j => j.Start(notification, series[0].SeriesId)) - .Callback(() => series[0].LastInfoSync = DateTime.Now) - .AtMostOnce(); + .Callback(() => series[0].LastInfoSync = DateTime.Now); mocker.GetMock() .Setup(j => j.Start(notification, series[1].SeriesId)) - .Throws(new InvalidOperationException()) - .AtMostOnce(); + .Throws(new InvalidOperationException()); mocker.GetMock() .Setup(j => j.Start(notification, series[0].SeriesId)) - .Callback(() => series[0].LastDiskSync = DateTime.Now) - .AtMostOnce(); + .Callback(() => series[0].LastDiskSync = DateTime.Now); mocker.GetMock() @@ -125,17 +116,98 @@ namespace NzbDrone.Core.Test mocker.GetMock() .Setup(s => s.GetSeriesFiles(It.IsAny())).Returns(new List()); - mocker.GetMock() - .Setup(s => s.GetEpisodeBySeries(It.IsAny())).Returns(episodes); - //Act mocker.Resolve().Start(notification, 0); //Assert mocker.VerifyAllMocks(); + + mocker.GetMock().Verify(j => j.Start(notification, series[0].SeriesId), Times.Once()); + mocker.GetMock().Verify(j => j.Start(notification, series[1].SeriesId), Times.Once()); + + mocker.GetMock().Verify(j => j.Start(notification, series[0].SeriesId), Times.Once()); + ExceptionVerification.ExcpectedErrors(1); + } + + + [Test] + public void AutoIgnoreSeason_new_series_should_not_ignore_any() + { + int seriesId = 12; + + var mocker = new AutoMoqer(MockBehavior.Strict); + mocker.GetMock() + .Setup(p => p.GetSeriesFiles(seriesId)) + .Returns(new List()); + + mocker.GetMock() + .Setup(p => p.GetSeasons(seriesId)) + .Returns(new List { 0, 1, 2, 3, 4 }); + + mocker.Resolve().AutoIgnoreSeasons(seriesId); + + + mocker.GetMock().Verify(p => p.SetSeasonIgnore(seriesId, It.IsAny(), It.IsAny()), Times.Never()); + } + + [Test] + public void AutoIgnoreSeason_existing_should_not_ignore_currentseason() + { + int seriesId = 12; + + var episodesFiles = Builder.CreateListOfSize(2) + .WhereAll().Have(e => e.SeriesId = seriesId) + .Build(); + + episodesFiles[0].SeasonNumber = 0; + episodesFiles[1].SeasonNumber = 1; + + var mocker = new AutoMoqer(MockBehavior.Strict); + + mocker.GetMock() + .Setup(p => p.GetSeriesFiles(seriesId)) + .Returns(episodesFiles); + + mocker.GetMock() + .Setup(p => p.GetSeasons(seriesId)) + .Returns(new List { 0, 1, 2 }); + + mocker.Resolve().AutoIgnoreSeasons(seriesId); + + mocker.GetMock().Verify(p => p.SetSeasonIgnore(seriesId, 2, It.IsAny()), Times.Never()); + } + + [Test] + public void AutoIgnoreSeason_existing_should_ignore_seasons_with_no_file() + { + int seriesId = 12; + + var episodesFiles = Builder.CreateListOfSize(2) + .WhereAll().Have(e => e.SeriesId = seriesId) + .Build(); + + episodesFiles[0].SeasonNumber = 1; + + var mocker = new AutoMoqer(); + + mocker.GetMock() + .Setup(p => p.GetSeriesFiles(seriesId)) + .Returns(episodesFiles); + + mocker.GetMock() + .Setup(p => p.GetSeasons(seriesId)) + .Returns(new List { 0, 1, 2 }); + + mocker.Resolve().AutoIgnoreSeasons(seriesId); + + mocker.GetMock().Verify(p => p.SetSeasonIgnore(seriesId, 0, true), Times.Once()); + mocker.GetMock().Verify(p => p.SetSeasonIgnore(seriesId, 1, true), Times.Never()); + mocker.GetMock().Verify(p => p.SetSeasonIgnore(seriesId, 2, It.IsAny()), Times.Never()); + } } + } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/Jobs/ImportNewSeriesJob.cs b/NzbDrone.Core/Providers/Jobs/ImportNewSeriesJob.cs index 8374f3a62..6d8c0d40f 100644 --- a/NzbDrone.Core/Providers/Jobs/ImportNewSeriesJob.cs +++ b/NzbDrone.Core/Providers/Jobs/ImportNewSeriesJob.cs @@ -71,7 +71,7 @@ namespace NzbDrone.Core.Providers.Jobs _diskScanJob.Start(notification, currentSeries.SeriesId); var updatedSeries = _seriesProvider.GetSeries(currentSeries.SeriesId); - AutoIgnoreSeasons(updatedSeries); + AutoIgnoreSeasons(updatedSeries.SeriesId); } catch (Exception e) @@ -84,20 +84,20 @@ namespace NzbDrone.Core.Providers.Jobs ScanSeries(notification); } - private void AutoIgnoreSeasons(Series updatedSeries) + public void AutoIgnoreSeasons(int seriesId) { - var episodeFiles = _mediaFileProvider.GetSeriesFiles(updatedSeries.SeriesId); - var episodes = _episodeProvider.GetEpisodeBySeries(updatedSeries.SeriesId); + var episodeFiles = _mediaFileProvider.GetSeriesFiles(seriesId); + if (episodeFiles.Count() != 0) { - var seasons = episodes.Select(c => c.SeasonNumber).Distinct(); + var seasons = _episodeProvider.GetSeasons(seriesId); var currentSeasons = seasons.Max(); foreach (var season in seasons) { - if (season != currentSeasons) + if (season != currentSeasons && !episodeFiles.Any(e => e.SeasonNumber == season)) { - + _episodeProvider.SetSeasonIgnore(seriesId, season, true); } } } diff --git a/NzbDrone.Core/Providers/MediaFileProvider.cs b/NzbDrone.Core/Providers/MediaFileProvider.cs index 9d936f2c6..8a25655df 100644 --- a/NzbDrone.Core/Providers/MediaFileProvider.cs +++ b/NzbDrone.Core/Providers/MediaFileProvider.cs @@ -204,7 +204,7 @@ namespace NzbDrone.Core.Providers return _database.Fetch(); } - public virtual List GetSeriesFiles(int seriesId) + public virtual IList GetSeriesFiles(int seriesId) { return _database.Fetch("WHERE seriesId= @0", seriesId); } From 8b484601f61d4a1b7d4ae41eb6ba48597afdc9fd Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 19 Jun 2011 13:43:47 -0700 Subject: [PATCH 10/10] Removed all warnings --- Migrator.net/Migrator.Providers/Dialect.cs | 2 +- .../UpcomingEpisodesProviderTest.cs | 1 - NzbDrone.Core.Test/dbBenchmark.cs | 4 +-- NzbDrone.Core/Model/Quality.cs | 26 +++++++++++++++++++ .../Controllers/AddSeriesController.cs | 2 +- .../Controllers/DirectoryController.cs | 2 +- NzbDrone.Web/NzbDrone.Web.csproj | 4 --- NzbDrone.Web/Views/Series/Details.cshtml | 5 ++-- 8 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Migrator.net/Migrator.Providers/Dialect.cs b/Migrator.net/Migrator.Providers/Dialect.cs index 6c1a2fabf..16f4426a6 100644 --- a/Migrator.net/Migrator.Providers/Dialect.cs +++ b/Migrator.net/Migrator.Providers/Dialect.cs @@ -166,7 +166,7 @@ namespace Migrator.Providers public virtual string Default(object defaultValue) { - if (defaultValue is String && defaultValue == String.Empty) + if (defaultValue is String && defaultValue.ToString() == String.Empty) { defaultValue = "''"; } diff --git a/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs b/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs index f6a5f9947..fdd982e83 100644 --- a/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs +++ b/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs @@ -18,7 +18,6 @@ namespace NzbDrone.Core.Test private Episode tomorrow; private Episode twoDays; private Episode sevenDays; - private Episode eightDays; [SetUp] public new void Setup() diff --git a/NzbDrone.Core.Test/dbBenchmark.cs b/NzbDrone.Core.Test/dbBenchmark.cs index 60eb37b88..3b8b3800b 100644 --- a/NzbDrone.Core.Test/dbBenchmark.cs +++ b/NzbDrone.Core.Test/dbBenchmark.cs @@ -211,7 +211,7 @@ namespace NzbDrone.Core.Test [Test] - public void get_season_count_x5000() + public void get_season_count_x500() { var mocker = new AutoMoqer(); mocker.SetConstant(db); @@ -225,7 +225,7 @@ namespace NzbDrone.Core.Test Console.WriteLine("Starting Test"); var sw = Stopwatch.StartNew(); - for (int i = 0; i < 5000; i++) + for (int i = 0; i < 500; i++) { provider.GetSeasons(random.Next(1, 10)).Should().HaveSameCount(seasonsNumbers); } diff --git a/NzbDrone.Core/Model/Quality.cs b/NzbDrone.Core/Model/Quality.cs index 95ea38efb..28b0b4012 100644 --- a/NzbDrone.Core/Model/Quality.cs +++ b/NzbDrone.Core/Model/Quality.cs @@ -85,5 +85,31 @@ namespace NzbDrone.Core.Model return result; } + + public override int GetHashCode() + { + unchecked // Overflow is fine, just wrap + { + int hash = 17; + hash = hash * 23 + Proper.GetHashCode(); + hash = hash * 23 + QualityType.GetHashCode(); + return hash; + } + } + + public bool Equals(Quality other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Equals(other.QualityType, QualityType) && other.Proper.Equals(Proper); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Quality)) return false; + return Equals((Quality) obj); + } } } diff --git a/NzbDrone.Web/Controllers/AddSeriesController.cs b/NzbDrone.Web/Controllers/AddSeriesController.cs index 4737ebca7..6431d35da 100644 --- a/NzbDrone.Web/Controllers/AddSeriesController.cs +++ b/NzbDrone.Web/Controllers/AddSeriesController.cs @@ -139,7 +139,7 @@ namespace NzbDrone.Web.Controllers return new JsonResult { Data = "ok" }; } - catch (Exception ex) + catch (Exception) { return new JsonResult { Data = "failed" }; } diff --git a/NzbDrone.Web/Controllers/DirectoryController.cs b/NzbDrone.Web/Controllers/DirectoryController.cs index c756de335..b7e446d35 100644 --- a/NzbDrone.Web/Controllers/DirectoryController.cs +++ b/NzbDrone.Web/Controllers/DirectoryController.cs @@ -50,7 +50,7 @@ namespace NzbDrone.Web.Controllers return new SelectList(dirs, dirs.FirstOrDefault()); } } - catch(Exception ex) + catch { //Swallow the exceptions so proper JSON is returned to the client (Empty results) } diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index e0908cf64..e35bd337a 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -45,10 +45,6 @@ x86 - - False - ..\Libraries\Castle.Core.dll - False ..\Libraries\MVC3\Microsoft.Web.Infrastructure.dll diff --git a/NzbDrone.Web/Views/Series/Details.cshtml b/NzbDrone.Web/Views/Series/Details.cshtml index 2d03c1c66..a2fb68d53 100644 --- a/NzbDrone.Web/Views/Series/Details.cshtml +++ b/NzbDrone.Web/Views/Series/Details.cshtml @@ -91,8 +91,7 @@ Loading... } - @{var specialSeason = Model.Seasons.Where(s => s == 0).FirstOrDefault();} - @if (specialSeason != null) + @if (Model.Seasons.Any(s => s == 0)) {
@@ -127,7 +126,7 @@ .DataBinding( d => d.Ajax().Select("_AjaxSeasonGrid", "Series", - new RouteValueDictionary { { "seriesId", Model.SeriesId }, { "seasonNumber", specialSeason } } + new RouteValueDictionary { { "seriesId", Model.SeriesId }, { "seasonNumber", 0 } } )).Render(); } Loading