diff --git a/NzbDrone.Api/Episodes/EpisodeModule.cs b/NzbDrone.Api/Episodes/EpisodeModule.cs index 94874f57a..3d6684d19 100644 --- a/NzbDrone.Api/Episodes/EpisodeModule.cs +++ b/NzbDrone.Api/Episodes/EpisodeModule.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NzbDrone.Api.Mapping; using NzbDrone.Api.REST; using NzbDrone.Core.Tv; @@ -15,6 +16,7 @@ namespace NzbDrone.Api.Episodes GetResourceAll = GetEpisodes; UpdateResource = SetMonitored; + GetResourceById = GetEpisode; } private List GetEpisodes() @@ -33,5 +35,10 @@ namespace NzbDrone.Api.Episodes { _episodeService.SetEpisodeMonitored(episodeResource.Id, episodeResource.Monitored); } + + private EpisodeResource GetEpisode(int id) + { + return _episodeService.GetEpisode(id).InjectTo(); + } } } \ No newline at end of file diff --git a/NzbDrone.Api/Seasons/SeasonModule.cs b/NzbDrone.Api/Seasons/SeasonModule.cs index 8c6bf7d8b..0521b8518 100644 --- a/NzbDrone.Api/Seasons/SeasonModule.cs +++ b/NzbDrone.Api/Seasons/SeasonModule.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using NzbDrone.Api.Mapping; using NzbDrone.Core.Tv; namespace NzbDrone.Api.Seasons @@ -13,6 +14,7 @@ namespace NzbDrone.Api.Seasons _seasonService = seasonService; GetResourceAll = GetSeasons; + GetResourceById = GetSeason; UpdateResource = Update; Post["/pass"] = x => SetSeasonPass(); @@ -30,6 +32,11 @@ namespace NzbDrone.Api.Seasons return ToListResource(() => _seasonService.GetAllSeasons()); } + private SeasonResource GetSeason(int id) + { + return _seasonService.Get(id).InjectTo(); + } + private void Update(SeasonResource seasonResource) { _seasonService.SetMonitored(seasonResource.SeriesId, seasonResource.SeasonNumber, seasonResource.Monitored); diff --git a/NzbDrone.Core/Tv/SeasonService.cs b/NzbDrone.Core/Tv/SeasonService.cs index de0c4013d..8cb3d0c75 100644 Binary files a/NzbDrone.Core/Tv/SeasonService.cs and b/NzbDrone.Core/Tv/SeasonService.cs differ diff --git a/NzbDrone.Integration.Test/Client/ClientBase.cs b/NzbDrone.Integration.Test/Client/ClientBase.cs index 8b36d0260..1483f9ad4 100644 --- a/NzbDrone.Integration.Test/Client/ClientBase.cs +++ b/NzbDrone.Integration.Test/Client/ClientBase.cs @@ -42,13 +42,19 @@ namespace NzbDrone.Integration.Test.Client return Post(request); } + public TResource Put(TResource body) + { + var request = BuildRequest(); + request.AddBody(body); + return Put(request); + } + public TResource Get(int id, HttpStatusCode statusCode = HttpStatusCode.OK) { var request = BuildRequest(id.ToString()); return Get(request, statusCode); } - public void Delete(int id) { var request = BuildRequest(id.ToString()); @@ -82,6 +88,12 @@ namespace NzbDrone.Integration.Test.Client return Execute(request, statusCode); } + public T Put(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.Accepted) where T : class, new() + { + request.Method = Method.PUT; + return Execute(request, statusCode); + } + public void Delete(IRestRequest request, HttpStatusCode statusCode = HttpStatusCode.OK) { request.Method = Method.DELETE; @@ -109,13 +121,11 @@ namespace NzbDrone.Integration.Test.Client return Json.Deserialize(response.Content); } - private static void AssertDisableCache(IList headers) { headers.Single(c => c.Name == "Cache-Control").Value.Should().Be("no-cache, no-store, must-revalidate"); headers.Single(c => c.Name == "Pragma").Value.Should().Be("no-cache"); headers.Single(c => c.Name == "Expires").Value.Should().Be("0"); } - } } \ No newline at end of file diff --git a/NzbDrone.Integration.Test/Client/EpisodeClient.cs b/NzbDrone.Integration.Test/Client/EpisodeClient.cs new file mode 100644 index 000000000..675c38bd8 --- /dev/null +++ b/NzbDrone.Integration.Test/Client/EpisodeClient.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Net; +using NzbDrone.Api.Episodes; +using NzbDrone.Api.Series; +using RestSharp; + +namespace NzbDrone.Integration.Test.Client +{ + public class EpisodeClient : ClientBase + { + public EpisodeClient(IRestClient restClient) + : base(restClient, "episodes") + { + } + + public List GetEpisodesInSeries(int seriesId) + { + var request = BuildRequest("?seriesId=" + seriesId.ToString()); + return Get>(request); + } + } +} diff --git a/NzbDrone.Integration.Test/Client/SeasonClient.cs b/NzbDrone.Integration.Test/Client/SeasonClient.cs new file mode 100644 index 000000000..af0572a70 --- /dev/null +++ b/NzbDrone.Integration.Test/Client/SeasonClient.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Net; +using NzbDrone.Api.Episodes; +using NzbDrone.Api.Seasons; +using RestSharp; + +namespace NzbDrone.Integration.Test.Client +{ + public class SeasonClient : ClientBase + { + public SeasonClient(IRestClient restClient) + : base(restClient) + { + } + + public List GetSeasonsInSeries(int seriesId) + { + var request = BuildRequest("?seriesId=" + seriesId.ToString()); + return Get>(request); + } + } +} diff --git a/NzbDrone.Integration.Test/EpisodeIntegrationTests.cs b/NzbDrone.Integration.Test/EpisodeIntegrationTests.cs new file mode 100644 index 000000000..411023cac --- /dev/null +++ b/NzbDrone.Integration.Test/EpisodeIntegrationTests.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Api.Series; +using System.Linq; + +namespace NzbDrone.Integration.Test +{ + [TestFixture] + public class EpisodeIntegrationTests : IntegrationTest + { + private SeriesResource GivenSeriesWithEpisodes() + { + var series = Series.Lookup("archer").First(); + + series.QualityProfileId = 1; + series.Path = @"C:\Test\Archer"; + + series = Series.Post(series); + + while (true) + { + if (Episodes.GetEpisodesInSeries(series.Id).Count > 0) + { + return series; + } + + Thread.Sleep(1000); + } + } + + [Test] + public void should_be_able_to_get_all_episodes_in_series() + { + var series = GivenSeriesWithEpisodes(); + Episodes.GetEpisodesInSeries(series.Id).Count.Should().BeGreaterThan(0); + } + + [Test] + public void should_be_able_to_get_a_single_episode() + { + var series = GivenSeriesWithEpisodes(); + var episodes = Episodes.GetEpisodesInSeries(series.Id); + + Episodes.Get(episodes.First().Id).Should().NotBeNull(); + } + + [Test] + public void should_be_able_to_set_monitor_status_via_api() + { + var series = GivenSeriesWithEpisodes(); + var episodes = Episodes.GetEpisodesInSeries(series.Id); + var updatedEpisode = episodes.First(); + updatedEpisode.Monitored = false; + + Episodes.Put(updatedEpisode).Monitored.Should().BeFalse(); + } + } +} \ No newline at end of file diff --git a/NzbDrone.Integration.Test/IntegrationTest.cs b/NzbDrone.Integration.Test/IntegrationTest.cs index 313e58f5b..b705146b6 100644 --- a/NzbDrone.Integration.Test/IntegrationTest.cs +++ b/NzbDrone.Integration.Test/IntegrationTest.cs @@ -3,6 +3,7 @@ using NLog.Config; using NLog.Targets; using NUnit.Framework; using NzbDrone.Api.Commands; +using NzbDrone.Api.Episodes; using NzbDrone.Api.RootFolders; using NzbDrone.Common.EnvironmentInfo; using NzbDrone.Integration.Test.Client; @@ -22,6 +23,8 @@ namespace NzbDrone.Integration.Test protected ClientBase Commands; protected ReleaseClient Releases; protected IndexerClient Indexers; + protected EpisodeClient Episodes; + protected SeasonClient Seasons; private NzbDroneRunner _runner; @@ -57,6 +60,8 @@ namespace NzbDrone.Integration.Test RootFolders = new ClientBase(RestClient); Commands = new ClientBase(RestClient); Indexers = new IndexerClient(RestClient); + Episodes = new EpisodeClient(RestClient); + Seasons = new SeasonClient(RestClient); } [TearDown] diff --git a/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj b/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj index a3d18d2b5..04ce2753c 100644 --- a/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj +++ b/NzbDrone.Integration.Test/NzbDrone.Integration.Test.csproj @@ -93,10 +93,14 @@ + + + + diff --git a/NzbDrone.Integration.Test/SeasonIntegrationTests.cs b/NzbDrone.Integration.Test/SeasonIntegrationTests.cs new file mode 100644 index 000000000..c10146030 --- /dev/null +++ b/NzbDrone.Integration.Test/SeasonIntegrationTests.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading; +using FluentAssertions; +using NUnit.Framework; +using NzbDrone.Api.Series; +using System.Linq; + +namespace NzbDrone.Integration.Test +{ + [TestFixture] + public class SeasonIntegrationTests : IntegrationTest + { + private SeriesResource GivenSeriesWithEpisodes() + { + var series = Series.Lookup("archer").First(); + + series.QualityProfileId = 1; + series.Path = @"C:\Test\Archer"; + + series = Series.Post(series); + + while (true) + { + if (Seasons.GetSeasonsInSeries(series.Id).Count > 0) + { + return series; + } + + Thread.Sleep(1000); + } + } + + [Test] + public void should_be_able_to_get_all_seasons_in_series() + { + var series = GivenSeriesWithEpisodes(); + Seasons.GetSeasonsInSeries(series.Id).Count.Should().BeGreaterThan(0); + } + + [Test] + public void should_be_able_to_get_a_single_season() + { + var series = GivenSeriesWithEpisodes(); + var seasons = Seasons.GetSeasonsInSeries(series.Id); + + Seasons.Get(seasons.First().Id).Should().NotBeNull(); + } + + [Test] + public void should_be_able_to_set_monitor_status_via_api() + { + var series = GivenSeriesWithEpisodes(); + var seasons = Seasons.GetSeasonsInSeries(series.Id); + var updatedSeason = seasons.First(); + updatedSeason.Monitored = false; + + Seasons.Put(updatedSeason).Monitored.Should().BeFalse(); + } + } +} \ No newline at end of file