StatusCode as string (#385)

* StatusCode as string

* fix tests

* fix test

* ReplaceSingleNode

* <!--<DelaySign>true</DelaySign>-->

* Array

* add test

* Response_ProvideResponse_Handlebars_WithBodyAsJson_ResultAsHandlebarsString

* net461

* .

* fix

* target frame

* BodyAsJson

* Response_ProvideResponse_WithStatusCode

* fix build

* fix test
This commit is contained in:
Stef Heyenrath
2019-12-26 13:57:35 +01:00
committed by GitHub
parent b5795713b1
commit 120a808104
17 changed files with 236 additions and 72 deletions

View File

@@ -1,4 +1,5 @@
using JetBrains.Annotations;
using HandlebarsDotNet;
using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
@@ -24,14 +25,14 @@ namespace WireMock.Transformers
{
var handlebarsContext = _factory.Create();
var responseMessage = new ResponseMessage { StatusCode = original.StatusCode };
var responseMessage = new ResponseMessage();
var template = new { request = requestMessage };
switch (original.BodyData.DetectedBodyType)
{
case BodyType.Json:
TransformBodyAsJson(handlebarsContext, template, original, responseMessage);
TransformBodyAsJson(handlebarsContext.Handlebars, template, original, responseMessage);
break;
case BodyType.File:
@@ -40,7 +41,7 @@ namespace WireMock.Transformers
case BodyType.String:
responseMessage.BodyOriginal = original.BodyData.BodyAsString;
TransformBodyAsString(handlebarsContext, template, original, responseMessage);
TransformBodyAsString(handlebarsContext.Handlebars, template, original, responseMessage);
break;
}
@@ -62,29 +63,46 @@ namespace WireMock.Transformers
responseMessage.Headers = newHeaders;
switch (original.StatusCode)
{
case int statusCodeAsInteger:
responseMessage.StatusCode = statusCodeAsInteger;
break;
case string statusCodeAsString:
var templateForStatusCode = handlebarsContext.Handlebars.Compile(statusCodeAsString);
responseMessage.StatusCode = templateForStatusCode(template);
break;
}
return responseMessage;
}
private static void TransformBodyAsJson(IHandlebarsContext handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage)
private static void TransformBodyAsJson(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage)
{
JToken jToken;
switch (original.BodyData.BodyAsJson)
{
case JObject bodyAsJObject:
jToken = bodyAsJObject.DeepClone();
WalkNode(handlebarsContext, jToken, template);
break;
case Array bodyAsArray:
jToken = JArray.FromObject(bodyAsArray);
WalkNode(handlebarsContext, jToken, template);
break;
case string bodyAsString:
jToken = ReplaceSingleNode(handlebarsContext, bodyAsString, template);
break;
default:
jToken = JObject.FromObject(original.BodyData.BodyAsJson);
WalkNode(handlebarsContext, jToken, template);
break;
}
WalkNode(handlebarsContext, jToken, template);
responseMessage.BodyData = new BodyData
{
DetectedBodyType = original.BodyData.DetectedBodyType,
@@ -93,7 +111,25 @@ namespace WireMock.Transformers
};
}
private static void WalkNode(IHandlebarsContext handlebarsContext, JToken node, object context)
private static JToken ReplaceSingleNode(IHandlebars handlebarsContext, string stringValue, object context)
{
var templateForStringValue = handlebarsContext.Compile(stringValue);
string transformedString = templateForStringValue(context);
if (!string.Equals(stringValue, transformedString))
{
const string property = "_";
JObject dummy = JObject.Parse($"{{ \"{property}\": null }}");
JToken node = dummy[property];
ReplaceNodeValue(node, transformedString);
return dummy[property];
}
return stringValue;
}
private static void WalkNode(IHandlebars handlebarsContext, JToken node, object context)
{
if (node.Type == JTokenType.Object)
{
@@ -120,7 +156,7 @@ namespace WireMock.Transformers
return;
}
var templateForStringValue = handlebarsContext.Handlebars.Compile(stringValue);
var templateForStringValue = handlebarsContext.Compile(stringValue);
string transformedString = templateForStringValue(context);
if (!string.Equals(stringValue, transformedString))
{
@@ -152,9 +188,9 @@ namespace WireMock.Transformers
node.Replace(value);
}
private static void TransformBodyAsString(IHandlebarsContext handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage)
private static void TransformBodyAsString(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage)
{
var templateBodyAsString = handlebarsContext.Handlebars.Compile(original.BodyData.BodyAsString);
var templateBodyAsString = handlebarsContext.Compile(original.BodyData.BodyAsString);
responseMessage.BodyData = new BodyData
{