diff --git a/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs b/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs index 5198ef1ad0..dd1c99c19a 100644 --- a/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs +++ b/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs @@ -22,6 +22,17 @@ public interface IObservableUserEmailsClient [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] IObservable GetAll(); + /// + /// Gets all email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user + /// + /// Options for changing the API response + /// The es for the authenticated user. + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] + IObservable GetAll(ApiOptions options); + /// /// Adds email addresses for the authenticated user. /// diff --git a/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs b/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs index 2a2d10712f..96076c307e 100644 --- a/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs +++ b/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs @@ -34,7 +34,22 @@ public ObservableUserEmailsClient(IGitHubClient client) /// The es for the authenticated user. public IObservable GetAll() { - return _connection.GetAndFlattenAllPages(ApiUrls.Emails()); + return GetAll(ApiOptions.None); + } + + /// + /// Gets all email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user + /// + /// Options for changing the API response + /// The es for the authenticated user. + public IObservable GetAll(ApiOptions options) + { + Ensure.ArgumentNotNull(options, "options"); + + return _connection.GetAndFlattenAllPages(ApiUrls.Emails(), options); } /// diff --git a/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs b/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs index f0af752c69..12ac23e496 100644 --- a/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs +++ b/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs @@ -6,15 +6,42 @@ namespace Octokit.Tests.Integration.Clients { public class UserEmailsClientTests { + private readonly IUserEmailsClient _emailClient; + + public UserEmailsClientTests() + { + var github = Helper.GetAuthenticatedClient(); + _emailClient = github.User.Email; + } + [IntegrationTest] public async Task CanGetEmail() { - var github = Helper.GetAuthenticatedClient(); + var emails = await _emailClient.GetAll(); + Assert.NotEmpty(emails); + } - var emails = await github.User.Email.GetAll(); + [IntegrationTest] + public async Task CanGetEmailWithApiOptions() + { + var emails = await _emailClient.GetAll(ApiOptions.None); Assert.NotEmpty(emails); } + [IntegrationTest] + public async Task ReturnsCorrectCountOfEmailsWithoutStart() + { + var options = new ApiOptions + { + PageSize = 5, + PageCount = 1 + }; + + var emails = await _emailClient.GetAll(options); + + Assert.NotEmpty(emails); + } + const string testEmailAddress = "hahaha-not-a-real-email@foo.com"; [IntegrationTest(Skip = "this isn't passing in CI - i hate past me right now")] diff --git a/Octokit.Tests.Integration/Reactive/ObservableUserEmailsClientTests.cs b/Octokit.Tests.Integration/Reactive/ObservableUserEmailsClientTests.cs index f3cd8b8147..9e74629949 100644 --- a/Octokit.Tests.Integration/Reactive/ObservableUserEmailsClientTests.cs +++ b/Octokit.Tests.Integration/Reactive/ObservableUserEmailsClientTests.cs @@ -7,15 +7,40 @@ namespace Octokit.Tests.Integration { public class ObservableUserEmailsClientTests { - [IntegrationTest] - public async Task CanGetEmail() + readonly ObservableUserEmailsClient _emailClient; + + public ObservableUserEmailsClientTests() { var github = Helper.GetAuthenticatedClient(); - var client = new ObservableUserEmailsClient(github); + _emailClient = new ObservableUserEmailsClient(github); + } - var email = await client.GetAll(); + [IntegrationTest] + public async Task CanGetEmail() + { + var email = await _emailClient.GetAll(); Assert.NotNull(email); } + + [IntegrationTest] + public async Task CanGetEmailWithApiOptions() + { + var email = await _emailClient.GetAll(ApiOptions.None); + Assert.NotNull(email); + } + + [IntegrationTest] + public async Task ReturnsCorrectCountOfEmailsWithoutStart() + { + var options = new ApiOptions + { + PageSize = 5, + PageCount = 1 + }; + + var emails = await _emailClient.GetAll(options).ToList(); + Assert.NotEmpty(emails); + } } } diff --git a/Octokit.Tests/Clients/UserEmailsClientTests.cs b/Octokit.Tests/Clients/UserEmailsClientTests.cs index b356479600..34d3110661 100644 --- a/Octokit.Tests/Clients/UserEmailsClientTests.cs +++ b/Octokit.Tests/Clients/UserEmailsClientTests.cs @@ -1,7 +1,7 @@ -using NSubstitute; -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; +using NSubstitute; using Xunit; namespace Octokit.Tests.Clients @@ -19,7 +19,20 @@ public void GetsCorrectUrl() client.GetAll(); connection.Received(1) - .GetAll(Arg.Is(u => u.ToString() == "user/emails")); + .GetAll(Arg.Is(u => u.ToString() == "user/emails"), + Args.ApiOptions); + } + + [Fact] + public void GetsCorrectUrlWithApiOptions() + { + var connection = Substitute.For(); + var client = new UserEmailsClient(connection); + + client.GetAll(ApiOptions.None); + + connection.Received(1) + .GetAll(Arg.Is(u => u.ToString() == "user/emails"), Args.ApiOptions); } } diff --git a/Octokit.Tests/Reactive/ObservableUserEmailsClientTests.cs b/Octokit.Tests/Reactive/ObservableUserEmailsClientTests.cs index 1e62a86b10..ea7dc6886e 100644 --- a/Octokit.Tests/Reactive/ObservableUserEmailsClientTests.cs +++ b/Octokit.Tests/Reactive/ObservableUserEmailsClientTests.cs @@ -1,7 +1,7 @@ -using NSubstitute; -using Octokit.Reactive; -using System; +using System; using System.Collections.Generic; +using NSubstitute; +using Octokit.Reactive; using Xunit; namespace Octokit.Tests @@ -18,25 +18,35 @@ private static ObservableUserEmailsClient CreateFixtureWithNonReactiveClient() public class TheGetAllMethod { + private static readonly Uri _expectedUri = new Uri("user/emails", UriKind.Relative); + [Fact] public void GetsCorrectUrl() { - var expectedUri = new Uri("user/emails", UriKind.Relative); var github = Substitute.For(); var client = new ObservableUserEmailsClient(github); client.GetAll(); - github.Connection.Received(1).GetResponse>(expectedUri); + github.Connection.Received(1).Get>(_expectedUri, + Arg.Is>(dictionary => dictionary.Count == 0), null); + } + + [Fact] + public void GetsCorrectUrlWithApiOption() + { + var github = Substitute.For(); + var client = new ObservableUserEmailsClient(github); + + client.GetAll(ApiOptions.None); + + github.Connection.Received(1).Get>(_expectedUri, + Arg.Is>(dictionary => dictionary.Count == 0), null); } } public class TheAddMethod { - public IGitHubClient GitHubClient; - - public ObservableUserEmailsClient Client; - [Fact] public void CallsAddOnClient() { diff --git a/Octokit/Clients/IUserEmailsClient.cs b/Octokit/Clients/IUserEmailsClient.cs index b653d218da..4fb9fb1232 100644 --- a/Octokit/Clients/IUserEmailsClient.cs +++ b/Octokit/Clients/IUserEmailsClient.cs @@ -22,6 +22,17 @@ public interface IUserEmailsClient [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] Task> GetAll(); + /// + /// Gets all email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user + /// + /// Options for changing the API response + /// The es for the authenticated user. + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] + Task> GetAll(ApiOptions options); + /// /// Adds email addresses for the authenticated user. /// diff --git a/Octokit/Clients/UserEmailsClient.cs b/Octokit/Clients/UserEmailsClient.cs index d503e85370..fc638cd060 100644 --- a/Octokit/Clients/UserEmailsClient.cs +++ b/Octokit/Clients/UserEmailsClient.cs @@ -30,7 +30,21 @@ public UserEmailsClient(IApiConnection apiConnection) /// The es for the authenticated user. public Task> GetAll() { - return ApiConnection.GetAll(ApiUrls.Emails()); + return GetAll(ApiOptions.None); + } + + /// + /// Gets all email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#list-email-addresses-for-a-user + /// + /// The es for the authenticated user. + public Task> GetAll(ApiOptions options) + { + Ensure.ArgumentNotNull(options, "options"); + + return ApiConnection.GetAll(ApiUrls.Emails(), options); } /// diff --git a/Octokit/Models/Request/ApiOptions.cs b/Octokit/Models/Request/ApiOptions.cs index ef149633c9..cdc3cbf379 100644 --- a/Octokit/Models/Request/ApiOptions.cs +++ b/Octokit/Models/Request/ApiOptions.cs @@ -58,5 +58,4 @@ internal string DebuggerDisplay } } } - }