diff --git a/Octokit.Tests/Http/ApiConnectionTests.cs b/Octokit.Tests/Http/ApiConnectionTests.cs index 2c9d753e..c6e52372 100644 --- a/Octokit.Tests/Http/ApiConnectionTests.cs +++ b/Octokit.Tests/Http/ApiConnectionTests.cs @@ -17,7 +17,7 @@ namespace Octokit.Tests.Http public async Task MakesGetRequestForItem() { var getUri = new Uri("/anything", UriKind.Relative); - IResponse response = new ApiResponse { BodyAsObject = new object() }; + IResponse response = new ApiResponse {BodyAsObject = new object()}; var connection = Substitute.For(); connection.GetAsync(Args.Uri, null).Returns(Task.FromResult(response)); var apiConnection = new ApiConnection(connection); @@ -42,7 +42,7 @@ namespace Octokit.Tests.Http public async Task MakesHtmlRequest() { var getUri = new Uri("/anything", UriKind.Relative); - IResponse response = new ApiResponse { Body = "" }; + IResponse response = new ApiResponse {Body = ""}; var connection = Substitute.For(); connection.GetHtml(Args.Uri, null).Returns(Task.FromResult(response)); var apiConnection = new ApiConnection(connection); @@ -72,7 +72,7 @@ namespace Octokit.Tests.Http IResponse> response = new ApiResponse> { ApiInfo = new ApiInfo(links, scopes, scopes, "etag", 1, 1), - BodyAsObject = new List { new object(), new object() } + BodyAsObject = new List {new object(), new object()} }; var connection = Substitute.For(); connection.GetAsync>(Args.Uri, null).Returns(Task.FromResult(response)); @@ -92,14 +92,14 @@ namespace Octokit.Tests.Http } } - public class TheUpdateMethod + public class ThePatchMethod { [Fact] public async Task MakesPatchRequestWithSuppliedData() { var patchUri = new Uri("/anything", UriKind.Relative); var sentData = new object(); - IResponse response = new ApiResponse { BodyAsObject = new object() }; + IResponse response = new ApiResponse {BodyAsObject = new object()}; var connection = Substitute.For(); connection.PatchAsync(Args.Uri, Args.Object).Returns(Task.FromResult(response)); var apiConnection = new ApiConnection(connection); @@ -108,7 +108,6 @@ namespace Octokit.Tests.Http Assert.Same(data, response.BodyAsObject); connection.Received().PatchAsync(patchUri, sentData); - } [Fact] @@ -121,14 +120,14 @@ namespace Octokit.Tests.Http } } - public class TheCreateMethod + public class ThePostMethod { [Fact] public async Task MakesPostRequestWithSuppliedData() { var postUri = new Uri("/anything", UriKind.Relative); var sentData = new object(); - IResponse response = new ApiResponse { BodyAsObject = new object() }; + IResponse response = new ApiResponse {BodyAsObject = new object()}; var connection = Substitute.For(); connection.PostAsync(Args.Uri, Args.Object).Returns(Task.FromResult(response)); var apiConnection = new ApiConnection(connection); @@ -137,51 +136,13 @@ namespace Octokit.Tests.Http Assert.Same(data, response.BodyAsObject); connection.Received().PostAsync(postUri, sentData); - } - [Fact] - public async Task EnsuresArgumentNotNull() - { - var client = new ApiConnection(Substitute.For()); - var postUri = new Uri("/", UriKind.Relative); - await AssertEx.Throws(async () => await client.Post(null, new object())); - await AssertEx.Throws(async () => await client.Post(postUri, null)); - } - } - - public class TheDeleteMethod - { - [Fact] - public async Task MakesDeleteRequest() - { - var deleteUri = new Uri("/anything", UriKind.Relative); - IResponse response = new ApiResponse { BodyAsObject = new object() }; - var connection = Substitute.For(); - connection.DeleteAsync(Args.Uri).Returns(Task.FromResult(response)); - var apiConnection = new ApiConnection(connection); - - await apiConnection.Delete(deleteUri); - - connection.Received().DeleteAsync(deleteUri); - - } - - [Fact] - public async Task EnsuresArgumentNotNull() - { - var connection = new ApiConnection(Substitute.For()); - await AssertEx.Throws(async () => await connection.Delete(null)); - } - } - - public class TheUploadMethod - { [Fact] public async Task MakesUploadRequest() { var uploadUrl = new Uri("/anything", UriKind.Relative); - IResponse response = new ApiResponse { BodyAsObject = "the response" }; + IResponse response = new ApiResponse {BodyAsObject = "the response"}; var connection = Substitute.For(); connection.PostAsync(Args.Uri, Arg.Any(), Args.String, Args.String) .Returns(Task.FromResult(response)); @@ -193,14 +154,109 @@ namespace Octokit.Tests.Http connection.Received().PostAsync(uploadUrl, rawData, Args.String, Args.String); } + [Fact] + public async Task EnsuresArgumentsNotNull() + { + var postUri = new Uri("/", UriKind.Relative); + var connection = new ApiConnection(Substitute.For()); + + // 2 parameter overload + await AssertEx.Throws(async () => + await connection.Post(null, new object())); + await AssertEx.Throws(async () => + await connection.Post(postUri, null)); + + // 3 parameters + await AssertEx.Throws(async () => + await connection.Post(null, new MemoryStream(), "some-content-type", "anAccept")); + await AssertEx.Throws(async () => + await connection.Post(postUri, null, "some-content-type", "anAccept")); + await AssertEx.Throws(async () => + await connection.Post(postUri, new MemoryStream(), null, "anAccept")); + await AssertEx.Throws(async () => + await connection.Post(postUri, new MemoryStream(), "some-content-type", null)); + } + } + + public class ThePutMethod + { + [Fact] + public async Task MakesPutRequestWithSuppliedData() + { + var putUri = new Uri("/anything", UriKind.Relative); + var sentData = new object(); + IResponse response = new ApiResponse { BodyAsObject = new object() }; + var connection = Substitute.For(); + connection.PutAsync(Args.Uri, Args.Object).Returns(Task.FromResult(response)); + var apiConnection = new ApiConnection(connection); + + var data = await apiConnection.Put(putUri, sentData); + + Assert.Same(data, response.BodyAsObject); + connection.Received().PutAsync(putUri, sentData); + } + + [Fact] + public async Task MakesPutRequestWithSuppliedDataAndTwoFactorCode() + { + var putUri = new Uri("/anything", UriKind.Relative); + var sentData = new object(); + IResponse response = new ApiResponse { BodyAsObject = new object() }; + var connection = Substitute.For(); + connection.PutAsync(Args.Uri, Args.Object, "two-factor").Returns(Task.FromResult(response)); + var apiConnection = new ApiConnection(connection); + + var data = await apiConnection.Put(putUri, sentData, "two-factor"); + + Assert.Same(data, response.BodyAsObject); + connection.Received().PutAsync(putUri, sentData, "two-factor"); + } + + [Fact] + public async Task EnsuresArgumentsNotNull() + { + var putUri = new Uri("/", UriKind.Relative); + var connection = new ApiConnection(Substitute.For()); + + // 2 parameter overload + await AssertEx.Throws(async () => + await connection.Put(null, new object())); + await AssertEx.Throws(async () => + await connection.Put(putUri, null)); + + // 3 parameters + await AssertEx.Throws(async () => + await connection.Put(null, new MemoryStream(), "two-factor")); + await AssertEx.Throws(async () => + await connection.Put(putUri, null, "two-factor")); + await AssertEx.Throws(async () => + await connection.Put(putUri, new MemoryStream(), null)); + await AssertEx.Throws(async () => + await connection.Put(putUri, new MemoryStream(), "")); + } + } + + public class TheDeleteMethod + { + [Fact] + public async Task MakesDeleteRequest() + { + var deleteUri = new Uri("/anything", UriKind.Relative); + IResponse response = new ApiResponse {BodyAsObject = new object()}; + var connection = Substitute.For(); + connection.DeleteAsync(Args.Uri).Returns(Task.FromResult(response)); + var apiConnection = new ApiConnection(connection); + + await apiConnection.Delete(deleteUri); + + connection.Received().DeleteAsync(deleteUri); + } + [Fact] public async Task EnsuresArgumentNotNull() { var connection = new ApiConnection(Substitute.For()); - await AssertEx.Throws(async () => await connection.Post(null, new MemoryStream(), "some-content-type", "anAccept")); - await AssertEx.Throws(async () => await connection.Post(new Uri("/ok", UriKind.Relative), null, "some-content-type", "anAccept")); - await AssertEx.Throws(async () => await connection.Post(new Uri("/ok", UriKind.Relative), new MemoryStream(), null, "anAccept")); - await AssertEx.Throws(async () => await connection.Post(new Uri("/ok", UriKind.Relative), new MemoryStream(), "some-content-type", null)); + await AssertEx.Throws(async () => await connection.Delete(null)); } } diff --git a/Octokit/Http/ApiConnection.cs b/Octokit/Http/ApiConnection.cs index df98f4e3..555fd4f9 100644 --- a/Octokit/Http/ApiConnection.cs +++ b/Octokit/Http/ApiConnection.cs @@ -58,6 +58,21 @@ namespace Octokit return response.BodyAsObject; } + public async Task Post(Uri uri, Stream rawData, string contentType, string accepts) + { + Ensure.ArgumentNotNull(uri, "uri"); + Ensure.ArgumentNotNull(rawData, "rawData"); + Ensure.ArgumentNotNull(contentType, "contentType"); + Ensure.ArgumentNotNull(accepts, "accepts"); + + var response = await Connection.PostAsync( + uri, + rawData, + contentType, + accepts); + return response.BodyAsObject; + } + public async Task Put(Uri endpoint, object data) { Ensure.ArgumentNotNull(endpoint, "endpoint"); @@ -96,21 +111,6 @@ namespace Octokit await Connection.DeleteAsync(endpoint); } - public async Task Post(Uri uri, Stream rawData, string contentType, string accepts) - { - Ensure.ArgumentNotNull(uri, "uri"); - Ensure.ArgumentNotNull(rawData, "rawData"); - Ensure.ArgumentNotNull(contentType, "contentType"); - Ensure.ArgumentNotNull(accepts, "accepts"); - - var response = await Connection.PostAsync( - uri, - rawData, - contentType, - accepts); - return response.BodyAsObject; - } - async Task> GetPage(Uri endpoint, IDictionary parameters) { Ensure.ArgumentNotNull(endpoint, "endpoint"); diff --git a/Octokit/Http/IApiConnection.cs b/Octokit/Http/IApiConnection.cs index 51fce882..2d199095 100644 --- a/Octokit/Http/IApiConnection.cs +++ b/Octokit/Http/IApiConnection.cs @@ -17,11 +17,11 @@ namespace Octokit Task GetHtml(Uri endpoint, IDictionary parameters); Task> GetAll(Uri endpoint, IDictionary parameters); Task Post(Uri endpoint, object data); + Task Post(Uri uri, Stream rawData, string contentType, string accepts); Task Put(Uri endpoint, object data); Task Put(Uri endpoint, object data, string twoFactorAuthenticationCode); Task Patch(Uri endpoint, object data); [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification="Legitimate, but I'm not fixing it just yet.")] Task Delete(Uri endpoint); - Task Post(Uri uri, Stream rawData, string contentType, string accepts); } } \ No newline at end of file