diff --git a/examples/WireMock.Net.TestcontainersExample/Program.cs b/examples/WireMock.Net.TestcontainersExample/Program.cs index 38a23149..a634d93f 100644 --- a/examples/WireMock.Net.TestcontainersExample/Program.cs +++ b/examples/WireMock.Net.TestcontainersExample/Program.cs @@ -198,7 +198,7 @@ private static async Task TestAsync(string? image = null) var dummyNetwork = new NetworkBuilder() .WithName($"Dummy Network for {image ?? "null"}") .WithReuse(true) - .WithCleanUp(true) + // .WithCleanUp(true) .Build(); var builder = new WireMockContainerBuilder() diff --git a/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj b/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj index 5154a8e0..a0c36b8e 100644 --- a/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj +++ b/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj @@ -21,6 +21,8 @@ + + @@ -28,6 +30,10 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/WireMock.Net.Testcontainers/WireMockConfiguration.cs b/src/WireMock.Net.Testcontainers/WireMockConfiguration.cs index 17fdc0f2..159e9901 100644 --- a/src/WireMock.Net.Testcontainers/WireMockConfiguration.cs +++ b/src/WireMock.Net.Testcontainers/WireMockConfiguration.cs @@ -1,5 +1,7 @@ // Copyright © WireMock.Net +using System.Collections.Generic; +using System.Linq; using Docker.DotNet.Models; using DotNet.Testcontainers.Builders; using DotNet.Testcontainers.Configurations; @@ -24,6 +26,8 @@ public sealed class WireMockConfiguration : ContainerConfiguration public bool HasBasicAuthentication => !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password); + public List AdditionalUrls { get; private set; } = []; + public WireMockConfiguration(string? username = null, string? password = null) { Username = username; @@ -70,6 +74,7 @@ public WireMockConfiguration(WireMockConfiguration oldValue, WireMockConfigurati StaticMappingsPath = BuildConfiguration.Combine(oldValue.StaticMappingsPath, newValue.StaticMappingsPath); WatchStaticMappings = BuildConfiguration.Combine(oldValue.WatchStaticMappings, newValue.WatchStaticMappings); WatchStaticMappingsInSubdirectories = BuildConfiguration.Combine(oldValue.WatchStaticMappingsInSubdirectories, newValue.WatchStaticMappingsInSubdirectories); + AdditionalUrls = BuildConfiguration.Combine(oldValue.AdditionalUrls.AsEnumerable(), newValue.AdditionalUrls.AsEnumerable()).ToList(); } /// @@ -94,4 +99,15 @@ public WireMockConfiguration WithWatchStaticMappings(bool includeSubDirectories) WatchStaticMappingsInSubdirectories = includeSubDirectories; return this; } + + /// + /// An additional Url on which WireMock listens. + /// + /// The url to add. + /// + public WireMockConfiguration WithAdditionalUrl(string url) + { + AdditionalUrls.Add(url); + return this; + } } \ No newline at end of file diff --git a/src/WireMock.Net.Testcontainers/WireMockContainer.cs b/src/WireMock.Net.Testcontainers/WireMockContainer.cs index 141f03a4..b03a10bb 100644 --- a/src/WireMock.Net.Testcontainers/WireMockContainer.cs +++ b/src/WireMock.Net.Testcontainers/WireMockContainer.cs @@ -1,7 +1,9 @@ // Copyright © WireMock.Net using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; @@ -30,6 +32,7 @@ public sealed class WireMockContainer : DockerContainer private IWireMockAdminApi? _adminApi; private EnhancedFileSystemWatcher? _enhancedFileSystemWatcher; + private IDictionary? _publicUris; /// /// Initializes a new instance of the class. @@ -48,6 +51,21 @@ public WireMockContainer(WireMockConfiguration configuration) : base(configurati [PublicAPI] public string GetPublicUrl() => GetPublicUri().ToString(); + /// + /// Gets the public Urls as a dictionary with the internal port as the key. + /// + [PublicAPI] + public IDictionary GetPublicUrls() => GetPublicUris().ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToString()); + + /// + /// Gets the mapped public port for the given container port. + /// + [PublicAPI] + public string GetMappedPublicUrl(int containerPort) + { + return GetPublicUris()[containerPort].ToString(); + } + /// /// Create a RestEase Admin client which can be used to call the admin REST endpoint. /// @@ -121,7 +139,7 @@ public HttpClient CreateClient(HttpMessageHandler innerHandler, params Delegatin await ReloadStaticMappingsAsync(target, ct); } } - + /// /// Reload the static mappings. /// @@ -198,7 +216,14 @@ private void WireMockContainer_Started(object sender, EventArgs e) private async void FileCreatedChangedOrDeleted(object sender, FileSystemEventArgs args) { - await ReloadStaticMappingsAsync(args.FullPath); + try + { + await ReloadStaticMappingsAsync(args.FullPath); + } + catch (Exception ex) + { + Logger.LogWarning(ex, "Error reloading static mappings from '{FullPath}'.", args.FullPath); + } } private async Task ReloadStaticMappingsAsync(string path, CancellationToken cancellationToken = default) @@ -207,5 +232,27 @@ private async Task ReloadStaticMappingsAsync(string path, CancellationToken canc await ReloadStaticMappingsAsync(cancellationToken); } - private Uri GetPublicUri() => new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(ContainerPort)).Uri; + private Uri GetPublicUri() => GetPublicUris()[ContainerPort]; + + private IDictionary GetPublicUris() + { + if (_publicUris != null) + { + return _publicUris; + } + + _publicUris = _configuration.ExposedPorts.Keys + .Select(int.Parse) + .ToDictionary(port => port, port => new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri); + + foreach (var url in _configuration.AdditionalUrls) + { + if (PortUtils.TryExtract(url, out _, out _, out _, out _, out var port)) + { + _publicUris[port] = new UriBuilder(Uri.UriSchemeHttp, Hostname, GetMappedPublicPort(port)).Uri; + } + } + + return _publicUris; + } } \ No newline at end of file diff --git a/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs b/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs index 9ec17b05..ea2e9074 100644 --- a/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs +++ b/src/WireMock.Net.Testcontainers/WireMockContainerBuilder.cs @@ -1,6 +1,7 @@ // Copyright © WireMock.Net using System; +using System.Linq; using System.Runtime.InteropServices; using Docker.DotNet.Models; using DotNet.Testcontainers.Builders; @@ -8,6 +9,7 @@ using JetBrains.Annotations; using Stef.Validation; using WireMock.Net.Testcontainers.Utils; +using WireMock.Util; namespace WireMock.Net.Testcontainers; @@ -132,6 +134,36 @@ public WireMockContainerBuilder WithMappings(string path, bool includeSubDirecto WithCommand("--WatchStaticMappingsInSubdirectories", includeSubDirectories); } + /// + /// Use Http version 2. + /// + /// A configured instance of + [PublicAPI] + public WireMockContainerBuilder WithHttp2() + { + return WithCommand("--UseHttp2 true"); + } + + /// + /// Adds another URL to the WireMock container. By default, the WireMock container will listen on http://*:80. + /// + /// This method can be used to also host the WireMock container on another port or protocol (like grpc). + /// + /// grpc://*:9090 + /// A configured instance of + [PublicAPI] + public WireMockContainerBuilder AddUrl(string url) + { + if (!PortUtils.TryExtract(Guard.NotNullOrEmpty(url), out _, out _, out _, out _, out var port)) + { + throw new ArgumentException("The URL is not valid.", nameof(url)); + } + + DockerResourceConfiguration.WithAdditionalUrl(url); + + return WithPortBinding(port, true); + } + private WireMockContainerBuilder WithCommand(string param, bool value) { return !value ? this : WithCommand($"{param} true"); @@ -172,6 +204,11 @@ public override WireMockContainer Build() builder = builder.WithBindMount(builder.DockerResourceConfiguration.StaticMappingsPath, ContainerInfoProvider.Info[_imageOS.Value].MappingsPath); } + if (builder.DockerResourceConfiguration.AdditionalUrls.Any()) + { + builder = builder.WithCommand($"--Urls http://*:80 {string.Join(" ", builder.DockerResourceConfiguration.AdditionalUrls)}"); + } + builder.Validate(); return new WireMockContainer(builder.DockerResourceConfiguration); diff --git a/src/WireMock.Net/Util/PortUtils.cs b/src/WireMock.Net/Util/PortUtils.cs index f50a106d..5605dfc8 100644 --- a/src/WireMock.Net/Util/PortUtils.cs +++ b/src/WireMock.Net/Util/PortUtils.cs @@ -83,32 +83,6 @@ public static IReadOnlyList FindFreeTcpPorts(int count) } } - ///// - ///// Finds free TCP ports. - ///// - //public static IReadOnlyList FindFreeTcpPorts(int numPorts) - //{ - // var freePorts = new List(); - - // TcpListener? tcpListener = null; - // try - // { - // for (var i = 0; i < numPorts; i++) - // { - // tcpListener = new TcpListener(IPAddress.Loopback, 0); - // tcpListener.Start(); - - // freePorts.Add(((IPEndPoint)tcpListener.LocalEndpoint).Port); - // } - // } - // finally - // { - // tcpListener?.Stop(); - // } - - // return freePorts; - //} - /// /// Extract the isHttps, isHttp2, protocol, host and port from a URL. /// @@ -118,7 +92,7 @@ public static bool TryExtract(string url, out bool isHttps, out bool isHttp2, [N isHttp2 = false; protocol = null; host = null; - port = default; + port = 0; var match = UrlDetailsRegex.Match(url); if (match.Success) diff --git a/test/WireMock.Net.Tests/Grpc/WireMockServerTests.Grpc.cs b/test/WireMock.Net.Tests/Grpc/WireMockServerTests.Grpc.cs index 68acd4f8..807acd85 100644 --- a/test/WireMock.Net.Tests/Grpc/WireMockServerTests.Grpc.cs +++ b/test/WireMock.Net.Tests/Grpc/WireMockServerTests.Grpc.cs @@ -12,7 +12,7 @@ using Google.Protobuf.WellKnownTypes; using Greet; using Grpc.Net.Client; -using NarrowIntegrationTest.Lookup; +using ExampleIntegrationTest.Lookup; using WireMock.Constants; using WireMock.Matchers; using WireMock.RequestBuilders; @@ -668,7 +668,7 @@ public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingPolicyGrpcGenerate .RespondWith(Response.Create() .WithHeader("Content-Type", "application/grpc") .WithTrailingHeader("grpc-status", "0") - .WithBodyAsProtoBuf(definition, "NarrowIntegrationTest.Lookup.GetVersionResponse", + .WithBodyAsProtoBuf(definition, "ExampleIntegrationTest.Lookup.GetVersionResponse", new GetVersionResponse { Version = version, @@ -677,9 +677,9 @@ public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingPolicyGrpcGenerate Seconds = seconds, Nanos = nanos }, - Client = new NarrowIntegrationTest.Lookup.Client + Client = new ExampleIntegrationTest.Lookup.Client { - ClientName = NarrowIntegrationTest.Lookup.Client.Types.Clients.BillingCenter, + ClientName = ExampleIntegrationTest.Lookup.Client.Types.Clients.Test, CorrelationId = correlationId } } @@ -695,23 +695,34 @@ public async Task WireMockServer_WithBodyAsProtoBuf_Enum_UsingPolicyGrpcGenerate // Assert reply.Version.Should().Be(version); reply.DateHired.Should().Be(new Timestamp { Seconds = seconds, Nanos = nanos }); - reply.Client.ClientName.Should().Be(NarrowIntegrationTest.Lookup.Client.Types.Clients.BillingCenter); + reply.Client.ClientName.Should().Be(ExampleIntegrationTest.Lookup.Client.Types.Clients.Test); reply.Client.CorrelationId.Should().Be(correlationId); } + [Fact] + public async Task WireMockServer_WithBodyAsProtoBuf_FromJson_UsingGrpcGeneratedClient() + { + var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc(); + await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-1.json"); + + var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]); + + Then_ReplyMessage_Should_BeCorrect(reply); + } + [Fact] public async Task WireMockServer_WithBodyAsProtoBuf_ServerProtoDefinitionFromJson_UsingGrpcGeneratedClient() { - var server = Given_When_ServerStartedUsingHttp2(); + var server = Given_When_ServerStarted_And_RunningOnHttpAndGrpc(); Given_ProtoDefinition_IsAddedOnServerLevel(server); - await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server); + await Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(server, "protobuf-mapping-3.json"); var reply = await When_GrpcClient_Calls_SayHelloAsync(server.Urls[1]); Then_ReplyMessage_Should_BeCorrect(reply); } - private static WireMockServer Given_When_ServerStartedUsingHttp2() + private static WireMockServer Given_When_ServerStarted_And_RunningOnHttpAndGrpc() { var ports = PortUtils.FindFreeTcpPorts(2); @@ -728,9 +739,9 @@ private static void Given_ProtoDefinition_IsAddedOnServerLevel(WireMockServer se server.AddProtoDefinition("my-greeter", ReadProtoFile("greet.proto")); } - private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server) + private static async Task Given_When_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockServer server, string filename) { - var mappingsJson = ReadMappingFile("protobuf-mapping-3.json"); + var mappingsJson = ReadMappingFile(filename); using var httpClient = server.CreateClient(); diff --git a/test/WireMock.Net.Tests/Grpc/policy.proto b/test/WireMock.Net.Tests/Grpc/policy.proto index 57551fda..4b7fb322 100644 --- a/test/WireMock.Net.Tests/Grpc/policy.proto +++ b/test/WireMock.Net.Tests/Grpc/policy.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -option csharp_namespace = "NarrowIntegrationTest.Lookup"; +option csharp_namespace = "ExampleIntegrationTest.Lookup"; import "google/protobuf/timestamp.proto"; @@ -24,17 +24,8 @@ message Client { string CorrelationId = 1; enum Clients { Unknown = 0; - QMS = 1; - BillingCenter = 2; - PAS = 3; - Payroll = 4; - Portal = 5; - SFO = 6; - QuoteAndBind = 7; - LegacyConversion = 8; - BindNow = 9; - PaymentPortal = 10 ; - PricingEngine = 11; + Other = 1; + Test = 2; } Clients ClientName = 2; } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs new file mode 100644 index 00000000..365ccc58 --- /dev/null +++ b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.Grpc.cs @@ -0,0 +1,186 @@ +// Copyright © WireMock.Net + +#if NET6_0_OR_GREATER +using System; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using FluentAssertions; +using FluentAssertions.Execution; +using Greet; +using Grpc.Net.Client; +using WireMock.Constants; +using WireMock.Net.Testcontainers; +using Xunit; + +namespace WireMock.Net.Tests.Testcontainers; + +public partial class TestcontainersTests +{ + [Fact] + public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls1() + { + // Act + var adminUsername = $"username_{Guid.NewGuid()}"; + var adminPassword = $"password_{Guid.NewGuid()}"; + var wireMockContainer = new WireMockContainerBuilder() + .WithAutoRemove(true) + .WithCleanUp(true) + .WithAdminUserNameAndPassword(adminUsername, adminPassword) + .WithCommand("--UseHttp2") + .WithCommand("--Urls", "http://*:80 grpc://*:9090") + .WithPortBinding(9090, true) + .Build(); + + try + { + await wireMockContainer.StartAsync().ConfigureAwait(false); + + // Assert + using (new AssertionScope()) + { + var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue); + logs.Should().NotBeNull(); + + var url = wireMockContainer.GetPublicUrl(); + url.Should().NotBeNullOrWhiteSpace(); + + var urls = wireMockContainer.GetPublicUrls(); + urls.Should().HaveCount(2); + + var httpPort = wireMockContainer.GetMappedPublicPort(80); + httpPort.Should().BeGreaterThan(0); + + var httpUrl = wireMockContainer.GetMappedPublicUrl(80); + httpUrl.Should().StartWith("http://"); + + var grpcPort = wireMockContainer.GetMappedPublicPort(9090); + grpcPort.Should().BeGreaterThan(0); + + var grpcUrl = wireMockContainer.GetMappedPublicUrl(80); + grpcUrl.Should().StartWith("http://"); + + var adminClient = wireMockContainer.CreateWireMockAdminClient(); + + var settings = await adminClient.GetSettingsAsync(); + settings.Should().NotBeNull(); + } + } + finally + { + await wireMockContainer.StopAsync(); + } + } + + [Fact] + public async Task WireMockContainer_Build_Grpc_TestPortsAndUrls2() + { + // Act + var adminUsername = $"username_{Guid.NewGuid()}"; + var adminPassword = $"password_{Guid.NewGuid()}"; + var wireMockContainer = new WireMockContainerBuilder() + .WithAutoRemove(true) + .WithCleanUp(true) + .WithAdminUserNameAndPassword(adminUsername, adminPassword) + .AddUrl("http://*:8080") + .AddUrl("grpc://*:9090") + .AddUrl("grpc://*:9091") + .Build(); + + try + { + await wireMockContainer.StartAsync().ConfigureAwait(false); + + // Assert + using (new AssertionScope()) + { + var logs = await wireMockContainer.GetLogsAsync(DateTime.MinValue); + logs.Should().NotBeNull(); + + var url = wireMockContainer.GetPublicUrl(); + url.Should().NotBeNullOrWhiteSpace(); + + var urls = wireMockContainer.GetPublicUrls(); + urls.Should().HaveCount(4); + + foreach (var internalPort in new[] { 80, 8080, 9090, 9091 }) + { + var publicPort = wireMockContainer.GetMappedPublicPort(internalPort); + publicPort.Should().BeGreaterThan(0); + + var publicUrl = wireMockContainer.GetMappedPublicUrl(internalPort); + publicUrl.Should().StartWith("http://"); + } + + var adminClient = wireMockContainer.CreateWireMockAdminClient(); + + var settings = await adminClient.GetSettingsAsync(); + settings.Should().NotBeNull(); + } + } + finally + { + await wireMockContainer.StopAsync(); + } + } + + [Fact] + public async Task WireMockContainer_Build_Grpc_ProtoDefinitionFromJson_UsingGrpcGeneratedClient() + { + var wireMockContainer = await Given_WireMockContainerIsStartedForHttpAndGrpc(); + + await Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(wireMockContainer); + + var reply = await When_GrpcClient_Calls_SayHelloAsync(wireMockContainer); + + Then_ReplyMessage_Should_BeCorrect(reply); + + await wireMockContainer.StopAsync(); + } + + private static async Task Given_WireMockContainerIsStartedForHttpAndGrpc() + { + var wireMockContainer = new WireMockContainerBuilder() + .WithAutoRemove(true) + .WithCleanUp(true) + .AddUrl("grpc://*:9090") + .Build(); + + await wireMockContainer.StartAsync(); + + return wireMockContainer; + } + + private static async Task Given_ProtoBufMappingIsAddedViaAdminInterfaceAsync(WireMockContainer wireMockContainer) + { + var mappingsJson = ReadMappingFile("protobuf-mapping-1.json"); + + using var httpClient = wireMockContainer.CreateClient(); + + var result = await httpClient.PostAsync("/__admin/mappings", new StringContent(mappingsJson, Encoding.UTF8, WireMockConstants.ContentTypeJson)); + result.EnsureSuccessStatusCode(); + } + + private static async Task When_GrpcClient_Calls_SayHelloAsync(WireMockContainer wireMockContainer) + { + var address = wireMockContainer.GetPublicUrls()[9090]; + var channel = GrpcChannel.ForAddress(address); + + var client = new Greeter.GreeterClient(channel); + + return await client.SayHelloAsync(new HelloRequest { Name = "stef" }); + } + + private static void Then_ReplyMessage_Should_BeCorrect(HelloReply reply) + { + reply.Message.Should().Be("hello stef POST"); + } + + private static string ReadMappingFile(string filename) + { + return File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), "__admin", "mappings", filename)); + } +} +#endif \ No newline at end of file diff --git a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs index 1b0f1bc1..2a219dc9 100644 --- a/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs +++ b/test/WireMock.Net.Tests/Testcontainers/TestcontainersTests.cs @@ -8,15 +8,16 @@ using FluentAssertions; using FluentAssertions.Execution; using WireMock.Net.Testcontainers; +using WireMock.Net.Testcontainers.Utils; using WireMock.Net.Tests.Facts; using Xunit; namespace WireMock.Net.Tests.Testcontainers; -public class TestcontainersTests +public partial class TestcontainersTests { [Fact] - public async Task WireMockContainer_Build_WithNoImage_And_StartAsync_and_StopAsync() + public async Task WireMockContainer_Build_And_StartAsync_and_StopAsync() { // Act var adminUsername = $"username_{Guid.NewGuid()}"; @@ -32,7 +33,7 @@ public async Task WireMockContainer_Build_WithNoImage_And_StartAsync_and_StopAsy // https://github.com/testcontainers/testcontainers-dotnet/issues/1322 [RunOnDockerPlatformFact("Linux")] - public async Task WireMockContainer_Build_WithNoImageAndNetwork_And_StartAsync_and_StopAsync() + public async Task WireMockContainer_Build_WithNetwork_And_StartAsync_and_StopAsync() { // Act var dummyNetwork = new NetworkBuilder() @@ -61,7 +62,8 @@ public async Task WireMockContainer_Build_WithImage_And_StartAsync_and_StopAsync .WithCleanUp(true) .WithAdminUserNameAndPassword(adminUsername, adminPassword); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + var imageOS = await TestcontainersUtils.GetImageOSAsync.Value; + if (imageOS == OSPlatform.Windows) { wireMockContainerBuilder = wireMockContainerBuilder.WithWindowsImage(); } @@ -86,7 +88,8 @@ public async Task WireMockContainer_Build_WithImageAsText_And_StartAsync_and_Sto .WithCleanUp(true) .WithAdminUserNameAndPassword(adminUsername, adminPassword); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + var imageOS = await TestcontainersUtils.GetImageOSAsync.Value; + if (imageOS == OSPlatform.Windows) { wireMockContainerBuilder = wireMockContainerBuilder.WithImage("sheyenrath/wiremock.net-windows"); } diff --git a/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json b/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json index b157ac61..8b3dcf93 100644 --- a/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json +++ b/test/WireMock.Net.Tests/__admin/mappings/protobuf-mapping-1.json @@ -32,7 +32,7 @@ }, "Response": { "BodyAsJson": { - "message": "hello {{request.BodyAsJson.name}}" + "message": "hello {{request.BodyAsJson.name}} {{request.method}}" }, "UseTransformer": true, "TransformerType": "Handlebars",