From 3e6eb256f543d895c496d3d6ee6e655b97685204 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 2 Mar 2020 13:25:53 +0000 Subject: [PATCH] wip --- src/WireMock.Net/ResponseBuilders/Response.cs | 51 ++++++++++--------- .../ResponseWithCallbackTests.cs | 46 ++++++++++++++--- 2 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 07680b58..63b933e5 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -1,12 +1,10 @@ -using JetBrains.Annotations; -using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; -using System.Net.Http; using System.Text; using System.Threading.Tasks; +using JetBrains.Annotations; using WireMock.Http; using WireMock.ResponseProviders; using WireMock.Settings; @@ -341,25 +339,6 @@ namespace WireMock.ResponseBuilders await Task.Delay(Delay.Value); } - if (Callback != null) - { - var callbackResponseMessage = Callback(requestMessage); - - if (!WithCallbackUsed) - { - // 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); @@ -369,19 +348,41 @@ namespace WireMock.ResponseBuilders return await HttpClientHelper.SendAsync(_httpClientForProxy, requestMessage, proxyUriWithRequestPathAndQuery.AbsoluteUri); } + ResponseMessage responseMessage; + if (Callback == null) + { + responseMessage = ResponseMessage; + } + else + { + responseMessage = Callback(requestMessage); + + if (!WithCallbackUsed) + { + // Copy StatusCode from ResponseMessage + responseMessage.StatusCode = ResponseMessage.StatusCode; + + // Copy Headers from ResponseMessage (if defined) + if (ResponseMessage.Headers != null) + { + responseMessage.Headers = ResponseMessage.Headers; + } + } + } + if (UseTransformer) { var factory = new HandlebarsContextFactory(settings.FileSystemHandler, settings.HandlebarsRegistrationCallback); var responseMessageTransformer = new ResponseMessageTransformer(factory); - return responseMessageTransformer.Transform(requestMessage, ResponseMessage, UseTransformerForBodyAsFile); + return responseMessageTransformer.Transform(requestMessage, responseMessage, UseTransformerForBodyAsFile); } if (!UseTransformer && ResponseMessage.BodyData?.BodyAsFileIsCached == true) { - ResponseMessage.BodyData.BodyAsBytes = settings.FileSystemHandler.ReadResponseBodyAsFile(ResponseMessage.BodyData.BodyAsFile); + ResponseMessage.BodyData.BodyAsBytes = settings.FileSystemHandler.ReadResponseBodyAsFile(responseMessage.BodyData.BodyAsFile); } - return ResponseMessage; + return responseMessage; } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs index 25c7c331..510b5f1b 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using NFluent; +using FluentAssertions; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Settings; @@ -17,15 +17,49 @@ namespace WireMock.Net.Tests.ResponseBuilders public async Task Response_WithCallback() { // Assign - var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var response = Response.Create().WithCallback(req => new ResponseMessage { BodyData = new BodyData { DetectedBodyType = BodyType.String, BodyAsString = req.Path + "Bar" }, StatusCode = 302 }); + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var response = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = request.Path + "Bar" + }, + StatusCode = 302 + }); // Act - var responseMessage = await response.ProvideResponseAsync(request, _settings); + var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); // Assert - Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("/fooBar"); - Check.That(responseMessage.StatusCode).IsEqualTo(302); + responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); + responseMessage.StatusCode.Should().Be(302); + } + + [Fact] + public async Task Response_WithCallback_And_UseTransformer_Is_True() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var response = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = "{{request.Path}}Bar" + }, + StatusCode = 302 + }) + .WithTransformer(); + + // Act + var responseMessage = await response.ProvideResponseAsync(requestMessage, _settings); + + // Assert + responseMessage.BodyData.BodyAsString.Should().Be("/fooBar"); + responseMessage.StatusCode.Should().Be(302); } } } \ No newline at end of file