mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-24 18:32:13 +01:00
Add ReplaceNodeOption flag (#710)
This commit is contained in:
@@ -1,10 +1,8 @@
|
||||
using FluentAssertions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using FluentAssertions;
|
||||
using WireMock.RequestBuilders;
|
||||
using WireMock.ResponseBuilders;
|
||||
using WireMock.Server;
|
||||
|
||||
@@ -7,6 +7,7 @@ using WireMock.Handlers;
|
||||
using WireMock.Models;
|
||||
using WireMock.ResponseBuilders;
|
||||
using WireMock.Settings;
|
||||
using WireMock.Types;
|
||||
using Xunit;
|
||||
|
||||
namespace WireMock.Net.Tests.ResponseBuilders
|
||||
@@ -15,15 +16,14 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
||||
{
|
||||
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]
|
||||
@@ -73,6 +73,31 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
||||
Check.That(j["Value"].Type).IsEqualTo(JTokenType.Boolean);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(ReplaceNodeOptions.None, JTokenType.Integer)]
|
||||
//[InlineData(ReplaceNodeOptions.Bool, JTokenType.String)]
|
||||
//[InlineData(ReplaceNodeOptions.Integer, JTokenType.Integer)]
|
||||
//[InlineData(ReplaceNodeOptions.Bool | ReplaceNodeOptions.Integer, JTokenType.Integer)]
|
||||
public async Task Response_ProvideResponseAsync_Handlebars_Random1_Integer(ReplaceNodeOptions options, JTokenType expected)
|
||||
{
|
||||
// Assign
|
||||
var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp);
|
||||
|
||||
var responseBuilder = Response.Create()
|
||||
.WithBodyAsJson(new
|
||||
{
|
||||
Value = "{{Random Type=\"Integer\"}}"
|
||||
})
|
||||
.WithTransformer(options);
|
||||
|
||||
// Act
|
||||
var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false);
|
||||
|
||||
// Assert
|
||||
JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson);
|
||||
Check.That(j["Value"].Type).IsEqualTo(expected);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Response_ProvideResponseAsync_Handlebars_Random1_Guid()
|
||||
{
|
||||
|
||||
@@ -23,17 +23,16 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
||||
{
|
||||
public class ResponseWithTransformerTests
|
||||
{
|
||||
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||
|
||||
private const string ClientIp = "::1";
|
||||
|
||||
public ResponseWithTransformerTests()
|
||||
{
|
||||
_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;
|
||||
}
|
||||
|
||||
[Theory]
|
||||
@@ -366,7 +365,7 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
||||
public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsObject(TransformerType transformerType)
|
||||
{
|
||||
// Assign
|
||||
string jsonString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"Wiremock\" } ] }";
|
||||
string jsonString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"WireMock\" } ] }";
|
||||
var bodyData = new BodyData
|
||||
{
|
||||
BodyAsJson = JsonConvert.DeserializeObject(jsonString),
|
||||
@@ -386,6 +385,108 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
||||
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, ReplaceNodeOptions.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, "\"\"", "\"\"")]
|
||||
[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_ReplaceNodeOptionsKeep(TransformerType transformerType, string value, string expected)
|
||||
{
|
||||
string jsonString = $"{{ \"x\": {value} }}";
|
||||
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, ReplaceNodeOptions.None);
|
||||
|
||||
// Act
|
||||
var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false);
|
||||
|
||||
// Assert
|
||||
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_WithBodyAsJsonWithExtraQuotes_AlwaysMakesString(TransformerType transformerType, string value, string expected)
|
||||
{
|
||||
string jsonString = $"{{ \"x\": {value} }}";
|
||||
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);
|
||||
|
||||
// Act
|
||||
var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false);
|
||||
|
||||
// Assert
|
||||
JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":{expected}}}");
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(TransformerType.Handlebars)]
|
||||
//[InlineData(TransformerType.Scriban)] Scriban cannot access dynamic Json Objects
|
||||
|
||||
104
test/WireMock.Net.Tests/Util/StringUtilsTests.cs
Normal file
104
test/WireMock.Net.Tests/Util/StringUtilsTests.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
using FluentAssertions;
|
||||
using WireMock.Util;
|
||||
using Xunit;
|
||||
|
||||
namespace WireMock.Net.Tests.Util
|
||||
{
|
||||
public class StringUtilsTests
|
||||
{
|
||||
[Theory]
|
||||
[InlineData("'s")]
|
||||
[InlineData("\"s")]
|
||||
public void StringUtils_TryParseQuotedString_With_UnexpectedUnclosedString_Returns_False(string input)
|
||||
{
|
||||
// Act
|
||||
bool valid = StringUtils.TryParseQuotedString(input, out var result, out var quote);
|
||||
|
||||
// Assert
|
||||
valid.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("")]
|
||||
[InlineData(null)]
|
||||
[InlineData("x")]
|
||||
public void StringUtils_TryParseQuotedString_With_InvalidStringLength_Returns_False(string input)
|
||||
{
|
||||
// Act
|
||||
bool valid = StringUtils.TryParseQuotedString(input, out var result, out var quote);
|
||||
|
||||
// Assert
|
||||
valid.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("xx")]
|
||||
[InlineData(" ")]
|
||||
public void StringUtils_TryParseQuotedString_With_InvalidStringQuoteCharacter_Returns_False(string input)
|
||||
{
|
||||
// Act
|
||||
bool valid = StringUtils.TryParseQuotedString(input, out var result, out var quote);
|
||||
|
||||
// Assert
|
||||
valid.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void StringUtils_TryParseQuotedString_With_UnexpectedUnrecognizedEscapeSequence_Returns_False()
|
||||
{
|
||||
// Arrange
|
||||
string input = new string(new[] { '"', '\\', 'u', '?', '"' });
|
||||
|
||||
// Act
|
||||
bool valid = StringUtils.TryParseQuotedString(input, out var result, out var quote);
|
||||
|
||||
// Assert
|
||||
valid.Should().BeFalse();
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("''", "")]
|
||||
[InlineData("'s'", "s")]
|
||||
[InlineData("'\\\\'", "\\")]
|
||||
[InlineData("'\\n'", "\n")]
|
||||
public void StringUtils_TryParseQuotedString_SingleQuotedString(string input, string expectedResult)
|
||||
{
|
||||
// Act
|
||||
bool valid = StringUtils.TryParseQuotedString(input, out var result, out var quote);
|
||||
|
||||
// Assert
|
||||
valid.Should().BeTrue();
|
||||
result.Should().Be(expectedResult);
|
||||
quote.Should().Be('\'');
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("\"\"", "")]
|
||||
[InlineData("\"\\\\\"", "\\")]
|
||||
[InlineData("\"\\n\"", "\n")]
|
||||
[InlineData("\"\\\\n\"", "\\n")]
|
||||
[InlineData("\"\\\\new\"", "\\new")]
|
||||
[InlineData("\"[]\"", "[]")]
|
||||
[InlineData("\"()\"", "()")]
|
||||
[InlineData("\"(\\\"\\\")\"", "(\"\")")]
|
||||
[InlineData("\"/\"", "/")]
|
||||
[InlineData("\"a\"", "a")]
|
||||
[InlineData("\"This \\\"is\\\" a test.\"", "This \"is\" a test.")]
|
||||
[InlineData(@"""This \""is\"" b test.""", @"This ""is"" b test.")]
|
||||
[InlineData("\"ab\\\"cd\"", "ab\"cd")]
|
||||
[InlineData("\"\\\"\"", "\"")]
|
||||
[InlineData("\"\\\"\\\"\"", "\"\"")]
|
||||
[InlineData("\"AB YZ 19 \uD800\udc05 \u00e4\"", "AB YZ 19 \uD800\udc05 \u00e4")]
|
||||
[InlineData("\"\\\\\\\\192.168.1.1\\\\audio\\\\new\"", "\\\\192.168.1.1\\audio\\new")]
|
||||
public void StringUtils_TryParseQuotedString_DoubleQuotedString(string input, string expectedResult)
|
||||
{
|
||||
// Act
|
||||
bool valid = StringUtils.TryParseQuotedString(input, out var result, out var quote);
|
||||
|
||||
// Assert
|
||||
valid.Should().BeTrue();
|
||||
result.Should().Be(expectedResult);
|
||||
quote.Should().Be('"');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user