diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c4afbe4..42ab62e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +# 1.23.0 (05 January 2026) +- [#1414](https://github.com/wiremock/WireMock.Net/pull/1414) - Pass the parameter matchOperator in Request.WithPath to its inner calls [bug] contributed by [gbamqzkdyg](https://github.com/gbamqzkdyg) +- [#1416](https://github.com/wiremock/WireMock.Net/pull/1416) - Fix: Pass AllowedHandlebarsHelpers configuration to Handlebars.Net.Helpers library contributed by [samlatham](https://github.com/samlatham) +- [#1413](https://github.com/wiremock/WireMock.Net/issues/1413) - Parameter `matchOperator` is not respected in the method Request.WithPath [bug] +- [#1415](https://github.com/wiremock/WireMock.Net/issues/1415) - HandlebarsSettings AllowedHandlebarsHelpers Configuration Not Applied [bug] + +# 1.22.0 (02 January 2026) +- [#1412](https://github.com/wiremock/WireMock.Net/pull/1412) - chore(testcontainers): bump up Testcontainers to version 4.10.0 [feature] contributed by [vhatsura](https://github.com/vhatsura) +- [#1411](https://github.com/wiremock/WireMock.Net/issues/1411) - WireMock.Net.Testcontainers isn't compatible with Testcontainers 4.10.0 [bug] + +# 1.21.0 (25 December 2025) +- [#1408](https://github.com/wiremock/WireMock.Net/pull/1408) - Fix readyness-check for Testcontainers [bug] contributed by [StefH](https://github.com/StefH) + # 1.20.0 (24 December 2025) - [#1399](https://github.com/wiremock/WireMock.Net/pull/1399) - Upgrade RamlToOpenApiConverter and YamlDotNet [feature] contributed by [StefH](https://github.com/StefH) - [#1400](https://github.com/wiremock/WireMock.Net/pull/1400) - Add WireMock.Net.NUnit project [feature] contributed by [StefH](https://github.com/StefH) diff --git a/Directory.Build.props b/Directory.Build.props index daf48040..4d6aa967 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,7 @@ - 1.20.0 + 1.23.0 WireMock.Net-Logo.png https://github.com/wiremock/WireMock.Net Apache-2.0 diff --git a/Generate-ReleaseNotes.cmd b/Generate-ReleaseNotes.cmd index 5a5e664b..90e00c82 100644 --- a/Generate-ReleaseNotes.cmd +++ b/Generate-ReleaseNotes.cmd @@ -1,6 +1,6 @@ rem https://github.com/StefH/GitHubReleaseNotes -SET version=1.20.0 +SET version=1.23.0 GitHubReleaseNotes --output CHANGELOG.md --skip-empty-releases --exclude-labels wontfix test question invalid doc duplicate example environment --version %version% --token %GH_TOKEN% diff --git a/PackageReleaseNotes.txt b/PackageReleaseNotes.txt index d0d374b0..8d7293e0 100644 --- a/PackageReleaseNotes.txt +++ b/PackageReleaseNotes.txt @@ -1,8 +1,7 @@ -# 1.20.0 (24 December 2025) -- #1399 Upgrade RamlToOpenApiConverter and YamlDotNet [feature] -- #1400 Add WireMock.Net.NUnit project [feature] -- #1405 Fix Testcontainers AddProtoDefinition [bug] -- #1398 Upgrade YamlDotNet dependency [feature] -- #1404 An exception occurs when adding multiple proto definitions in the TestContainer. [bug] +# 1.23.0 (05 January 2026) +- #1414 Pass the parameter matchOperator in Request.WithPath to its inner calls [bug] +- #1416 Fix: Pass AllowedHandlebarsHelpers configuration to Handlebars.Net.Helpers library +- #1413 Parameter `matchOperator` is not respected in the method Request.WithPath [bug] +- #1415 HandlebarsSettings AllowedHandlebarsHelpers Configuration Not Applied [bug] The full release notes can be found here: https://github.com/wiremock/WireMock.Net/blob/master/CHANGELOG.md \ No newline at end of file diff --git a/src/WireMock.Net.Minimal/RequestBuilders/Request.WithPath.cs b/src/WireMock.Net.Minimal/RequestBuilders/Request.WithPath.cs index 7ff11fd8..32b83ecc 100644 --- a/src/WireMock.Net.Minimal/RequestBuilders/Request.WithPath.cs +++ b/src/WireMock.Net.Minimal/RequestBuilders/Request.WithPath.cs @@ -21,7 +21,7 @@ public partial class Request { Guard.NotNullOrEmpty(matchers); - _requestMatchers.Add(new RequestMessagePathMatcher(MatchBehaviour.AcceptOnMatch, MatchOperator.Or, matchers)); + _requestMatchers.Add(new RequestMessagePathMatcher(MatchBehaviour.AcceptOnMatch, matchOperator, matchers)); return this; } diff --git a/src/WireMock.Net.Minimal/Transformers/Handlebars/WireMockHandlebarsHelpers.cs b/src/WireMock.Net.Minimal/Transformers/Handlebars/WireMockHandlebarsHelpers.cs index 06216920..63ab8d7c 100644 --- a/src/WireMock.Net.Minimal/Transformers/Handlebars/WireMockHandlebarsHelpers.cs +++ b/src/WireMock.Net.Minimal/Transformers/Handlebars/WireMockHandlebarsHelpers.cs @@ -39,6 +39,8 @@ internal static class WireMockHandlebarsHelpers //#endif o.CustomHelperPaths = paths; + o.Categories = settings.HandlebarsSettings?.AllowedHandlebarsHelpers ?? HandlebarsSettings.DefaultAllowedHandlebarsHelpers; + o.CustomHelpers = new Dictionary(); if (settings.HandlebarsSettings?.AllowedCustomHandlebarsHelpers.HasFlag(CustomHandlebarsHelpers.File) == true) { diff --git a/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj b/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj index 24157f88..39c248a2 100644 --- a/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj +++ b/src/WireMock.Net.Testcontainers/WireMock.Net.Testcontainers.csproj @@ -39,7 +39,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/test/WireMock.Net.Tests/Settings/HandlebarsSettingsTests.cs b/test/WireMock.Net.Tests/Settings/HandlebarsSettingsTests.cs new file mode 100644 index 00000000..1655dd68 --- /dev/null +++ b/test/WireMock.Net.Tests/Settings/HandlebarsSettingsTests.cs @@ -0,0 +1,93 @@ +// Copyright © WireMock.Net + +using System; +using System.Linq; +using System.Threading.Tasks; +using FluentAssertions; +using HandlebarsDotNet; +using HandlebarsDotNet.Helpers.Enums; +using Moq; +using WireMock.Handlers; +using WireMock.Models; +using WireMock.ResponseBuilders; +using WireMock.Settings; +using Xunit; + +namespace WireMock.Net.Tests.Settings; + +public class HandlebarsSettingsTests +{ + private const string ClientIp = "::1"; + + private readonly WireMockServerSettings _settings; + private readonly Mock _mappingMock; + private readonly Mock _fileSystemHandlerMock; + + public HandlebarsSettingsTests() + { + _mappingMock = new Mock(); + + _fileSystemHandlerMock = new Mock(MockBehavior.Strict); + + _settings = new WireMockServerSettings + { + FileSystemHandler = _fileSystemHandlerMock.Object + }; + } + + [Fact] + public async Task Response_HandlebarsHelpers_Environment_NotAllowed_By_Default() + { + // Arrange + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithBody("Username: {{Environment.GetEnvironmentVariable \"USERNAME\"}}") + .WithTransformer(); + + // Act + Func action = () => responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings); + + // Assert + await action.Should().ThrowAsync(); + } + + [Fact] + public async Task Response_HandlebarsHelpers_Environment_Allowed_When_Configured() + { + // Arrange + var settingsWithEnv = new WireMockServerSettings + { + FileSystemHandler = _fileSystemHandlerMock.Object, + HandlebarsSettings = new HandlebarsSettings + { + AllowedHandlebarsHelpers = HandlebarsSettings.DefaultAllowedHandlebarsHelpers + .Concat([Category.Environment]) + .ToArray() + } + }; + + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithBody("User: {{Environment.GetEnvironmentVariable \"USERNAME\"}}") + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, settingsWithEnv).ConfigureAwait(false); + + // Assert + response.Message?.BodyData?.BodyAsString.Should().NotContain("{{Environment.GetEnvironmentVariable"); + response.Message?.BodyData?.BodyAsString.Should().StartWith("User: "); + } + + [Fact] + public void DefaultAllowedHandlebarsHelpers_Should_Not_Include_EnvironmentAndDynamicLinq() + { + // Assert + HandlebarsSettings.DefaultAllowedHandlebarsHelpers.Should() + .NotContain(Category.Environment) + .And + .NotContain(Category.DynamicLinq); + } +} \ No newline at end of file