diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index eb5cc93dd..ef3eaa129 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -112,6 +112,7 @@ + diff --git a/NzbDrone.Core.Test/ProviderTests/SearchHistoryProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/SearchHistoryProviderTest.cs new file mode 100644 index 000000000..7f6a80c2e --- /dev/null +++ b/NzbDrone.Core.Test/ProviderTests/SearchHistoryProviderTest.cs @@ -0,0 +1,267 @@ +using System; +using System.IO; +using System.Linq; +using System.Net; +using FizzWare.NBuilder; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Common; +using NzbDrone.Core.Model; +using NzbDrone.Core.Model.Notification; +using NzbDrone.Core.Providers; +using NzbDrone.Core.Repository; +using NzbDrone.Core.Repository.Quality; +using NzbDrone.Core.Repository.Search; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common.AutoMoq; +using NzbDrone.Test.Common; + +namespace NzbDrone.Core.Test.ProviderTests +{ + [TestFixture] + // ReSharper disable InconsistentNaming + public class SearchHistoryProviderTest : CoreTest + { + private SearchHistory _searchHistory; + private Series _series; + private Episode _episode; + + [SetUp] + public void Setup() + { + _series = Builder.CreateNew() + .Build(); + + _episode = Builder.CreateNew() + .Build(); + + var items = Builder.CreateListOfSize(10) + .Build().ToList(); + + _searchHistory = Builder.CreateNew() + .With(h => h.EpisodeId = _episode.EpisodeId) + .With(h => h.SeriesId - _series.SeriesId) + .With(h => h.SearchHistoryItems = items) + .Build(); + } + + private void WithUnsuccessfulSearch() + { + foreach(var item in _searchHistory.SearchHistoryItems) + { + item.Success = false; + } + } + + private void WithSuccessfulSearch() + { + foreach(var item in _searchHistory.SearchHistoryItems) + { + item.Success = false; + } + + var i = _searchHistory.SearchHistoryItems.Last(); + i.Success = true; + i.SearchError = ReportRejectionType.None; + } + + [Test] + public void Add_should_add_history_and_history_items() + { + WithRealDb(); + + Mocker.Resolve().Add(_searchHistory); + + Db.Fetch().Should().HaveCount(1); + Db.Fetch().Should().HaveCount(10); + } + + [Test] + public void Add_should_add_return_id() + { + WithRealDb(); + + var result = Mocker.Resolve().Add(_searchHistory); + + result.Should().NotBe(0); + } + + [Test] + public void Delete_should_delete_history_and_history_items() + { + WithRealDb(); + + Mocker.Resolve().Add(_searchHistory); + + var history = Db.Fetch(); + + Mocker.Resolve().Delete(history.First().Id); + + Db.Fetch().Should().HaveCount(0); + Db.Fetch().Should().HaveCount(0); + } + + [Test] + public void AllSearchHistory_should_return_all_items() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().AllSearchHistory(); + + result.Count.Should().Be(1); + } + + [Test] + public void AllSearchHistory_should_have_series_title() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().AllSearchHistory(); + + result.Count.Should().Be(1); + result.First().SeriesTitle.Should().Be(_series.Title); + } + + [Test] + public void AllSearchHistory_should_have_episode_information() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().AllSearchHistory(); + + result.Count.Should().Be(1); + result.First().EpisodeTitle.Should().Be(_episode.Title); + result.First().EpisodeNumber.Should().Be(_episode.EpisodeNumber); + result.First().SeasonNumber.Should().Be(_episode.SeasonNumber); + } + + [Test] + public void AllSearchHistory_should_have_totalItems_count() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().AllSearchHistory(); + + result.Count.Should().Be(1); + result.First().TotalItems.Should().Be(_searchHistory.SearchHistoryItems.Count); + } + + [Test] + public void AllSearchHistory_should_have_successfulCount_equal_zero_when_all_failed() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + WithUnsuccessfulSearch(); + + Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().AllSearchHistory(); + + result.Count.Should().Be(1); + result.First().SuccessfulCount.Should().Be(0); + } + + [Test] + public void AllSearchHistory_should_have_successfulCount_equal_one_when_one_was_downloaded() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + WithSuccessfulSearch(); + + Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().AllSearchHistory(); + + result.Count.Should().Be(1); + result.First().SuccessfulCount.Should().Be(1); + } + + [Test] + public void GetSearchHistory_should_return_searchHistory_with_items() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + WithSuccessfulSearch(); + var id = Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().GetSearchHistory(id); + + result.SearchHistoryItems.Should().HaveCount(_searchHistory.SearchHistoryItems.Count); + } + + [Test] + public void GetSearchHistory_should_have_episodeDetails() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + WithSuccessfulSearch(); + var id = Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().GetSearchHistory(id); + + result.EpisodeNumber.Should().Be(_episode.EpisodeNumber); + result.SeasonNumber.Should().Be(_episode.SeasonNumber); + result.EpisodeTitle.Should().Be(_episode.Title); + result.AirDate.Should().Be(_episode.AirDate.Value); + } + + [Test] + public void GetSearchHistory_should_not_have_episode_info_if_it_was_a_full_season_search() + { + WithRealDb(); + Db.Insert(_series); + + _searchHistory.EpisodeId = 0; + var id = Mocker.Resolve().Add(_searchHistory); + + var result = Mocker.Resolve().GetSearchHistory(id); + + result.EpisodeNumber.Should().Be(null); + result.SeasonNumber.Should().Be(_searchHistory.SeasonNumber); + result.EpisodeTitle.Should().Be(null); + } + + [Test] + public void ForceDownload_should_download_report() + { + WithRealDb(); + Db.Insert(_series); + Db.Insert(_episode); + + var reportTitle = String.Format("{0} - S{1:00}E{2:00}", _series.Title, _episode.SeasonNumber, _episode.EpisodeNumber); + _searchHistory.SearchHistoryItems.First().ReportTitle = reportTitle; + + Mocker.Resolve().Add(_searchHistory); + var items = Db.Fetch(); + + Mocker.Resolve().ForceDownload(items.First().Id); + + Mocker.GetMock().Verify(v => v.DownloadReport(It.IsAny()), Times.Once()); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Providers/SearchHistoryProvider.cs b/NzbDrone.Core/Providers/SearchHistoryProvider.cs index 3432cf273..b262302ac 100644 --- a/NzbDrone.Core/Providers/SearchHistoryProvider.cs +++ b/NzbDrone.Core/Providers/SearchHistoryProvider.cs @@ -34,15 +34,17 @@ namespace NzbDrone.Core.Providers } - public virtual void Add(SearchHistory searchResult) + public virtual int Add(SearchHistory searchHistory) { logger.Trace("Adding new search result"); - searchResult.SuccessfulDownload = searchResult.SearchHistoryItems.Any(s => s.Success); - var id = Convert.ToInt32(_database.Insert(searchResult)); + searchHistory.SuccessfulDownload = searchHistory.SearchHistoryItems.Any(s => s.Success); + var id = Convert.ToInt32(_database.Insert(searchHistory)); - searchResult.SearchHistoryItems.ForEach(s => s.SearchHistoryId = id); + searchHistory.SearchHistoryItems.ForEach(s => s.SearchHistoryId = id); logger.Trace("Adding search result items"); - _database.InsertMany(searchResult.SearchHistoryItems); + _database.InsertMany(searchHistory.SearchHistoryItems); + + return id; } public virtual void Delete(int id) @@ -102,6 +104,7 @@ namespace NzbDrone.Core.Providers public virtual void ForceDownload(int itemId) { var item = _database.Single(itemId); + logger.Info("Starting Force Download of: {0}", item.ReportTitle); var searchResult = _database.Single(item.SearchHistoryId); var series = _seriesProvider.GetSeries(searchResult.SeriesId); @@ -111,6 +114,7 @@ namespace NzbDrone.Core.Providers parseResult.Indexer = item.Indexer; var episodes = _episodeProvider.GetEpisodesByParseResult(parseResult); + logger.Info("Forcing Download of: {0}", item.ReportTitle); _downloadProvider.DownloadReport(parseResult); } } diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index e64985d2d..a9241eb1d 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -51,9 +51,9 @@ x86 - - ..\packages\DataTables.Mvc.0.1.0.67\lib\DataTables.Mvc.Core.dll - True + + False + ..\packages\DataTables.Mvc.0.1.0.68\lib\DataTables.Mvc.Core.dll ..\packages\DynamicQuery.1.0\lib\35\Dynamic.dll diff --git a/NzbDrone.Web/Views/SearchHistory/Details.cshtml b/NzbDrone.Web/Views/SearchHistory/Details.cshtml index 0546caba1..93ef288fd 100644 --- a/NzbDrone.Web/Views/SearchHistory/Details.cshtml +++ b/NzbDrone.Web/Views/SearchHistory/Details.cshtml @@ -20,7 +20,7 @@ .AddColumn(new Column().DataProperty("Success").Title("Successful").Width("120px")) .AddColumn(new Column().DisplayAndSort("Quality", "QualityInt").Title("Quality").Width("80px")) .AddColumn(new Column().DataProperty("SearchError").Title("Error")) - .AddColumn(new Column().DataProperty("return actionColumn(source, type, val);", true)) + .AddColumn(new Column().DataProperty("return actionColumn(source, type, val);", true).Sortable(false).Searchable(false)) .AddColumn(new Column().DataProperty("Details").RenderFunction("return getDetails(row, val);").Visible(false)) .AddSorting(3, SortDirection.Desc)) diff --git a/NzbDrone.Web/packages.config b/NzbDrone.Web/packages.config index f1a80c99a..d435e4f26 100644 --- a/NzbDrone.Web/packages.config +++ b/NzbDrone.Web/packages.config @@ -1,6 +1,6 @@  - + diff --git a/packages/DataTables.Mvc.0.1.0.67/DataTables.Mvc.0.1.0.67.nupkg b/packages/DataTables.Mvc.0.1.0.67/DataTables.Mvc.0.1.0.67.nupkg deleted file mode 100644 index a3bc6861c..000000000 Binary files a/packages/DataTables.Mvc.0.1.0.67/DataTables.Mvc.0.1.0.67.nupkg and /dev/null differ diff --git a/packages/DataTables.Mvc.0.1.0.67/lib/DataTables.Mvc.Core.dll b/packages/DataTables.Mvc.0.1.0.67/lib/DataTables.Mvc.Core.dll deleted file mode 100644 index a18c8bf2c..000000000 Binary files a/packages/DataTables.Mvc.0.1.0.67/lib/DataTables.Mvc.Core.dll and /dev/null differ diff --git a/packages/DataTables.Mvc.0.1.0.68/Content/App_Start/DataTablesMvc.cs.pp b/packages/DataTables.Mvc.0.1.0.68/Content/App_Start/DataTablesMvc.cs.pp new file mode 100644 index 000000000..abaaa76f4 --- /dev/null +++ b/packages/DataTables.Mvc.0.1.0.68/Content/App_Start/DataTablesMvc.cs.pp @@ -0,0 +1,17 @@ +using DataTables.Mvc.Core.Helpers; +using DataTables.Mvc.Core.Models; +using System.Web.Mvc; + +[assembly: WebActivator.PreApplicationStartMethod(typeof($rootnamespace$.App_Start.DataTablesModelBinderActivator), "Start")] + +namespace $rootnamespace$.App_Start +{ + public static class DataTablesModelBinderActivator + { + public static void Start() + { + if (!ModelBinders.Binders.ContainsKey(typeof(DataTablesParams))) + ModelBinders.Binders.Add(typeof(DataTablesParams), new DataTablesModelBinder()); + } + } +} \ No newline at end of file diff --git a/packages/DataTables.Mvc.0.1.0.68/DataTables.Mvc.0.1.0.68.nupkg b/packages/DataTables.Mvc.0.1.0.68/DataTables.Mvc.0.1.0.68.nupkg new file mode 100644 index 000000000..04747a362 Binary files /dev/null and b/packages/DataTables.Mvc.0.1.0.68/DataTables.Mvc.0.1.0.68.nupkg differ diff --git a/packages/DataTables.Mvc.0.1.0.68/lib/DataTables.Mvc.Core.dll b/packages/DataTables.Mvc.0.1.0.68/lib/DataTables.Mvc.Core.dll new file mode 100644 index 000000000..abe1a56e1 Binary files /dev/null and b/packages/DataTables.Mvc.0.1.0.68/lib/DataTables.Mvc.Core.dll differ diff --git a/packages/DataTables.Mvc.0.1.0.68/tools/install.ps1 b/packages/DataTables.Mvc.0.1.0.68/tools/install.ps1 new file mode 100644 index 000000000..7e1f5357f --- /dev/null +++ b/packages/DataTables.Mvc.0.1.0.68/tools/install.ps1 @@ -0,0 +1,5 @@ +param($installPath, $toolsPath, $package, $project) + +$path = [System.IO.Path] +$appstart = $path::Combine($path::GetDirectoryName($project.FileName), "App_Start\DataTablesMvc.cs") +$DTE.ItemOperations.OpenFile($appstart) \ No newline at end of file