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 };