Add HandleBars Random functionality (#230 #219)

Add HandleBars Random functionality (#219)
This commit is contained in:
Stef Heyenrath
2018-11-09 10:06:09 +00:00
committed by GitHub
parent 34be065467
commit 3df4161329
7 changed files with 98 additions and 7 deletions

View File

@@ -10,5 +10,6 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=XUA/@EntryIndexedValue">XUA</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=funcs/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Heyenrath/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=randomizer/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Stef/@EntryIndexedValue">True</s:Boolean>
</wpf:ResourceDictionary>

View File

@@ -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();

View File

@@ -9,6 +9,8 @@
HandleBarsJsonPath.Register();
HandleBarsLinq.Register();
HandleBarsRandom.Register();
}
}
}

View File

@@ -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<string, object>)arguments[0];
string type = (string)properties["Type"];
properties.Remove("Type");
return FieldOptionsFactory.GetFieldOptions(type, properties);
}
}
}

View File

@@ -53,6 +53,7 @@
<PackageReference Include="RestEase" Version="1.4.7" />
<PackageReference Include="MimeKitLite" Version="2.0.7" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.0.9" />
<PackageReference Include="RandomDataGenerator.Net" Version="1.0.1" />
</ItemGroup>
<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">

View File

@@ -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();
}
}
}

View File

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