diff --git a/WireMock.Net Solution.sln.DotSettings b/WireMock.Net Solution.sln.DotSettings index f147855d..4556d123 100644 --- a/WireMock.Net Solution.sln.DotSettings +++ b/WireMock.Net Solution.sln.DotSettings @@ -10,5 +10,6 @@ XUA True True + True True \ No newline at end of file diff --git a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs index 535b65a6..5b4076db 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs +++ b/examples/WireMock.Net.Console.Net452.Classic/MainApp.cs @@ -395,6 +395,13 @@ namespace WireMock.Net.ConsoleApplication }) ); + server + .Given(Request.Create().WithPath("/random")) + .RespondWith(Response.Create() + .WithBody("Text:{{Random Type=\"Text\" Min=8 Max=20}}\r\nDateTime:{{Random Type=\"DateTime\"}}\r\nGuid:{{Random Type=\"Guid\" Uppercase=true}}") + .WithTransformer() + ); + System.Console.WriteLine("Press any key to stop the server"); System.Console.ReadKey(); server.Stop(); diff --git a/src/WireMock.Net/Transformers/HandleBarsHelpers.cs b/src/WireMock.Net/Transformers/HandleBarsHelpers.cs index 7d3f2c30..f35142ae 100644 --- a/src/WireMock.Net/Transformers/HandleBarsHelpers.cs +++ b/src/WireMock.Net/Transformers/HandleBarsHelpers.cs @@ -9,6 +9,8 @@ HandleBarsJsonPath.Register(); HandleBarsLinq.Register(); + + HandleBarsRandom.Register(); } } } \ No newline at end of file diff --git a/src/WireMock.Net/Transformers/HandleBarsRandom.cs b/src/WireMock.Net/Transformers/HandleBarsRandom.cs new file mode 100644 index 00000000..b516d54f --- /dev/null +++ b/src/WireMock.Net/Transformers/HandleBarsRandom.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using HandlebarsDotNet; +using RandomDataGenerator.FieldOptions; +using RandomDataGenerator.Randomizers; +using WireMock.Validation; + +namespace WireMock.Transformers +{ + internal static class HandleBarsRandom + { + public static void Register() + { + Handlebars.RegisterHelper("Random", (writer, context, arguments) => + { + var fieldOptions = GetFieldOptionsFromArguments(arguments); + + dynamic randomizer = RandomizerFactory.GetRandomizerAsDynamic(fieldOptions); + if (randomizer.GetType().GetMethod("GenerateAsString") != null) + { + string valueAsString = randomizer.GenerateAsString(); + writer.WriteSafeString(valueAsString); + } + else + { + object valueAsObject = randomizer.Generate(); + writer.WriteSafeString(valueAsObject); + } + }); + } + + private static FieldOptionsAbstract GetFieldOptionsFromArguments(object[] arguments) + { + Check.Condition(arguments, args => args.Length > 0, nameof(arguments)); + Check.NotNull(arguments[0], "arguments[0]"); + + var properties = (Dictionary)arguments[0]; + string type = (string)properties["Type"]; + + properties.Remove("Type"); + + return FieldOptionsFactory.GetFieldOptions(type, properties); + } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index 496e9f36..cd586170 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -53,6 +53,7 @@ + diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs new file mode 100644 index 00000000..bfe54ebd --- /dev/null +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using NFluent; +using WireMock.Models; +using WireMock.ResponseBuilders; +using Xunit; + +namespace WireMock.Net.Tests.ResponseBuilders +{ + public class ResponseWithHandlebarsRandomTests + { + private const string ClientIp = "::1"; + + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + + var response = Response.Create() + .WithBodyAsJson(new + { + Text = "{{Random Type=\"Text\" Min=8 Max=20}}", + DateTime = "{{Random Type=\"DateTime\"}}", + Guid = "{{Random Type=\"Guid\" Uppercase=true}}" + }) + .WithTransformer(); + + // Act + var responseMessage = await response.ProvideResponseAsync(request); + + // assert + Check.That(responseMessage.BodyData).IsNotNull(); + } + } +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs index 1192c7ec..4f98d351 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using NFluent; using WireMock.Models; using WireMock.ResponseBuilders; @@ -12,7 +13,7 @@ namespace WireMock.Net.Tests.ResponseBuilders private const string ClientIp = "::1"; [Fact] - public async void Response_ProvideResponse_Handlebars_RegexMatch() + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch() { // Assign var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; @@ -31,7 +32,7 @@ namespace WireMock.Net.Tests.ResponseBuilders } [Fact] - public async void Response_ProvideResponse_Handlebars_RegexMatch_NoMatch() + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch_NoMatch() { // Assign var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; @@ -50,7 +51,7 @@ namespace WireMock.Net.Tests.ResponseBuilders } [Fact] - public async void Response_ProvideResponse_Handlebars_RegexMatch_NoMatch_WithDefaultValue() + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch_NoMatch_WithDefaultValue() { // Assign var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; @@ -69,7 +70,7 @@ namespace WireMock.Net.Tests.ResponseBuilders } [Fact] - public async void Response_ProvideResponse_Handlebars_RegexMatch2() + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2() { // Assign var body = new BodyData { BodyAsString = "https://localhost:5000/", DetectedBodyType = BodyType.String }; @@ -88,7 +89,7 @@ namespace WireMock.Net.Tests.ResponseBuilders } [Fact] - public async void Response_ProvideResponse_Handlebars_RegexMatch2_NoMatch() + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2_NoMatch() { // Assign var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String }; @@ -107,7 +108,7 @@ namespace WireMock.Net.Tests.ResponseBuilders } [Fact] - public async void Response_ProvideResponse_Handlebars_RegexMatch2_NoMatch_WithDefaultValue() + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2_NoMatch_WithDefaultValue() { // Assign var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String }; @@ -126,7 +127,7 @@ namespace WireMock.Net.Tests.ResponseBuilders } [Fact] - public void Response_ProvideResponse_Handlebars_RegexMatch2_Throws() + public void Response_ProvideResponseAsync_Handlebars_RegexMatch2_Throws() { // Assign var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String };