From e0f0d9df6a8050bc32da4b5d23a499776d341357 Mon Sep 17 00:00:00 2001 From: Steve Land Date: Fri, 17 Aug 2018 16:50:03 +0100 Subject: [PATCH 1/2] Admin API GetRequestsAsync Json/JsonApi request body tests --- .../FluentMockServerAdminRestClientTests.cs | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs b/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs index 71d6be87d..61b311357 100644 --- a/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs @@ -61,5 +61,63 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync() Check.That(requestLogged.Request.Body).IsNull(); Check.That(requestLogged.Request.Path).IsEqualTo("/foo"); } + + [Fact] + public async Task IFluentMockServerAdmin_GetRequestsAsync_JsonApi() + { + // given + _server = FluentMockServer.Start(new FluentMockServerSettings { StartAdminInterface = true, Logger = new WireMockNullLogger() }); + var serverUrl = "http://localhost:" + _server.Ports[0]; + var data = "{\"data\":[{\"type\":\"program\",\"attributes\":{\"alias\":\"T000001\",\"title\":\"Title Group Entity\"}}]}"; + var jsonApiAcceptHeader = "application/vnd.api+json"; + var jsonApiContentType = "application/vnd.api+json"; + var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); + request.Headers.Accept.Clear(); + request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonApiAcceptHeader)); + request.Content = new StringContent(data); + request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); + var response = new HttpClient().SendAsync(request); + + var api = RestClient.For(serverUrl); + + // when + var requests = await api.GetRequestsAsync(); + + // then + Check.That(requests).HasSize(1); + var requestLogged = requests.First(); + Check.That(requestLogged.Request.Method).IsEqualTo("post"); + Check.That(requestLogged.Request.Body).IsNotNull(); + Check.That(requestLogged.Request.Body).Contains("T000001"); + } + + [Fact] + public async Task IFluentMockServerAdmin_GetRequestsAsync_Json() + { + // given + _server = FluentMockServer.Start(new FluentMockServerSettings { StartAdminInterface = true, Logger = new WireMockNullLogger() }); + var serverUrl = "http://localhost:" + _server.Ports[0]; + var data = "{\"alias\": \"T000001\"}"; + var jsonAcceptHeader = "application/json"; + var jsonApiContentType = "application/json"; + var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); + request.Headers.Accept.Clear(); + request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonAcceptHeader)); + request.Content = new StringContent(data); + request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); + var response = new HttpClient().SendAsync(request); + + var api = RestClient.For(serverUrl); + + // when + var requests = await api.GetRequestsAsync(); + + // then + Check.That(requests).HasSize(1); + var requestLogged = requests.First(); + Check.That(requestLogged.Request.Method).IsEqualTo("post"); + Check.That(requestLogged.Request.Body).IsNotNull(); + Check.That(requestLogged.Request.Body).Contains("T000001"); + } } } \ No newline at end of file From 712f4eda37552404a0c5acf8f2b21b715dd8e43d Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Fri, 17 Aug 2018 19:12:51 +0200 Subject: [PATCH 2/2] Fix code + update unit-tests --- src/WireMock.Net/Util/BodyParser.cs | 10 +- test/WireMock.Net.Tests/ClientTests.cs | 63 ----------- .../FluentMockServerAdminRestClientTests.cs | 100 +++++++++++++++--- .../Util/BodyParserTests.cs | 30 ++++++ 4 files changed, 122 insertions(+), 81 deletions(-) delete mode 100644 test/WireMock.Net.Tests/ClientTests.cs diff --git a/src/WireMock.Net/Util/BodyParser.cs b/src/WireMock.Net/Util/BodyParser.cs index c551ddc43..58362917c 100644 --- a/src/WireMock.Net/Util/BodyParser.cs +++ b/src/WireMock.Net/Util/BodyParser.cs @@ -10,6 +10,12 @@ namespace WireMock.Util { internal static class BodyParser { + private static readonly string[] JsonContentTypes = + { + "application/json", + "application/vnd.api+json" + }; + private static readonly string[] TextContentTypes = { "text/", @@ -41,7 +47,7 @@ public static async Task Parse([NotNull] Stream stream, [CanBeNull] st { var data = new BodyData(); - if (contentTypeHeaderValue != null && TextContentTypes.Any(t => contentTypeHeaderValue.StartsWith(t, StringComparison.OrdinalIgnoreCase))) + if (contentTypeHeaderValue != null && TextContentTypes.Any(text => contentTypeHeaderValue.StartsWith(text, StringComparison.OrdinalIgnoreCase))) { try { @@ -55,7 +61,7 @@ public static async Task Parse([NotNull] Stream stream, [CanBeNull] st data.BodyAsBytes = await ReadBytesAsync(stream); } } - else if (contentTypeHeaderValue != null && contentTypeHeaderValue.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) + else if (contentTypeHeaderValue != null && JsonContentTypes.Any(json => contentTypeHeaderValue.StartsWith(json, StringComparison.OrdinalIgnoreCase))) { var stringData = await ReadStringAsync(stream); data.BodyAsString = stringData.Item1; diff --git a/test/WireMock.Net.Tests/ClientTests.cs b/test/WireMock.Net.Tests/ClientTests.cs deleted file mode 100644 index 91295be3f..000000000 --- a/test/WireMock.Net.Tests/ClientTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Linq; -using System.Threading.Tasks; -using NFluent; -using RestEase; -using WireMock.Admin.Mappings; -using WireMock.Client; -using WireMock.Server; -using Xunit; - -namespace WireMock.Net.Tests -{ - // TODO : move these to FluentMockServerAdminRestClientTests - public class ClientTests - { - [Fact] - public async Task Client_IFluentMockServerAdmin_SettingsGet() - { - // Assign - var server = FluentMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); - - // Act - var settings = await api.GetSettingsAsync(); - Check.That(settings).IsNotNull(); - } - - [Fact] - public async Task Client_IFluentMockServerAdmin_PostMappingAsync() - { - // Assign - var server = FluentMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); - - // Act - var model = new MappingModel - { - Request = new RequestModel - { - Path = "/1" - }, - Response = new ResponseModel - { - Body = "txt", - StatusCode = 200 - }, - Priority = 500, - Title = "test" - }; - var result = await api.PostMappingAsync(model); - - // Assert - Check.That(result).IsNotNull(); - Check.That(result.Status).IsNotNull(); - Check.That(result.Guid).IsNotNull(); - - var mapping = server.Mappings.Single(m => m.Priority == 500); - Check.That(mapping).IsNotNull(); - Check.That(mapping.Title).Equals("test"); - - server.Stop(); - } - } -} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs b/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs index 1e9e578a1..ca4d68cc5 100644 --- a/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerAdminRestClientTests.cs @@ -1,6 +1,6 @@ -using System; -using System.Linq; +using System.Linq; using System.Net.Http; +using System.Net.Http.Headers; using System.Threading.Tasks; using NFluent; using RestEase; @@ -15,11 +15,63 @@ namespace WireMock.Net.Tests { public class FluentMockServerAdminRestClientTests { + [Fact] + public async Task IFluentMockServerAdmin_GetSettingsAsync() + { + // Assign + var server = FluentMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var settings = await api.GetSettingsAsync(); + Check.That(settings).IsNotNull(); + } + + [Fact] + public async Task IFluentMockServerAdmin_PostMappingAsync() + { + // Assign + var server = FluentMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var model = new MappingModel + { + Request = new RequestModel + { + Path = "/1" + }, + Response = new ResponseModel + { + Body = "txt", + StatusCode = 200 + }, + Priority = 500, + Title = "test" + }; + var result = await api.PostMappingAsync(model); + + // Assert + Check.That(result).IsNotNull(); + Check.That(result.Status).IsNotNull(); + Check.That(result.Guid).IsNotNull(); + + var mapping = server.Mappings.Single(m => m.Priority == 500); + Check.That(mapping).IsNotNull(); + Check.That(mapping.Title).Equals("test"); + + server.Stop(); + } + [Fact] public async Task IFluentMockServerAdmin_FindRequestsAsync() { // given - var server = FluentMockServer.Start(new FluentMockServerSettings { StartAdminInterface = true, Logger = new WireMockNullLogger() }); + var server = FluentMockServer.Start(new FluentMockServerSettings + { + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); var serverUrl = "http://localhost:" + server.Ports[0]; await new HttpClient().GetAsync(serverUrl + "/foo"); var api = RestClient.For(serverUrl); @@ -39,7 +91,11 @@ public async Task IFluentMockServerAdmin_FindRequestsAsync() public async Task IFluentMockServerAdmin_GetRequestsAsync() { // given - var server = FluentMockServer.Start(new FluentMockServerSettings { StartAdminInterface = true, Logger = new WireMockNullLogger() }); + var server = FluentMockServer.Start(new FluentMockServerSettings + { + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); var serverUrl = "http://localhost:" + server.Ports[0]; await new HttpClient().GetAsync(serverUrl + "/foo"); var api = RestClient.For(serverUrl); @@ -59,17 +115,23 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync() public async Task IFluentMockServerAdmin_GetRequestsAsync_JsonApi() { // given - _server = FluentMockServer.Start(new FluentMockServerSettings { StartAdminInterface = true, Logger = new WireMockNullLogger() }); - var serverUrl = "http://localhost:" + _server.Ports[0]; - var data = "{\"data\":[{\"type\":\"program\",\"attributes\":{\"alias\":\"T000001\",\"title\":\"Title Group Entity\"}}]}"; - var jsonApiAcceptHeader = "application/vnd.api+json"; - var jsonApiContentType = "application/vnd.api+json"; + var server = FluentMockServer.Start(new FluentMockServerSettings + { + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); + string serverUrl = server.Urls[0]; + string data = "{\"data\":[{\"type\":\"program\",\"attributes\":{\"alias\":\"T000001\",\"title\":\"Title Group Entity\"}}]}"; + string jsonApiAcceptHeader = "application/vnd.api+json"; + string jsonApiContentType = "application/vnd.api+json"; + var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); request.Headers.Accept.Clear(); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonApiAcceptHeader)); request.Content = new StringContent(data); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); - var response = new HttpClient().SendAsync(request); + + var response = await new HttpClient().SendAsync(request); var api = RestClient.For(serverUrl); @@ -88,17 +150,22 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync_JsonApi() public async Task IFluentMockServerAdmin_GetRequestsAsync_Json() { // given - _server = FluentMockServer.Start(new FluentMockServerSettings { StartAdminInterface = true, Logger = new WireMockNullLogger() }); - var serverUrl = "http://localhost:" + _server.Ports[0]; - var data = "{\"alias\": \"T000001\"}"; - var jsonAcceptHeader = "application/json"; - var jsonApiContentType = "application/json"; + var server = FluentMockServer.Start(new FluentMockServerSettings + { + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); + string serverUrl = server.Urls[0]; + string data = "{\"alias\": \"T000001\"}"; + string jsonAcceptHeader = "application/json"; + string jsonApiContentType = "application/json"; + var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); request.Headers.Accept.Clear(); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonAcceptHeader)); request.Content = new StringContent(data); request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); - var response = new HttpClient().SendAsync(request); + var response = await new HttpClient().SendAsync(request); var api = RestClient.For(serverUrl); @@ -113,4 +180,5 @@ public async Task IFluentMockServerAdmin_GetRequestsAsync_Json() Check.That(requestLogged.Request.Body).Contains("T000001"); } } + } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/Util/BodyParserTests.cs b/test/WireMock.Net.Tests/Util/BodyParserTests.cs index 21508f5cd..bafcc5a97 100644 --- a/test/WireMock.Net.Tests/Util/BodyParserTests.cs +++ b/test/WireMock.Net.Tests/Util/BodyParserTests.cs @@ -9,6 +9,36 @@ namespace WireMock.Net.Tests.Util { public class BodyParserTests { + [Fact] + public async Task BodyParser_Parse_ApplicationJson() + { + // Assign + var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes("{ \"x\": 1 }")); + + // Act + var body = await BodyParser.Parse(memoryStream, "application/json"); + + // Assert + Check.That(body.BodyAsBytes).IsNull(); + Check.That(body.BodyAsJson).IsNotNull(); + Check.That(body.BodyAsString).Equals("{ \"x\": 1 }"); + } + + [Fact] // http://jsonapi.org/ + public async Task BodyParser_Parse_ApplicationJsonApi() + { + // Assign + var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes("{ \"x\": 1 }")); + + // Act + var body = await BodyParser.Parse(memoryStream, "application/vnd.api+json"); + + // Assert + Check.That(body.BodyAsBytes).IsNull(); + Check.That(body.BodyAsJson).IsNotNull(); + Check.That(body.BodyAsString).Equals("{ \"x\": 1 }"); + } + [Fact] public async Task BodyParser_Parse_ApplicationXml() {