Compare commits

...

1 Commits

Author SHA1 Message Date
Stef Heyenrath 1d4f820f1a Fix BodyParser 2026-06-12 18:48:08 +02:00
5 changed files with 122 additions and 20 deletions
@@ -305,12 +305,6 @@ public class WireMockServerSettings
[PublicAPI, JsonIgnore] [PublicAPI, JsonIgnore]
public IDictionary<string, Func<MatcherModel, IMatcher>>? CustomMatcherMappings { get; set; } public IDictionary<string, Func<MatcherModel, IMatcher>>? CustomMatcherMappings { get; set; }
/// <summary>
/// The <see cref="JsonSerializerSettings"/> used when the JSON response is generated.
/// </summary>
[PublicAPI, JsonIgnore]
public JsonSerializerSettings? JsonSerializerSettings { get; set; }
/// <summary> /// <summary>
/// The Culture to use. /// The Culture to use.
/// Currently used for: /// Currently used for:
+3 -2
View File
@@ -5,6 +5,7 @@ using System.Text;
using Stef.Validation; using Stef.Validation;
using WireMock.Constants; using WireMock.Constants;
using WireMock.Matchers; using WireMock.Matchers;
using WireMock.Serialization;
using WireMock.Types; using WireMock.Types;
namespace WireMock.Util; namespace WireMock.Util;
@@ -25,7 +26,7 @@ internal static class BodyParser
CONNECT - No defined body semantics CONNECT - No defined body semantics
PATCH - Body supported. PATCH - Body supported.
*/ */
private static readonly IDictionary<string, bool> BodyAllowedForMethods = new Dictionary<string, bool> private static readonly Dictionary<string, bool> BodyAllowedForMethods = new()
{ {
{ HttpRequestMethod.HEAD, false }, { HttpRequestMethod.HEAD, false },
{ HttpRequestMethod.GET, false }, { HttpRequestMethod.GET, false },
@@ -173,7 +174,7 @@ internal static class BodyParser
{ {
try try
{ {
data.BodyAsJson = settings.DefaultJsonConverter.Deserialize<object>(data.BodyAsString); data.BodyAsJson = settings.DefaultJsonConverter.Deserialize<object>(data.BodyAsString, JsonSerializationConstants.JsonConverterOptionsWithDateParsingNone);
data.DetectedBodyType = BodyType.Json; data.DetectedBodyType = BodyType.Json;
} }
catch catch
@@ -416,4 +416,20 @@ public class JsonPartialWildcardMatcherTests
// Assert // Assert
Assert.Equal(1.0, match); Assert.Equal(1.0, match);
} }
}
[Fact]
public void JsonPartialWildcardMatcher_IsMatch_WithRegexTrue_DateFormat_ShouldMatch()
{
// Assign
var matcher = new JsonPartialWildcardMatcher(
new { date = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$", id = 1 },
ignoreCase: false,
regex: true);
// Act
var match = matcher.IsMatch("{\"date\":\"2026-06-09T22:23:18.53421+00:00\",\"id\":1}").Score;
// Assert
Assert.Equal(1.0, match);
}
}
@@ -366,17 +366,33 @@ public class SystemTextJsonPartialWildcardMatcherTests
Assert.Equal(1.0, match); Assert.Equal(1.0, match);
} }
[Fact] [Fact]
public void SystemTextJsonPartialWildcardMatcher_IsMatch_JsonElement_ShouldMatch() public void SystemTextJsonPartialWildcardMatcher_IsMatch_JsonElement_ShouldMatch()
{ {
// Assign // Assign
var matcher = new SystemTextJsonPartialWildcardMatcher(new { Id = 1, Name = "Test" }); var matcher = new SystemTextJsonPartialWildcardMatcher(new { Id = 1, Name = "Test" });
// Act // Act
var jsonElement = JsonDocument.Parse("{ \"Id\" : 1, \"Name\" : \"Test\", \"Extra\" : \"value\" }").RootElement; var jsonElement = JsonDocument.Parse("{ \"Id\" : 1, \"Name\" : \"Test\", \"Extra\" : \"value\" }").RootElement;
var match = matcher.IsMatch(jsonElement).Score; var match = matcher.IsMatch(jsonElement).Score;
// Assert // Assert
Assert.Equal(1.0, match); Assert.Equal(1.0, match);
}
[Fact]
public void SystemTextJsonPartialWildcardMatcher_IsMatch_WithRegexTrue_DateFormat_ShouldMatch()
{
// Assign
var matcher = new SystemTextJsonPartialWildcardMatcher(
new { date = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$", id = 1 },
ignoreCase: false,
regex: true);
// Act
var match = matcher.IsMatch("{\"date\":\"2026-06-09T22:23:18.53421+00:00\",\"id\":1}").Score;
// Assert
Assert.Equal(1.0, match);
}
} }
}
@@ -53,6 +53,81 @@ public partial class WireMockServerTests
response.Should().BeEquivalentTo("{\"first_name\":\"John\",\"last_name\":\"Smith\"}"); response.Should().BeEquivalentTo("{\"first_name\":\"John\",\"last_name\":\"Smith\"}");
} }
[Fact]
public async Task WireMockServer_WithBodyAsJson_WithJsonPartialWildcardMatcher()
{
// Arrange
using var server = WireMockServer.Start(new WireMockServerSettings
{
Logger = new TestOutputHelperWireMockLogger(testOutputHelper)
});
server
.Given(
Request.Create()
.WithPath("/test")
.UsingPost()
.WithBody(new JsonPartialWildcardMatcher(
new
{
date = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$",
id = 1
},
ignoreCase: true,
regex: true
)
)
)
.RespondWith(Response.Create().WithStatusCode(200).WithBody("matched"));
// Act
var requestUri = new Uri($"http://localhost:{server.Port}/test");
var response = await server.CreateClient().PostAsync(requestUri, new StringContent("{\"date\":\"2026-06-09T22:23:18.53421+00:00\",\"id\":1}"), _ct);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
server.Stop();
}
[Fact]
public async Task WireMockServer_WithBodyAsJson_WithSystemTextJsonPartialWildcardMatcher()
{
// Arrange
using var server = WireMockServer.Start(new WireMockServerSettings
{
Logger = new TestOutputHelperWireMockLogger(testOutputHelper),
DefaultJsonSerializer = new SystemTextJsonConverter()
});
server
.Given(
Request.Create()
.WithPath("/test")
.UsingPost()
.WithBody(new SystemTextJsonPartialWildcardMatcher(
new
{
date = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$",
id = 1
},
ignoreCase: true,
regex: true
)
)
)
.RespondWith(Response.Create().WithStatusCode(200).WithBody("matched"));
// Act
var requestUri = new Uri($"http://localhost:{server.Port}/test");
var response = await server.CreateClient().PostAsync(requestUri, new StringContent("{\"date\":\"2026-06-09T22:23:18.53421+00:00\",\"id\":1}"), _ct);
// Assert
response.StatusCode.Should().Be(HttpStatusCode.OK);
server.Stop();
}
[Fact] [Fact]
public async Task WireMockServer_WithBodyAsJson_Using_PostAsJsonAsync_And_MultipleJmesPathMatchers_ShouldMatch() public async Task WireMockServer_WithBodyAsJson_Using_PostAsJsonAsync_And_MultipleJmesPathMatchers_ShouldMatch()
{ {