From 77000372c6280ff3d365ff874d45cf2a5f4793a3 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 11 Jun 2025 11:51:29 +0200 Subject: [PATCH] Fix for WithTransformer and JsonBody as list (#1315) * Fix for WithTransformer and JsonBody as list * Fix WithTransformer when the response BodyAsJson is a List --- .../Transformers/Transformer.cs | 5 +- .../WireMockServerTests.WithTransformer.cs | 78 ++++++++++++++++++- 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/src/WireMock.Net.Minimal/Transformers/Transformer.cs b/src/WireMock.Net.Minimal/Transformers/Transformer.cs index ca70c78e..000eeece 100644 --- a/src/WireMock.Net.Minimal/Transformers/Transformer.cs +++ b/src/WireMock.Net.Minimal/Transformers/Transformer.cs @@ -1,6 +1,7 @@ // Copyright © WireMock.Net using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using HandlebarsDotNet.Helpers.Models; @@ -170,8 +171,8 @@ internal class Transformer : ITransformer WalkNode(transformerContext, options, jToken, model); break; - case Array bodyAsArray: - jToken = JArray.FromObject(bodyAsArray, _jsonSerializer); + case var bodyAsEnumerable when bodyAsEnumerable is IEnumerable and not string: + jToken = JArray.FromObject(bodyAsEnumerable, _jsonSerializer); WalkNode(transformerContext, options, jToken, model); break; diff --git a/test/WireMock.Net.Tests/WireMockServerTests.WithTransformer.cs b/test/WireMock.Net.Tests/WireMockServerTests.WithTransformer.cs index 22e94056..aaec3811 100644 --- a/test/WireMock.Net.Tests/WireMockServerTests.WithTransformer.cs +++ b/test/WireMock.Net.Tests/WireMockServerTests.WithTransformer.cs @@ -1,12 +1,11 @@ // Copyright © WireMock.Net using System; +using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Threading.Tasks; using FluentAssertions; -using WireMock.RequestBuilders; -using WireMock.ResponseBuilders; using WireMock.Server; using Xunit; @@ -44,6 +43,78 @@ public partial class WireMockServerTests response.Should().Contain("Hello, Stef!"); } + [Fact] + public async Task WireMockServer_WithTransformer_WithJsonBodyAsArray_ShouldWork() + { + // Arrange + using var server = WireMockServer.Start(); + server + .WhenRequest(req => req + .WithPath("/withbody") + .UsingPost() + ) + .ThenRespondWith(rsp => rsp + .WithSuccess() + .WithBodyAsJson(new[] + { + new + { + test = "test", + secret = true + }, + new + { + test = "123", + secret = false + } + } + ) + .WithTransformer() + ); + + // Act + var response = await GetResponseAsync(server, "/withbody"); + + // Assert + response.Should().Be("""[{"test":"test","secret":true},{"test":"123","secret":false}]"""); + } + + [Fact] + public async Task WireMockServer_WithTransformer_WithJsonBodyAsList_ShouldWork() + { + // Arrange + using var server = WireMockServer.Start(); + server + .WhenRequest(req => req + .WithPath("/withbody") + .UsingPost() + ) + .ThenRespondWith(rsp => rsp + .WithSuccess() + .WithBodyAsJson( + new List + { + new + { + test = "test", + secret = true + }, + new + { + test = "123", + secret = false + } + }) + .WithTransformer() + ); + + // Act + var response = await GetResponseAsync(server, "/withbody"); + + // Assert + response.Should().Be("""[{"test":"test","secret":true},{"test":"123","secret":false}]"""); + } + [Fact] public async Task WireMockServer_WithTransformerBefore_WithBodyFromFile_ShouldWork() { @@ -88,8 +159,7 @@ public partial class WireMockServerTests private static async Task GetResponseAsync(WireMockServer server, string relativePath) { - using HttpClient httpClient = new HttpClient(); - httpClient.BaseAddress = new Uri(server.Urls[0]); + using var httpClient = server.CreateClient(); using var requestContent = new StringContent(RequestXml); using var responseMsg = await httpClient.PostAsync(relativePath, requestContent);