Skip to content

Commit

Permalink
revert
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Jan 4, 2022
1 parent 8cef74f commit 69dd1cb
Show file tree
Hide file tree
Showing 10 changed files with 159 additions and 66 deletions.
2 changes: 1 addition & 1 deletion examples/WireMock.Net.Console.Net452.Classic/MainApp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ public static void Run()
.WithHeader("Transformed-Postman-Token", "token is {{request.headers.Postman-Token}}")
.WithHeader("xyz_{{request.headers.Postman-Token}}", "token is {{request.headers.Postman-Token}}")
.WithBody(@"{""msg"": ""Hello world CATCH-ALL on /*, {{request.path}}, add={{Math.Add request.query.start.[0] 42}} bykey={{request.query.start}}, bykey={{request.query.stop}}, byidx0={{request.query.stop.[0]}}, byidx1={{request.query.stop.[1]}}"" }")
.WithTransformer(TransformerType.Handlebars, true, ReplaceNodeOption.Bool | ReplaceNodeOption.Integer)
.WithTransformer(TransformerType.Handlebars, true, ReplaceNodeOption.Default)
.WithDelay(TimeSpan.FromMilliseconds(100))
);

Expand Down
57 changes: 33 additions & 24 deletions src/WireMock.Net.Abstractions/Types/ReplaceNodeOption.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,38 @@ namespace WireMock.Types
[Flags]
public enum ReplaceNodeOption
{
/// <summary>
/// Don't replace any of the below types.
/// </summary>
None = 0,

/// <summary>
/// Replace boolean string value to a real boolean value. (This is used by default to maintain backward compatibility.)
/// </summary>
Bool = 0b00000001,

/// <summary>
/// Replace integer string value to a real integer value.
/// </summary>
Integer = 0b00000010,

/// <summary>
/// Replace long string value to a real long value.
/// </summary>
Long = 0b00000100,

/// <summary>
/// Replace all string values to a real values.
/// </summary>
All = Bool | Integer | Long
Default = 0,
//None = 0,

//StripQuotes = 0b00001000,

//AddQuotes = 0b00010000,

//Keep = 0b00000010,

///// <summary>
///// Don't replace any of the below types.
///// </summary>
//None = 0,

///// <summary>
///// Replace boolean string value to a real boolean value. (This is used by default to maintain backward compatibility.)
///// </summary>
//Bool = 0b00000001,

///// <summary>
///// Replace integer string value to a real integer value.
///// </summary>
//Integer = 0b00000010,

///// <summary>
///// Replace long string value to a real long value.
///// </summary>
//Long = 0b00000100,

///// <summary>
///// Replace all string values to a real values.
///// </summary>
//All = Bool | Integer | Long
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ public interface ITransformResponseBuilder : IDelayResponseBuilder
/// <returns>
/// The <see cref="IResponseBuilder"/>.
/// </returns>
IResponseBuilder WithTransformer(TransformerType transformerType = TransformerType.Handlebars, bool transformContentFromBodyAsFile = false, ReplaceNodeOption option = ReplaceNodeOption.Bool);
IResponseBuilder WithTransformer(TransformerType transformerType = TransformerType.Handlebars, bool transformContentFromBodyAsFile = false, ReplaceNodeOption option = ReplaceNodeOption.Default);
}
}
2 changes: 1 addition & 1 deletion src/WireMock.Net/ResponseBuilders/Response.cs
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ public IResponseBuilder WithTransformer(ReplaceNodeOption option)
#pragma warning disable CS1574
/// <inheritdoc cref="ITransformResponseBuilder.WithTransformer(TransformerType, bool, ReplaceNodeOption)"/>
#pragma warning restore CS1574
public IResponseBuilder WithTransformer(TransformerType transformerType, bool transformContentFromBodyAsFile = false, ReplaceNodeOption option = ReplaceNodeOption.Bool)
public IResponseBuilder WithTransformer(TransformerType transformerType, bool transformContentFromBodyAsFile = false, ReplaceNodeOption option = ReplaceNodeOption.Default)
{
UseTransformer = true;
TransformerType = transformerType;
Expand Down
2 changes: 1 addition & 1 deletion src/WireMock.Net/Serialization/WebhookMapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public static IWebhook Map(WebhookModel model)

if (!Enum.TryParse<ReplaceNodeOption>(model.Request.TransformerReplaceNodeOption, out var option))
{
option = ReplaceNodeOption.Bool;
option = ReplaceNodeOption.Default;
}

webhook.Request.TransformerReplaceNodeOption = option;
Expand Down
2 changes: 1 addition & 1 deletion src/WireMock.Net/Server/WireMockServer.Admin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -788,7 +788,7 @@ private IResponseBuilder InitResponseBuilder(ResponseModel responseModel)

if (!Enum.TryParse<ReplaceNodeOption>(responseModel.TransformerReplaceNodeOption, out var option))
{
option = ReplaceNodeOption.Bool;
option = ReplaceNodeOption.Default;
}
responseBuilder = responseBuilder.WithTransformer(
transformerType,
Expand Down
33 changes: 15 additions & 18 deletions src/WireMock.Net/Transformers/Transformer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using WireMock.Types;
using WireMock.Util;
Expand Down Expand Up @@ -193,39 +194,35 @@ private static void WalkNode(ITransformerContext handlebarsContext, ReplaceNodeO
return;
}

string transformedString = handlebarsContext.ParseAndRender(stringValue, model);
if (!string.Equals(stringValue, transformedString))
string transformed = handlebarsContext.ParseAndRender(stringValue, model);
if (!string.Equals(stringValue, transformed))
{
ReplaceNodeValue(option, node, transformedString);
ReplaceNodeValue(option, node, transformed);
}
break;
}
}

private static void ReplaceNodeValue(ReplaceNodeOption option, JToken node, string stringValue)
private static void ReplaceNodeValue(ReplaceNodeOption option, JToken node, string transformedString)
{
if (option.HasFlag(ReplaceNodeOption.Bool) && bool.TryParse(stringValue, out bool valueAsBoolean))
StringUtils.TryParseQuotedString(transformedString, out var result, out _);
bool valueAsBoolean;
if (bool.TryParse(result, out valueAsBoolean) || bool.TryParse(transformedString, out valueAsBoolean))
{
node.Replace(valueAsBoolean);
return;
}

if (option.HasFlag(ReplaceNodeOption.Integer) && int.TryParse(stringValue, out int valueAsInteger))
JToken value;
try
{
node.Replace(valueAsInteger);
return;
}

if (option.HasFlag(ReplaceNodeOption.Long) && long.TryParse(stringValue, out long valueAsLong))
{
node.Replace(valueAsLong);
return;
// Try to convert this string into a JsonObject
value = JToken.Parse(transformedString);
}

if (!JsonUtils.TryParseAsComplexObject(stringValue, out JToken value))
catch (JsonException)
{
// Just keep string value and convert to JToken
value = stringValue;
// Ignore JsonException and just keep string value and convert to JToken
value = transformedString;
}

node.Replace(value);
Expand Down
42 changes: 42 additions & 0 deletions src/WireMock.Net/Util/StringUtils.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System.Linq;
using System.Text.RegularExpressions;

namespace WireMock.Util
{
internal static class StringUtils
{
public static bool TryParseQuotedString(string value, out string result, out char quote)
{
result = null;
quote = '\0';

if (value == null || value.Length < 2)
{
return false;
}

quote = value[0]; // This can be single or a double quote
if (quote != '"' && quote != '\'')
{
return false;
}

if (value.Last() != quote)
{
return false;
}

try
{
result = Regex.Unescape(value.Substring(1, value.Length - 2));
return true;
}
catch
{
// Ignore Exception, just continue and return false.
}

return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,14 @@ public class ResponseWithHandlebarsRandomTests
{
private const string ClientIp = "::1";

private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
private readonly WireMockServerSettings _settings = new WireMockServerSettings();

public ResponseWithHandlebarsRandomTests()
{
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
var filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");

_settings.FileSystemHandler = _filesystemHandlerMock.Object;
_settings.FileSystemHandler = filesystemHandlerMock.Object;
}

[Fact]
Expand Down Expand Up @@ -75,10 +74,10 @@ public async Task Response_ProvideResponseAsync_Handlebars_Random1_Boolean()
}

[Theory]
[InlineData(ReplaceNodeOption.None, JTokenType.String)]
[InlineData(ReplaceNodeOption.Bool, JTokenType.String)]
[InlineData(ReplaceNodeOption.Integer, JTokenType.Integer)]
[InlineData(ReplaceNodeOption.Bool | ReplaceNodeOption.Integer, JTokenType.Integer)]
[InlineData(ReplaceNodeOption.Default, JTokenType.Integer)]
//[InlineData(ReplaceNodeOption.Bool, JTokenType.String)]
//[InlineData(ReplaceNodeOption.Integer, JTokenType.Integer)]
//[InlineData(ReplaceNodeOption.Bool | ReplaceNodeOption.Integer, JTokenType.Integer)]
public async Task Response_ProvideResponseAsync_Handlebars_Random1_Integer(ReplaceNodeOption option, JTokenType expected)
{
// Assign
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,15 +385,52 @@ public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsOb
Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"x\":\"test /foo_object\"}");
}

//[Theory]
//[InlineData(TransformerType.Handlebars, "a")]
//[InlineData(TransformerType.Handlebars, "42")]
//[InlineData(TransformerType.Handlebars, "{")]
//[InlineData(TransformerType.Handlebars, "]")]
//[InlineData(TransformerType.Handlebars, " ")]
//public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithExtraQuotes_AndSpecialOption_MakesAString_ResultAsObject(TransformerType transformerType, string text)
//{
// string jsonString = $"{{ \"x\": \"{text}\" }}";
// var bodyData = new BodyData
// {
// BodyAsJson = JsonConvert.DeserializeObject(jsonString),
// DetectedBodyType = BodyType.Json,
// Encoding = Encoding.UTF8
// };
// var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData);

// var responseBuilder = Response.Create()
// .WithBodyAsJson(new { text = "\"{{request.bodyAsJson.x}}\"" })
// .WithTransformer(transformerType, false, ReplaceNodeOption.Default);

// // Act
// var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false);

// // Assert
// JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":\"{text}\"}}");
//}

[Theory]
[InlineData(TransformerType.Handlebars, "a")]
[InlineData(TransformerType.Handlebars, "42")]
[InlineData(TransformerType.Handlebars, "{")]
[InlineData(TransformerType.Handlebars, "]")]
[InlineData(TransformerType.Handlebars, " ")]
public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithText_ResultAsObject(TransformerType transformerType, string text)
[InlineData(TransformerType.Handlebars, "\"\"", "\"\"")]
[InlineData(TransformerType.Handlebars, "\"a\"", "\"a\"")]
[InlineData(TransformerType.Handlebars, "\" \"", "\" \"")]
[InlineData(TransformerType.Handlebars, "\"'\"", "\"'\"")]
[InlineData(TransformerType.Handlebars, "\"false\"", "false")] // bool is special
[InlineData(TransformerType.Handlebars, "false", "false")]
[InlineData(TransformerType.Handlebars, "\"true\"", "true")] // bool is special
[InlineData(TransformerType.Handlebars, "true", "true")]
[InlineData(TransformerType.Handlebars, "\"-42\"", "-42")] // todo
[InlineData(TransformerType.Handlebars, "-42", "-42")]
[InlineData(TransformerType.Handlebars, "\"2147483647\"", "2147483647")] // todo
[InlineData(TransformerType.Handlebars, "2147483647", "2147483647")]
[InlineData(TransformerType.Handlebars, "\"9223372036854775807\"", "9223372036854775807")] // todo
[InlineData(TransformerType.Handlebars, "9223372036854775807", "9223372036854775807")]
public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_And_ReplaceNodeOptionKeep(TransformerType transformerType, string value, string expected)
{
string jsonString = $"{{ \"x\": \"{text}\" }}";
string jsonString = $"{{ \"x\": {value} }}";
var bodyData = new BodyData
{
BodyAsJson = JsonConvert.DeserializeObject(jsonString),
Expand All @@ -404,22 +441,31 @@ public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithText_Re

var responseBuilder = Response.Create()
.WithBodyAsJson(new { text = "{{request.bodyAsJson.x}}" })
.WithTransformer(transformerType);
.WithTransformer(transformerType, false, ReplaceNodeOption.Default);

// Act
var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false);

// Assert
JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":\"{text}\"}}");
JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":{expected}}}");
}

[Theory]
[InlineData(TransformerType.Handlebars, "\"\"", "\"\"")]
[InlineData(TransformerType.Handlebars, "\"a\"", "\"a\"")]
[InlineData(TransformerType.Handlebars, "\" \"", "\" \"")]
[InlineData(TransformerType.Handlebars, "\"'\"", "\"'\"")]
[InlineData(TransformerType.Handlebars, "\"false\"", "false")] // bool is special
[InlineData(TransformerType.Handlebars, "false", "false")]
[InlineData(TransformerType.Handlebars, "\"true\"", "true")] // bool is special
[InlineData(TransformerType.Handlebars, "true", "true")]
[InlineData(TransformerType.Handlebars, "\"-42\"", "\"-42\"")]
[InlineData(TransformerType.Handlebars, "-42", "\"-42\"")]
[InlineData(TransformerType.Handlebars, "\"2147483647\"", "\"2147483647\"")]
[InlineData(TransformerType.Handlebars, "2147483647", "\"2147483647\"")]
[InlineData(TransformerType.Handlebars, "\"9223372036854775807\"", "\"9223372036854775807\"")]
[InlineData(TransformerType.Handlebars, "9223372036854775807", "\"9223372036854775807\"")]
public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithPrimitive_ResultAsObject(TransformerType transformerType, string value, string expected)
public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithExtraQuotes_AlwaysMakesString(TransformerType transformerType, string value, string expected)
{
string jsonString = $"{{ \"x\": {value} }}";
var bodyData = new BodyData
Expand All @@ -431,7 +477,7 @@ public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithPrimiti
var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData);

var responseBuilder = Response.Create()
.WithBodyAsJson(new { text = "{{request.bodyAsJson.x}}" })
.WithBodyAsJson(new { text = "\"{{request.bodyAsJson.x}}\"" })
.WithTransformer(transformerType);

// Act
Expand Down

0 comments on commit 69dd1cb

Please sign in to comment.