From 6850f2b99d59c8278fcdbf216ce26129c967f462 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 17 Jun 2019 21:33:20 +0200 Subject: [PATCH 1/8] wip --- src/WireMock.Net/IMapping.cs | 6 +-- src/WireMock.Net/Mapping.cs | 14 +++--- src/WireMock.Net/ResponseBuilders/Response.cs | 8 ++-- .../DynamicAsyncResponseProvider.cs | 3 +- .../DynamicResponseProvider.cs | 3 +- .../ResponseProviders/IResponseProvider.cs | 10 ++-- .../ProxyAsyncResponseProvider.cs | 2 +- .../Server/FluentMockServer.Admin.cs | 6 +-- src/WireMock.Net/Server/FluentMockServer.cs | 4 +- .../Server/RespondWithAProvider.cs | 12 ++--- .../Settings/FluentMockServerSettings.cs | 8 +++- .../Settings/IFluentMockServerSettings.cs | 9 +++- .../Transformers/HandlebarsContextFactory.cs | 34 ++++++++++++++ .../Transformers/IHandlebarsContextFactory.cs | 9 ++++ .../ResponseMessageTransformer.cs | 46 +++++++++---------- .../ResponseBuilders/ResponseCreateTests.cs | 10 ++-- .../ResponseBuilders/ResponseWithBodyTests.cs | 32 ++++++------- .../ResponseWithCallbackTests.cs | 6 +-- .../ResponseWithHandlebarsFileTests.cs | 11 +++-- .../ResponseWithHandlebarsJsonPathTests.cs | 24 +++++----- .../ResponseWithHandlebarsLinqTests.cs | 22 ++++----- .../ResponseWithHandlebarsRandomTests.cs | 20 ++++---- .../ResponseWithHandlebarsRegexTests.cs | 24 +++++----- .../ResponseWithHandlebarsTests.cs | 26 +++++------ .../ResponseWithHandlebarsXegerTests.cs | 12 ++--- .../ResponseWithHeadersTests.cs | 20 ++++---- .../ResponseWithProxyTests.cs | 14 +++--- .../Serialization/MappingConverterTests.cs | 8 ++-- 28 files changed, 232 insertions(+), 171 deletions(-) create mode 100644 src/WireMock.Net/Transformers/HandlebarsContextFactory.cs create mode 100644 src/WireMock.Net/Transformers/IHandlebarsContextFactory.cs diff --git a/src/WireMock.Net/IMapping.cs b/src/WireMock.Net/IMapping.cs index 3d3beefa9..066600356 100644 --- a/src/WireMock.Net/IMapping.cs +++ b/src/WireMock.Net/IMapping.cs @@ -1,9 +1,9 @@ using JetBrains.Annotations; using System; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Matchers.Request; using WireMock.ResponseProviders; +using WireMock.Settings; namespace WireMock { @@ -62,9 +62,9 @@ public interface IMapping IResponseProvider Provider { get; } /// - /// The FileSystemHandler. + /// The FluentMockServerSettings. /// - IFileSystemHandler FileSystemHandler { get; } + IFluentMockServerSettings Settings { get; } /// /// Is State started ? diff --git a/src/WireMock.Net/Mapping.cs b/src/WireMock.Net/Mapping.cs index dd4d818bf..125372061 100644 --- a/src/WireMock.Net/Mapping.cs +++ b/src/WireMock.Net/Mapping.cs @@ -1,9 +1,9 @@ using JetBrains.Annotations; using System; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Matchers.Request; using WireMock.ResponseProviders; +using WireMock.Settings; namespace WireMock { @@ -39,8 +39,8 @@ public class Mapping : IMapping /// public IResponseProvider Provider { get; } - /// - public IFileSystemHandler FileSystemHandler { get; } + /// + public IFluentMockServerSettings Settings { get; } /// public bool IsStartState => Scenario == null || Scenario != null && NextState != null && ExecutionConditionState == null; @@ -54,7 +54,7 @@ public class Mapping : IMapping /// The unique identifier. /// The unique title (can be null). /// The full file path from this mapping title (can be null). - /// The fileSystemHandler. + /// The FluentMockServerSettings. /// The request matcher. /// The provider. /// The priority for this mapping. @@ -62,13 +62,13 @@ public class Mapping : IMapping /// State in which the current mapping can occur. [Optional] /// The next state which will occur after the current mapping execution. [Optional] public Mapping(Guid guid, [CanBeNull] string title, [CanBeNull] string path, - [NotNull] IFileSystemHandler fileSystemHandler, [NotNull] IRequestMatcher requestMatcher, [NotNull] IResponseProvider provider, + [NotNull] IFluentMockServerSettings settings, [NotNull] IRequestMatcher requestMatcher, [NotNull] IResponseProvider provider, int priority, [CanBeNull] string scenario, [CanBeNull] string executionConditionState, [CanBeNull] string nextState) { Guid = guid; Title = title; Path = path; - FileSystemHandler = fileSystemHandler; + Settings = settings; RequestMatcher = requestMatcher; Provider = provider; Priority = priority; @@ -80,7 +80,7 @@ public Mapping(Guid guid, [CanBeNull] string title, [CanBeNull] string path, /// public async Task ResponseToAsync(RequestMessage requestMessage) { - return await Provider.ProvideResponseAsync(requestMessage, FileSystemHandler); + return await Provider.ProvideResponseAsync(requestMessage, Settings); } /// diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index f806ee848..0df7e2ac5 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -7,7 +7,6 @@ using System.Net.Http; using System.Text; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Http; using WireMock.Settings; using WireMock.Transformers; @@ -371,7 +370,7 @@ private IResponseBuilder WithCallbackInternal(bool withCallbackUsed, Func ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) + public async Task ProvideResponseAsync(RequestMessage requestMessage, IFluentMockServerSettings settings) { Check.NotNull(requestMessage, nameof(requestMessage)); @@ -410,13 +409,14 @@ public async Task ProvideResponseAsync(RequestMessage requestMe if (UseTransformer) { - var responseMessageTransformer = new ResponseMessageTransformer(fileSystemHandler); + var factory = new HandlebarsContextFactory(settings.FileSystemHandler, settings.HandlebarRegistrationCallback); + var responseMessageTransformer = new ResponseMessageTransformer(factory); return responseMessageTransformer.Transform(requestMessage, ResponseMessage); } if (!UseTransformer && ResponseMessage.BodyData?.BodyAsFileIsCached == true) { - ResponseMessage.BodyData.BodyAsBytes = fileSystemHandler.ReadResponseBodyAsFile(ResponseMessage.BodyData.BodyAsFile); + ResponseMessage.BodyData.BodyAsBytes = settings.FileSystemHandler.ReadResponseBodyAsFile(ResponseMessage.BodyData.BodyAsFile); ResponseMessage.BodyData.BodyAsFile = null; } diff --git a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs index f1456b319..b20e3b83e 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using WireMock.Handlers; +using WireMock.Settings; namespace WireMock.ResponseProviders { @@ -13,7 +14,7 @@ public DynamicAsyncResponseProvider(Func> _responseMessageFunc = responseMessageFunc; } - public Task ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) + public Task ProvideResponseAsync(RequestMessage requestMessage, IFluentMockServerSettings settings) { return _responseMessageFunc(requestMessage); } diff --git a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs index 534f7a5e4..214a61457 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using WireMock.Handlers; +using WireMock.Settings; namespace WireMock.ResponseProviders { @@ -13,7 +14,7 @@ public DynamicResponseProvider(Func responseMes _responseMessageFunc = responseMessageFunc; } - public Task ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) + public Task ProvideResponseAsync(RequestMessage requestMessage, IFluentMockServerSettings settings) { return Task.FromResult(_responseMessageFunc(requestMessage)); } diff --git a/src/WireMock.Net/ResponseProviders/IResponseProvider.cs b/src/WireMock.Net/ResponseProviders/IResponseProvider.cs index ca4f65d46..4b0615477 100644 --- a/src/WireMock.Net/ResponseProviders/IResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/IResponseProvider.cs @@ -1,6 +1,6 @@ -using System.Threading.Tasks; -using JetBrains.Annotations; -using WireMock.Handlers; +using JetBrains.Annotations; +using System.Threading.Tasks; +using WireMock.Settings; namespace WireMock.ResponseProviders { @@ -13,8 +13,8 @@ public interface IResponseProvider /// The provide response. /// /// The request. - /// The fileSystemHandler. + /// The FluentMockServerSettings. /// The . - Task ProvideResponseAsync([NotNull] RequestMessage requestMessage, [NotNull] IFileSystemHandler fileSystemHandler); + Task ProvideResponseAsync([NotNull] RequestMessage requestMessage, [NotNull] IFluentMockServerSettings settings); } } \ No newline at end of file diff --git a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs index 748a08228..e1a0c4631 100644 --- a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs @@ -16,7 +16,7 @@ public ProxyAsyncResponseProvider(Func ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) + public Task ProvideResponseAsync(RequestMessage requestMessage, IFluentMockServerSettings settings) { return _responseMessageFunc(requestMessage, _settings); } diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 971c655bc..48361a8a7 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -164,10 +164,10 @@ public void WatchStaticMappings([CanBeNull] string folder = null) { if (folder == null) { - folder = _fileSystemHandler.GetMappingFolder(); + folder = _settings.FileSystemHandler.GetMappingFolder(); } - if (!_fileSystemHandler.FolderExists(folder)) + if (!_settings.FileSystemHandler.FolderExists(folder)) { return; } @@ -302,7 +302,7 @@ private IMapping ToMapping(RequestMessage requestMessage, ResponseMessage respon var response = Response.Create(responseMessage); - return new Mapping(Guid.NewGuid(), string.Empty, null, _fileSystemHandler, request, response, 0, null, null, null); + return new Mapping(Guid.NewGuid(), string.Empty, null, _settings, request, response, 0, null, null, null); } #endregion diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index c9ba2d92b..274c1fc2a 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -29,6 +29,7 @@ public partial class FluentMockServer : IDisposable private readonly IWireMockLogger _logger; private readonly IFileSystemHandler _fileSystemHandler; + private readonly IFluentMockServerSettings _settings; private readonly IOwinSelfHost _httpServer; private readonly IWireMockMiddlewareOptions _options = new WireMockMiddlewareOptions(); @@ -185,6 +186,7 @@ public static FluentMockServer StartWithAdminInterfaceAndReadStaticMappings(para private FluentMockServer(IFluentMockServerSettings settings) { + _settings = settings; settings.Logger = settings.Logger ?? new WireMockNullLogger(); _logger = settings.Logger; @@ -435,7 +437,7 @@ public void ResetScenarios() [PublicAPI] public IRespondWithAProvider Given(IRequestMatcher requestMatcher, bool saveToFile = false) { - return new RespondWithAProvider(RegisterMapping, requestMatcher, _fileSystemHandler, saveToFile); + return new RespondWithAProvider(RegisterMapping, requestMatcher, _settings, saveToFile); } private void RegisterMapping(IMapping mapping, bool saveToFile) diff --git a/src/WireMock.Net/Server/RespondWithAProvider.cs b/src/WireMock.Net/Server/RespondWithAProvider.cs index 1db7db6b7..02b5bbedf 100644 --- a/src/WireMock.Net/Server/RespondWithAProvider.cs +++ b/src/WireMock.Net/Server/RespondWithAProvider.cs @@ -1,7 +1,7 @@ using System; -using WireMock.Handlers; using WireMock.Matchers.Request; using WireMock.ResponseProviders; +using WireMock.Settings; namespace WireMock.Server { @@ -18,7 +18,7 @@ internal class RespondWithAProvider : IRespondWithAProvider private string _scenario; private readonly RegistrationCallback _registrationCallback; private readonly IRequestMatcher _requestMatcher; - private readonly IFileSystemHandler _fileSystemHandler; + private readonly IFluentMockServerSettings _settings; private readonly bool _saveToFile; public Guid Guid { get; private set; } = Guid.NewGuid(); @@ -28,13 +28,13 @@ internal class RespondWithAProvider : IRespondWithAProvider /// /// The registration callback. /// The request matcher. - /// The fileSystemHandler. + /// The FluentMockServerSettings. /// Optional boolean to indicate if this mapping should be saved as static mapping file. - public RespondWithAProvider(RegistrationCallback registrationCallback, IRequestMatcher requestMatcher, IFileSystemHandler fileSystemHandler, bool saveToFile = false) + public RespondWithAProvider(RegistrationCallback registrationCallback, IRequestMatcher requestMatcher, IFluentMockServerSettings settings, bool saveToFile = false) { _registrationCallback = registrationCallback; _requestMatcher = requestMatcher; - _fileSystemHandler = fileSystemHandler; + _settings = settings; _saveToFile = saveToFile; } @@ -44,7 +44,7 @@ public RespondWithAProvider(RegistrationCallback registrationCallback, IRequestM /// The provider. public void RespondWith(IResponseProvider provider) { - _registrationCallback(new Mapping(Guid, _title, _path, _fileSystemHandler, _requestMatcher, provider, _priority, _scenario, _executionConditionState, _nextState), _saveToFile); + _registrationCallback(new Mapping(Guid, _title, _path, _settings, _requestMatcher, provider, _priority, _scenario, _executionConditionState, _nextState), _saveToFile); } /// diff --git a/src/WireMock.Net/Settings/FluentMockServerSettings.cs b/src/WireMock.Net/Settings/FluentMockServerSettings.cs index ab02e13d1..97ab8f734 100644 --- a/src/WireMock.Net/Settings/FluentMockServerSettings.cs +++ b/src/WireMock.Net/Settings/FluentMockServerSettings.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using HandlebarsDotNet; +using JetBrains.Annotations; using Newtonsoft.Json; using System; using WireMock.Handlers; @@ -83,5 +84,10 @@ public class FluentMockServerSettings : IFluentMockServerSettings [PublicAPI] [JsonIgnore] public IFileSystemHandler FileSystemHandler { get; set; } + + /// + [PublicAPI] + [JsonIgnore] + public Action HandlebarRegistrationCallback { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Settings/IFluentMockServerSettings.cs b/src/WireMock.Net/Settings/IFluentMockServerSettings.cs index e21c475b6..a34edfb06 100644 --- a/src/WireMock.Net/Settings/IFluentMockServerSettings.cs +++ b/src/WireMock.Net/Settings/IFluentMockServerSettings.cs @@ -1,5 +1,6 @@ -using System; +using HandlebarsDotNet; using JetBrains.Annotations; +using System; using WireMock.Handlers; using WireMock.Logging; @@ -112,5 +113,11 @@ public interface IFluentMockServerSettings /// [PublicAPI] IFileSystemHandler FileSystemHandler { get; set; } + + /// + /// Action which is called when output need to be transformed using Handlebars. [Optional] + /// + [PublicAPI] + Action HandlebarRegistrationCallback { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Transformers/HandlebarsContextFactory.cs b/src/WireMock.Net/Transformers/HandlebarsContextFactory.cs new file mode 100644 index 000000000..9993f7fd2 --- /dev/null +++ b/src/WireMock.Net/Transformers/HandlebarsContextFactory.cs @@ -0,0 +1,34 @@ +using HandlebarsDotNet; +using System; +using WireMock.Handlers; + +namespace WireMock.Transformers +{ + internal class HandlebarsContextFactory : IHandlebarsContextFactory + { + private static readonly HandlebarsConfiguration HandlebarsConfiguration = new HandlebarsConfiguration + { + UnresolvedBindingFormatter = "{0}" + }; + + private readonly IFileSystemHandler _fileSystemHandler; + private readonly Action _action; + + public HandlebarsContextFactory(IFileSystemHandler fileSystemHandler, Action action) + { + _fileSystemHandler = fileSystemHandler; + _action = action; + } + + public IHandlebars Create() + { + var handlebarsContext = Handlebars.Create(HandlebarsConfiguration); + + HandlebarsHelpers.Register(handlebarsContext, _fileSystemHandler); + + _action?.Invoke(handlebarsContext, _fileSystemHandler); + + return handlebarsContext; + } + } +} diff --git a/src/WireMock.Net/Transformers/IHandlebarsContextFactory.cs b/src/WireMock.Net/Transformers/IHandlebarsContextFactory.cs new file mode 100644 index 000000000..5d6beff38 --- /dev/null +++ b/src/WireMock.Net/Transformers/IHandlebarsContextFactory.cs @@ -0,0 +1,9 @@ +using HandlebarsDotNet; + +namespace WireMock.Transformers +{ + interface IHandlebarsContextFactory + { + IHandlebars Create(); + } +} diff --git a/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs b/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs index 5861e0d8f..a87f58453 100644 --- a/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs +++ b/src/WireMock.Net/Transformers/ResponseMessageTransformer.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; -using WireMock.Handlers; using WireMock.Util; using WireMock.Validation; @@ -13,22 +12,19 @@ namespace WireMock.Transformers { internal class ResponseMessageTransformer { - private static readonly HandlebarsConfiguration HandlebarsConfiguration = new HandlebarsConfiguration - { - UnresolvedBindingFormatter = "{0}" - }; - - private static readonly IHandlebars HandlebarsContext = Handlebars.Create(HandlebarsConfiguration); + private readonly IHandlebarsContextFactory _factory; - public ResponseMessageTransformer([NotNull] IFileSystemHandler fileSystemHandler) + public ResponseMessageTransformer([NotNull] IHandlebarsContextFactory factory) { - Check.NotNull(fileSystemHandler, nameof(fileSystemHandler)); + Check.NotNull(factory, nameof(factory)); - HandlebarsHelpers.Register(HandlebarsContext, fileSystemHandler); + _factory = factory; } public ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage original) { + var handlebarsContext = _factory.Create(); + var responseMessage = new ResponseMessage { StatusCode = original.StatusCode }; var template = new { request = requestMessage }; @@ -36,16 +32,16 @@ public ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage switch (original.BodyData.DetectedBodyType) { case BodyType.Json: - TransformBodyAsJson(template, original, responseMessage); + TransformBodyAsJson(handlebarsContext, template, original, responseMessage); break; case BodyType.File: - TransformBodyAsFile(template, original, responseMessage); + TransformBodyAsFile(handlebarsContext, template, original, responseMessage); break; case BodyType.String: responseMessage.BodyOriginal = original.BodyData.BodyAsString; - TransformBodyAsString(template, original, responseMessage); + TransformBodyAsString(handlebarsContext, template, original, responseMessage); break; } @@ -53,9 +49,9 @@ public ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage var newHeaders = new Dictionary>(); foreach (var header in original.Headers) { - var templateHeaderKey = HandlebarsContext.Compile(header.Key); + var templateHeaderKey = handlebarsContext.Compile(header.Key); var templateHeaderValues = header.Value - .Select(HandlebarsContext.Compile) + .Select(handlebarsContext.Compile) .Select(func => func(template)) .ToArray(); @@ -67,7 +63,7 @@ public ResponseMessage Transform(RequestMessage requestMessage, ResponseMessage return responseMessage; } - private static void TransformBodyAsJson(object template, ResponseMessage original, ResponseMessage responseMessage) + private static void TransformBodyAsJson(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage) { JToken jToken; switch (original.BodyData.BodyAsJson) @@ -85,7 +81,7 @@ private static void TransformBodyAsJson(object template, ResponseMessage origina break; } - WalkNode(jToken, template); + WalkNode(handlebarsContext, jToken, template); responseMessage.BodyData = new BodyData { @@ -95,14 +91,14 @@ private static void TransformBodyAsJson(object template, ResponseMessage origina }; } - private static void WalkNode(JToken node, object context) + private static void WalkNode(IHandlebars handlebarsContext, JToken node, object context) { if (node.Type == JTokenType.Object) { // In case of Object, loop all children. Do a ToArray() to avoid `Collection was modified` exceptions. foreach (JProperty child in node.Children().ToArray()) { - WalkNode(child.Value, context); + WalkNode(handlebarsContext, child.Value, context); } } else if (node.Type == JTokenType.Array) @@ -110,7 +106,7 @@ private static void WalkNode(JToken node, object context) // In case of Array, loop all items. Do a ToArray() to avoid `Collection was modified` exceptions. foreach (JToken child in node.Children().ToArray()) { - WalkNode(child, context); + WalkNode(handlebarsContext, child, context); } } else if (node.Type == JTokenType.String) @@ -122,7 +118,7 @@ private static void WalkNode(JToken node, object context) return; } - var templateForStringValue = HandlebarsContext.Compile(stringValue); + var templateForStringValue = handlebarsContext.Compile(stringValue); string transformedString = templateForStringValue(context); if (!string.Equals(stringValue, transformedString)) { @@ -154,9 +150,9 @@ private static void ReplaceNodeValue(JToken node, string stringValue) node.Replace(value); } - private static void TransformBodyAsString(object template, ResponseMessage original, ResponseMessage responseMessage) + private static void TransformBodyAsString(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage) { - var templateBodyAsString = HandlebarsContext.Compile(original.BodyData.BodyAsString); + var templateBodyAsString = handlebarsContext.Compile(original.BodyData.BodyAsString); responseMessage.BodyData = new BodyData { @@ -166,9 +162,9 @@ private static void TransformBodyAsString(object template, ResponseMessage origi }; } - private static void TransformBodyAsFile(object template, ResponseMessage original, ResponseMessage responseMessage) + private static void TransformBodyAsFile(IHandlebars handlebarsContext, object template, ResponseMessage original, ResponseMessage responseMessage) { - var templateBodyAsFile = HandlebarsContext.Compile(original.BodyData.BodyAsFile); + var templateBodyAsFile = handlebarsContext.Compile(original.BodyData.BodyAsFile); responseMessage.BodyData = new BodyData { diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs index aa0d0eb05..e61af72bb 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs @@ -1,16 +1,16 @@ -using System.Threading.Tasks; -using Moq; +using Moq; using NFluent; -using WireMock.Handlers; +using System.Threading.Tasks; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseCreateTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); [Fact] public async Task Response_Create_Func() @@ -22,7 +22,7 @@ public async Task Response_Create_Func() var response = Response.Create(() => responseMessage); // Act - var providedResponse = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var providedResponse = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(providedResponse).Equals(responseMessage); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs index 2080c5154..6880de6ec 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs @@ -4,9 +4,9 @@ using System; using System.Text; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -14,7 +14,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithBodyTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -31,7 +31,7 @@ public async Task Response_ProvideResponse_WithBody_Bytes_Encoding_Destination_S var response = Response.Create().WithBody(new byte[] { 48, 49 }, BodyDestinationFormat.String, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // then Check.That(responseMessage.BodyData.BodyAsString).Equals("01"); @@ -53,7 +53,7 @@ public async Task Response_ProvideResponse_WithBody_Bytes_Encoding_Destination_B var response = Response.Create().WithBody(new byte[] { 48, 49 }, BodyDestinationFormat.SameAsSource, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // then Check.That(responseMessage.BodyData.BodyAsBytes).ContainsExactly(new byte[] { 48, 49 }); @@ -75,7 +75,7 @@ public async Task Response_ProvideResponse_WithBody_String_Encoding() var response = Response.Create().WithBody("test", null, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // then Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); @@ -97,7 +97,7 @@ public async Task Response_ProvideResponse_WithBody_Object_Encoding() var response = Response.Create().WithBodyAsJson(x, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // then Check.That(responseMessage.BodyData.BodyAsJson).Equals(x); @@ -119,7 +119,7 @@ public async Task Response_ProvideResponse_WithBody_Object_Indented() var response = Response.Create().WithBodyAsJson(x, true); // act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // then Check.That(responseMessage.BodyData.BodyAsJson).Equals(x); @@ -135,7 +135,7 @@ public async Task Response_ProvideResponse_WithBody_String_SameAsSource_Encoding var response = Response.Create().WithBody("r", BodyDestinationFormat.SameAsSource, Encoding.ASCII); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsBytes).IsNull(); @@ -153,7 +153,7 @@ public async Task Response_ProvideResponse_WithBody_String_Bytes_Encoding() var response = Response.Create().WithBody("r", BodyDestinationFormat.Bytes, Encoding.ASCII); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsNull(); @@ -171,7 +171,7 @@ public async Task Response_ProvideResponse_WithBody_String_Json_Encoding() var response = Response.Create().WithBody("{ \"value\": 42 }", BodyDestinationFormat.Json, Encoding.ASCII); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsNull(); @@ -193,7 +193,7 @@ public async Task Response_ProvideResponse_WithBody_Func() .WithBody(req => $"path: {req.Path}"); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("path: /test"); @@ -221,8 +221,8 @@ public async Task Response_ProvideResponse_WithJsonBodyAndTransform_Func() .WithTransformer(); // Act - var response1Message = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); - var response2Message = await response.ProvideResponseAsync(request2, _fileSystemHandlerMock.Object); + var response1Message = await response.ProvideResponseAsync(request1, _settingsMock.Object); + var response2Message = await response.ProvideResponseAsync(request2, _settingsMock.Object); // Assert Check.That(((JToken)response1Message.BodyData.BodyAsJson).SelectToken("id")?.Value()).IsEqualTo(request1Id); @@ -246,7 +246,7 @@ public async Task Response_ProvideResponse_WithBodyAsFile() var response = Response.Create().WithStatusCode(200).WithBody(fileContents); - var provideResponseAsync = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); + var provideResponseAsync = await response.ProvideResponseAsync(request1, _settingsMock.Object); Check.That(provideResponseAsync.StatusCode).IsEqualTo(200); Check.That(provideResponseAsync.BodyData.BodyAsString).Contains(fileContents); @@ -262,7 +262,7 @@ public async Task Response_ProvideResponse_WithResponseAsFile() var response = Response.Create().WithStatusCode(200).WithBody(fileContents); - var provideResponseAsync = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); + var provideResponseAsync = await response.ProvideResponseAsync(request1, _settingsMock.Object); Check.That(provideResponseAsync.StatusCode).IsEqualTo(200); Check.That(provideResponseAsync.BodyData.BodyAsString).Contains(fileContents); @@ -278,7 +278,7 @@ public async Task Response_ProvideResponse_WithResponseDeleted() var response = Response.Create().WithStatusCode(200).WithBody("File deleted."); - var provideResponseAsync = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); + var provideResponseAsync = await response.ProvideResponseAsync(request1, _settingsMock.Object); Check.That(provideResponseAsync.StatusCode).IsEqualTo(200); Check.That(provideResponseAsync.BodyData.BodyAsString).Contains("File deleted."); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs index 76912fbc4..e956eef71 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs @@ -1,9 +1,9 @@ using Moq; using NFluent; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -11,7 +11,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithCallbackTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); [Fact] public async Task Response_WithCallback() @@ -21,7 +21,7 @@ public async Task Response_WithCallback() var response = Response.Create().WithCallback(req => new ResponseMessage { BodyData = new BodyData { DetectedBodyType = BodyType.String, BodyAsString = req.Path + "Bar" }, StatusCode = 302 }); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("/fooBar"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs index 05f387d13..42e87c7ff 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs @@ -6,6 +6,7 @@ using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests.ResponseBuilders @@ -13,12 +14,16 @@ namespace WireMock.Net.Tests.ResponseBuilders public class ResponseWithHandlebarsFileTests { private readonly Mock _filesystemHandlerMock; + private readonly Mock _settingsMock; private const string ClientIp = "::1"; public ResponseWithHandlebarsFileTests() { _filesystemHandlerMock = new Mock(MockBehavior.Strict); _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + + _settingsMock = new Mock(); + _settingsMock.SetupGet(s => s.FileSystemHandler).Returns(_filesystemHandlerMock.Object); } [Fact] @@ -35,7 +40,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_File() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _filesystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -60,7 +65,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_File_Replace() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _filesystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -85,7 +90,7 @@ public void Response_ProvideResponseAsync_Handlebars_File_WithMissingArgument_Th .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _filesystemHandlerMock.Object)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settingsMock.Object)).Throws(); // Verify _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString(It.IsAny()), Times.Never); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs index f0bda9aab..2f3ba32a8 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs @@ -1,11 +1,11 @@ -using System; -using System.Threading.Tasks; -using Moq; +using Moq; using Newtonsoft.Json.Linq; using NFluent; -using WireMock.Handlers; +using System; +using System.Threading.Tasks; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -13,7 +13,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsJsonPathTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -63,7 +63,7 @@ public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Objec .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -89,7 +89,7 @@ public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Numbe .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -143,7 +143,7 @@ public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Reque .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals($"{{{Environment.NewLine} \"Name\": \"Acme Co\",{Environment.NewLine} \"Products\": [{Environment.NewLine} {{{Environment.NewLine} \"Name\": \"Anvil\",{Environment.NewLine} \"Price\": 50{Environment.NewLine} }}{Environment.NewLine} ]{Environment.NewLine}}}"); @@ -196,7 +196,7 @@ public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Reque .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals($"{{{Environment.NewLine} \"Name\": \"Acme Co\",{Environment.NewLine} \"Products\": [{Environment.NewLine} {{{Environment.NewLine} \"Name\": \"Anvil\",{Environment.NewLine} \"Price\": 50{Environment.NewLine} }}{Environment.NewLine} ]{Environment.NewLine}}}"); @@ -249,7 +249,7 @@ public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Requ .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); @@ -302,7 +302,7 @@ public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Requ .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); @@ -331,7 +331,7 @@ public void Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Throws() .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settingsMock.Object)).Throws(); } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs index 4043bc464..88ebf699e 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs @@ -3,9 +3,9 @@ using NFluent; using System; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -13,7 +13,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsLinqTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); [Fact] public async Task Response_ProvideResponse_Handlebars_Linq1_String0() @@ -29,7 +29,7 @@ public async Task Response_ProvideResponse_Handlebars_Linq1_String0() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -59,7 +59,7 @@ public async Task Response_ProvideResponse_Handlebars_Linq1_String1() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -89,7 +89,7 @@ public async Task Response_ProvideResponse_Handlebars_Linq1_String2() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -119,7 +119,7 @@ public async Task Response_ProvideResponse_Handlebars_Linq2_Object() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -144,7 +144,7 @@ public void Response_ProvideResponse_Handlebars_Linq_Throws_NotSupportedExceptio .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settingsMock.Object)).Throws(); } [Fact] @@ -160,7 +160,7 @@ public void Response_ProvideResponse_Handlebars_Linq1_Throws_ArgumentNullExcepti .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settingsMock.Object)).Throws(); } [Fact] @@ -176,7 +176,7 @@ public void Response_ProvideResponse_Handlebars_Linq1_Throws_ArgumentException() .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settingsMock.Object)).Throws(); } [Fact] @@ -200,7 +200,7 @@ public async void Response_ProvideResponse_Handlebars_Linq1_ParseError_Returns_E .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -228,7 +228,7 @@ public async void Response_ProvideResponse_Handlebars_Linq2_ParseError_Returns_E .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs index aa78f1669..db29129a5 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs @@ -1,18 +1,18 @@ -using System.Linq; -using System.Threading.Tasks; -using Moq; +using Moq; using Newtonsoft.Json.Linq; using NFluent; -using WireMock.Handlers; +using System.Linq; +using System.Threading.Tasks; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsRandomTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -32,7 +32,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Random1() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -55,7 +55,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Random1_Boolean() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -77,7 +77,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Random1_Guid() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -101,7 +101,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Random1_StringList() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -123,7 +123,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Random2() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs index e93650167..b47bb54f2 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs @@ -1,10 +1,10 @@ -using System; -using System.Threading.Tasks; -using Moq; +using Moq; using NFluent; -using WireMock.Handlers; +using System; +using System.Threading.Tasks; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -12,7 +12,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsRegexTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -28,7 +28,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("abc"); @@ -47,7 +47,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch_NoMatch() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals(""); @@ -66,7 +66,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch_NoMatch_Wi .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("d"); @@ -85,7 +85,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("5000-https"); @@ -104,7 +104,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2_NoMatch() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals(""); @@ -123,7 +123,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2_NoMatch_W .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("x"); @@ -142,7 +142,7 @@ public void Response_ProvideResponseAsync_Handlebars_RegexMatch2_Throws() .WithTransformer(); // Act and Assert - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _settingsMock.Object)).Throws(); } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs index 57ca8d1df..516b2de3b 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs @@ -5,9 +5,9 @@ using Moq; using Newtonsoft.Json; using NFluent; -using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; #if NET452 @@ -20,7 +20,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -41,7 +41,7 @@ public async Task Response_ProvideResponse_Handlebars_WithBodyAsJson_ResultAsObj .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(JsonConvert.SerializeObject(responseMessage.BodyData.BodyAsJson)).Equals("{\"x\":\"test /foo_object\"}"); @@ -63,7 +63,7 @@ public async Task Response_ProvideResponse_Handlebars_UrlPathVerb() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt"); @@ -81,7 +81,7 @@ public async Task Response_ProvideResponse_Handlebars_UrlPath() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("http://localhost/a/b http://localhost/wiremock/a/b /a/b /wiremock/a/b"); @@ -99,7 +99,7 @@ public async Task Response_ProvideResponse_Handlebars_PathSegments() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("a wiremock"); @@ -121,7 +121,7 @@ public async Task Response_ProvideResponse_Handlebars_Query() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test keya=1 idx=1 idx=2 keyb=5"); @@ -141,7 +141,7 @@ public async Task Response_ProvideResponse_Handlebars_Header() var response = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}").WithBody("test").WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); @@ -163,7 +163,7 @@ public async Task Response_ProvideResponse_Handlebars_Headers() var response = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}", "{{request.url}}").WithBody("test").WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); @@ -188,7 +188,7 @@ public async Task Response_ProvideResponse_Handlebars_Origin_Port_Protocol_Host( .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test http://localhost:1234 1234 http localhost"); @@ -212,7 +212,7 @@ public async Task Response_ProvideResponse_Handlebars_WithBodyAsJson_ResultAsArr .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(JsonConvert.SerializeObject(responseMessage.BodyData.BodyAsJson)).Equals("[\"first\",\"/foo_array\",\"test 1\",\"test 2\",\"last\"]"); @@ -229,7 +229,7 @@ public async Task Response_ProvideResponse_Handlebars_WithBodyAsFile() .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\test.xml"); // why use a \\ here ? // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); @@ -256,7 +256,7 @@ public async Task Response_ProvideResponse_Handlebars_WithBodyAsFile_JsonPath() .WithBodyFromFile(@"c:\\{{JsonPath.SelectToken request.body " + jsonPath + "}}\\test.json"); // why use a \\ here ? // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsFile).Equals(@"c:\1\test.json"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs index 869f2d759..dd8053d6d 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs @@ -1,17 +1,17 @@ -using System.Threading.Tasks; -using Moq; +using Moq; using Newtonsoft.Json.Linq; using NFluent; -using WireMock.Handlers; +using System.Threading.Tasks; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsXegerTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -29,7 +29,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Xeger1() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -52,7 +52,7 @@ public async Task Response_ProvideResponseAsync_Handlebars_Xeger2() .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs index 448591d86..a6be05d2a 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Moq; +using Moq; using NFluent; -using WireMock.Handlers; +using System.Collections.Generic; +using System.Threading.Tasks; using WireMock.Models; using WireMock.ResponseBuilders; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -12,7 +12,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHeadersTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private const string ClientIp = "::1"; [Theory] @@ -26,7 +26,7 @@ public async Task Response_ProvideResponse_WithHeader_SingleValue(string headerN IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValue); // Act - var response = await builder.ProvideResponseAsync(requestMock, _fileSystemHandlerMock.Object); + var response = await builder.ProvideResponseAsync(requestMock, _settingsMock.Object); // Assert Check.That(response.Headers[headerName].ToString()).Equals(headerValue); @@ -42,7 +42,7 @@ public async Task Response_ProvideResponse_WithHeader_MultipleValues(string head IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValues); // Act - var response = await builder.ProvideResponseAsync(requestMock, _fileSystemHandlerMock.Object); + var response = await builder.ProvideResponseAsync(requestMock, _settingsMock.Object); // Assert Check.That(response.Headers[headerName].ToArray()).Equals(headerValues); @@ -57,7 +57,7 @@ public async Task Response_ProvideResponse_WithHeaders_SingleValue() var response = Response.Create().WithHeaders(headers); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.Headers["h"]).ContainsExactly("x"); @@ -72,7 +72,7 @@ public async Task Response_ProvideResponse_WithHeaders_MultipleValues() var response = Response.Create().WithHeaders(headers); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.Headers["h"]).ContainsExactly("x"); @@ -87,7 +87,7 @@ public async Task Response_ProvideResponse_WithHeaders_WiremockList() var response = Response.Create().WithHeaders(headers); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.Headers["h"]).ContainsExactly("x"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs index a920f27c5..733ed7528 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs @@ -1,13 +1,13 @@ -using System; +using Moq; +using NFluent; +using System; using System.Collections.Generic; using System.Threading.Tasks; -using Moq; -using NFluent; -using WireMock.Handlers; using WireMock.Models; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Server; +using WireMock.Settings; using WireMock.Util; using Xunit; @@ -15,7 +15,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithProxyTests : IDisposable { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); private readonly FluentMockServer _server; private readonly Guid _guid; @@ -33,11 +33,11 @@ public async Task Response_WithProxy() { // Assign var headers = new Dictionary { { "Content-Type", new[] { "application/xml" } } }; - var request = new RequestMessage(new UrlDetails($"{_server.Urls[0]}/{_guid}"), "POST", "::1", new BodyData { DetectedBodyType = BodyType.Json, BodyAsJson = new { a = 1 } }, headers); + var request = new RequestMessage(new UrlDetails($"{_server.Urls[0]}/{_guid}"), "POST", "::1", new BodyData { DetectedBodyType = BodyType.Json, BodyAsJson = new { a = 1 } }, headers); var response = Response.Create().WithProxy(_server.Urls[0]); // Act - var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); + var responseMessage = await response.ProvideResponseAsync(request, _settingsMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("{\"p\":42}"); diff --git a/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs b/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs index ebe68c33c..d4c9179b4 100644 --- a/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs +++ b/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs @@ -1,17 +1,17 @@ using FluentAssertions; using Moq; using System; -using WireMock.Handlers; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Serialization; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests.Serialization { public class MappingConverterTests { - private readonly Mock _fileSystemHandlerMock = new Mock(); + private readonly Mock _settingsMock = new Mock(); [Fact] public void ToMappingModel() @@ -19,7 +19,7 @@ public void ToMappingModel() // Assign var request = Request.Create(); var response = Response.Create(); - var mapping = new Mapping(Guid.NewGuid(), "", null, _fileSystemHandlerMock.Object, request, response, 0, null, null, null); + var mapping = new Mapping(Guid.NewGuid(), "", null, _settingsMock.Object, request, response, 0, null, null, null); // Act var model = MappingConverter.ToMappingModel(mapping); @@ -37,7 +37,7 @@ public void ToMappingModel_WithPriority_ReturnsPriority() // Assign var request = Request.Create(); var response = Response.Create().WithBodyAsJson(new { x = "x" }).WithTransformer(); - var mapping = new Mapping(Guid.NewGuid(), "", null, _fileSystemHandlerMock.Object, request, response, 42, null, null, null); + var mapping = new Mapping(Guid.NewGuid(), "", null, _settingsMock.Object, request, response, 42, null, null, null); // Act var model = MappingConverter.ToMappingModel(mapping); From 68907c9754e9d19aef23d9559b85648679bcfb2e Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 18 Jun 2019 14:14:59 +0200 Subject: [PATCH 2/8] HandlebarsRegistrationCallback --- src/WireMock.Net/ResponseBuilders/Response.cs | 2 +- src/WireMock.Net/Settings/FluentMockServerSettings.cs | 4 ++-- src/WireMock.Net/Settings/IFluentMockServerSettings.cs | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 0df7e2ac5..3fb53b581 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -409,7 +409,7 @@ public async Task ProvideResponseAsync(RequestMessage requestMe if (UseTransformer) { - var factory = new HandlebarsContextFactory(settings.FileSystemHandler, settings.HandlebarRegistrationCallback); + var factory = new HandlebarsContextFactory(settings.FileSystemHandler, settings.HandlebarsRegistrationCallback); var responseMessageTransformer = new ResponseMessageTransformer(factory); return responseMessageTransformer.Transform(requestMessage, ResponseMessage); } diff --git a/src/WireMock.Net/Settings/FluentMockServerSettings.cs b/src/WireMock.Net/Settings/FluentMockServerSettings.cs index 97ab8f734..700ea5840 100644 --- a/src/WireMock.Net/Settings/FluentMockServerSettings.cs +++ b/src/WireMock.Net/Settings/FluentMockServerSettings.cs @@ -85,9 +85,9 @@ public class FluentMockServerSettings : IFluentMockServerSettings [JsonIgnore] public IFileSystemHandler FileSystemHandler { get; set; } - /// + /// [PublicAPI] [JsonIgnore] - public Action HandlebarRegistrationCallback { get; set; } + public Action HandlebarsRegistrationCallback { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Settings/IFluentMockServerSettings.cs b/src/WireMock.Net/Settings/IFluentMockServerSettings.cs index a34edfb06..205115edc 100644 --- a/src/WireMock.Net/Settings/IFluentMockServerSettings.cs +++ b/src/WireMock.Net/Settings/IFluentMockServerSettings.cs @@ -115,9 +115,9 @@ public interface IFluentMockServerSettings IFileSystemHandler FileSystemHandler { get; set; } /// - /// Action which is called when output need to be transformed using Handlebars. [Optional] + /// Action which can be used to add additional is Handlebar registrations. [Optional] /// [PublicAPI] - Action HandlebarRegistrationCallback { get; set; } + Action HandlebarsRegistrationCallback { get; set; } } } \ No newline at end of file From a89d5fb8cefb46d9ea4dfcb48bdf5b2c6f08feab Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Tue, 18 Jun 2019 17:41:59 +0200 Subject: [PATCH 3/8] HandlebarsContextFactoryTests --- .../HandlebarsContextFactoryTests.cs | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/WireMock.Net.Tests/Transformers/HandlebarsContextFactoryTests.cs diff --git a/test/WireMock.Net.Tests/Transformers/HandlebarsContextFactoryTests.cs b/test/WireMock.Net.Tests/Transformers/HandlebarsContextFactoryTests.cs new file mode 100644 index 000000000..16fd37121 --- /dev/null +++ b/test/WireMock.Net.Tests/Transformers/HandlebarsContextFactoryTests.cs @@ -0,0 +1,52 @@ +using FluentAssertions; +using HandlebarsDotNet; +using Moq; +using System; +using WireMock.Handlers; +using WireMock.Transformers; +using Xunit; + +namespace WireMock.Net.Tests.Transformers +{ + public class HandlebarsContextFactoryTests + { + private readonly Mock _fileSystemHandlerMock = new Mock(); + + [Fact] + public void Create_WithNullAction_DoesNotInvokeAction() + { + // Arrange + var sut = new HandlebarsContextFactory(_fileSystemHandlerMock.Object, null); + + // Act + var result = sut.Create(); + + // Assert + result.Should().NotBeNull(); + } + + [Fact] + public void Create_WithAction_InvokesAction() + { + // Arrange + int num = 0; + Action action = (ctx, fs) => + { + ctx.Should().NotBeNull(); + fs.Should().NotBeNull(); + + num++; + }; + var sut = new HandlebarsContextFactory(_fileSystemHandlerMock.Object, action); + + // Act + var result = sut.Create(); + + // Assert + result.Should().NotBeNull(); + + // Verify + num.Should().Be(1); + } + } +} From da3bd2eb61d699956c308eb146e4960a3616203d Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 19 Jun 2019 07:19:08 +0200 Subject: [PATCH 4/8] 1.0.21.0 --- Directory.Build.props | 2 +- GitHubReleaseNotes.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 13eb4ee42..f35456164 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,7 @@ - 1.0.20 + 1.0.21 diff --git a/GitHubReleaseNotes.txt b/GitHubReleaseNotes.txt index 88cae14c9..822d051f9 100644 --- a/GitHubReleaseNotes.txt +++ b/GitHubReleaseNotes.txt @@ -1,3 +1,3 @@ https://github.com/StefH/GitHubReleaseNotes -GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.20.0 \ No newline at end of file +GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.21.0 \ No newline at end of file From 01b3ba4aa1a816a6bdcf69bea07196f1cd882443 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 19 Jun 2019 18:37:54 +0200 Subject: [PATCH 5/8] fix sonar --- src/WireMock.Net/Matchers/ExactObjectMatcher.cs | 6 ++++++ src/WireMock.Net/RequestBuilders/Request.Params.cs | 3 ++- src/WireMock.Net/ResponseBuilders/Response.cs | 2 ++ .../ResponseProviders/DynamicAsyncResponseProvider.cs | 1 - .../ResponseProviders/DynamicResponseProvider.cs | 1 - .../ResponseProviders/ProxyAsyncResponseProvider.cs | 1 - 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/WireMock.Net/Matchers/ExactObjectMatcher.cs b/src/WireMock.Net/Matchers/ExactObjectMatcher.cs index bfe87509a..5bd794295 100644 --- a/src/WireMock.Net/Matchers/ExactObjectMatcher.cs +++ b/src/WireMock.Net/Matchers/ExactObjectMatcher.cs @@ -10,8 +10,14 @@ namespace WireMock.Matchers /// public class ExactObjectMatcher : IObjectMatcher { + /// + /// Gets the value as object. + /// public object ValueAsObject { get; } + /// + /// Gets the value as byte[]. + /// public byte[] ValueAsBytes { get; } /// diff --git a/src/WireMock.Net/RequestBuilders/Request.Params.cs b/src/WireMock.Net/RequestBuilders/Request.Params.cs index 94dcd6bd8..af2142c8b 100644 --- a/src/WireMock.Net/RequestBuilders/Request.Params.cs +++ b/src/WireMock.Net/RequestBuilders/Request.Params.cs @@ -63,6 +63,7 @@ public IRequestBuilder WithParam(string key, MatchBehaviour matchBehaviour, bool return this; } + /// public IRequestBuilder WithParam(string key, MatchBehaviour matchBehaviour, params IStringMatcher[] matchers) { return WithParam(key, matchBehaviour, false, matchers); @@ -77,7 +78,7 @@ public IRequestBuilder WithParam(string key, MatchBehaviour matchBehaviour, bool return this; } - /// + /// public IRequestBuilder WithParam(params Func>, bool>[] funcs) { Check.NotNullOrEmpty(funcs, nameof(funcs)); diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 3fb53b581..2ca85c397 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading.Tasks; using WireMock.Http; +using WireMock.ResponseProviders; using WireMock.Settings; using WireMock.Transformers; using WireMock.Util; @@ -370,6 +371,7 @@ private IResponseBuilder WithCallbackInternal(bool withCallbackUsed, Func public async Task ProvideResponseAsync(RequestMessage requestMessage, IFluentMockServerSettings settings) { Check.NotNull(requestMessage, nameof(requestMessage)); diff --git a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs index b20e3b83e..b1880b33e 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Settings; namespace WireMock.ResponseProviders diff --git a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs index 214a61457..2a88d26dd 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Settings; namespace WireMock.ResponseProviders diff --git a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs index e1a0c4631..aee6e7a7c 100644 --- a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using WireMock.Handlers; using WireMock.Settings; namespace WireMock.ResponseProviders From f9fa09886495cf041520d8eea8039b78183c7735 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 20 Jun 2019 15:36:45 +0200 Subject: [PATCH 6/8] LocalFileSystemHandler --- .../Handlers/LocalFileSystemHandler.cs | 20 ++++++++++++++++++- src/WireMock.Net/Server/FluentMockServer.cs | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/WireMock.Net/Handlers/LocalFileSystemHandler.cs b/src/WireMock.Net/Handlers/LocalFileSystemHandler.cs index eeb957e8b..f349d9fcb 100644 --- a/src/WireMock.Net/Handlers/LocalFileSystemHandler.cs +++ b/src/WireMock.Net/Handlers/LocalFileSystemHandler.cs @@ -11,6 +11,24 @@ public class LocalFileSystemHandler : IFileSystemHandler { private static readonly string AdminMappingsFolder = Path.Combine("__admin", "mappings"); + private readonly string _rootFolder; + + /// + /// Initializes a new instance of the class. + /// + public LocalFileSystemHandler() : this(Directory.GetCurrentDirectory()) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The root folder. + public LocalFileSystemHandler(string rootFolder) + { + _rootFolder = rootFolder; + } + /// public bool FolderExists(string path) { @@ -38,7 +56,7 @@ public IEnumerable EnumerateFiles(string path) /// public string GetMappingFolder() { - return Path.Combine(Directory.GetCurrentDirectory(), AdminMappingsFolder); + return Path.Combine(_rootFolder, AdminMappingsFolder); } /// diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index 274c1fc2a..93b0b906d 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -93,7 +93,7 @@ protected virtual void Dispose(bool disposing) /// The FluentMockServerSettings. /// The . [PublicAPI] - public static FluentMockServer Start(IFluentMockServerSettings settings) + public static FluentMockServer Start([NotNull] IFluentMockServerSettings settings) { Check.NotNull(settings, nameof(settings)); From e3d8045fb23db572e5f40e815637a637dd493c68 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 20 Jun 2019 17:19:24 +0200 Subject: [PATCH 7/8] readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bfa2eae5c..0d920dd32 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,14 @@ A C# .NET version based on [mock4net](https://github.com/alexvictoor/mock4net) w ## Key Features * HTTP response stubbing, matchable on URL/Path, headers, cookies and body content patterns -* Runs in unit tests, as a standalone process, as windows service, as Azure or IIS or as docker +* Library can be used in unit tests and integration tests +* Runs as a standalone process, as windows service, as Azure/IIS or as docker * Configurable via a fluent DotNet API, JSON files and JSON over HTTP * Record/playback of stubs (proxying) * Per-request conditional proxying * Stateful behaviour simulation * Response templating / transformation using Handlebars and extensions +* Can be used locally or in CI/CD scenarios. ## Info | | | From 5ebab24e5046fa84cd801f5b84e84aa8e2908284 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 20 Jun 2019 22:33:22 +0200 Subject: [PATCH 8/8] Fix System.IO.IOException --- .../Server/FluentMockServer.Admin.cs | 41 ++++++++++++------- src/WireMock.Net/Util/FileHelper.cs | 12 +++--- .../Util/FileHelperTests.cs | 20 +++++---- 3 files changed, 46 insertions(+), 27 deletions(-) diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 48361a8a7..7380eccac 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -177,17 +177,23 @@ public void WatchStaticMappings([CanBeNull] string folder = null) var watcher = new EnhancedFileSystemWatcher(folder, "*.json", EnhancedFileSystemWatcherTimeoutMs); watcher.Created += (sender, args) => { - _logger.Info("New MappingFile created : '{0}'", args.FullPath); - ReadStaticMappingAndAddOrUpdate(args.FullPath); + _logger.Info("MappingFile created : '{0}', reading file.", args.FullPath); + if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) + { + _logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); + } }; watcher.Changed += (sender, args) => { - _logger.Info("New MappingFile updated : '{0}'", args.FullPath); - ReadStaticMappingAndAddOrUpdate(args.FullPath); + _logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath); + if (!ReadStaticMappingAndAddOrUpdate(args.FullPath)) + { + _logger.Error("Unable to read MappingFile '{0}'.", args.FullPath); + } }; watcher.Deleted += (sender, args) => { - _logger.Info("New MappingFile deleted : '{0}'", args.FullPath); + _logger.Info("MappingFile deleted : '{0}'", args.FullPath); string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath); if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) @@ -208,24 +214,31 @@ public void WatchStaticMappings([CanBeNull] string folder = null) /// /// The path. [PublicAPI] - public void ReadStaticMappingAndAddOrUpdate([NotNull] string path) + public bool ReadStaticMappingAndAddOrUpdate([NotNull] string path) { Check.NotNull(path, nameof(path)); string filenameWithoutExtension = Path.GetFileNameWithoutExtension(path); - var mappingModels = DeserializeObjectToArray(JsonConvert.DeserializeObject(_fileSystemHandler.ReadMappingFile(path))); - foreach (var mappingModel in mappingModels) + if (FileHelper.TryReadMappingFileWithRetryAndDelay(_fileSystemHandler, path, out string value)) { - if (mappingModels.Length == 1 && Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) - { - DeserializeAndAddOrUpdateMapping(mappingModel, guidFromFilename, path); - } - else + var mappingModels = DeserializeObjectToArray(JsonConvert.DeserializeObject(value)); + foreach (var mappingModel in mappingModels) { - DeserializeAndAddOrUpdateMapping(mappingModel, null, path); + if (mappingModels.Length == 1 && Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) + { + DeserializeAndAddOrUpdateMapping(mappingModel, guidFromFilename, path); + } + else + { + DeserializeAndAddOrUpdateMapping(mappingModel, null, path); + } } + + return true; } + + return false; } #endregion diff --git a/src/WireMock.Net/Util/FileHelper.cs b/src/WireMock.Net/Util/FileHelper.cs index b391f0609..cceca2ae1 100644 --- a/src/WireMock.Net/Util/FileHelper.cs +++ b/src/WireMock.Net/Util/FileHelper.cs @@ -1,6 +1,5 @@ -using System.IO; +using JetBrains.Annotations; using System.Threading; -using JetBrains.Annotations; using WireMock.Handlers; using WireMock.Validation; @@ -11,16 +10,19 @@ internal static class FileHelper private const int NumberOfRetries = 3; private const int DelayOnRetry = 500; - public static string ReadAllTextWithRetryAndDelay([NotNull] IFileSystemHandler handler, [NotNull] string path) + public static bool TryReadMappingFileWithRetryAndDelay([NotNull] IFileSystemHandler handler, [NotNull] string path, out string value) { Check.NotNull(handler, nameof(handler)); Check.NotNullOrEmpty(path, nameof(path)); + value = null; + for (int i = 1; i <= NumberOfRetries; ++i) { try { - return handler.ReadMappingFile(path); + value = handler.ReadMappingFile(path); + return true; } catch { @@ -28,7 +30,7 @@ public static string ReadAllTextWithRetryAndDelay([NotNull] IFileSystemHandler h } } - throw new IOException(); + return false; } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/Util/FileHelperTests.cs b/test/WireMock.Net.Tests/Util/FileHelperTests.cs index 5b3672b50..97a887e97 100644 --- a/test/WireMock.Net.Tests/Util/FileHelperTests.cs +++ b/test/WireMock.Net.Tests/Util/FileHelperTests.cs @@ -1,7 +1,6 @@ -using System; -using System.IO; +using FluentAssertions; using Moq; -using NFluent; +using System; using WireMock.Handlers; using WireMock.Util; using Xunit; @@ -11,31 +10,36 @@ namespace WireMock.Net.Tests.Util public class FileHelperTests { [Fact] - public void FileHelper_ReadAllTextWithRetryAndDelay() + public void TryReadMappingFileWithRetryAndDelay_WithIFileSystemHandlerOk_ReturnsTrue() { // Assign var staticMappingHandlerMock = new Mock(); staticMappingHandlerMock.Setup(m => m.ReadMappingFile(It.IsAny())).Returns("text"); // Act - string result = FileHelper.ReadAllTextWithRetryAndDelay(staticMappingHandlerMock.Object, @"c:\temp"); + bool result = FileHelper.TryReadMappingFileWithRetryAndDelay(staticMappingHandlerMock.Object, @"c:\temp", out string value); // Assert - Check.That(result).Equals("text"); + result.Should().BeTrue(); + value.Should().Be("text"); // Verify staticMappingHandlerMock.Verify(m => m.ReadMappingFile(@"c:\temp"), Times.Once); } [Fact] - public void FileHelper_ReadAllTextWithRetryAndDelay_Throws() + public void TryReadMappingFileWithRetryAndDelay_WithIFileSystemHandlerThrows_ReturnsFalse() { // Assign var staticMappingHandlerMock = new Mock(); staticMappingHandlerMock.Setup(m => m.ReadMappingFile(It.IsAny())).Throws(); // Act - Check.ThatCode(() => FileHelper.ReadAllTextWithRetryAndDelay(staticMappingHandlerMock.Object, @"c:\temp")).Throws(); + bool result = FileHelper.TryReadMappingFileWithRetryAndDelay(staticMappingHandlerMock.Object, @"c:\temp", out string value); + + // Assert + result.Should().BeFalse(); + value.Should().BeNull(); // Verify staticMappingHandlerMock.Verify(m => m.ReadMappingFile(@"c:\temp"), Times.Exactly(3));