diff --git a/Directory.Build.props b/Directory.Build.props index 4b5a09de..cb15dbda 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -44,6 +44,11 @@ + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -52,7 +57,5 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive --> - - diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index a707c1d0..324ac065 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -225,7 +225,7 @@ public partial class WireMockServer if (FileHelper.TryReadMappingFileWithRetryAndDelay(_settings.FileSystemHandler, path, out var value)) { var mappingModels = DeserializeJsonToArray(value); - if (mappingModels.Length == 1 && Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) + if (mappingModels.Length == 1 && Guid.TryParse(filenameWithoutExtension, out var guidFromFilename)) { ConvertMappingAndRegisterAsRespondProvider(mappingModels[0], guidFromFilename, path); } @@ -783,7 +783,7 @@ public partial class WireMockServer _settings.Logger.Info("MappingFile deleted : '{0}'", args.FullPath); string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath); - if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) + if (Guid.TryParse(filenameWithoutExtension, out var guidFromFilename)) { DeleteMapping(guidFromFilename); } diff --git a/src/WireMock.Net/Util/StringUtils.cs b/src/WireMock.Net/Util/StringUtils.cs index 5816967d..cf9d85ec 100644 --- a/src/WireMock.Net/Util/StringUtils.cs +++ b/src/WireMock.Net/Util/StringUtils.cs @@ -23,7 +23,7 @@ internal static class StringUtils s => int.TryParse(s, out var result) ? (true, result) : (false, s), s => long.TryParse(s, out var result) ? (true, result) : (false, s), s => double.TryParse(s, out var result) ? (true, result) : (false, s), - s => Guid.TryParse(s, out var result) ? (true, result) : (false, s), + s => Guid.TryParseExact(s, "D", out var result) ? (true, result) : (false, s), s => TimeSpan.TryParse(s, out var result) ? (true, result) : (false, s), s => DateTime.TryParse(s, out var result) ? (true, result) : (false, s), s => diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs index 77891d76..ee0477ce 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs @@ -105,7 +105,7 @@ public class ResponseWithHandlebarsRandomTests [Theory] [InlineData(ReplaceNodeOptions.EvaluateAndTryToConvert, JTokenType.Guid)] [InlineData(ReplaceNodeOptions.Evaluate, JTokenType.String)] - public async Task Response_ProvideResponseAsync_Handlebars_Random1_Guid(ReplaceNodeOptions options, JTokenType expected) + public async Task Response_ProvideResponseAsync_Handlebars_Random_Guid(ReplaceNodeOptions options, JTokenType expected) { // Assign var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); @@ -114,7 +114,8 @@ public class ResponseWithHandlebarsRandomTests .WithBodyAsJson(new { Guid1 = "{{Random Type=\"Guid\" Uppercase=false}}", - Guid2 = "{{Random Type=\"Guid\"}}" + Guid2 = "{{Random Type=\"Guid\"}}", + Guid3 = "{{ String.Replace (Random Type=\"Guid\") \"-\" \"\" }}" }) .WithTransformer(options); @@ -127,6 +128,27 @@ public class ResponseWithHandlebarsRandomTests jObject["Guid2"]!.Type.Should().Be(expected); } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random_StringReplaceGuid() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + MyGuid = "{{ String.Replace (Random Type=\"Guid\") \"-\" \"\" }}" + }) + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + var jObject = JObject.FromObject(response.Message.BodyData!.BodyAsJson!); + jObject["MyGuid"]!.Type.Should().Be(JTokenType.String); + } + [Fact] public async Task Response_ProvideResponseAsync_Handlebars_Random1_StringList() { diff --git a/test/WireMock.Net.Tests/Util/StringUtilsTests.cs b/test/WireMock.Net.Tests/Util/StringUtilsTests.cs index f9ab2753..17fb313b 100644 --- a/test/WireMock.Net.Tests/Util/StringUtilsTests.cs +++ b/test/WireMock.Net.Tests/Util/StringUtilsTests.cs @@ -97,7 +97,7 @@ public class StringUtilsTests isConverted.Should().Be(expectedConversion); if (isConverted) { - ((double) convertedValue).Should().BeApproximately(expectedValue, 0.01); + ((double)convertedValue).Should().BeApproximately(expectedValue, 0.01); } else { @@ -106,6 +106,10 @@ public class StringUtilsTests } [Theory] + [InlineData("3F2504E04F8911D39A0C0305E82C3301", false)] + [InlineData("{3F2504E04F8911D39A0C0305E82C3301}", false)] + [InlineData("(3F2504E04F8911D39A0C0305E82C3301)", false)] + [InlineData("{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}", false)] [InlineData("3F2504E0-4F89-11D3-9A0C-0305E82C3301", true)] [InlineData("00000000-0000-0000-0000-000000000000", true)] [InlineData("3f2504e0-4f89-11d3-9a0c-0305e82c3301", true)] // Lowercase Guid