mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-04-20 23:41:19 +02:00
Refactor Transformer (add Scriban) (#562)
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<VersionPrefix>1.4.0</VersionPrefix>
|
<VersionPrefix>1.4.1</VersionPrefix>
|
||||||
<PackageReleaseNotes>See CHANGELOG.md</PackageReleaseNotes>
|
<PackageReleaseNotes>See CHANGELOG.md</PackageReleaseNotes>
|
||||||
<PackageIconUrl>https://raw.githubusercontent.com/WireMock-Net/WireMock.Net/master/WireMock.Net-Logo.png</PackageIconUrl>
|
<PackageIconUrl>https://raw.githubusercontent.com/WireMock-Net/WireMock.Net/master/WireMock.Net-Logo.png</PackageIconUrl>
|
||||||
<PackageProjectUrl>https://github.com/WireMock-Net/WireMock.Net</PackageProjectUrl>
|
<PackageProjectUrl>https://github.com/WireMock-Net/WireMock.Net</PackageProjectUrl>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using WireMock.Server;
|
|||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using WireMock.Types;
|
||||||
|
|
||||||
namespace WireMock.Net.ConsoleApplication
|
namespace WireMock.Net.ConsoleApplication
|
||||||
{
|
{
|
||||||
@@ -346,7 +347,7 @@ namespace WireMock.Net.ConsoleApplication
|
|||||||
.WithHeader("Transformed-Postman-Token", "token is {{request.headers.Postman-Token}}")
|
.WithHeader("Transformed-Postman-Token", "token is {{request.headers.Postman-Token}}")
|
||||||
.WithHeader("xyz_{{request.headers.Postman-Token}}", "token is {{request.headers.Postman-Token}}")
|
.WithHeader("xyz_{{request.headers.Postman-Token}}", "token is {{request.headers.Postman-Token}}")
|
||||||
.WithBody(@"{""msg"": ""Hello world CATCH-ALL on /*, {{request.path}}, add={{Math.Add request.query.start.[0] 42}} bykey={{request.query.start}}, bykey={{request.query.stop}}, byidx0={{request.query.stop.[0]}}, byidx1={{request.query.stop.[1]}}"" }")
|
.WithBody(@"{""msg"": ""Hello world CATCH-ALL on /*, {{request.path}}, add={{Math.Add request.query.start.[0] 42}} bykey={{request.query.start}}, bykey={{request.query.stop}}, byidx0={{request.query.stop.[0]}}, byidx1={{request.query.stop.[1]}}"" }")
|
||||||
.WithTransformer()
|
.WithTransformer(TransformerType.Handlebars)
|
||||||
.WithDelay(TimeSpan.FromMilliseconds(100))
|
.WithDelay(TimeSpan.FromMilliseconds(100))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using WireMock.Types;
|
||||||
|
|
||||||
namespace WireMock.Admin.Mappings
|
namespace WireMock.Admin.Mappings
|
||||||
{
|
{
|
||||||
@@ -53,10 +54,15 @@ namespace WireMock.Admin.Mappings
|
|||||||
public EncodingModel BodyEncoding { get; set; }
|
public EncodingModel BodyEncoding { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Use Handlebars transformer.
|
/// Use ResponseMessage Transformer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool? UseTransformer { get; set; }
|
public bool? UseTransformer { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the type of the transformer.
|
||||||
|
/// </summary>
|
||||||
|
public string TransformerType { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Use the Handlerbars transformer for the content from the referenced BodyAsFile.
|
/// Use the Handlerbars transformer for the content from the referenced BodyAsFile.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
23
src/WireMock.Net.Abstractions/Types/TransformerType.cs
Normal file
23
src/WireMock.Net.Abstractions/Types/TransformerType.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
namespace WireMock.Types
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The ResponseMessage Transformers
|
||||||
|
/// </summary>
|
||||||
|
public enum TransformerType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// https://github.com/Handlebars-Net/Handlebars.Net
|
||||||
|
/// </summary>
|
||||||
|
Handlebars,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// https://github.com/scriban/scriban : default
|
||||||
|
/// </summary>
|
||||||
|
Scriban,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// https://github.com/scriban/scriban : DotLiquid
|
||||||
|
/// </summary>
|
||||||
|
ScribanDotLiquid
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
namespace WireMock.ResponseBuilders
|
using WireMock.Types;
|
||||||
|
|
||||||
|
namespace WireMock.ResponseBuilders
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The TransformResponseBuilder interface.
|
/// The TransformResponseBuilder interface.
|
||||||
@@ -6,11 +8,19 @@
|
|||||||
public interface ITransformResponseBuilder : IDelayResponseBuilder
|
public interface ITransformResponseBuilder : IDelayResponseBuilder
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The with transformer.
|
/// Use the Handlebars.Net ResponseMessage transformer.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>
|
/// <returns>
|
||||||
/// The <see cref="IResponseBuilder"/>.
|
/// The <see cref="IResponseBuilder"/>.
|
||||||
/// </returns>
|
/// </returns>
|
||||||
IResponseBuilder WithTransformer(bool transformContentFromBodyAsFile = false);
|
IResponseBuilder WithTransformer(bool transformContentFromBodyAsFile = false);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Use a specific ResponseMessage transformer.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>
|
||||||
|
/// The <see cref="IResponseBuilder"/>.
|
||||||
|
/// </returns>
|
||||||
|
IResponseBuilder WithTransformer(TransformerType transformerType, bool transformContentFromBodyAsFile = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,8 @@ using WireMock.Proxy;
|
|||||||
using WireMock.ResponseProviders;
|
using WireMock.ResponseProviders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
using WireMock.Transformers;
|
using WireMock.Transformers;
|
||||||
|
using WireMock.Transformers.Handlebars;
|
||||||
|
using WireMock.Transformers.Scriban;
|
||||||
using WireMock.Types;
|
using WireMock.Types;
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
@@ -32,6 +34,11 @@ namespace WireMock.ResponseBuilders
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool UseTransformer { get; private set; }
|
public bool UseTransformer { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the type of the transformer.
|
||||||
|
/// </summary>
|
||||||
|
public TransformerType TransformerType { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a value indicating whether to use the Handlerbars transformer for the content from the referenced BodyAsFile.
|
/// Gets a value indicating whether to use the Handlerbars transformer for the content from the referenced BodyAsFile.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -282,6 +289,16 @@ namespace WireMock.ResponseBuilders
|
|||||||
public IResponseBuilder WithTransformer(bool transformContentFromBodyAsFile = false)
|
public IResponseBuilder WithTransformer(bool transformContentFromBodyAsFile = false)
|
||||||
{
|
{
|
||||||
UseTransformer = true;
|
UseTransformer = true;
|
||||||
|
TransformerType = TransformerType.Handlebars;
|
||||||
|
UseTransformerForBodyAsFile = transformContentFromBodyAsFile;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc cref="ITransformResponseBuilder.WithTransformer(TransformerType, bool)"/>
|
||||||
|
public IResponseBuilder WithTransformer(TransformerType transformerType, bool transformContentFromBodyAsFile = false)
|
||||||
|
{
|
||||||
|
UseTransformer = true;
|
||||||
|
TransformerType = transformerType;
|
||||||
UseTransformerForBodyAsFile = transformContentFromBodyAsFile;
|
UseTransformerForBodyAsFile = transformContentFromBodyAsFile;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -328,7 +345,7 @@ namespace WireMock.ResponseBuilders
|
|||||||
|
|
||||||
var proxyHelper = new ProxyHelper(settings);
|
var proxyHelper = new ProxyHelper(settings);
|
||||||
|
|
||||||
var (proxyResponseMessage, mapping) = await proxyHelper.SendAsync(
|
var (proxyResponseMessage, _) = await proxyHelper.SendAsync(
|
||||||
ProxyAndRecordSettings,
|
ProxyAndRecordSettings,
|
||||||
_httpClientForProxy,
|
_httpClientForProxy,
|
||||||
requestMessage,
|
requestMessage,
|
||||||
@@ -369,8 +386,24 @@ namespace WireMock.ResponseBuilders
|
|||||||
|
|
||||||
if (UseTransformer)
|
if (UseTransformer)
|
||||||
{
|
{
|
||||||
var factory = new HandlebarsContextFactory(settings.FileSystemHandler, settings.HandlebarsRegistrationCallback);
|
ITransformer responseMessageTransformer;
|
||||||
var responseMessageTransformer = new ResponseMessageTransformer(factory);
|
switch (TransformerType)
|
||||||
|
{
|
||||||
|
case TransformerType.Handlebars:
|
||||||
|
var factoryHandlebars = new HandlebarsContextFactory(settings.FileSystemHandler, settings.HandlebarsRegistrationCallback);
|
||||||
|
responseMessageTransformer = new Transformer(factoryHandlebars);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TransformerType.Scriban:
|
||||||
|
case TransformerType.ScribanDotLiquid:
|
||||||
|
var factoryDotLiquid = new ScribanContextFactory(settings.FileSystemHandler, TransformerType);
|
||||||
|
responseMessageTransformer = new Transformer(factoryDotLiquid);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new NotImplementedException($"TransformerType '{TransformerType}' is not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
return responseMessageTransformer.Transform(requestMessage, responseMessage, UseTransformerForBodyAsFile);
|
return responseMessageTransformer.Transform(requestMessage, responseMessage, UseTransformerForBodyAsFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ namespace WireMock.Serialization
|
|||||||
mappingModel.Response.BodyAsFile = null;
|
mappingModel.Response.BodyAsFile = null;
|
||||||
mappingModel.Response.BodyAsFileIsCached = null;
|
mappingModel.Response.BodyAsFileIsCached = null;
|
||||||
mappingModel.Response.UseTransformer = null;
|
mappingModel.Response.UseTransformer = null;
|
||||||
|
mappingModel.Response.TransformerType = null;
|
||||||
mappingModel.Response.UseTransformerForBodyAsFile = null;
|
mappingModel.Response.UseTransformerForBodyAsFile = null;
|
||||||
mappingModel.Response.BodyEncoding = null;
|
mappingModel.Response.BodyEncoding = null;
|
||||||
mappingModel.Response.ProxyUrl = response.ProxyAndRecordSettings.Url;
|
mappingModel.Response.ProxyUrl = response.ProxyAndRecordSettings.Url;
|
||||||
@@ -133,6 +134,7 @@ namespace WireMock.Serialization
|
|||||||
if (response.UseTransformer)
|
if (response.UseTransformer)
|
||||||
{
|
{
|
||||||
mappingModel.Response.UseTransformer = response.UseTransformer;
|
mappingModel.Response.UseTransformer = response.UseTransformer;
|
||||||
|
mappingModel.Response.TransformerType = response.TransformerType.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.UseTransformerForBodyAsFile)
|
if (response.UseTransformerForBodyAsFile)
|
||||||
|
|||||||
@@ -770,7 +770,11 @@ namespace WireMock.Server
|
|||||||
|
|
||||||
if (responseModel.UseTransformer == true)
|
if (responseModel.UseTransformer == true)
|
||||||
{
|
{
|
||||||
responseBuilder = responseBuilder.WithTransformer(responseModel.UseTransformerForBodyAsFile == true);
|
if (!Enum.TryParse<TransformerType>(responseModel.TransformerType, out var transformerType))
|
||||||
|
{
|
||||||
|
transformerType = TransformerType.Handlebars;
|
||||||
|
}
|
||||||
|
responseBuilder = responseBuilder.WithTransformer(transformerType, responseModel.UseTransformerForBodyAsFile == true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(responseModel.ProxyUrl))
|
if (!string.IsNullOrEmpty(responseModel.ProxyUrl))
|
||||||
|
|||||||
@@ -1,11 +1,19 @@
|
|||||||
using HandlebarsDotNet;
|
using HandlebarsDotNet;
|
||||||
using WireMock.Handlers;
|
using WireMock.Handlers;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal class HandlebarsContext : IHandlebarsContext
|
internal class HandlebarsContext : IHandlebarsContext
|
||||||
{
|
{
|
||||||
public IHandlebars Handlebars { get; set; }
|
public IHandlebars Handlebars { get; set; }
|
||||||
|
|
||||||
public IFileSystemHandler FileSystemHandler { get; set; }
|
public IFileSystemHandler FileSystemHandler { get; set; }
|
||||||
|
|
||||||
|
public string ParseAndRender(string text, object model)
|
||||||
|
{
|
||||||
|
var template = Handlebars.Compile(text);
|
||||||
|
|
||||||
|
return template(model);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using HandlebarsDotNet;
|
using HandlebarsDotNet;
|
||||||
|
using JetBrains.Annotations;
|
||||||
using WireMock.Handlers;
|
using WireMock.Handlers;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal class HandlebarsContextFactory : IHandlebarsContextFactory
|
internal class HandlebarsContextFactory : ITransformerContextFactory
|
||||||
{
|
{
|
||||||
private static readonly HandlebarsConfiguration HandlebarsConfiguration = new HandlebarsConfiguration
|
private static readonly HandlebarsConfiguration HandlebarsConfiguration = new HandlebarsConfiguration
|
||||||
{
|
{
|
||||||
@@ -14,15 +15,15 @@ namespace WireMock.Transformers
|
|||||||
private readonly IFileSystemHandler _fileSystemHandler;
|
private readonly IFileSystemHandler _fileSystemHandler;
|
||||||
private readonly Action<IHandlebars, IFileSystemHandler> _action;
|
private readonly Action<IHandlebars, IFileSystemHandler> _action;
|
||||||
|
|
||||||
public HandlebarsContextFactory(IFileSystemHandler fileSystemHandler, Action<IHandlebars, IFileSystemHandler> action)
|
public HandlebarsContextFactory([NotNull] IFileSystemHandler fileSystemHandler, [CanBeNull] Action<IHandlebars, IFileSystemHandler> action)
|
||||||
{
|
{
|
||||||
_fileSystemHandler = fileSystemHandler;
|
_fileSystemHandler = fileSystemHandler ?? throw new ArgumentNullException(nameof(fileSystemHandler));
|
||||||
_action = action;
|
_action = action;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IHandlebarsContext Create()
|
public ITransformerContext Create()
|
||||||
{
|
{
|
||||||
var handlebars = Handlebars.Create(HandlebarsConfiguration);
|
var handlebars = HandlebarsDotNet.Handlebars.Create(HandlebarsConfiguration);
|
||||||
|
|
||||||
WireMockHandlebarsHelpers.Register(handlebars, _fileSystemHandler);
|
WireMockHandlebarsHelpers.Register(handlebars, _fileSystemHandler);
|
||||||
|
|
||||||
@@ -3,7 +3,7 @@ using System;
|
|||||||
using WireMock.Handlers;
|
using WireMock.Handlers;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsFile
|
internal static class HandlebarsFile
|
||||||
{
|
{
|
||||||
@@ -7,7 +7,7 @@ using System.Linq;
|
|||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsJsonPath
|
internal static class HandlebarsJsonPath
|
||||||
{
|
{
|
||||||
@@ -7,7 +7,7 @@ using Newtonsoft.Json.Linq;
|
|||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsLinq
|
internal static class HandlebarsLinq
|
||||||
{
|
{
|
||||||
@@ -9,7 +9,7 @@ using RandomDataGenerator.FieldOptions;
|
|||||||
using RandomDataGenerator.Randomizers;
|
using RandomDataGenerator.Randomizers;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsRandom
|
internal static class HandlebarsRandom
|
||||||
{
|
{
|
||||||
@@ -5,7 +5,7 @@ using HandlebarsDotNet;
|
|||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsRegex
|
internal static class HandlebarsRegex
|
||||||
{
|
{
|
||||||
@@ -8,7 +8,7 @@ using WireMock.Validation;
|
|||||||
using Wmhelp.XPath2;
|
using Wmhelp.XPath2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsXPath
|
internal static class HandlebarsXPath
|
||||||
{
|
{
|
||||||
@@ -3,7 +3,7 @@ using Fare;
|
|||||||
using HandlebarsDotNet;
|
using HandlebarsDotNet;
|
||||||
using WireMock.Validation;
|
using WireMock.Validation;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class HandlebarsXeger
|
internal static class HandlebarsXeger
|
||||||
{
|
{
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using HandlebarsDotNet;
|
||||||
|
|
||||||
|
namespace WireMock.Transformers.Handlebars
|
||||||
|
{
|
||||||
|
interface IHandlebarsContext : ITransformerContext
|
||||||
|
{
|
||||||
|
IHandlebars Handlebars { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
using HandlebarsDotNet.Helpers;
|
using HandlebarsDotNet.Helpers;
|
||||||
using WireMock.Handlers;
|
using WireMock.Handlers;
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
namespace WireMock.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
internal static class WireMockHandlebarsHelpers
|
internal static class WireMockHandlebarsHelpers
|
||||||
{
|
{
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
using HandlebarsDotNet;
|
|
||||||
using WireMock.Handlers;
|
|
||||||
|
|
||||||
namespace WireMock.Transformers
|
|
||||||
{
|
|
||||||
interface IHandlebarsContext
|
|
||||||
{
|
|
||||||
IHandlebars Handlebars { get; set; }
|
|
||||||
|
|
||||||
IFileSystemHandler FileSystemHandler { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace WireMock.Transformers
|
|
||||||
{
|
|
||||||
interface IHandlebarsContextFactory
|
|
||||||
{
|
|
||||||
IHandlebarsContext Create();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
7
src/WireMock.Net/Transformers/ITransformer.cs
Normal file
7
src/WireMock.Net/Transformers/ITransformer.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace WireMock.Transformers
|
||||||
|
{
|
||||||
|
interface ITransformer
|
||||||
|
{
|
||||||
|
ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage original, bool useTransformerForBodyAsFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
src/WireMock.Net/Transformers/ITransformerContext.cs
Normal file
11
src/WireMock.Net/Transformers/ITransformerContext.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using WireMock.Handlers;
|
||||||
|
|
||||||
|
namespace WireMock.Transformers
|
||||||
|
{
|
||||||
|
interface ITransformerContext
|
||||||
|
{
|
||||||
|
IFileSystemHandler FileSystemHandler { get; set; }
|
||||||
|
|
||||||
|
string ParseAndRender(string text, object model);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace WireMock.Transformers
|
||||||
|
{
|
||||||
|
interface ITransformerContextFactory
|
||||||
|
{
|
||||||
|
ITransformerContext Create();
|
||||||
|
}
|
||||||
|
}
|
||||||
27
src/WireMock.Net/Transformers/Scriban/ScribanContext.cs
Normal file
27
src/WireMock.Net/Transformers/Scriban/ScribanContext.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using Scriban;
|
||||||
|
using WireMock.Handlers;
|
||||||
|
using WireMock.Types;
|
||||||
|
|
||||||
|
namespace WireMock.Transformers.Scriban
|
||||||
|
{
|
||||||
|
internal class ScribanContext : ITransformerContext
|
||||||
|
{
|
||||||
|
private readonly TransformerType _transformerType;
|
||||||
|
|
||||||
|
public IFileSystemHandler FileSystemHandler { get; set; }
|
||||||
|
|
||||||
|
public ScribanContext(IFileSystemHandler fileSystemHandler, TransformerType transformerType)
|
||||||
|
{
|
||||||
|
FileSystemHandler = fileSystemHandler ?? throw new ArgumentNullException(nameof(fileSystemHandler));
|
||||||
|
_transformerType = transformerType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ParseAndRender(string text, object model)
|
||||||
|
{
|
||||||
|
var template = _transformerType == TransformerType.ScribanDotLiquid ? Template.ParseLiquid(text) : Template.Parse(text);
|
||||||
|
|
||||||
|
return template.Render(model, member => member.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using WireMock.Handlers;
|
||||||
|
using WireMock.Types;
|
||||||
|
using WireMock.Validation;
|
||||||
|
|
||||||
|
namespace WireMock.Transformers.Scriban
|
||||||
|
{
|
||||||
|
internal class ScribanContextFactory : ITransformerContextFactory
|
||||||
|
{
|
||||||
|
private readonly IFileSystemHandler _fileSystemHandler;
|
||||||
|
private readonly TransformerType _transformerType;
|
||||||
|
|
||||||
|
public ScribanContextFactory(IFileSystemHandler fileSystemHandler, TransformerType transformerType)
|
||||||
|
{
|
||||||
|
Check.NotNull(fileSystemHandler, nameof(fileSystemHandler));
|
||||||
|
Check.Condition(transformerType, t => t == TransformerType.Scriban || t == TransformerType.ScribanDotLiquid, nameof(transformerType));
|
||||||
|
|
||||||
|
_fileSystemHandler = fileSystemHandler;
|
||||||
|
_transformerType = transformerType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ITransformerContext Create()
|
||||||
|
{
|
||||||
|
return new ScribanContext(_fileSystemHandler, _transformerType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Scriban;
|
||||||
|
using Scriban.Parsing;
|
||||||
|
using Scriban.Runtime;
|
||||||
|
|
||||||
|
namespace WireMock.Transformers.Scriban
|
||||||
|
{
|
||||||
|
internal class WireMockListAccessor : IListAccessor, IObjectAccessor
|
||||||
|
{
|
||||||
|
#region IListAccessor
|
||||||
|
public int GetLength(TemplateContext context, SourceSpan span, object target)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public object GetValue(TemplateContext context, SourceSpan span, object target, int index)
|
||||||
|
{
|
||||||
|
return target.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetValue(TemplateContext context, SourceSpan span, object target, int index, object value)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IObjectAccessor
|
||||||
|
public int GetMemberCount(TemplateContext context, SourceSpan span, object target)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<string> GetMembers(TemplateContext context, SourceSpan span, object target)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasMember(TemplateContext context, SourceSpan span, object target, string member)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TryGetValue(TemplateContext context, SourceSpan span, object target, string member, out object value)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TrySetValue(TemplateContext context, SourceSpan span, object target, string member, object value)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using Scriban;
|
||||||
|
using Scriban.Runtime;
|
||||||
|
using WireMock.Types;
|
||||||
|
|
||||||
|
namespace WireMock.Transformers.Scriban
|
||||||
|
{
|
||||||
|
internal class WireMockTemplateContext: TemplateContext
|
||||||
|
{
|
||||||
|
protected override IObjectAccessor GetMemberAccessorImpl(object target)
|
||||||
|
{
|
||||||
|
if (target?.GetType().GetGenericTypeDefinition() == typeof(WireMockList<>))
|
||||||
|
{
|
||||||
|
return new WireMockListAccessor();
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.GetMemberAccessorImpl(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,235 +1,227 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using HandlebarsDotNet;
|
using JetBrains.Annotations;
|
||||||
using JetBrains.Annotations;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json.Linq;
|
||||||
using Newtonsoft.Json.Linq;
|
using WireMock.Types;
|
||||||
using WireMock.Types;
|
using WireMock.Util;
|
||||||
using WireMock.Util;
|
using WireMock.Validation;
|
||||||
using WireMock.Validation;
|
|
||||||
|
namespace WireMock.Transformers.Handlebars
|
||||||
namespace WireMock.Transformers
|
{
|
||||||
{
|
internal class Transformer : ITransformer
|
||||||
internal class ResponseMessageTransformer
|
{
|
||||||
{
|
private readonly ITransformerContextFactory _factory;
|
||||||
private readonly IHandlebarsContextFactory _factory;
|
|
||||||
|
public Transformer([NotNull] ITransformerContextFactory factory)
|
||||||
public ResponseMessageTransformer([NotNull] IHandlebarsContextFactory factory)
|
{
|
||||||
{
|
Check.NotNull(factory, nameof(factory));
|
||||||
Check.NotNull(factory, nameof(factory));
|
|
||||||
|
_factory = factory;
|
||||||
_factory = factory;
|
}
|
||||||
}
|
|
||||||
|
public ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage original, bool useTransformerForBodyAsFile)
|
||||||
public ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage original, bool useTransformerForBodyAsFile)
|
{
|
||||||
{
|
var handlebarsContext = _factory.Create();
|
||||||
var handlebarsContext = _factory.Create();
|
|
||||||
|
var responseMessage = new ResponseMessage();
|
||||||
var responseMessage = new ResponseMessage();
|
|
||||||
|
var model = new { request = requestMessage };
|
||||||
var template = new { request = requestMessage };
|
|
||||||
|
switch (original.BodyData?.DetectedBodyType)
|
||||||
switch (original.BodyData?.DetectedBodyType)
|
{
|
||||||
{
|
case BodyType.Json:
|
||||||
case BodyType.Json:
|
TransformBodyAsJson(handlebarsContext, model, original, responseMessage);
|
||||||
TransformBodyAsJson(handlebarsContext.Handlebars, template, original, responseMessage);
|
break;
|
||||||
break;
|
|
||||||
|
case BodyType.File:
|
||||||
case BodyType.File:
|
TransformBodyAsFile(handlebarsContext, model, original, responseMessage, useTransformerForBodyAsFile);
|
||||||
TransformBodyAsFile(handlebarsContext, template, original, responseMessage, useTransformerForBodyAsFile);
|
break;
|
||||||
break;
|
|
||||||
|
case BodyType.String:
|
||||||
case BodyType.String:
|
responseMessage.BodyOriginal = original.BodyData.BodyAsString;
|
||||||
responseMessage.BodyOriginal = original.BodyData.BodyAsString;
|
TransformBodyAsString(handlebarsContext, model, original, responseMessage);
|
||||||
TransformBodyAsString(handlebarsContext.Handlebars, template, original, responseMessage);
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
responseMessage.FaultType = original.FaultType;
|
||||||
responseMessage.FaultType = original.FaultType;
|
responseMessage.FaultPercentage = original.FaultPercentage;
|
||||||
responseMessage.FaultPercentage = original.FaultPercentage;
|
|
||||||
|
// Headers
|
||||||
// Headers
|
var newHeaders = new Dictionary<string, WireMockList<string>>();
|
||||||
var newHeaders = new Dictionary<string, WireMockList<string>>();
|
foreach (var header in original.Headers)
|
||||||
foreach (var header in original.Headers)
|
{
|
||||||
{
|
var headerKey = handlebarsContext.ParseAndRender(header.Key, model);
|
||||||
var templateHeaderKey = handlebarsContext.Handlebars.Compile(header.Key);
|
var templateHeaderValues = header.Value
|
||||||
var templateHeaderValues = header.Value
|
.Select(text => handlebarsContext.ParseAndRender(text, model))
|
||||||
.Select(handlebarsContext.Handlebars.Compile)
|
.ToArray();
|
||||||
.Select(func => func(template))
|
|
||||||
.ToArray();
|
newHeaders.Add(headerKey, new WireMockList<string>(templateHeaderValues));
|
||||||
|
}
|
||||||
newHeaders.Add(templateHeaderKey(template), new WireMockList<string>(templateHeaderValues));
|
|
||||||
}
|
responseMessage.Headers = newHeaders;
|
||||||
|
|
||||||
responseMessage.Headers = newHeaders;
|
switch (original.StatusCode)
|
||||||
|
{
|
||||||
switch (original.StatusCode)
|
case int statusCodeAsInteger:
|
||||||
{
|
responseMessage.StatusCode = statusCodeAsInteger;
|
||||||
case int statusCodeAsInteger:
|
break;
|
||||||
responseMessage.StatusCode = statusCodeAsInteger;
|
|
||||||
break;
|
case string statusCodeAsString:
|
||||||
|
responseMessage.StatusCode = handlebarsContext.ParseAndRender(statusCodeAsString, model);
|
||||||
case string statusCodeAsString:
|
break;
|
||||||
var templateForStatusCode = handlebarsContext.Handlebars.Compile(statusCodeAsString);
|
}
|
||||||
responseMessage.StatusCode = templateForStatusCode(template);
|
|
||||||
break;
|
return responseMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
return responseMessage;
|
private static void TransformBodyAsJson(ITransformerContext handlebarsContext, object model, ResponseMessage original, ResponseMessage responseMessage)
|
||||||
}
|
{
|
||||||
|
JToken jToken;
|
||||||
private static void TransformBodyAsJson(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage)
|
switch (original.BodyData.BodyAsJson)
|
||||||
{
|
{
|
||||||
JToken jToken;
|
case JObject bodyAsJObject:
|
||||||
switch (original.BodyData.BodyAsJson)
|
jToken = bodyAsJObject.DeepClone();
|
||||||
{
|
WalkNode(handlebarsContext, jToken, model);
|
||||||
case JObject bodyAsJObject:
|
break;
|
||||||
jToken = bodyAsJObject.DeepClone();
|
|
||||||
WalkNode(handlebarsContext, jToken, template);
|
case Array bodyAsArray:
|
||||||
break;
|
jToken = JArray.FromObject(bodyAsArray);
|
||||||
|
WalkNode(handlebarsContext, jToken, model);
|
||||||
case Array bodyAsArray:
|
break;
|
||||||
jToken = JArray.FromObject(bodyAsArray);
|
|
||||||
WalkNode(handlebarsContext, jToken, template);
|
case string bodyAsString:
|
||||||
break;
|
jToken = ReplaceSingleNode(handlebarsContext, bodyAsString, model);
|
||||||
|
break;
|
||||||
case string bodyAsString:
|
|
||||||
jToken = ReplaceSingleNode(handlebarsContext, bodyAsString, template);
|
default:
|
||||||
break;
|
jToken = JObject.FromObject(original.BodyData.BodyAsJson);
|
||||||
|
WalkNode(handlebarsContext, jToken, model);
|
||||||
default:
|
break;
|
||||||
jToken = JObject.FromObject(original.BodyData.BodyAsJson);
|
}
|
||||||
WalkNode(handlebarsContext, jToken, template);
|
|
||||||
break;
|
responseMessage.BodyData = new BodyData
|
||||||
}
|
{
|
||||||
|
Encoding = original.BodyData.Encoding,
|
||||||
responseMessage.BodyData = new BodyData
|
DetectedBodyType = original.BodyData.DetectedBodyType,
|
||||||
{
|
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
||||||
Encoding = original.BodyData.Encoding,
|
BodyAsJson = jToken
|
||||||
DetectedBodyType = original.BodyData.DetectedBodyType,
|
};
|
||||||
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
}
|
||||||
BodyAsJson = jToken
|
|
||||||
};
|
private static JToken ReplaceSingleNode(ITransformerContext handlebarsContext, string stringValue, object model)
|
||||||
}
|
{
|
||||||
|
string transformedString = handlebarsContext.ParseAndRender(stringValue, model);
|
||||||
private static JToken ReplaceSingleNode(IHandlebars handlebarsContext, string stringValue, object context)
|
|
||||||
{
|
if (!string.Equals(stringValue, transformedString))
|
||||||
var templateForStringValue = handlebarsContext.Compile(stringValue);
|
{
|
||||||
string transformedString = templateForStringValue(context);
|
const string property = "_";
|
||||||
if (!string.Equals(stringValue, transformedString))
|
JObject dummy = JObject.Parse($"{{ \"{property}\": null }}");
|
||||||
{
|
JToken node = dummy[property];
|
||||||
const string property = "_";
|
|
||||||
JObject dummy = JObject.Parse($"{{ \"{property}\": null }}");
|
ReplaceNodeValue(node, transformedString);
|
||||||
JToken node = dummy[property];
|
|
||||||
|
return dummy[property];
|
||||||
ReplaceNodeValue(node, transformedString);
|
}
|
||||||
|
|
||||||
return dummy[property];
|
return stringValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return stringValue;
|
private static void WalkNode(ITransformerContext handlebarsContext, JToken node, object model)
|
||||||
}
|
{
|
||||||
|
if (node.Type == JTokenType.Object)
|
||||||
private static void WalkNode(IHandlebars handlebarsContext, JToken node, object context)
|
{
|
||||||
{
|
// In case of Object, loop all children. Do a ToArray() to avoid `Collection was modified` exceptions.
|
||||||
if (node.Type == JTokenType.Object)
|
foreach (JProperty child in node.Children<JProperty>().ToArray())
|
||||||
{
|
{
|
||||||
// In case of Object, loop all children. Do a ToArray() to avoid `Collection was modified` exceptions.
|
WalkNode(handlebarsContext, child.Value, model);
|
||||||
foreach (JProperty child in node.Children<JProperty>().ToArray())
|
}
|
||||||
{
|
}
|
||||||
WalkNode(handlebarsContext, child.Value, context);
|
else if (node.Type == JTokenType.Array)
|
||||||
}
|
{
|
||||||
}
|
// In case of Array, loop all items. Do a ToArray() to avoid `Collection was modified` exceptions.
|
||||||
else if (node.Type == JTokenType.Array)
|
foreach (JToken child in node.Children().ToArray())
|
||||||
{
|
{
|
||||||
// In case of Array, loop all items. Do a ToArray() to avoid `Collection was modified` exceptions.
|
WalkNode(handlebarsContext, child, model);
|
||||||
foreach (JToken child in node.Children().ToArray())
|
}
|
||||||
{
|
}
|
||||||
WalkNode(handlebarsContext, child, context);
|
else if (node.Type == JTokenType.String)
|
||||||
}
|
{
|
||||||
}
|
// In case of string, try to transform the value.
|
||||||
else if (node.Type == JTokenType.String)
|
string stringValue = node.Value<string>();
|
||||||
{
|
if (string.IsNullOrEmpty(stringValue))
|
||||||
// In case of string, try to transform the value.
|
{
|
||||||
string stringValue = node.Value<string>();
|
return;
|
||||||
if (string.IsNullOrEmpty(stringValue))
|
}
|
||||||
{
|
|
||||||
return;
|
string transformedString = handlebarsContext.ParseAndRender(stringValue, model);
|
||||||
}
|
if (!string.Equals(stringValue, transformedString))
|
||||||
|
{
|
||||||
var templateForStringValue = handlebarsContext.Compile(stringValue);
|
ReplaceNodeValue(node, transformedString);
|
||||||
string transformedString = templateForStringValue(context);
|
}
|
||||||
if (!string.Equals(stringValue, transformedString))
|
}
|
||||||
{
|
}
|
||||||
ReplaceNodeValue(node, transformedString);
|
|
||||||
}
|
private static void ReplaceNodeValue(JToken node, string stringValue)
|
||||||
}
|
{
|
||||||
}
|
if (bool.TryParse(stringValue, out bool valueAsBoolean))
|
||||||
|
{
|
||||||
private static void ReplaceNodeValue(JToken node, string stringValue)
|
node.Replace(valueAsBoolean);
|
||||||
{
|
return;
|
||||||
if (bool.TryParse(stringValue, out bool valueAsBoolean))
|
}
|
||||||
{
|
|
||||||
node.Replace(valueAsBoolean);
|
JToken value;
|
||||||
return;
|
try
|
||||||
}
|
{
|
||||||
|
// Try to convert this string into a JsonObject
|
||||||
JToken value;
|
value = JToken.Parse(stringValue);
|
||||||
try
|
}
|
||||||
{
|
catch (JsonException)
|
||||||
// Try to convert this string into a JsonObject
|
{
|
||||||
value = JToken.Parse(stringValue);
|
// Ignore JsonException and just keep string value and convert to JToken
|
||||||
}
|
value = stringValue;
|
||||||
catch (JsonException)
|
}
|
||||||
{
|
|
||||||
// Ignore JsonException and just keep string value and convert to JToken
|
node.Replace(value);
|
||||||
value = stringValue;
|
}
|
||||||
}
|
|
||||||
|
private static void TransformBodyAsString(ITransformerContext handlebarsContext, object model, ResponseMessage original, ResponseMessage responseMessage)
|
||||||
node.Replace(value);
|
{
|
||||||
}
|
responseMessage.BodyData = new BodyData
|
||||||
|
{
|
||||||
private static void TransformBodyAsString(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage)
|
Encoding = original.BodyData.Encoding,
|
||||||
{
|
DetectedBodyType = original.BodyData.DetectedBodyType,
|
||||||
var templateBodyAsString = handlebarsContext.Compile(original.BodyData.BodyAsString);
|
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
||||||
|
BodyAsString = handlebarsContext.ParseAndRender(original.BodyData.BodyAsString, model)
|
||||||
responseMessage.BodyData = new BodyData
|
};
|
||||||
{
|
}
|
||||||
Encoding = original.BodyData.Encoding,
|
|
||||||
DetectedBodyType = original.BodyData.DetectedBodyType,
|
private void TransformBodyAsFile(ITransformerContext handlebarsContext, object model, ResponseMessage original, ResponseMessage responseMessage, bool useTransformerForBodyAsFile)
|
||||||
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
{
|
||||||
BodyAsString = templateBodyAsString(template)
|
string transformedBodyAsFilename = handlebarsContext.ParseAndRender(original.BodyData.BodyAsFile, model);
|
||||||
};
|
|
||||||
}
|
if (!useTransformerForBodyAsFile)
|
||||||
|
{
|
||||||
private void TransformBodyAsFile(IHandlebarsContext handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage, bool useTransformerForBodyAsFile)
|
responseMessage.BodyData = new BodyData
|
||||||
{
|
{
|
||||||
var templateBodyAsFile = handlebarsContext.Handlebars.Compile(original.BodyData.BodyAsFile);
|
DetectedBodyType = original.BodyData.DetectedBodyType,
|
||||||
string transformedBodyAsFilename = templateBodyAsFile(template);
|
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
||||||
|
BodyAsFile = transformedBodyAsFilename
|
||||||
if (!useTransformerForBodyAsFile)
|
};
|
||||||
{
|
}
|
||||||
responseMessage.BodyData = new BodyData
|
else
|
||||||
{
|
{
|
||||||
DetectedBodyType = original.BodyData.DetectedBodyType,
|
string text = handlebarsContext.FileSystemHandler.ReadResponseBodyAsString(transformedBodyAsFilename);
|
||||||
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
|
||||||
BodyAsFile = transformedBodyAsFilename
|
responseMessage.BodyData = new BodyData
|
||||||
};
|
{
|
||||||
}
|
DetectedBodyType = BodyType.String,
|
||||||
else
|
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
||||||
{
|
BodyAsString = handlebarsContext.ParseAndRender(text, model),
|
||||||
string text = handlebarsContext.FileSystemHandler.ReadResponseBodyAsString(transformedBodyAsFilename);
|
BodyAsFile = transformedBodyAsFilename
|
||||||
var templateBodyAsString = handlebarsContext.Handlebars.Compile(text);
|
};
|
||||||
|
}
|
||||||
responseMessage.BodyData = new BodyData
|
}
|
||||||
{
|
}
|
||||||
DetectedBodyType = BodyType.String,
|
|
||||||
DetectedBodyTypeFromContentType = original.BodyData.DetectedBodyTypeFromContentType,
|
|
||||||
BodyAsString = templateBodyAsString(template),
|
|
||||||
BodyAsFile = transformedBodyAsFilename
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -50,6 +50,12 @@
|
|||||||
<DefineConstants>USE_ASPNETCORE;NET46</DefineConstants>
|
<DefineConstants>USE_ASPNETCORE;NET46</DefineConstants>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="Transformers\Scriban\ScribanTransformer.cs" />
|
||||||
|
<Compile Remove="Transformers\Scriban\WireMockListAccessor.cs" />
|
||||||
|
<Compile Remove="Transformers\Scriban\WireMockTemplateContext.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="JetBrains.Annotations" Version="2020.1.0" PrivateAssets="All" />
|
<PackageReference Include="JetBrains.Annotations" Version="2020.1.0" PrivateAssets="All" />
|
||||||
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
|
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
|
||||||
@@ -59,6 +65,7 @@
|
|||||||
<PackageReference Include="RandomDataGenerator.Net" Version="1.0.12" />
|
<PackageReference Include="RandomDataGenerator.Net" Version="1.0.12" />
|
||||||
<PackageReference Include="JmesPath.Net" Version="1.0.125" />
|
<PackageReference Include="JmesPath.Net" Version="1.0.125" />
|
||||||
<PackageReference Include="Handlebars.Net.Helpers" Version="1.1.0" />
|
<PackageReference Include="Handlebars.Net.Helpers" Version="1.1.0" />
|
||||||
|
<!--<PackageReference Include="DotLiquid" Version="2.0.366" />-->
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition="'$(Configuration)' == 'Debug - Sonar'">
|
<ItemGroup Condition="'$(Configuration)' == 'Debug - Sonar'">
|
||||||
@@ -78,6 +85,7 @@
|
|||||||
|
|
||||||
<PackageReference Include="Microsoft.AspNet.WebApi.OwinSelfHost" Version="5.2.6" />
|
<PackageReference Include="Microsoft.AspNet.WebApi.OwinSelfHost" Version="5.2.6" />
|
||||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||||
|
<PackageReference Include="Scriban.Signed" Version="2.1.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net46' ">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'net46' ">
|
||||||
@@ -87,9 +95,11 @@
|
|||||||
<PackageReference Include="Microsoft.Owin.Hosting" Version="4.0.0" />
|
<PackageReference Include="Microsoft.Owin.Hosting" Version="4.0.0" />
|
||||||
<PackageReference Include="System.Net.Http" Version="4.3.3" />
|
<PackageReference Include="System.Net.Http" Version="4.3.3" />
|
||||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||||
|
<PackageReference Include="Scriban.Signed" Version="2.1.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
|
||||||
|
<PackageReference Include="Scriban.Signed" Version="2.1.4" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
|
||||||
|
|
||||||
<!-- https://github.com/WireMock-Net/WireMock.Net/issues/507 -->
|
<!-- https://github.com/WireMock-Net/WireMock.Net/issues/507 -->
|
||||||
@@ -102,9 +112,11 @@
|
|||||||
<PackageReference Include="System.Xml.XmlDocument" Version="4.3.0" />
|
<PackageReference Include="System.Xml.XmlDocument" Version="4.3.0" />
|
||||||
<PackageReference Include="System.Xml.XPath.XmlDocument" Version="4.3.0" />
|
<PackageReference Include="System.Xml.XPath.XmlDocument" Version="4.3.0" />
|
||||||
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
<PackageReference Include="System.ValueTuple" Version="4.5.0" />
|
||||||
|
<PackageReference Include="Scriban.Signed" Version="2.1.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' ">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1' ">
|
||||||
|
<PackageReference Include="Scriban.Signed" Version="3.3.2" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
|
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
|
||||||
|
|
||||||
<!-- https://github.com/WireMock-Net/WireMock.Net/issues/507 -->
|
<!-- https://github.com/WireMock-Net/WireMock.Net/issues/507 -->
|
||||||
@@ -113,6 +125,7 @@
|
|||||||
|
|
||||||
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' or '$(TargetFramework)' == 'net5.0'">
|
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp3.1' or '$(TargetFramework)' == 'net5.0'">
|
||||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||||
|
<PackageReference Include="Scriban.Signed" Version="3.3.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Moq;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -14,9 +16,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithBodyTests
|
public class ResponseWithBodyTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithBodyTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponse_WithBody_Bytes_Encoding_Destination_String()
|
public async Task Response_ProvideResponse_WithBody_Bytes_Encoding_Destination_String()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -11,8 +13,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithCallbackTests
|
public class ResponseWithCallbackTests
|
||||||
{
|
{
|
||||||
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithCallbackTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_WithCallbackAsync()
|
public async Task Response_WithCallbackAsync()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Moq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -11,9 +13,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsHelpersTests
|
public class ResponseWithHandlebarsHelpersTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsHelpersTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponseAsync_HandlebarsHelpers_String_Uppercase()
|
public async Task Response_ProvideResponseAsync_HandlebarsHelpers_String_Uppercase()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Moq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -13,9 +17,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsJsonPathTests
|
public class ResponseWithHandlebarsJsonPathTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsJsonPathTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Object_ResponseBodyAsJson()
|
public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Object_ResponseBodyAsJson()
|
||||||
{
|
{
|
||||||
@@ -333,5 +347,32 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
// Act
|
// Act
|
||||||
Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settings)).Throws<ArgumentNullException>();
|
Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settings)).Throws<ArgumentNullException>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Response_ProvideResponse_Transformer_WithBodyAsFile_JsonPath()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
string jsonString = "{ \"MyUniqueNumber\": \"1\" }";
|
||||||
|
var bodyData = new BodyData
|
||||||
|
{
|
||||||
|
BodyAsString = jsonString,
|
||||||
|
BodyAsJson = JsonConvert.DeserializeObject(jsonString),
|
||||||
|
DetectedBodyType = BodyType.Json,
|
||||||
|
DetectedBodyTypeFromContentType = BodyType.Json,
|
||||||
|
Encoding = Encoding.UTF8
|
||||||
|
};
|
||||||
|
var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, bodyData);
|
||||||
|
|
||||||
|
string jsonPath = "\"$.MyUniqueNumber\"";
|
||||||
|
var response = Response.Create()
|
||||||
|
.WithTransformer()
|
||||||
|
.WithBodyFromFile(@"c:\\{{JsonPath.SelectToken request.body " + jsonPath + "}}\\test.json"); // why use a \\ here ?
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var responseMessage = await response.ProvideResponseAsync(request, _settings);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(responseMessage.BodyData.BodyAsFile).Equals(@"c:\1\test.json");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Moq;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -13,8 +15,17 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsLinqTests
|
public class ResponseWithHandlebarsLinqTests
|
||||||
{
|
{
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsLinqTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponse_Handlebars_Linq1_String0()
|
public async Task Response_ProvideResponse_Handlebars_Linq1_String0()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Moq;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -11,9 +13,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsRandomTests
|
public class ResponseWithHandlebarsRandomTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsRandomTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponseAsync_Handlebars_Random1()
|
public async Task Response_ProvideResponseAsync_Handlebars_Random1()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Moq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -12,9 +14,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsRegexTests
|
public class ResponseWithHandlebarsRegexTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsRegexTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch()
|
public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ using WireMock.Settings;
|
|||||||
using WireMock.Types;
|
using WireMock.Types;
|
||||||
using WireMock.Util;
|
using WireMock.Util;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
using Moq;
|
||||||
|
using WireMock.Handlers;
|
||||||
#if !NETSTANDARD1_3
|
#if !NETSTANDARD1_3
|
||||||
using Wmhelp.XPath2;
|
using Wmhelp.XPath2;
|
||||||
#endif
|
#endif
|
||||||
@@ -15,9 +17,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsXPathTests
|
public class ResponseWithHandlebarsXPathTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsXPathTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_BodyAsString()
|
public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_BodyAsString()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using NFluent;
|
using NFluent;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using WireMock.Handlers;
|
||||||
using WireMock.Models;
|
using WireMock.Models;
|
||||||
using WireMock.ResponseBuilders;
|
using WireMock.ResponseBuilders;
|
||||||
using WireMock.Settings;
|
using WireMock.Settings;
|
||||||
@@ -11,9 +12,19 @@ namespace WireMock.Net.Tests.ResponseBuilders
|
|||||||
{
|
{
|
||||||
public class ResponseWithHandlebarsXegerTests
|
public class ResponseWithHandlebarsXegerTests
|
||||||
{
|
{
|
||||||
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
|
||||||
private const string ClientIp = "::1";
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithHandlebarsXegerTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task Response_ProvideResponseAsync_Handlebars_Xeger1()
|
public async Task Response_ProvideResponseAsync_Handlebars_Xeger1()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using FluentAssertions;
|
||||||
|
using NFluent;
|
||||||
|
using WireMock.Models;
|
||||||
|
using WireMock.ResponseBuilders;
|
||||||
|
using WireMock.Settings;
|
||||||
|
using WireMock.Types;
|
||||||
|
using WireMock.Util;
|
||||||
|
using Xunit;
|
||||||
|
using WireMock.Handlers;
|
||||||
|
using Moq;
|
||||||
|
#if NET452
|
||||||
|
using Microsoft.Owin;
|
||||||
|
#else
|
||||||
|
using Microsoft.AspNetCore.Http;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace WireMock.Net.Tests.ResponseBuilders
|
||||||
|
{
|
||||||
|
public class ResponseWithScribanTests
|
||||||
|
{
|
||||||
|
private const string ClientIp = "::1";
|
||||||
|
|
||||||
|
private readonly Mock<IFileSystemHandler> _filesystemHandlerMock;
|
||||||
|
private readonly WireMockServerSettings _settings = new WireMockServerSettings();
|
||||||
|
|
||||||
|
public ResponseWithScribanTests()
|
||||||
|
{
|
||||||
|
_filesystemHandlerMock = new Mock<IFileSystemHandler>(MockBehavior.Strict);
|
||||||
|
_filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny<string>())).Returns("abc");
|
||||||
|
|
||||||
|
_settings.FileSystemHandler = _filesystemHandlerMock.Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Response_ProvideResponse_DotLiquid_WithNullBody_ShouldNotThrowException()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock"));
|
||||||
|
var request = new RequestMessage(urlDetails, "GET", ClientIp);
|
||||||
|
|
||||||
|
var response = Response.Create().WithTransformer(TransformerType.ScribanDotLiquid);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var responseMessage = await response.ProvideResponseAsync(request, _settings);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
responseMessage.BodyData.Should().BeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Response_ProvideResponse_DotLiquid_UrlPathVerb()
|
||||||
|
{
|
||||||
|
// Assign
|
||||||
|
var body = new BodyData
|
||||||
|
{
|
||||||
|
BodyAsString = "whatever",
|
||||||
|
DetectedBodyType = BodyType.String
|
||||||
|
};
|
||||||
|
var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POSt", ClientIp, body);
|
||||||
|
|
||||||
|
var response = Response.Create()
|
||||||
|
.WithBody("test {{request.Url}} {{request.Path}} {{request.Method}}")
|
||||||
|
.WithTransformer(TransformerType.Scriban);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var responseMessage = await response.ProvideResponseAsync(request, _settings);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Check.That(responseMessage.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,52 +1,52 @@
|
|||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using HandlebarsDotNet;
|
using HandlebarsDotNet;
|
||||||
using Moq;
|
using Moq;
|
||||||
using System;
|
using System;
|
||||||
using WireMock.Handlers;
|
using WireMock.Handlers;
|
||||||
using WireMock.Transformers;
|
using WireMock.Transformers.Handlebars;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace WireMock.Net.Tests.Transformers
|
namespace WireMock.Net.Tests.Transformers.Handlebars
|
||||||
{
|
{
|
||||||
public class HandlebarsContextFactoryTests
|
public class HandlebarsContextFactoryTests
|
||||||
{
|
{
|
||||||
private readonly Mock<IFileSystemHandler> _fileSystemHandlerMock = new Mock<IFileSystemHandler>();
|
private readonly Mock<IFileSystemHandler> _fileSystemHandlerMock = new Mock<IFileSystemHandler>();
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Create_WithNullAction_DoesNotInvokeAction()
|
public void Create_WithNullAction_DoesNotInvokeAction()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var sut = new HandlebarsContextFactory(_fileSystemHandlerMock.Object, null);
|
var sut = new HandlebarsContextFactory(_fileSystemHandlerMock.Object, null);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = sut.Create();
|
var result = sut.Create();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
result.Should().NotBeNull();
|
result.Should().NotBeNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Create_WithAction_InvokesAction()
|
public void Create_WithAction_InvokesAction()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
int num = 0;
|
int num = 0;
|
||||||
Action<IHandlebars, IFileSystemHandler> action = (ctx, fs) =>
|
Action<IHandlebars, IFileSystemHandler> action = (ctx, fs) =>
|
||||||
{
|
{
|
||||||
ctx.Should().NotBeNull();
|
ctx.Should().NotBeNull();
|
||||||
fs.Should().NotBeNull();
|
fs.Should().NotBeNull();
|
||||||
|
|
||||||
num++;
|
num++;
|
||||||
};
|
};
|
||||||
var sut = new HandlebarsContextFactory(_fileSystemHandlerMock.Object, action);
|
var sut = new HandlebarsContextFactory(_fileSystemHandlerMock.Object, action);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = sut.Create();
|
var result = sut.Create();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
result.Should().NotBeNull();
|
result.Should().NotBeNull();
|
||||||
|
|
||||||
// Verify
|
// Verify
|
||||||
num.Should().Be(1);
|
num.Should().Be(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using FluentAssertions;
|
||||||
|
using Moq;
|
||||||
|
using WireMock.Handlers;
|
||||||
|
using WireMock.Transformers.Scriban;
|
||||||
|
using WireMock.Types;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace WireMock.Net.Tests.Transformers.Scriban
|
||||||
|
{
|
||||||
|
public class ScribanContextFactoryTests
|
||||||
|
{
|
||||||
|
private readonly Mock<IFileSystemHandler> _fileSystemHandlerMock = new Mock<IFileSystemHandler>();
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(TransformerType.Scriban)]
|
||||||
|
[InlineData(TransformerType.ScribanDotLiquid)]
|
||||||
|
public void Create_With_Scriban_TransformerType_Creates_ITransformerContext(TransformerType transformerType)
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var sut = new ScribanContextFactory(_fileSystemHandlerMock.Object, transformerType);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = sut.Create();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
result.Should().NotBeNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Create_With_Invalid_TransformerType_Throws_Exception()
|
||||||
|
{
|
||||||
|
// Act
|
||||||
|
Action action = () => new ScribanContextFactory(_fileSystemHandlerMock.Object, TransformerType.Handlebars);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
action.Should().Throw<Exception>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user