From f777bc5b638d2cbf59a41db5f1aecf10d44743e6 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:09:34 +0930 Subject: [PATCH 1/7] added overloads for Delete to accept a payload --- Octokit/Http/ApiConnection.cs | 14 ++++++++++++++ Octokit/Http/Connection.cs | 22 ++++++++++++++++++++++ Octokit/Http/IApiConnection.cs | 10 +++++++++- Octokit/Http/IConnection.cs | 8 ++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/Octokit/Http/ApiConnection.cs b/Octokit/Http/ApiConnection.cs index 9caaad59..d5250334 100644 --- a/Octokit/Http/ApiConnection.cs +++ b/Octokit/Http/ApiConnection.cs @@ -286,6 +286,20 @@ namespace Octokit return Connection.Delete(uri); } + /// + /// Deletes the API object at the specified URI. + /// + /// URI of the API resource to delete + /// Object that describes the API resource; this will be serialized and used as the request's body + /// A for the request's execution. + public Task Delete(Uri uri, object data) + { + Ensure.ArgumentNotNull(uri, "uri"); + Ensure.ArgumentNotNull(data, "data"); + + return Connection.Delete(uri, data); + } + /// /// Executes a GET to the API object at the specified URI. This operation is appropriate for /// API calls which queue long running calculations. diff --git a/Octokit/Http/Connection.cs b/Octokit/Http/Connection.cs index c67a27e2..5644690d 100644 --- a/Octokit/Http/Connection.cs +++ b/Octokit/Http/Connection.cs @@ -295,6 +295,28 @@ namespace Octokit return response.StatusCode; } + /// + /// Performs an asynchronous HTTP DELETE request that expects an empty response. + /// + /// URI endpoint to send request to + /// The object to serialize as the body of the request + /// The returned + public async Task Delete(Uri uri, object data) + { + Ensure.ArgumentNotNull(uri, "uri"); + Ensure.ArgumentNotNull(data, "data"); + + var request = new Request + { + Method = HttpMethod.Delete, + Body = data, + BaseAddress = BaseAddress, + Endpoint = uri + }; + var response = await Run(request, CancellationToken.None); + return response.StatusCode; + } + /// /// Base address for the connection. /// diff --git a/Octokit/Http/IApiConnection.cs b/Octokit/Http/IApiConnection.cs index 9781a82d..87e48f4a 100644 --- a/Octokit/Http/IApiConnection.cs +++ b/Octokit/Http/IApiConnection.cs @@ -147,7 +147,7 @@ namespace Octokit /// /// The API resource's type. /// URI of the API resource to update - /// /// Object that describes the API resource; this will be serialized and used as the request's body + /// Object that describes the API resource; this will be serialized and used as the request's body /// The updated API resource. /// Thrown when an API error occurs. Task Patch(Uri uri, object data); @@ -170,6 +170,14 @@ namespace Octokit /// A for the request's execution. Task Delete(Uri uri); + /// + /// Deletes the API object at the specified URI. + /// + /// URI of the API resource to delete + /// Object that describes the API resource; this will be serialized and used as the request's body + /// A for the request's execution. + Task Delete(Uri uri, object data); + /// /// Executes a GET to the API object at the specified URI. This operation is appropriate for /// API calls which queue long running calculations. diff --git a/Octokit/Http/IConnection.cs b/Octokit/Http/IConnection.cs index b33c59f7..0e99814f 100644 --- a/Octokit/Http/IConnection.cs +++ b/Octokit/Http/IConnection.cs @@ -130,6 +130,14 @@ namespace Octokit /// The returned Task Delete(Uri uri); + /// + /// Performs an asynchronous HTTP DELETE request that expects an empty response. + /// + /// URI endpoint to send request to + /// The object to serialize as the body of the request + /// The returned + Task Delete(Uri uri, object data); + /// /// Base address for the connection. /// From 23f15486531931057008fe4b88f7f94f5ea63403 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:09:53 +0930 Subject: [PATCH 2/7] added tests and new method --- .../Clients/UserEmailsClientTests.cs | 31 +++++++++++++++++-- Octokit/Clients/UserEmailsClient.cs | 9 ++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Octokit.Tests/Clients/UserEmailsClientTests.cs b/Octokit.Tests/Clients/UserEmailsClientTests.cs index e699bc8a..8b96bd24 100644 --- a/Octokit.Tests/Clients/UserEmailsClientTests.cs +++ b/Octokit.Tests/Clients/UserEmailsClientTests.cs @@ -1,8 +1,6 @@ using NSubstitute; -using Octokit.Tests.Helpers; using System; using System.Collections.Generic; -using System.Threading.Tasks; using Xunit; namespace Octokit.Tests.Clients @@ -53,6 +51,35 @@ namespace Octokit.Tests.Clients } } + public class TheDeleteMethod + { + [Fact] + public void PostsToCorrectUrl() + { + var connection = Substitute.For(); + var client = new UserEmailsClient(connection); + + client.Delete("octocat@github.com"); + + connection.Received(1) + .Delete(Arg.Is(u => u.ToString() == "user/emails"), Arg.Any()); + } + + [Fact] + public void EnsuresNonNullArgument() + { + var client = new UserEmailsClient(Substitute.For()); + Assert.Throws(() => client.Delete(null)); + } + + [Fact] + public void EnsuresNoNullEmails() + { + var client = new UserEmailsClient(Substitute.For()); + Assert.Throws(() => client.Delete("octokit@github.com", null)); + } + } + public class TheCtor { [Fact] diff --git a/Octokit/Clients/UserEmailsClient.cs b/Octokit/Clients/UserEmailsClient.cs index a5a23629..b6406bd1 100644 --- a/Octokit/Clients/UserEmailsClient.cs +++ b/Octokit/Clients/UserEmailsClient.cs @@ -49,5 +49,14 @@ namespace Octokit return ApiConnection.Post>(ApiUrls.Emails(), emailAddresses); } + + public Task Delete(params string[] emailAddresses) + { + Ensure.ArgumentNotNull(emailAddresses, "emailAddresses"); + if (emailAddresses.Any(String.IsNullOrWhiteSpace)) + throw new ArgumentException("Cannot contain null, empty or whitespace values", "emailAddresses"); + + return ApiConnection.Delete(ApiUrls.Emails(), emailAddresses); + } } } \ No newline at end of file From 97995a769a64c2cfedb78cb173927cf5a4c69609 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:24:53 +0930 Subject: [PATCH 3/7] corrected return type from Add --- .../Clients/IObservableUserEmailsClient.cs | 2 +- .../Clients/ObservableUserEmailsClient.cs | 2 +- Octokit/Clients/IUserEmailsClient.cs | 2 +- Octokit/Clients/UserEmailsClient.cs | 13 ++----------- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs b/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs index 95f67d9e..148e3162 100644 --- a/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs +++ b/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs @@ -30,6 +30,6 @@ namespace Octokit.Reactive /// /// The email addresses to add. /// Returns the added es. - IObservable Add(params string[] emailAddresses); + IObservable Add(params string[] emailAddresses); } } diff --git a/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs b/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs index cce05a82..03b3153b 100644 --- a/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs +++ b/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs @@ -44,7 +44,7 @@ namespace Octokit.Reactive /// /// The email addresses to add. /// Returns the added es. - public IObservable Add(params string[] emailAddresses) + public IObservable Add(params string[] emailAddresses) { return _client.Add(emailAddresses).ToObservable().SelectMany(a => a); } diff --git a/Octokit/Clients/IUserEmailsClient.cs b/Octokit/Clients/IUserEmailsClient.cs index 9af896e3..170a1b94 100644 --- a/Octokit/Clients/IUserEmailsClient.cs +++ b/Octokit/Clients/IUserEmailsClient.cs @@ -30,6 +30,6 @@ namespace Octokit /// /// The email addresses to add. /// Returns the added es. - Task> Add(params string[] emailAddresses); + Task> Add(params string[] emailAddresses); } } diff --git a/Octokit/Clients/UserEmailsClient.cs b/Octokit/Clients/UserEmailsClient.cs index b6406bd1..b7b9eecd 100644 --- a/Octokit/Clients/UserEmailsClient.cs +++ b/Octokit/Clients/UserEmailsClient.cs @@ -41,22 +41,13 @@ namespace Octokit /// /// The email addresses to add. /// Returns the added es. - public Task> Add(params string[] emailAddresses) + public Task> Add(params string[] emailAddresses) { Ensure.ArgumentNotNull(emailAddresses, "emailAddresses"); if (emailAddresses.Any(String.IsNullOrWhiteSpace)) throw new ArgumentException("Cannot contain null, empty or whitespace values", "emailAddresses"); - return ApiConnection.Post>(ApiUrls.Emails(), emailAddresses); - } - - public Task Delete(params string[] emailAddresses) - { - Ensure.ArgumentNotNull(emailAddresses, "emailAddresses"); - if (emailAddresses.Any(String.IsNullOrWhiteSpace)) - throw new ArgumentException("Cannot contain null, empty or whitespace values", "emailAddresses"); - - return ApiConnection.Delete(ApiUrls.Emails(), emailAddresses); + return ApiConnection.Post>(ApiUrls.Emails(), emailAddresses); } } } \ No newline at end of file From 2cd53f061d4f6f48040cb6f0a05d4828301c9cec Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:25:44 +0930 Subject: [PATCH 4/7] wireup delete API --- .../Clients/UserEmailsClientTests.cs | 23 ++++++++++++++++++- Octokit/Clients/IUserEmailsClient.cs | 10 ++++++++ Octokit/Clients/UserEmailsClient.cs | 17 ++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs b/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs index 347c1c9e..7827b337 100644 --- a/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs +++ b/Octokit.Tests.Integration/Clients/UserEmailsClientTests.cs @@ -1,4 +1,4 @@ -using System.Net.Http.Headers; +using System.Linq; using System.Threading.Tasks; using Xunit; @@ -17,5 +17,26 @@ namespace Octokit.Tests.Integration.Clients var emails = await github.User.Email.GetAll(); Assert.NotEmpty(emails); } + + const string testEmailAddress = "hahaha-not-a-real-email@foo.com"; + + [IntegrationTest] + public async Task CanAddAndDeleteEmail() + { + var github = new GitHubClient(new ProductHeaderValue("OctokitTests")) + { + Credentials = Helper.Credentials + }; + + await github.User.Email.Add(testEmailAddress); + + var emails = await github.User.Email.GetAll(); + Assert.Contains(testEmailAddress, emails.Select(x => x.Email)); + + await github.User.Email.Delete(testEmailAddress); + + emails = await github.User.Email.GetAll(); + Assert.DoesNotContain(testEmailAddress, emails.Select(x => x.Email)); + } } } diff --git a/Octokit/Clients/IUserEmailsClient.cs b/Octokit/Clients/IUserEmailsClient.cs index 170a1b94..b2c60821 100644 --- a/Octokit/Clients/IUserEmailsClient.cs +++ b/Octokit/Clients/IUserEmailsClient.cs @@ -31,5 +31,15 @@ namespace Octokit /// The email addresses to add. /// Returns the added es. Task> Add(params string[] emailAddresses); + + /// + /// Deletes email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#delete-email-addresses + /// + /// The email addresses to add. + /// Returns the added es. + Task Delete(params string[] emailAddresses); } } diff --git a/Octokit/Clients/UserEmailsClient.cs b/Octokit/Clients/UserEmailsClient.cs index b7b9eecd..a17867df 100644 --- a/Octokit/Clients/UserEmailsClient.cs +++ b/Octokit/Clients/UserEmailsClient.cs @@ -49,5 +49,22 @@ namespace Octokit return ApiConnection.Post>(ApiUrls.Emails(), emailAddresses); } + + /// + /// Deletes email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#delete-email-addresses + /// + /// The email addresses to add. + /// Returns the added es. + public Task Delete(params string[] emailAddresses) + { + Ensure.ArgumentNotNull(emailAddresses, "emailAddresses"); + if (emailAddresses.Any(String.IsNullOrWhiteSpace)) + throw new ArgumentException("Cannot contain null, empty or whitespace values", "emailAddresses"); + + return ApiConnection.Delete(ApiUrls.Emails(), emailAddresses); + } } } \ No newline at end of file From 906e23cfbd18986aa0c394aed770c5b2ef7664da Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:30:40 +0930 Subject: [PATCH 5/7] corrected docs --- Octokit/Clients/IUserEmailsClient.cs | 2 +- Octokit/Clients/UserEmailsClient.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Octokit/Clients/IUserEmailsClient.cs b/Octokit/Clients/IUserEmailsClient.cs index b2c60821..b653d218 100644 --- a/Octokit/Clients/IUserEmailsClient.cs +++ b/Octokit/Clients/IUserEmailsClient.cs @@ -38,7 +38,7 @@ namespace Octokit /// /// http://developer.github.com/v3/users/emails/#delete-email-addresses /// - /// The email addresses to add. + /// The email addresses to delete. /// Returns the added es. Task Delete(params string[] emailAddresses); } diff --git a/Octokit/Clients/UserEmailsClient.cs b/Octokit/Clients/UserEmailsClient.cs index a17867df..b26fd7c6 100644 --- a/Octokit/Clients/UserEmailsClient.cs +++ b/Octokit/Clients/UserEmailsClient.cs @@ -56,7 +56,7 @@ namespace Octokit /// /// http://developer.github.com/v3/users/emails/#delete-email-addresses /// - /// The email addresses to add. + /// The email addresses to delete. /// Returns the added es. public Task Delete(params string[] emailAddresses) { From b03c634b68c97f53fea1e73b9116c67be147d545 Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:30:48 +0930 Subject: [PATCH 6/7] updated observable clients --- .../Clients/IObservableUserEmailsClient.cs | 12 +++++++++++- .../Clients/ObservableUserEmailsClient.cs | 16 +++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs b/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs index 148e3162..5198ef1a 100644 --- a/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs +++ b/Octokit.Reactive/Clients/IObservableUserEmailsClient.cs @@ -1,6 +1,6 @@ using System; using System.Diagnostics.CodeAnalysis; - +using System.Reactive; namespace Octokit.Reactive { @@ -31,5 +31,15 @@ namespace Octokit.Reactive /// The email addresses to add. /// Returns the added es. IObservable Add(params string[] emailAddresses); + + /// + /// Deletes email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#delete-email-addresses + /// + /// The email addresses to delete. + /// Returns the added es. + IObservable Delete(params string[] emailAddresses); } } diff --git a/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs b/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs index 03b3153b..ba3df0fa 100644 --- a/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs +++ b/Octokit.Reactive/Clients/ObservableUserEmailsClient.cs @@ -1,4 +1,5 @@ -using Octokit.Reactive.Internal; +using System.Reactive; +using Octokit.Reactive.Internal; using System; using System.Reactive.Linq; using System.Reactive.Threading.Tasks; @@ -48,5 +49,18 @@ namespace Octokit.Reactive { return _client.Add(emailAddresses).ToObservable().SelectMany(a => a); } + + /// + /// Deletes email addresses for the authenticated user. + /// + /// + /// http://developer.github.com/v3/users/emails/#delete-email-addresses + /// + /// The email addresses to delete. + /// Returns the added es. + public IObservable Delete(params string[] emailAddresses) + { + return _client.Delete(emailAddresses).ToObservable(); + } } } From 3bb4b17a1a1c9b6d6308c725ca3b36e1277e29bd Mon Sep 17 00:00:00 2001 From: Brendan Forster Date: Tue, 8 Jul 2014 10:49:03 +0930 Subject: [PATCH 7/7] fix impacted test --- Octokit.Tests/Clients/UserEmailsClientTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Octokit.Tests/Clients/UserEmailsClientTests.cs b/Octokit.Tests/Clients/UserEmailsClientTests.cs index 8b96bd24..7c095212 100644 --- a/Octokit.Tests/Clients/UserEmailsClientTests.cs +++ b/Octokit.Tests/Clients/UserEmailsClientTests.cs @@ -33,7 +33,7 @@ namespace Octokit.Tests.Clients client.Add("octocat@github.com"); connection.Received(1) - .Post>(Arg.Is(u => u.ToString() == "user/emails"), Arg.Any()); + .Post>(Arg.Is(u => u.ToString() == "user/emails"), Arg.Any()); } [Fact]