From 41fd1ef99d41d07a1f83be6442f4eca5d240064a Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 4 Sep 2018 22:50:17 +0200 Subject: [PATCH] #198 (#199) --- .../MainApp.cs | 14 +++++++++ src/WireMock.Net/ResponseBuilders/Response.cs | 31 +++++++++++++++---- .../FluentMockServerTests.Admin.cs | 8 ++--- .../FluentMockServerTests.cs | 18 ++++++----- .../ResponseWithBodyTests.cs | 28 +++++++++++++++-- 5 files changed, 80 insertions(+), 19 deletions(-) diff --git a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs index e1574a65e..b34d6dbd4 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs +++ b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs @@ -358,6 +358,20 @@ public static void Run() .WithBody("linq match !!!") ); + server + .Given(Request.Create().WithPath("/myendpoint").UsingAnyMethod()) + .RespondWith(Response.Create() + .WithStatusCode(500) + .WithBody(requestMessage => + { + string returnStr = JsonConvert.SerializeObject(new + { + Message = "Test error" + }); + return returnStr; + }) + ); + System.Console.WriteLine("Press any key to stop the server"); System.Console.ReadKey(); server.Stop(); diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 48629d1ec..714da3e38 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -169,7 +169,14 @@ public IResponseBuilder WithHeaders(IDictionary> he /// public IResponseBuilder WithBody(Func bodyFactory, string destination = BodyDestinationFormat.SameAsSource, Encoding encoding = null) { - return WithCallback(req => new ResponseMessage { Body = bodyFactory(req) }); + Check.NotNull(bodyFactory, nameof(bodyFactory)); + + return WithCallback(req => new ResponseMessage + { + Body = bodyFactory(req), + BodyDestination = destination, + BodyEncoding = encoding ?? Encoding.UTF8 + }); } /// @@ -353,6 +360,22 @@ public async Task ProvideResponseAsync(RequestMessage requestMe await Task.Delay(Delay.Value); } + if (Callback != null) + { + var callbackResponseMessage = Callback(requestMessage); + + // Copy StatusCode from ResponseMessage + callbackResponseMessage.StatusCode = ResponseMessage.StatusCode; + + // Copy Headers from ResponseMessage (if defined) + if (ResponseMessage.Headers != null) + { + callbackResponseMessage.Headers = ResponseMessage.Headers; + } + + return callbackResponseMessage; + } + if (ProxyUrl != null && _httpClientForProxy != null) { var requestUri = new Uri(requestMessage.Url); @@ -367,11 +390,7 @@ public async Task ProvideResponseAsync(RequestMessage requestMe return ResponseMessageTransformer.Transform(requestMessage, ResponseMessage); } - if (Callback != null) - { - return Callback(requestMessage); - } - + // Just return normal defined ResponseMessage return ResponseMessage; } } diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs b/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs index 5dbb11d35..b0dab914f 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs @@ -48,15 +48,15 @@ public void FluentMockServer_Admin_ResetMappings() [Fact] public void FluentMockServer_Admin_StartStop() { - var server1 = FluentMockServer.Start("http://localhost:9091"); + var server1 = FluentMockServer.Start("http://localhost:19091"); - Check.That(server1.Urls[0]).Equals("http://localhost:9091"); + Check.That(server1.Urls[0]).Equals("http://localhost:19091"); server1.Stop(); - var server2 = FluentMockServer.Start("http://localhost:9091/"); + var server2 = FluentMockServer.Start("http://localhost:19091/"); - Check.That(server2.Urls[0]).Equals("http://localhost:9091/"); + Check.That(server2.Urls[0]).Equals("http://localhost:19091/"); server2.Stop(); } diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.cs b/test/WireMock.Net.Tests/FluentMockServerTests.cs index 596bef47a..4de466363 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.cs @@ -106,7 +106,7 @@ public async Task FluentMockServer_Should_respond_to_request_BodyAsJson_Indented [Fact] public async Task FluentMockServer_Should_respond_to_request_bodyAsCallback() { - // given + // Assign var _server = FluentMockServer.Start(); _server @@ -114,14 +114,18 @@ public async Task FluentMockServer_Should_respond_to_request_bodyAsCallback() .WithPath("/foo") .UsingGet()) .RespondWith(Response.Create() - .WithStatusCode(200) - .WithBody(req => $"{{ path: '{req.Path}' }}")); + .WithStatusCode(500) + .WithHeader("H1", "X1") + .WithBody(req => $"path: {req.Path}")); - // when - var response = await new HttpClient().GetStringAsync("http://localhost:" + _server.Ports[0] + "/foo"); + // Act + var response = await new HttpClient().GetAsync("http://localhost:" + _server.Ports[0] + "/foo"); - // then - Check.That(response).IsEqualTo("{ path: '/foo' }"); + // Assert + string content = await response.Content.ReadAsStringAsync(); + Check.That(content).IsEqualTo("path: /foo"); + Check.That((int) response.StatusCode).IsEqualTo(500); + Check.That(response.Headers.GetValues("H1")).ContainsExactly("X1"); } [Fact] diff --git a/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs b/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs index 0d22dac6c..a13e26c17 100644 --- a/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithBodyTests.cs @@ -1,5 +1,4 @@ -using System; -using System.Text; +using System.Text; using System.Threading.Tasks; using NFluent; using WireMock.Models; @@ -150,5 +149,30 @@ public async Task Response_ProvideResponse_WithBody_String_Json_Encoding() Check.That(((dynamic)responseMessage.BodyAsJson).value).Equals(42); Check.That(responseMessage.BodyEncoding).Equals(Encoding.ASCII); } + + [Fact] + public async Task Response_ProvideResponse_WithBody_Func() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost/test"), "GET", ClientIp); + + var response = Response.Create() + .WithStatusCode(500) + .WithHeader("H1", "X1") + .WithHeader("H2", "X2") + .WithBody(req => $"path: {req.Path}"); + + // Act + var responseMessage = await response.ProvideResponseAsync(request); + + // Assert + Check.That(responseMessage.Body).IsEqualTo("path: /test"); + Check.That(responseMessage.BodyAsBytes).IsNull(); + Check.That(responseMessage.BodyAsJson).IsNull(); + Check.That(responseMessage.BodyEncoding.CodePage).Equals(Encoding.UTF8.CodePage); + Check.That(responseMessage.StatusCode).IsEqualTo(500); + Check.That(responseMessage.Headers["H1"].ToString()).IsEqualTo("X1"); + Check.That(responseMessage.Headers["H2"].ToString()).IsEqualTo("X2"); + } } } \ No newline at end of file