From e6ecf5cc84ed3c0e74d759b527f3a184cf71efb1 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 23 Aug 2018 12:30:36 +0000 Subject: [PATCH] ResponseMessageTransformer (#190 ; #188) ResponseMessageTransformer (#190 ; #188) --- .../ResponseMessageTransformer.cs | 25 +++++++++++-------- .../RequestMessageBodyMatcherTests.cs | 3 +-- .../ResponseWithHandlebarsTests.cs | 23 +++++++++++++++++ 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs b/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs index 36de18bff..586219dda 100644 --- a/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs +++ b/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using HandlebarsDotNet; using Newtonsoft.Json; @@ -55,37 +56,41 @@ public static ResponseMessage Transform(RequestMessage requestMessage, ResponseM private static void TransformBodyAsJson(object template, ResponseMessage original, ResponseMessage responseMessage) { - JObject jobject; + JToken jToken; switch (original.BodyAsJson) { case JObject bodyAsJObject: - jobject = bodyAsJObject; + jToken = bodyAsJObject; + break; + + case Array bodyAsArray: + jToken = JArray.FromObject(bodyAsArray); break; default: - jobject = JObject.FromObject(original.BodyAsJson); + jToken = JObject.FromObject(original.BodyAsJson); break; } - WalkNode(jobject, template); + WalkNode(jToken, template); - responseMessage.BodyAsJson = jobject; + responseMessage.BodyAsJson = jToken; } private static void WalkNode(JToken node, object template) { if (node.Type == JTokenType.Object) { - // In case of Object, loop all children. - foreach (JProperty child in node.Children()) + // In case of Object, loop all children. Do a ToArray() to avoid `Collection was modified` exceptions. + foreach (JProperty child in node.Children().ToArray()) { WalkNode(child.Value, template); } } else if (node.Type == JTokenType.Array) { - // In case of Array, loop all items. - foreach (JToken child in node.Children()) + // In case of Array, loop all items. Do a ToArray() to avoid `Collection was modified` exceptions. + foreach (JToken child in node.Children().ToArray()) { WalkNode(child, template); } diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs index d5cd891ee..2516b68d0 100644 --- a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageBodyMatcherTests.cs @@ -1,5 +1,4 @@ -using System; -using Moq; +using Moq; using NFluent; using WireMock.Matchers; using WireMock.Matchers.Request; diff --git a/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithHandlebarsTests.cs b/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithHandlebarsTests.cs index c8aa60bdf..98497e628 100644 --- a/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithHandlebarsTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilderTests/ResponseWithHandlebarsTests.cs @@ -493,5 +493,28 @@ public void Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Throws() // Act Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_WithBodyAsJson_ResultAsArray() + { + // Assign + string jsonString = "{ \"a\": \"test 1\", \"b\": \"test 2\" }"; + var bodyData = new BodyData + { + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_array"), "POST", ClientIp, bodyData); + + var response = Response.Create() + .WithBodyAsJson(new[] { "first", "{{request.path}}", "{{request.bodyAsJson.a}}", "{{request.bodyAsJson.b}}", "last" }) + .WithTransformer(); + + // Act + var responseMessage = await response.ProvideResponseAsync(request); + + // Assert + Check.That(JsonConvert.SerializeObject(responseMessage.BodyAsJson)).Equals("[\"first\",\"/foo_array\",\"test 1\",\"test 2\",\"last\"]"); + } } } \ No newline at end of file