diff --git a/WireMock.Net Solution.sln.DotSettings b/WireMock.Net Solution.sln.DotSettings index 5504e424..448c9dfd 100644 --- a/WireMock.Net Solution.sln.DotSettings +++ b/WireMock.Net Solution.sln.DotSettings @@ -30,5 +30,6 @@ True True True + True True \ No newline at end of file diff --git a/examples/WireMock.Net.Console.NETCoreApp/Program.cs b/examples/WireMock.Net.Console.NETCoreApp/Program.cs index e5f99e98..e486bf16 100644 --- a/examples/WireMock.Net.Console.NETCoreApp/Program.cs +++ b/examples/WireMock.Net.Console.NETCoreApp/Program.cs @@ -1,22 +1,21 @@ -using System.IO; +using System.IO; using System.Reflection; using log4net; using log4net.Config; using log4net.Repository; using WireMock.Net.ConsoleApplication; -namespace WireMock.Net.Console.NETCoreApp +namespace WireMock.Net.Console.NETCoreApp; + +static class Program { - static class Program + private static readonly ILoggerRepository LogRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); + private static readonly ILog Log = LogManager.GetLogger(typeof(Program)); + + static void Main(params string[] args) { - private static readonly ILoggerRepository LogRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); - private static readonly ILog Log = LogManager.GetLogger(typeof(Program)); + XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config")); - static void Main(params string[] args) - { - XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config")); - - MainApp.Run(); - } + MainApp.Run(); } } \ No newline at end of file diff --git a/examples/WireMock.Net.Console.Net452.Classic/Program.cs b/examples/WireMock.Net.Console.Net452.Classic/Program.cs index c143a0f3..b6314fc2 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/Program.cs +++ b/examples/WireMock.Net.Console.Net452.Classic/Program.cs @@ -1,15 +1,14 @@ -using System.IO; +using System.IO; using log4net.Config; -namespace WireMock.Net.ConsoleApplication -{ - static class Program - { - static void Main(params string[] args) - { - XmlConfigurator.Configure(new FileInfo("log4net.config")); +namespace WireMock.Net.ConsoleApplication; - MainApp.Run(); - } +static class Program +{ + static void Main(params string[] args) + { + XmlConfigurator.Configure(new FileInfo("log4net.config")); + + MainApp.Run(); } } \ No newline at end of file diff --git a/examples/WireMock.Net.Console.Net452.Classic/WireMock.Net.Console.Net452.Classic.csproj b/examples/WireMock.Net.Console.Net452.Classic/WireMock.Net.Console.Net452.Classic.csproj index 5e8d72e8..c7e4e9b8 100644 --- a/examples/WireMock.Net.Console.Net452.Classic/WireMock.Net.Console.Net452.Classic.csproj +++ b/examples/WireMock.Net.Console.Net452.Classic/WireMock.Net.Console.Net452.Classic.csproj @@ -80,7 +80,6 @@ Designer - PreserveNewest diff --git a/examples/WireMock.Net.StandAlone.Net452/Program.cs b/examples/WireMock.Net.StandAlone.Net452/Program.cs index ff2acda3..c7d8b60f 100644 --- a/examples/WireMock.Net.StandAlone.Net452/Program.cs +++ b/examples/WireMock.Net.StandAlone.Net452/Program.cs @@ -1,27 +1,26 @@ -using System; -using System.IO; -using System.Linq; -using log4net.Config; -using WireMock.Server; -using WireMock.Settings; - -namespace WireMock.Net.StandAlone.Net452 -{ - public class Program - { - static void Main(params string[] args) - { - XmlConfigurator.Configure(new FileInfo("log4net.config")); - - if (WireMockServerSettingsParser.TryParseArguments(args, out var settings)) - { - settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); +using System; +using System.IO; +using System.Linq; +using log4net.Config; +using WireMock.Server; +using WireMock.Settings; - WireMockServer.Start(settings); +namespace WireMock.Net.StandAlone.Net452; - Console.WriteLine("Press any key to stop the server"); - Console.ReadKey(); - } - } - } +public class Program +{ + static void Main(params string[] args) + { + XmlConfigurator.Configure(new FileInfo("log4net.config")); + + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings)) + { + Console.WriteLine("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + + WireMockServer.Start(settings); + + Console.WriteLine("Press any key to stop the server"); + Console.ReadKey(); + } + } } \ No newline at end of file diff --git a/examples/WireMock.Net.StandAlone.Net461/Program.cs b/examples/WireMock.Net.StandAlone.Net461/Program.cs index 172aed7f..69f76045 100644 --- a/examples/WireMock.Net.StandAlone.Net461/Program.cs +++ b/examples/WireMock.Net.StandAlone.Net461/Program.cs @@ -1,23 +1,22 @@ -using System; -using System.Linq; -using WireMock.Server; -using WireMock.Settings; - -namespace WireMock.Net.StandAlone.Net461 -{ - static class Program - { - static void Main(string[] args) - { - if (WireMockServerSettingsParser.TryParseArguments(args, out var settings)) - { - settings.Logger.Debug("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); +using System; +using System.Linq; +using WireMock.Server; +using WireMock.Settings; - WireMockServer.Start(settings); +namespace WireMock.Net.StandAlone.Net461; - Console.WriteLine("Press any key to stop the server"); - Console.ReadKey(); - } - } - } +static class Program +{ + static void Main(string[] args) + { + if (WireMockServerSettingsParser.TryParseArguments(args, out var settings)) + { + Console.WriteLine("WireMock.Net server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'"))); + + WireMockServer.Start(settings); + + Console.WriteLine("Press any key to stop the server"); + Console.ReadKey(); + } + } } \ No newline at end of file diff --git a/src/WireMock.Net/Http/WebhookSender.cs b/src/WireMock.Net/Http/WebhookSender.cs index 45a6e454..20c6a949 100644 --- a/src/WireMock.Net/Http/WebhookSender.cs +++ b/src/WireMock.Net/Http/WebhookSender.cs @@ -25,9 +25,10 @@ internal class WebhookSender _settings = Guard.NotNull(settings); } - public Task SendAsync(HttpClient client, IWebhookRequest request, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage) + public Task SendAsync(HttpClient client, IMapping mapping, IWebhookRequest request, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage) { Guard.NotNull(client); + Guard.NotNull(mapping); Guard.NotNull(request); Guard.NotNull(originalRequestMessage); Guard.NotNull(originalResponseMessage); @@ -54,7 +55,7 @@ internal class WebhookSender throw new NotImplementedException($"TransformerType '{request.TransformerType}' is not supported."); } - (bodyData, headers) = responseMessageTransformer.Transform(originalRequestMessage, originalResponseMessage, request.BodyData, request.Headers, request.TransformerReplaceNodeOptions); + (bodyData, headers) = responseMessageTransformer.Transform(mapping, originalRequestMessage, originalResponseMessage, request.BodyData, request.Headers, request.TransformerReplaceNodeOptions); } else { diff --git a/src/WireMock.Net/Mapping.cs b/src/WireMock.Net/Mapping.cs index a981fa80..3c404a21 100644 --- a/src/WireMock.Net/Mapping.cs +++ b/src/WireMock.Net/Mapping.cs @@ -15,14 +15,14 @@ public class Mapping : IMapping /// public Guid Guid { get; } - /// - public string? Title { get; } + /// + public string? Title { get; } - /// - public string? Description { get; } + /// + public string? Description { get; } - /// - public string? Path { get; set; } + /// + public string? Path { get; set; } /// public int Priority { get; } @@ -115,16 +115,16 @@ public class Mapping : IMapping TimeSettings = timeSettings; } - /// - public Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage) - { - return Provider.ProvideResponseAsync(requestMessage, Settings); - } + /// + public Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage) + { + return Provider.ProvideResponseAsync(this, requestMessage, Settings); + } - /// - public IRequestMatchResult GetRequestMatchResult(IRequestMessage requestMessage, string? nextState) - { - var result = new RequestMatchResult(); + /// + public IRequestMatchResult GetRequestMatchResult(IRequestMessage requestMessage, string? nextState) + { + var result = new RequestMatchResult(); RequestMatcher.GetMatchingScore(requestMessage, result); diff --git a/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs b/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs index 2c8e97b4..1594bfcd 100644 --- a/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs +++ b/src/WireMock.Net/Owin/IWireMockMiddlewareOptions.cs @@ -4,12 +4,12 @@ using WireMock.Handlers; using WireMock.Logging; using WireMock.Matchers; using WireMock.Util; -using WireMock.Types; #if !USE_ASPNETCORE using Owin; #else using IAppBuilder = Microsoft.AspNetCore.Builder.IApplicationBuilder; using Microsoft.Extensions.DependencyInjection; +using WireMock.Types; #endif namespace WireMock.Owin; diff --git a/src/WireMock.Net/Owin/WireMockMiddleware.cs b/src/WireMock.Net/Owin/WireMockMiddleware.cs index 5bbb9097..c00dd708 100644 --- a/src/WireMock.Net/Owin/WireMockMiddleware.cs +++ b/src/WireMock.Net/Owin/WireMockMiddleware.cs @@ -26,7 +26,7 @@ namespace WireMock.Owin { internal class WireMockMiddleware : OwinMiddleware { - private readonly object _lock = new object(); + private readonly object _lock = new(); private static readonly Task CompletedTask = Task.FromResult(false); private readonly IWireMockMiddlewareOptions _options; private readonly IOwinRequestMapper _requestMapper; @@ -108,10 +108,10 @@ namespace WireMock.Owin logRequest = targetMapping.LogMapping; - if (targetMapping.IsAdminInterface && _options.AuthenticationMatcher != null) + if (targetMapping.IsAdminInterface && _options.AuthenticationMatcher != null && request.Headers != null) { bool present = request.Headers.TryGetValue(HttpKnownHeaderNames.Authorization, out WireMockList authorization); - if (!present || _options.AuthenticationMatcher.IsMatch(authorization.ToString()) < MatchScores.Perfect) + if (!present || _options.AuthenticationMatcher.IsMatch(authorization!.ToString()) < MatchScores.Perfect) { _options.Logger.Error("HttpStatusCode set to 401"); response = ResponseMessageBuilder.Create(null, HttpStatusCode.Unauthorized); @@ -208,7 +208,7 @@ namespace WireMock.Owin try { - await webhookSender.SendAsync(httpClientForWebhook, mapping.Webhooks[index].Request, request, response).ConfigureAwait(false); + await webhookSender.SendAsync(httpClientForWebhook, mapping, mapping.Webhooks[index].Request, request, response).ConfigureAwait(false); } catch (Exception ex) { diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 871e277e..194e1e69 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -244,7 +244,7 @@ public partial class Response : IResponseBuilder } /// - public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage, WireMockServerSettings settings) + public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings) { Guard.NotNull(requestMessage); Guard.NotNull(settings); @@ -327,7 +327,7 @@ public partial class Response : IResponseBuilder throw new NotImplementedException($"TransformerType '{TransformerType}' is not supported."); } - return (responseMessageTransformer.Transform(requestMessage, responseMessage, UseTransformerForBodyAsFile, TransformerReplaceNodeOptions), null); + return (responseMessageTransformer.Transform(mapping, requestMessage, responseMessage, UseTransformerForBodyAsFile, TransformerReplaceNodeOptions), null); } if (!UseTransformer && ResponseMessage.BodyData?.BodyAsFileIsCached == true) diff --git a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs index e2e8f949..c70a06d5 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs @@ -13,7 +13,7 @@ internal class DynamicAsyncResponseProvider : IResponseProvider _responseMessageFunc = responseMessageFunc; } - public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage, WireMockServerSettings settings) + public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings) { return (await _responseMessageFunc(requestMessage).ConfigureAwait(false), null); } diff --git a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs index 4d2b62ff..ecf0bda9 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs @@ -13,7 +13,7 @@ internal class DynamicResponseProvider : IResponseProvider _responseMessageFunc = responseMessageFunc; } - public Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage, WireMockServerSettings settings) + public Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings) { (IResponseMessage responseMessage, IMapping? mapping) result = (_responseMessageFunc(requestMessage), null); return Task.FromResult(result); diff --git a/src/WireMock.Net/ResponseProviders/IResponseProvider.cs b/src/WireMock.Net/ResponseProviders/IResponseProvider.cs index 49cd6b79..61e136a5 100644 --- a/src/WireMock.Net/ResponseProviders/IResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/IResponseProvider.cs @@ -13,8 +13,9 @@ public interface IResponseProvider /// /// The provide response. /// + /// The used mapping. /// The request. /// The WireMockServerSettings. /// The including a new (optional) . - Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage, WireMockServerSettings settings); + Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings); } \ No newline at end of file diff --git a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs index d221ca74..9aab9602 100644 --- a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs @@ -15,7 +15,7 @@ internal class ProxyAsyncResponseProvider : IResponseProvider _settings = settings; } - public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IRequestMessage requestMessage, WireMockServerSettings settings) + public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(IMapping mapping, IRequestMessage requestMessage, WireMockServerSettings settings) { return (await _responseMessageFunc(requestMessage, _settings).ConfigureAwait(false), null); } diff --git a/src/WireMock.Net/ScenarioState.cs b/src/WireMock.Net/ScenarioState.cs index d4671471..2c7f57a8 100644 --- a/src/WireMock.Net/ScenarioState.cs +++ b/src/WireMock.Net/ScenarioState.cs @@ -1,33 +1,32 @@ -namespace WireMock +namespace WireMock; + +/// +/// The ScenarioState +/// +public class ScenarioState { /// - /// The ScenarioState + /// Gets or sets the Name (from the Scenario). /// - public class ScenarioState - { - /// - /// Gets or sets the Name (from the Scenario). - /// - public string Name { get; set; } + public string? Name { get; set; } - /// - /// Gets or sets the NextState. - /// - public string NextState { get; set; } + /// + /// Gets or sets the NextState. + /// + public string? NextState { get; set; } - /// - /// Gets or sets a value indicating whether this is started. - /// - public bool Started { get; set; } + /// + /// Gets or sets a value indicating whether this is started. + /// + public bool Started { get; set; } - /// - /// Gets or sets a value indicating whether this is finished. - /// - public bool Finished { get; set; } + /// + /// Gets or sets a value indicating whether this is finished. + /// + public bool Finished { get; set; } - /// - /// Gets or sets the state counter. - /// - public int Counter { get; set; } - } + /// + /// Gets or sets the state counter. + /// + public int Counter { get; set; } } \ No newline at end of file diff --git a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs index 47e4f948..b812893a 100644 --- a/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs +++ b/src/WireMock.Net/Settings/WireMockServerSettingsParser.cs @@ -21,7 +21,7 @@ public static class WireMockServerSettingsParser [PublicAPI] public static bool TryParseArguments(string[] args, [NotNullWhen(true)] out WireMockServerSettings? settings, IWireMockLogger? logger = null) { - Guard.HasNoNulls(args, nameof(args)); + Guard.HasNoNulls(args); var parser = new SimpleCommandLineParser(); parser.Parse(args); @@ -68,8 +68,7 @@ public static class WireMockServerSettingsParser { settings.Logger = logger; } - - if (parser.GetStringValue("WireMockLogger") == "WireMockConsoleLogger") + else if (parser.GetStringValue("WireMockLogger") == "WireMockConsoleLogger") { settings.Logger = new WireMockConsoleLogger(); } diff --git a/src/WireMock.Net/Transformers/ITransformer.cs b/src/WireMock.Net/Transformers/ITransformer.cs index 293b3562..69ecf3c9 100644 --- a/src/WireMock.Net/Transformers/ITransformer.cs +++ b/src/WireMock.Net/Transformers/ITransformer.cs @@ -6,7 +6,7 @@ namespace WireMock.Transformers; interface ITransformer { - ResponseMessage Transform(IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options); + ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options); - (IBodyData? BodyData, IDictionary>? Headers) Transform(IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, IBodyData? bodyData, IDictionary>? headers, ReplaceNodeOptions options); + (IBodyData? BodyData, IDictionary>? Headers) Transform(IMapping mapping, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, IBodyData? bodyData, IDictionary>? headers, ReplaceNodeOptions options); } \ No newline at end of file diff --git a/src/WireMock.Net/Transformers/Transformer.cs b/src/WireMock.Net/Transformers/Transformer.cs index cac3ca85..73e3a303 100644 --- a/src/WireMock.Net/Transformers/Transformer.cs +++ b/src/WireMock.Net/Transformers/Transformer.cs @@ -19,6 +19,7 @@ internal class Transformer : ITransformer } public (IBodyData? BodyData, IDictionary>? Headers) Transform( + IMapping mapping, IRequestMessage originalRequestMessage, IResponseMessage originalResponseMessage, IBodyData? bodyData, @@ -29,6 +30,7 @@ internal class Transformer : ITransformer var model = new { + mapping, request = originalRequestMessage, response = originalResponseMessage }; @@ -42,7 +44,7 @@ internal class Transformer : ITransformer return (newBodyData, TransformHeaders(transformerContext, model, headers)); } - public ResponseMessage Transform(IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options) + public ResponseMessage Transform(IMapping mapping, IRequestMessage requestMessage, IResponseMessage original, bool useTransformerForBodyAsFile, ReplaceNodeOptions options) { var transformerContext = _factory.Create(); @@ -50,6 +52,7 @@ internal class Transformer : ITransformer var model = new { + mapping, request = requestMessage }; @@ -82,22 +85,15 @@ internal class Transformer : ITransformer return responseMessage; } - private static IBodyData TransformBodyData(ITransformerContext transformerContext, ReplaceNodeOptions options, object model, IBodyData original, bool useTransformerForBodyAsFile) + private static IBodyData? TransformBodyData(ITransformerContext transformerContext, ReplaceNodeOptions options, object model, IBodyData original, bool useTransformerForBodyAsFile) { - switch (original?.DetectedBodyType) + return original.DetectedBodyType switch { - case BodyType.Json: - return TransformBodyAsJson(transformerContext, options, model, original); - - case BodyType.File: - return TransformBodyAsFile(transformerContext, model, original, useTransformerForBodyAsFile); - - case BodyType.String: - return TransformBodyAsString(transformerContext, model, original); - - default: - return null; - } + BodyType.Json => TransformBodyAsJson(transformerContext, options, model, original), + BodyType.File => TransformBodyAsFile(transformerContext, model, original, useTransformerForBodyAsFile), + BodyType.String => TransformBodyAsString(transformerContext, model, original), + _ => null + }; } private static IDictionary> TransformHeaders(ITransformerContext transformerContext, object model, IDictionary>? original) @@ -166,11 +162,17 @@ internal class Transformer : ITransformer { const string property = "_"; JObject dummy = JObject.Parse($"{{ \"{property}\": null }}"); - JToken node = dummy[property]; + if (dummy[property] == null) + { + // TODO: check if just returning null is fine + return string.Empty; + } + + JToken node = dummy[property]!; ReplaceNodeValue(options, node, transformedString); - return dummy[property]; + return dummy[property]!; } return stringValue; diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs index a49eae02..25fcccd3 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs @@ -1,30 +1,31 @@ using System.Threading.Tasks; +using Moq; using NFluent; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseCreateTests { - public class ResponseCreateTests + private readonly WireMockServerSettings _settings = new (); + + [Fact] + public async Task Response_Create_Func() { - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + // Assign + var responseMessage = new ResponseMessage { StatusCode = 500 }; + var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", "::1"); + var mapping = new Mock().Object; - [Fact] - public async Task Response_Create_Func() - { - // Assign - var responseMessage = new ResponseMessage { StatusCode = 500 }; - var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", "::1"); + var responseBuilder = Response.Create(() => responseMessage); - var responseBuilder = Response.Create(() => responseMessage); + // Act + var response = await responseBuilder.ProvideResponseAsync(mapping, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(response.Message).Equals(responseMessage); - } + // Assert + Check.That(response.Message).Equals(responseMessage); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs index 8bae514b..81b083c5 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs @@ -19,11 +19,14 @@ public class ResponseWithBodyTests { private const string ClientIp = "::1"; + private readonly Mock _mappingMock; private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + private readonly WireMockServerSettings _settings = new (); public ResponseWithBodyTests() { + _mappingMock = new Mock(); + _filesystemHandlerMock = new Mock(MockBehavior.Strict); _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); @@ -44,7 +47,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody(new byte[] { 48, 49 }, BodyDestinationFormat.String, Encoding.ASCII); // act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // then Check.That(response.Message.BodyData.BodyAsString).Equals("01"); @@ -66,7 +69,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody(new byte[] { 48, 49 }, BodyDestinationFormat.SameAsSource, Encoding.ASCII); // act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // then Check.That(response.Message.BodyData.BodyAsBytes).ContainsExactly(new byte[] { 48, 49 }); @@ -88,7 +91,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody("test", null, Encoding.ASCII); // act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // then Check.That(response.Message.BodyData.BodyAsString).Equals("test"); @@ -110,7 +113,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBodyAsJson(x, Encoding.ASCII); // act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // then Check.That(response.Message.BodyData.BodyAsJson).Equals(x); @@ -132,7 +135,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBodyAsJson(x, true); // act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // then Check.That(response.Message.BodyData.BodyAsJson).Equals(x); @@ -148,7 +151,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody("r", BodyDestinationFormat.SameAsSource, Encoding.ASCII); // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsBytes).IsNull(); @@ -166,7 +169,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody("r", BodyDestinationFormat.Bytes, Encoding.ASCII); // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsNull(); @@ -184,7 +187,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody("{ \"value\": 42 }", BodyDestinationFormat.Json, Encoding.ASCII); // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsNull(); @@ -206,7 +209,7 @@ public class ResponseWithBodyTests .WithBody(req => $"path: {req.Path}"); // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("path: /test"); @@ -235,7 +238,7 @@ public class ResponseWithBodyTests }); // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // Assert Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("path: /test"); @@ -263,8 +266,8 @@ public class ResponseWithBodyTests .WithTransformer(); // Act - var response1 = await responseBuilder.ProvideResponseAsync(request1, _settings).ConfigureAwait(false); - var response2 = await responseBuilder.ProvideResponseAsync(request2, _settings).ConfigureAwait(false); + var response1 = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request1, _settings).ConfigureAwait(false); + var response2 = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request2, _settings).ConfigureAwait(false); // Assert Check.That(((JToken)response1.Message.BodyData.BodyAsJson).SelectToken("id")?.Value()).IsEqualTo(request1Id); @@ -288,7 +291,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithStatusCode(200).WithBody(fileContents); - var response = await responseBuilder.ProvideResponseAsync(request1, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request1, _settings).ConfigureAwait(false); Check.That(response.Message.StatusCode).IsEqualTo(200); Check.That(response.Message.BodyData.BodyAsString).Contains(fileContents); @@ -304,7 +307,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithStatusCode(200).WithBody(fileContents); - var response = await responseBuilder.ProvideResponseAsync(request1, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request1, _settings).ConfigureAwait(false); Check.That(response.Message.StatusCode).IsEqualTo(200); Check.That(response.Message.BodyData.BodyAsString).Contains(fileContents); @@ -320,7 +323,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithStatusCode(200).WithBody("File deleted."); - var response = await responseBuilder.ProvideResponseAsync(request1, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request1, _settings).ConfigureAwait(false); Check.That(response.Message.StatusCode).IsEqualTo(200); Check.That(response.Message.BodyData.BodyAsString).Contains("File deleted."); @@ -341,7 +344,7 @@ public class ResponseWithBodyTests var responseBuilder = Response.Create().WithBody(new { foo = "bar", n = 42 }, new JsonConverter.System.Text.Json.SystemTextJsonConverter()); // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); // Assert response.Message.BodyData!.BodyAsString.Should().Be(@"{""foo"":""bar"",""n"":42}"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs index cba83e86..ac1413a8 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs @@ -11,59 +11,37 @@ using WireMock.Types; using WireMock.Util; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithCallbackTests { - public class ResponseWithCallbackTests + private const string ClientIp = "::1"; + + private readonly Mock _mappingMock; + private readonly Mock _filesystemHandlerMock; + private readonly WireMockServerSettings _settings = new(); + + public ResponseWithCallbackTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + _filesystemHandlerMock = new Mock(MockBehavior.Strict); + _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithCallbackTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + _settings.FileSystemHandler = _filesystemHandlerMock.Object; + } - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } + [Fact] + public async Task Response_WithCallbackAsync() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var responseBuilder = Response.Create() + .WithCallback(async request => + { + await Task.Delay(1); - [Fact] - public async Task Response_WithCallbackAsync() - { - // Assign - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var responseBuilder = Response.Create() - .WithCallback(async request => - { - await Task.Delay(1); - - return new ResponseMessage - { - BodyData = new BodyData - { - DetectedBodyType = BodyType.String, - BodyAsString = request.Path + "Bar" - }, - StatusCode = 302 - }; - }); - - // Act - var response = await responseBuilder.ProvideResponseAsync(requestMessage, _settings).ConfigureAwait(false); - - // Assert - response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); - response.Message.StatusCode.Should().Be(302); - } - - [Fact] - public async Task Response_WithCallback() - { - // Assign - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var responseBuilder = Response.Create() - .WithCallback(request => new ResponseMessage + return new ResponseMessage { BodyData = new BodyData { @@ -71,101 +49,125 @@ namespace WireMock.Net.Tests.ResponseBuilders BodyAsString = request.Path + "Bar" }, StatusCode = 302 - }); + }; + }); - // Act - var response = await responseBuilder.ProvideResponseAsync(requestMessage, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, requestMessage, _settings).ConfigureAwait(false); - // Assert - response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); - response.Message.StatusCode.Should().Be(302); - } + // Assert + response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); + response.Message.StatusCode.Should().Be(302); + } - [Fact] - public async Task Response_WithCallback_ShouldUseStatusCodeAndHeaderInTheCallback() - { - // Assign - var header = "X-UserId"; - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var responseBuilder = Response.Create() - .WithCallback(request => new ResponseMessage + [Fact] + public async Task Response_WithCallback() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var responseBuilder = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData { - BodyData = new BodyData - { - DetectedBodyType = BodyType.String, - BodyAsString = request.Path + "Bar" - }, - StatusCode = HttpStatusCode.Accepted, - Headers = new Dictionary> - { - { header, new WireMockList("Stef") } - } - }); + DetectedBodyType = BodyType.String, + BodyAsString = request.Path + "Bar" + }, + StatusCode = 302 + }); - // Act - var response = await responseBuilder.ProvideResponseAsync(requestMessage, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, requestMessage, _settings).ConfigureAwait(false); - // Assert - response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); - response.Message.StatusCode.Should().Be(HttpStatusCode.Accepted); - response.Message.Headers[header].Should().ContainSingle("Stef"); - } + // Assert + response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); + response.Message.StatusCode.Should().Be(302); + } - [Fact] - public async Task Response_WithCallback_And_Additional_WithStatusCode_And_WithHeader_ShouldUseAdditional() - { - // Assign - var header = "X-UserId"; - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var responseBuilder = Response.Create() - .WithCallback(request => new ResponseMessage + [Fact] + public async Task Response_WithCallback_ShouldUseStatusCodeAndHeaderInTheCallback() + { + // Assign + var header = "X-UserId"; + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var responseBuilder = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData { - BodyData = new BodyData - { - DetectedBodyType = BodyType.String, - BodyAsString = request.Path + "Bar" - }, - StatusCode = HttpStatusCode.NotFound, - Headers = new Dictionary> - { - { header, new WireMockList("NA") } - } - }) - .WithStatusCode(HttpStatusCode.Accepted) - .WithHeader(header, "Stef"); - - // Act - var response = await responseBuilder.ProvideResponseAsync(requestMessage, _settings).ConfigureAwait(false); - - // Assert - response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); - response.Message.StatusCode.Should().Be((int) HttpStatusCode.Accepted); - response.Message.Headers[header].Should().ContainSingle("Stef"); - } - - [Fact] - public async Task Response_WithCallback_And_UseTransformer_Is_True() - { - // Assign - var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); - var responseBuilder = Response.Create() - .WithCallback(request => new ResponseMessage + DetectedBodyType = BodyType.String, + BodyAsString = request.Path + "Bar" + }, + StatusCode = HttpStatusCode.Accepted, + Headers = new Dictionary> { - BodyData = new BodyData - { - DetectedBodyType = BodyType.String, - BodyAsString = "{{request.Path}}Bar" - }, - StatusCode = 302 - }) - .WithTransformer(); + { header, new WireMockList("Stef") } + } + }); - // Act - var response = await responseBuilder.ProvideResponseAsync(requestMessage, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, requestMessage, _settings).ConfigureAwait(false); - // Assert - response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); - response.Message.StatusCode.Should().Be(302); - } + // Assert + response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); + response.Message.StatusCode.Should().Be(HttpStatusCode.Accepted); + response.Message.Headers[header].Should().ContainSingle("Stef"); + } + + [Fact] + public async Task Response_WithCallback_And_Additional_WithStatusCode_And_WithHeader_ShouldUseAdditional() + { + // Assign + var header = "X-UserId"; + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var responseBuilder = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = request.Path + "Bar" + }, + StatusCode = HttpStatusCode.NotFound, + Headers = new Dictionary> + { + { header, new WireMockList("NA") } + } + }) + .WithStatusCode(HttpStatusCode.Accepted) + .WithHeader(header, "Stef"); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, requestMessage, _settings).ConfigureAwait(false); + + // Assert + response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); + response.Message.StatusCode.Should().Be((int)HttpStatusCode.Accepted); + response.Message.Headers[header].Should().ContainSingle("Stef"); + } + + [Fact] + public async Task Response_WithCallback_And_UseTransformer_Is_True() + { + // Assign + var requestMessage = new RequestMessage(new UrlDetails("http://localhost/foo"), "GET", "::1"); + var responseBuilder = Response.Create() + .WithCallback(request => new ResponseMessage + { + BodyData = new BodyData + { + DetectedBodyType = BodyType.String, + BodyAsString = "{{request.Path}}Bar" + }, + StatusCode = 302 + }) + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, requestMessage, _settings).ConfigureAwait(false); + + // Assert + response.Message.BodyData.BodyAsString.Should().Be("/fooBar"); + response.Message.StatusCode.Should().Be(302); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithFaultTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithFaultTests.cs index 119b4949..f7491517 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithFaultTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithFaultTests.cs @@ -1,48 +1,55 @@ using System.Threading.Tasks; using FluentAssertions; +using Moq; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithFaultTests { - public class ResponseWithFaultTests + private readonly WireMockServerSettings _settings = new(); + private const string ClientIp = "::1"; + + private readonly Mock _mappingMock; + + public ResponseWithFaultTests() { - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); - private const string ClientIp = "::1"; - - [Theory] - [InlineData(FaultType.EMPTY_RESPONSE)] - [InlineData(FaultType.MALFORMED_RESPONSE_CHUNK)] - public async Task Response_ProvideResponse_WithFault(FaultType faultType) - { - // Arrange - var request = new RequestMessage(new UrlDetails("http://localhost/fault"), "GET", ClientIp); - - // Act - var responseBuilder = Response.Create().WithFault(faultType); - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - response.Message.FaultType.Should().Be(faultType); - response.Message.FaultPercentage.Should().BeNull(); - } - - [Theory] - [InlineData(FaultType.EMPTY_RESPONSE, 0.5)] - public async Task Response_ProvideResponse_WithFault_IncludingPercentage(FaultType faultType, double percentage) - { - // Arrange - var request = new RequestMessage(new UrlDetails("http://localhost/fault"), "GET", ClientIp); - - // Act - var responseBuilder = Response.Create().WithFault(faultType, percentage); - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - response.Message.FaultType.Should().Be(faultType); - response.Message.FaultPercentage.Should().Be(percentage); - } + _mappingMock = new Mock(); } -} + + [Theory] + [InlineData(FaultType.EMPTY_RESPONSE)] + [InlineData(FaultType.MALFORMED_RESPONSE_CHUNK)] + public async Task Response_ProvideResponse_WithFault(FaultType faultType) + { + // Arrange + var request = new RequestMessage(new UrlDetails("http://localhost/fault"), "GET", ClientIp); + + // Act + var responseBuilder = Response.Create().WithFault(faultType); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + response.Message.FaultType.Should().Be(faultType); + response.Message.FaultPercentage.Should().BeNull(); + } + + [Theory] + [InlineData(FaultType.EMPTY_RESPONSE, 0.5)] + public async Task Response_ProvideResponse_WithFault_IncludingPercentage(FaultType faultType, double percentage) + { + // Arrange + var request = new RequestMessage(new UrlDetails("http://localhost/fault"), "GET", ClientIp); + + // Act + var responseBuilder = Response.Create().WithFault(faultType, percentage); + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + response.Message.FaultType.Should().Be(faultType); + response.Message.FaultPercentage.Should().Be(percentage); + } +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs index dc067f7a..38a82ca2 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs @@ -9,91 +9,94 @@ using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsFileTests { - public class ResponseWithHandlebarsFileTests + private readonly WireMockServerSettings _settings = new(); + private const string ClientIp = "::1"; + + private readonly Mock _mappingMock; + private readonly Mock _filesystemHandlerMock; + + public ResponseWithHandlebarsFileTests() { - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - public ResponseWithHandlebarsFileTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + _filesystemHandlerMock = new Mock(MockBehavior.Strict); + _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } + _settings.FileSystemHandler = _filesystemHandlerMock.Object; + } - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_File() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_File() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Data = "{{File \"x.json\"}}" - }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Data = "{{File \"x.json\"}}" + }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Data"].Value()).Equals("abc"); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Data"].Value()).Equals("abc"); - // Verify - _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString("x.json"), Times.Once); - _filesystemHandlerMock.VerifyNoOtherCalls(); - } + // Verify + _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString("x.json"), Times.Once); + _filesystemHandlerMock.VerifyNoOtherCalls(); + } - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_File_Replace() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234?id=x"), "GET", ClientIp); + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_File_Replace() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234?id=x"), "GET", ClientIp); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Data = "{{File \"{{request.query.id}}.json\"}}" - }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Data = "{{File \"{{request.query.id}}.json\"}}" + }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Data"].Value()).Equals("abc"); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Data"].Value()).Equals("abc"); - // Verify - _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString("x.json"), Times.Once); - _filesystemHandlerMock.VerifyNoOtherCalls(); - } + // Verify + _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString("x.json"), Times.Once); + _filesystemHandlerMock.VerifyNoOtherCalls(); + } - [Fact] - public void Response_ProvideResponseAsync_Handlebars_File_WithMissingArgument_Throws_HandlebarsException() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + [Fact] + public void Response_ProvideResponseAsync_Handlebars_File_WithMissingArgument_Throws_HandlebarsException() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Data = "{{File}}" - }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Data = "{{File}}" + }) + .WithTransformer(); - // Act - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); + // Act + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings)).Throws(); - // Verify - _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString(It.IsAny()), Times.Never); - _filesystemHandlerMock.VerifyNoOtherCalls(); - } + // Verify + _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString(It.IsAny()), Times.Never); + _filesystemHandlerMock.VerifyNoOtherCalls(); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHelpersTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHelpersTests.cs index 9d1f91ce..8015aa26 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHelpersTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHelpersTests.cs @@ -9,40 +9,38 @@ using WireMock.Types; using WireMock.Util; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsHelpersTests { - public class ResponseWithHandlebarsHelpersTests + private const string ClientIp = "::1"; + + private readonly WireMockServerSettings _settings = new(); + + public ResponseWithHandlebarsHelpersTests() { - private const string ClientIp = "::1"; + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } - public ResponseWithHandlebarsHelpersTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + [Fact] + public async Task Response_ProvideResponseAsync_HandlebarsHelpers_String_Uppercase() + { + // Assign + var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - [Fact] - public async Task Response_ProvideResponseAsync_HandlebarsHelpers_String_Uppercase() - { - // Assign - var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; + var responseBuilder = Response.Create() + .WithBody("{{String.Uppercase request.body}}") + .WithTransformer(); - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + // Act + var response = await responseBuilder.ProvideResponseAsync(new Mock().Object, request, _settings).ConfigureAwait(false); - var responseBuilder = Response.Create() - .WithBody("{{String.Uppercase request.body}}") - .WithTransformer(); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // assert - Check.That(response.Message.BodyData.BodyAsString).Equals("ABC"); - } + // assert + Check.That(response.Message.BodyData.BodyAsString).Equals("ABC"); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHumanizerTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHumanizerTests.cs index fa06ee04..bd718384 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHumanizerTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsHumanizerTests.cs @@ -9,42 +9,43 @@ using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsHumanizerTests { - public class ResponseWithHandlebarsHumanizerTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithHandlebarsHumanizerTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithHandlebarsHumanizerTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Humanizer() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Humanizer() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Text = string.Format("{{{{[Humanizer.Humanize] \"{0}\" }}}}", "PascalCaseInputStringIsTurnedIntoSentence") + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Text = string.Format("{{{{[Humanizer.Humanize] \"{0}\" }}}}", "PascalCaseInputStringIsTurnedIntoSentence") - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Text"].Value()).IsEqualTo("Pascal case input string is turned into sentence"); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Text"].Value()).IsEqualTo("Pascal case input string is turned into sentence"); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs index 207f74c0..2409df88 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs @@ -13,30 +13,32 @@ using WireMock.Types; using WireMock.Util; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsJsonPathTests { - public class ResponseWithHandlebarsJsonPathTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithHandlebarsJsonPathTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithHandlebarsJsonPathTests() + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Object_ResponseBodyAsJson() + { + // Assign + var body = new BodyData { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Object_ResponseBodyAsJson() - { - // Assign - var body = new BodyData - { - BodyAsString = @"{ + BodyAsString = @"{ ""Stores"": [ ""Lambton Quay"", ""Willis Street"" @@ -66,57 +68,57 @@ namespace WireMock.Net.Tests.ResponseBuilders } ] }", - DetectedBodyType = BodyType.String - }; + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { x = "{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { x = "{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}" }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["x"]).IsNotNull(); - Check.That(j["x"]["Name"].ToString()).Equals("Acme Co"); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["x"]).IsNotNull(); + Check.That(j["x"]["Name"].ToString()).Equals("Acme Co"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Number_ResponseBodyAsJson() + [Fact] + public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Number_ResponseBodyAsJson() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "{ \"Price\": 99 }", - DetectedBodyType = BodyType.String - }; + BodyAsString = "{ \"Price\": 99 }", + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { x = "{{JsonPath.SelectToken request.body \"..Price\"}}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { x = "{{JsonPath.SelectToken request.body \"..Price\"}}" }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["x"].Value()).Equals(99); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["x"].Value()).Equals(99); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Request_BodyAsString() + [Fact] + public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Request_BodyAsString() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = @"{ + BodyAsString = @"{ ""Stores"": [ ""Lambton Quay"", ""Willis Street"" @@ -146,30 +148,30 @@ namespace WireMock.Net.Tests.ResponseBuilders } ] }", - DetectedBodyType = BodyType.String - }; + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{{JsonPath.SelectToken request.body \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.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}}}"); - } + // Assert + Check.That(response.Message.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}}}"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Request_BodyAsJObject() + [Fact] + public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectToken_Request_BodyAsJObject() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsJson = JObject.Parse(@"{ + BodyAsJson = JObject.Parse(@"{ 'Stores': [ 'Lambton Quay', 'Willis Street' @@ -199,30 +201,30 @@ namespace WireMock.Net.Tests.ResponseBuilders } ] }"), - DetectedBodyType = BodyType.Json - }; + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{{JsonPath.SelectToken request.bodyAsJson \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{{JsonPath.SelectToken request.bodyAsJson \"$.Manufacturers[?(@.Name == 'Acme Co')]\"}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.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}}}"); - } + // Assert + Check.That(response.Message.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}}}"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Request_BodyAsString() + [Fact] + public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Request_BodyAsString() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = @"{ + BodyAsString = @"{ ""Stores"": [ ""Lambton Quay"", ""Willis Street"" @@ -252,30 +254,30 @@ namespace WireMock.Net.Tests.ResponseBuilders } ] }", - DetectedBodyType = BodyType.String - }; + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{{#JsonPath.SelectTokens request.body \"$..Products[?(@.Price >= 50)].Name\"}}{{#each this}}%{{@index}}:{{this}}%{{/each}}{{/JsonPath.SelectTokens}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{{#JsonPath.SelectTokens request.body \"$..Products[?(@.Price >= 50)].Name\"}}{{#each this}}%{{@index}}:{{this}}%{{/each}}{{/JsonPath.SelectTokens}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Request_BodyAsJObject() + [Fact] + public async Task Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Request_BodyAsJObject() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsJson = JObject.Parse(@"{ + BodyAsJson = JObject.Parse(@"{ 'Stores': [ 'Lambton Quay', 'Willis Street' @@ -305,74 +307,73 @@ namespace WireMock.Net.Tests.ResponseBuilders } ] }"), - DetectedBodyType = BodyType.Json - }; + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{{#JsonPath.SelectTokens request.bodyAsJson \"$..Products[?(@.Price >= 50)].Name\"}}{{#each this}}%{{@index}}:{{this}}%{{/each}}{{/JsonPath.SelectTokens}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{{#JsonPath.SelectTokens request.bodyAsJson \"$..Products[?(@.Price >= 50)].Name\"}}{{#each this}}%{{@index}}:{{this}}%{{/each}}{{/JsonPath.SelectTokens}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); + } - [Fact] - public void Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Throws() + [Fact] + public void Response_ProvideResponse_Handlebars_JsonPath_SelectTokens_Throws() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsJson = JObject.Parse(@"{ + BodyAsJson = JObject.Parse(@"{ 'Stores': [ 'Lambton Quay', 'Willis Street' ] }"), - DetectedBodyType = BodyType.Json - }; + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBody("{{#JsonPath.SelectTokens request.body \"$..Products[?(@.Price >= 50)].Name\"}}{{id}} {{value}},{{/JsonPath.SelectTokens}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBody("{{#JsonPath.SelectTokens request.body \"$..Products[?(@.Price >= 50)].Name\"}}{{id}} {{value}},{{/JsonPath.SelectTokens}}") + .WithTransformer(); - // Act - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); - } + // Act + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings)).Throws(); + } - [Fact] - public async Task Response_ProvideResponse_Transformer_WithBodyAsFile_JsonPath() + [Fact] + public async Task Response_ProvideResponse_Transformer_WithBodyAsFile_JsonPath() + { + // Assign + string jsonString = "{ \"MyUniqueNumber\": \"1\" }"; + var bodyData = new BodyData { - // 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); + 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 responseBuilder = Response.Create() - .WithTransformer() - .WithBodyFromFile(@"c:\\{{JsonPath.SelectToken request.body " + jsonPath + "}}\\test.json"); // why use a \\ here ? + string jsonPath = "\"$.MyUniqueNumber\""; + var responseBuilder = Response.Create() + .WithTransformer() + .WithBodyFromFile(@"c:\\{{JsonPath.SelectToken request.body " + jsonPath + "}}\\test.json"); // why use a \\ here ? - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.json"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.json"); } } \ 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 427ed442..51d794df 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs @@ -13,237 +13,239 @@ using WireMock.Types; using WireMock.Util; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsLinqTests { - public class ResponseWithHandlebarsLinqTests + private readonly WireMockServerSettings _settings = new(); + + private Mock mappingMock; + + public ResponseWithHandlebarsLinqTests() { - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + mappingMock = new Mock(); - public ResponseWithHandlebarsLinqTests() + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_Linq1_String0() + { + // Assign + var body = new BodyData(); + + var request = new RequestMessage(new UrlDetails("http://localhost:1234/pathtest"), "POST", "::1", body); + + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { x = "{{Linq request.Path 'it'}}" }) + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["x"]).IsNotNull(); + Check.That(j["x"].ToString()).Equals("/pathtest"); + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_Linq1_String1() + { + // Assign + var body = new BodyData { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_Linq1_String0() - { - // Assign - var body = new BodyData(); - - var request = new RequestMessage(new UrlDetails("http://localhost:1234/pathtest"), "POST", "::1", body); - - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { x = "{{Linq request.Path 'it'}}" }) - .WithTransformer(); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["x"]).IsNotNull(); - Check.That(j["x"].ToString()).Equals("/pathtest"); - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_Linq1_String1() - { - // Assign - var body = new BodyData + BodyAsJson = new JObject { - BodyAsJson = new JObject - { - { "Id", new JValue(9) }, - { "Name", new JValue("Test") } - }, - DetectedBodyType = BodyType.Json - }; + { "Id", new JValue(9) }, + { "Name", new JValue("Test") } + }, + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson 'it.Name + \"_123\"' }}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson 'it.Name + \"_123\"' }}" }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["x"]).IsNotNull(); - Check.That(j["x"].ToString()).Equals("Test_123"); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["x"]).IsNotNull(); + Check.That(j["x"].ToString()).Equals("Test_123"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_Linq1_String2() + [Fact] + public async Task Response_ProvideResponse_Handlebars_Linq1_String2() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData + BodyAsJson = new JObject { - BodyAsJson = new JObject - { - { "Id", new JValue(9) }, - { "Name", new JValue("Test") } - }, - DetectedBodyType = BodyType.Json - }; + { "Id", new JValue(9) }, + { "Name", new JValue("Test") } + }, + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson 'new(it.Name + \"_123\" as N, it.Id as I)' }}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson 'new(it.Name + \"_123\" as N, it.Id as I)' }}" }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["x"]).IsNotNull(); - Check.That(j["x"].ToString()).Equals("{ N = Test_123, I = 9 }"); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["x"]).IsNotNull(); + Check.That(j["x"].ToString()).Equals("{ N = Test_123, I = 9 }"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_Linq2_Object() + [Fact] + public async Task Response_ProvideResponse_Handlebars_Linq2_Object() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData + BodyAsJson = new JObject { - BodyAsJson = new JObject - { - { "Id", new JValue(9) }, - { "Name", new JValue("Test") } - }, - DetectedBodyType = BodyType.Json - }; + { "Id", new JValue(9) }, + { "Name", new JValue("Test") } + }, + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/json") - .WithBodyAsJson(new { x = "{{#Linq request.bodyAsJson 'new(it.Name + \"_123\" as N, it.Id as I)' }}{{this}}{{/Linq}}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/json") + .WithBodyAsJson(new { x = "{{#Linq request.bodyAsJson 'new(it.Name + \"_123\" as N, it.Id as I)' }}{{this}}{{/Linq}}" }) + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["x"]).IsNotNull(); - Check.That(j["x"].ToString()).Equals("{ N = Test_123, I = 9 }"); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["x"]).IsNotNull(); + Check.That(j["x"].ToString()).Equals("{ N = Test_123, I = 9 }"); + } - [Fact] - public void Response_ProvideResponse_Handlebars_Linq_Throws_ArgumentException() + [Fact] + public void Response_ProvideResponse_Handlebars_Linq_Throws_ArgumentException() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData + BodyAsJson = new { x = "x" }, + DetectedBodyType = BodyType.Json + }; + + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + + var responseBuilder = Response.Create() + .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson 1}}" }) + .WithTransformer(); + + // Act + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings)).Throws(); + } + + [Fact] + public void Response_ProvideResponse_Handlebars_Linq1_Throws_ArgumentNullException() + { + // Assign + var body = new BodyData(); + + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + + var responseBuilder = Response.Create() + .WithBodyAsJson(new { x = "{{Linq request.body 'Name'}}" }) + .WithTransformer(); + + // Act + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings)).Throws(); + } + + [Fact] + public void Response_ProvideResponse_Handlebars_Linq1_Throws_HandlebarsException() + { + // Assign + var body = new BodyData(); + + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + + var responseBuilder = Response.Create() + .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson}} ''" }) + .WithTransformer(); + + // Act + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings)).Throws(); + } + + [Fact] + public void Response_ProvideResponse_Handlebars_Linq1_ParseError_Throws_ExceptionMessage() + { + // Assign + var body = new BodyData + { + BodyAsJson = new JObject { - BodyAsJson = new { x = "x" }, - DetectedBodyType = BodyType.Json - }; + { "Id", new JValue(9) }, + { "Name", new JValue("Test") } + }, + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - var responseBuilder = Response.Create() - .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson 1}}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson '---' }}" }) + .WithTransformer(); - // Act - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); - } + // Act + Func a = async () => await responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings).ConfigureAwait(false); - [Fact] - public void Response_ProvideResponse_Handlebars_Linq1_Throws_ArgumentNullException() + // Assert + a.Should().ThrowAsync(); + } + + [Fact] + public void Response_ProvideResponse_Handlebars_Linq2_ParseError_Throws_ExceptionMessage() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData(); - - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - - var responseBuilder = Response.Create() - .WithBodyAsJson(new { x = "{{Linq request.body 'Name'}}" }) - .WithTransformer(); - - // Act - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); - } - - [Fact] - public void Response_ProvideResponse_Handlebars_Linq1_Throws_HandlebarsException() - { - // Assign - var body = new BodyData(); - - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - - var responseBuilder = Response.Create() - .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson}} ''" }) - .WithTransformer(); - - // Act - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); - } - - [Fact] - public void Response_ProvideResponse_Handlebars_Linq1_ParseError_Throws_ExceptionMessage() - { - // Assign - var body = new BodyData + BodyAsJson = new JObject { - BodyAsJson = new JObject - { - { "Id", new JValue(9) }, - { "Name", new JValue("Test") } - }, - DetectedBodyType = BodyType.Json - }; + { "Id", new JValue(9) }, + { "Name", new JValue("Test") } + }, + DetectedBodyType = BodyType.Json + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - var responseBuilder = Response.Create() - .WithBodyAsJson(new { x = "{{Linq request.bodyAsJson '---' }}" }) - .WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new { x = "{{#Linq request.bodyAsJson '---' }}{{this}}{{/Linq}}" }) + .WithTransformer(); - // Act - Func a = async () => await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + Func a = async () => await responseBuilder.ProvideResponseAsync(mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - a.Should().ThrowAsync(); - } - - [Fact] - public void Response_ProvideResponse_Handlebars_Linq2_ParseError_Throws_ExceptionMessage() - { - // Assign - var body = new BodyData - { - BodyAsJson = new JObject - { - { "Id", new JValue(9) }, - { "Name", new JValue("Test") } - }, - DetectedBodyType = BodyType.Json - }; - - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); - - var responseBuilder = Response.Create() - .WithBodyAsJson(new { x = "{{#Linq request.bodyAsJson '---' }}{{this}}{{/Linq}}" }) - .WithTransformer(); - - // Act - Func a = async () => await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - a.Should().ThrowAsync(); - } + // Assert + a.Should().ThrowAsync(); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs index 728ab790..df434d0c 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs @@ -10,160 +10,162 @@ using WireMock.Settings; using WireMock.Types; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsRandomTests { - public class ResponseWithHandlebarsRandomTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithHandlebarsRandomTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithHandlebarsRandomTests() - { - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } - _settings.FileSystemHandler = filesystemHandlerMock.Object; - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random1() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Random1() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Text = "{{Random Type=\"Text\" Min=8 Max=20}}", + DateTime = "{{Random Type=\"DateTime\"}}", + Integer = "{{Random Type=\"Integer\" Min=1000 Max=1000}}", + Long = "{{Random Type=\"Long\" Min=77777777 Max=99999999}}" + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Text = "{{Random Type=\"Text\" Min=8 Max=20}}", - DateTime = "{{Random Type=\"DateTime\"}}", - Integer = "{{Random Type=\"Integer\" Min=1000 Max=1000}}", - Long = "{{Random Type=\"Long\" Min=77777777 Max=99999999}}" - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Text"].Value()).IsNotEmpty(); + Check.That(j["Integer"].Value()).IsEqualTo(1000); + Check.That(j["Long"].Value()).IsStrictlyGreaterThan(77777777).And.IsStrictlyLessThan(99999999); + } - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Text"].Value()).IsNotEmpty(); - Check.That(j["Integer"].Value()).IsEqualTo(1000); - Check.That(j["Long"].Value()).IsStrictlyGreaterThan(77777777).And.IsStrictlyLessThan(99999999); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random1_Boolean() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Random1_Boolean() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Value = "{{Random Type=\"Boolean\"}}" + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Value = "{{Random Type=\"Boolean\"}}" - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Value"].Type).IsEqualTo(JTokenType.Boolean); + } - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Value"].Type).IsEqualTo(JTokenType.Boolean); - } + [Theory] + [InlineData(ReplaceNodeOptions.None, JTokenType.Integer)] + //[InlineData(ReplaceNodeOptions.Bool, JTokenType.String)] + //[InlineData(ReplaceNodeOptions.Integer, JTokenType.Integer)] + //[InlineData(ReplaceNodeOptions.Bool | ReplaceNodeOptions.Integer, JTokenType.Integer)] + public async Task Response_ProvideResponseAsync_Handlebars_Random1_Integer(ReplaceNodeOptions options, JTokenType expected) + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Theory] - [InlineData(ReplaceNodeOptions.None, JTokenType.Integer)] - //[InlineData(ReplaceNodeOptions.Bool, JTokenType.String)] - //[InlineData(ReplaceNodeOptions.Integer, JTokenType.Integer)] - //[InlineData(ReplaceNodeOptions.Bool | ReplaceNodeOptions.Integer, JTokenType.Integer)] - public async Task Response_ProvideResponseAsync_Handlebars_Random1_Integer(ReplaceNodeOptions options, JTokenType expected) - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Value = "{{Random Type=\"Integer\"}}" + }) + .WithTransformer(options); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Value = "{{Random Type=\"Integer\"}}" - }) - .WithTransformer(options); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Value"].Type).IsEqualTo(expected); + } - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Value"].Type).IsEqualTo(expected); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random1_Guid() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Random1_Guid() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Guid1 = "{{Random Type=\"Guid\" Uppercase=false}}", + Guid2 = "{{Random Type=\"Guid\"}}" + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Guid1 = "{{Random Type=\"Guid\" Uppercase=false}}", - Guid2 = "{{Random Type=\"Guid\"}}" - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + string guid1 = j["Guid1"].Value(); + Check.That(guid1.ToUpper()).IsNotEqualTo(guid1); + string guid2 = j["Guid2"].Value(); + Check.That(guid2.ToUpper()).IsEqualTo(guid2); + } - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - string guid1 = j["Guid1"].Value(); - Check.That(guid1.ToUpper()).IsNotEqualTo(guid1); - string guid2 = j["Guid2"].Value(); - Check.That(guid2.ToUpper()).IsEqualTo(guid2); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random1_StringList() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Random1_StringList() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + StringValue = "{{Random Type=\"StringList\" Values=[\"a\", \"b\", \"c\"]}}" + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - StringValue = "{{Random Type=\"StringList\" Values=[\"a\", \"b\", \"c\"]}}" - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + string value = j["StringValue"].Value(); + Check.That(new[] { "a", "b", "c" }.Contains(value)).IsTrue(); + } - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - string value = j["StringValue"].Value(); - Check.That(new[] { "a", "b", "c" }.Contains(value)).IsTrue(); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Random2() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Random2() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Integer = "{{#Random Type=\"Integer\" Min=10000000 Max=99999999}}{{this}}{{/Random}}", + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Integer = "{{#Random Type=\"Integer\" Min=10000000 Max=99999999}}{{this}}{{/Random}}", - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Integer"].Value()).IsStrictlyGreaterThan(10000000).And.IsStrictlyLessThan(99999999); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Integer"].Value()).IsStrictlyGreaterThan(10000000).And.IsStrictlyLessThan(99999999); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs index 534fec42..e9969d90 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs @@ -10,113 +10,114 @@ using WireMock.Types; using WireMock.Util; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsRegexTests { - public class ResponseWithHandlebarsRegexTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithHandlebarsRegexTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithHandlebarsRegexTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch() + { + // Assign + var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch() - { - // Assign - var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var responseBuilder = Response.Create() + .WithBody("{{Regex.Match request.body \"^(\\w+)$\"}}") + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBody("{{Regex.Match request.body \"^(\\w+)$\"}}") - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // assert + Check.That(response.Message.BodyData.BodyAsString).Equals("abc"); + } - // assert - Check.That(response.Message.BodyData.BodyAsString).Equals("abc"); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch_NoMatch() + { + // Assign + var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch_NoMatch() - { - // Assign - var body = new BodyData { BodyAsString = "abc", DetectedBodyType = BodyType.String }; + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var responseBuilder = Response.Create() + .WithBody("{{Regex.Match request.body \"^?0$\"}}") + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBody("{{Regex.Match request.body \"^?0$\"}}") - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // assert + Check.That(response.Message.BodyData.BodyAsString).Equals(""); + } - // assert - Check.That(response.Message.BodyData.BodyAsString).Equals(""); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2() + { + // Assign + var body = new BodyData { BodyAsString = "https://localhost:5000/", DetectedBodyType = BodyType.String }; - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2() - { - // Assign - var body = new BodyData { BodyAsString = "https://localhost:5000/", DetectedBodyType = BodyType.String }; + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var responseBuilder = Response.Create() + .WithBody("{{#Regex.Match request.body \"^(?\\w+)://[^/]+?(?\\d+)/?\"}}{{this.port}}-{{this.proto}}{{/Regex.Match}}") + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBody("{{#Regex.Match request.body \"^(?\\w+)://[^/]+?(?\\d+)/?\"}}{{this.port}}-{{this.proto}}{{/Regex.Match}}") - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // assert + Check.That(response.Message.BodyData.BodyAsString).Equals("5000-https"); + } - // assert - Check.That(response.Message.BodyData.BodyAsString).Equals("5000-https"); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2_NoMatch() + { + // Assign + var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String }; - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_RegexMatch2_NoMatch() - { - // Assign - var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String }; + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var responseBuilder = Response.Create() + .WithBody("{{#Regex.Match request.body \"^(?\\w+)://[^/]+?(?\\d+)/?\"}}{{this}}{{/Regex.Match}}") + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBody("{{#Regex.Match request.body \"^(?\\w+)://[^/]+?(?\\d+)/?\"}}{{this}}{{/Regex.Match}}") - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // assert + Check.That(response.Message.BodyData.BodyAsString).Equals(""); + } - // assert - Check.That(response.Message.BodyData.BodyAsString).Equals(""); - } + [Fact] + public void Response_ProvideResponseAsync_Handlebars_RegexMatch2_Throws() + { + // Assign + var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String }; - [Fact] - public void Response_ProvideResponseAsync_Handlebars_RegexMatch2_Throws() - { - // Assign - var body = new BodyData { BodyAsString = "{{\\test", DetectedBodyType = BodyType.String }; + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var responseBuilder = Response.Create() + .WithBody("{{#Regex.Match request.bodyAsJson \"^(?\\w+)://[^/]+?(?\\d+)/?\"}}{{/Regex.Match}}") + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBody("{{#Regex.Match request.bodyAsJson \"^(?\\w+)://[^/]+?(?\\d+)/?\"}}{{/Regex.Match}}") - .WithTransformer(); - - // Act and Assert - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); - } + // Act and Assert + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings)).Throws(); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXPathTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXPathTests.cs index 8b14c04e..062b0bac 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXPathTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXPathTests.cs @@ -14,117 +14,119 @@ using FluentAssertions; using Wmhelp.XPath2; #endif -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsXPathTests { - public class ResponseWithHandlebarsXPathTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithHandlebarsXPathTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithHandlebarsXPathTests() + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_BodyAsString() + { + // Assign + var body = new BodyData { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_BodyAsString() - { - // Assign - var body = new BodyData - { - BodyAsString = @" + BodyAsString = @" abc def xyz ", - DetectedBodyType = BodyType.String - }; + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("{{XPath.SelectSingleNode request.body \"/todo-list/todo-item[1]\"}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("{{XPath.SelectSingleNode request.body \"/todo-list/todo-item[1]\"}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - var nav = new XmlDocument { InnerXml = response.Message.BodyData.BodyAsString }.CreateNavigator(); - var node = nav.XPath2SelectSingleNode("/response/todo-item"); - Check.That(node.Value).Equals("abc"); - Check.That(node.GetAttribute("id", "")).Equals("a1"); - } + // Assert + var nav = new XmlDocument { InnerXml = response.Message.BodyData.BodyAsString }.CreateNavigator(); + var node = nav.XPath2SelectSingleNode("/response/todo-item"); + Check.That(node.Value).Equals("abc"); + Check.That(node.GetAttribute("id", "")).Equals("a1"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Text_Request_BodyAsString() + [Fact] + public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Text_Request_BodyAsString() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = @" + BodyAsString = @" abc def xyz ", - DetectedBodyType = BodyType.String - }; + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("{{XPath.SelectSingleNode request.body \"/todo-list/todo-item[1]/text()\"}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("{{XPath.SelectSingleNode request.body \"/todo-list/todo-item[1]/text()\"}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("abc"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("abc"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_XPath_SelectNodes_Request_BodyAsString() + [Fact] + public async Task Response_ProvideResponse_Handlebars_XPath_SelectNodes_Request_BodyAsString() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = @" + BodyAsString = @" abc def xyz ", - DetectedBodyType = BodyType.String - }; + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("{{XPath.SelectNodes request.body \"/todo-list/todo-item\"}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("{{XPath.SelectNodes request.body \"/todo-list/todo-item\"}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - var nav = new XmlDocument { InnerXml = response.Message.BodyData.BodyAsString }.CreateNavigator(); - var nodes = nav.XPath2SelectNodes("/response/todo-item"); - Check.That(nodes.Count + 1).IsEqualTo(3); - } + // Assert + var nav = new XmlDocument { InnerXml = response.Message.BodyData.BodyAsString }.CreateNavigator(); + var nodes = nav.XPath2SelectNodes("/response/todo-item"); + Check.That(nodes.Count + 1).IsEqualTo(3); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_SoapXML_BodyAsString() - { - // Assign - string soap = @" + [Fact] + public async Task Response_ProvideResponse_Handlebars_XPath_SelectSingleNode_Request_SoapXML_BodyAsString() + { + // Assign + string soap = @" @@ -156,80 +158,79 @@ namespace WireMock.Net.Tests.ResponseBuilders "; - var body = new BodyData - { - BodyAsString = soap, - DetectedBodyType = BodyType.String - }; - - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("{{XPath.SelectSingleNode request.body \"//*[local-name()='TokenIdLijst']\"}}") - .WithTransformer(); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - response.Message.BodyData.BodyAsString.Should().Contain("TokenIdLijst").And.Contain("0000083256").And.Contain("0000083259"); - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_XPath_Evaluate_Request_BodyAsString() + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = @" - abc - def - xyz - ", - DetectedBodyType = BodyType.String - }; + BodyAsString = soap, + DetectedBodyType = BodyType.String + }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("{{XPath.Evaluate request.body \"boolean(/todo-list[count(todo-item) = 3])\"}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("{{XPath.SelectSingleNode request.body \"//*[local-name()='TokenIdLijst']\"}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).IsEqualIgnoringCase("True"); - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_XPath_Evaluate_Attribute_Request_BodyAsString() - { - // Assign - var body = new BodyData - { - BodyAsString = @" - abc - def - xyz - ", - DetectedBodyType = BodyType.String - }; - - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - - var responseBuilder = Response.Create() - .WithHeader("Content-Type", "application/xml") - .WithBody("{{XPath.Evaluate request.body \"string(/todo-list/todo-item[1]/@id)\"}}") - .WithTransformer(); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("a1"); - } + // Assert + response.Message.BodyData.BodyAsString.Should().Contain("TokenIdLijst").And.Contain("0000083256").And.Contain("0000083259"); } -} + + [Fact] + public async Task Response_ProvideResponse_Handlebars_XPath_Evaluate_Request_BodyAsString() + { + // Assign + var body = new BodyData + { + BodyAsString = @" + abc + def + xyz + ", + DetectedBodyType = BodyType.String + }; + + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("{{XPath.Evaluate request.body \"boolean(/todo-list[count(todo-item) = 3])\"}}") + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).IsEqualIgnoringCase("True"); + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_XPath_Evaluate_Attribute_Request_BodyAsString() + { + // Assign + var body = new BodyData + { + BodyAsString = @" + abc + def + xyz + ", + DetectedBodyType = BodyType.String + }; + + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + + var responseBuilder = Response.Create() + .WithHeader("Content-Type", "application/xml") + .WithBody("{{XPath.Evaluate request.body \"string(/todo-list/todo-item[1]/@id)\"}}") + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).IsEqualTo("a1"); + } +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs index c0a87f7c..24cf6177 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs @@ -1,4 +1,4 @@ -using Moq; +using Moq; using Newtonsoft.Json.Linq; using NFluent; using System.Threading.Tasks; @@ -8,67 +8,68 @@ using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHandlebarsXegerTests { - public class ResponseWithHandlebarsXegerTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithHandlebarsXegerTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithHandlebarsXegerTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } - _settings.FileSystemHandler = _filesystemHandlerMock.Object; - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Xeger1() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Xeger1() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Number = "{{Xeger.Generate \"[1-9]{1}\\d{3}\"}}", + Postcode = "{{Xeger.Generate \"[1-9][0-9]{3}[A-Z]{2}\"}}" + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Number = "{{Xeger.Generate \"[1-9]{1}\\d{3}\"}}", - Postcode = "{{Xeger.Generate \"[1-9][0-9]{3}[A-Z]{2}\"}}" - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings); + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Number"].Value()).IsStrictlyGreaterThan(1000).And.IsStrictlyLessThan(9999); + Check.That(j["Postcode"].Value()).IsNotEmpty(); + } - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Number"].Value()).IsStrictlyGreaterThan(1000).And.IsStrictlyLessThan(9999); - Check.That(j["Postcode"].Value()).IsNotEmpty(); - } + [Fact] + public async Task Response_ProvideResponseAsync_Handlebars_Xeger2() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); - [Fact] - public async Task Response_ProvideResponseAsync_Handlebars_Xeger2() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "GET", ClientIp); + var responseBuilder = Response.Create() + .WithBodyAsJson(new + { + Number = "{{#Xeger.Generate \"[1-9]{1}\\d{3}\"}}{{this}}{{/Xeger.Generate}}", + Postcode = "{{#Xeger.Generate \"[1-9][0-9]{3}[A-Z]{2}\"}}{{this}}{{/Xeger.Generate}}" + }) + .WithTransformer(); - var responseBuilder = Response.Create() - .WithBodyAsJson(new - { - Number = "{{#Xeger.Generate \"[1-9]{1}\\d{3}\"}}{{this}}{{/Xeger.Generate}}", - Postcode = "{{#Xeger.Generate \"[1-9][0-9]{3}[A-Z]{2}\"}}{{this}}{{/Xeger.Generate}}" - }) - .WithTransformer(); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings); - - // Assert - JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); - Check.That(j["Number"].Value()).IsStrictlyGreaterThan(1000).And.IsStrictlyLessThan(9999); - Check.That(j["Postcode"].Value()).IsNotEmpty(); - } + // Assert + JObject j = JObject.FromObject(response.Message.BodyData.BodyAsJson); + Check.That(j["Number"].Value()).IsStrictlyGreaterThan(1000).And.IsStrictlyLessThan(9999); + Check.That(j["Postcode"].Value()).IsNotEmpty(); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs index da9ed079..9428dc45 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Moq; using NFluent; using WireMock.Models; using WireMock.ResponseBuilders; @@ -7,89 +8,95 @@ using WireMock.Settings; using WireMock.Types; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithHeadersTests { - public class ResponseWithHeadersTests + private readonly WireMockServerSettings _settings = new(); + private const string ClientIp = "::1"; + + private readonly Mock _mappingMock; + + public ResponseWithHeadersTests() { - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); - private const string ClientIp = "::1"; + _mappingMock = new Mock(); + } - [Theory] - [InlineData("Content-Length", "1024")] - [InlineData("Transfer-Encoding", "identity")] - [InlineData("Location", "http://test")] - public async Task Response_ProvideResponse_WithHeader_SingleValue(string headerName, string headerValue) - { - // Assign - var requestMock = new RequestMessage(new UrlDetails("http://localhost/foo"), "PUT", ClientIp); - IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValue); + [Theory] + [InlineData("Content-Length", "1024")] + [InlineData("Transfer-Encoding", "identity")] + [InlineData("Location", "http://test")] + public async Task Response_ProvideResponse_WithHeader_SingleValue(string headerName, string headerValue) + { + // Assign + var requestMock = new RequestMessage(new UrlDetails("http://localhost/foo"), "PUT", ClientIp); + IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValue); - // Act - var response = await builder.ProvideResponseAsync(requestMock, _settings).ConfigureAwait(false); + // Act + var response = await builder.ProvideResponseAsync(_mappingMock.Object, requestMock, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.Headers[headerName].ToString()).Equals(headerValue); - } + // Assert + Check.That(response.Message.Headers[headerName].ToString()).Equals(headerValue); + } - [Theory] - [InlineData("Test", new[] { "one" })] - [InlineData("Test", new[] { "a", "b" })] - public async Task Response_ProvideResponse_WithHeader_MultipleValues(string headerName, string[] headerValues) - { - // Assign - var requestMock = new RequestMessage(new UrlDetails("http://localhost/foo"), "PUT", ClientIp); - IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValues); + [Theory] + [InlineData("Test", new[] { "one" })] + [InlineData("Test", new[] { "a", "b" })] + public async Task Response_ProvideResponse_WithHeader_MultipleValues(string headerName, string[] headerValues) + { + // Assign + var requestMock = new RequestMessage(new UrlDetails("http://localhost/foo"), "PUT", ClientIp); + IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValues); - // Act - var response = await builder.ProvideResponseAsync(requestMock, _settings).ConfigureAwait(false); + // Act + var response = await builder.ProvideResponseAsync(_mappingMock.Object, requestMock, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.Headers[headerName].ToArray()).Equals(headerValues); - } + // Assert + Check.That(response.Message.Headers[headerName].ToArray()).Equals(headerValues); + } - [Fact] - public async Task Response_ProvideResponse_WithHeaders_SingleValue() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", ClientIp); - var headers = new Dictionary { { "h", "x" } }; - var response = Response.Create().WithHeaders(headers); + [Fact] + public async Task Response_ProvideResponse_WithHeaders_SingleValue() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", ClientIp); + var headers = new Dictionary { { "h", "x" } }; + var response = Response.Create().WithHeaders(headers); - // Act - var responseMessage = await response.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var responseMessage = await response.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(responseMessage.Message.Headers["h"]).ContainsExactly("x"); - } + // Assert + Check.That(responseMessage.Message.Headers["h"]).ContainsExactly("x"); + } - [Fact] - public async Task Response_ProvideResponse_WithHeaders_MultipleValues() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", ClientIp); - var headers = new Dictionary { { "h", new[] { "x" } } }; - var responseBuilder = Response.Create().WithHeaders(headers); + [Fact] + public async Task Response_ProvideResponse_WithHeaders_MultipleValues() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", ClientIp); + var headers = new Dictionary { { "h", new[] { "x" } } }; + var responseBuilder = Response.Create().WithHeaders(headers); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.Headers["h"]).ContainsExactly("x"); - } + // Assert + Check.That(response.Message.Headers["h"]).ContainsExactly("x"); + } - [Fact] - public async Task Response_ProvideResponse_WithHeaders_WiremockList() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", ClientIp); - var headers = new Dictionary> { { "h", new WireMockList("x") } }; - var builder = Response.Create().WithHeaders(headers); + [Fact] + public async Task Response_ProvideResponse_WithHeaders_WiremockList() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost"), "GET", ClientIp); + var headers = new Dictionary> { { "h", new WireMockList("x") } }; + var builder = Response.Create().WithHeaders(headers); - // Act - var response = await builder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await builder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.Headers["h"]).ContainsExactly("x"); - } + // Assert + Check.That(response.Message.Headers["h"]).ContainsExactly("x"); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs index a1e7c32e..8a26171a 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; +using Moq; using NFluent; using WireMock.Models; using WireMock.RequestBuilders; @@ -12,78 +13,81 @@ using WireMock.Types; using WireMock.Util; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithProxyTests : IDisposable { - public class ResponseWithProxyTests : IDisposable + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + private readonly WireMockServer _server; + private readonly Guid _guid; + + private readonly Mock _mappingMock; + + public ResponseWithProxyTests() { - private const string ClientIp = "::1"; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); - private readonly WireMockServer _server; - private readonly Guid _guid; + _mappingMock = new Mock(); - public ResponseWithProxyTests() + _guid = Guid.NewGuid(); + + _server = WireMockServer.Start(); + _server.Given(Request.Create().UsingPost().WithPath($"/{_guid}")) + .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 42 }).WithHeader("Content-Type", "application/json")); + _server.Given(Request.Create().UsingPost().WithPath($"/{_guid}/append")) + .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 10 }).WithHeader("Content-Type", "application/json")); + _server.Given(Request.Create().UsingPost().WithPath($"/prepend/{_guid}")) + .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 11 }).WithHeader("Content-Type", "application/json")); + _server.Given(Request.Create().UsingPost().WithPath($"/prepend/{_guid}/append")) + .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 12 }).WithHeader("Content-Type", "application/json")); + } + + [Theory] + [InlineData("", "", "{\"p\":42}")] + [InlineData("", "/append", "{\"p\":10}")] + [InlineData("/prepend", "", "{\"p\":11}")] + [InlineData("/prepend", "/append", "{\"p\":12}")] + public async Task Response_WithProxy(string prepend, string append, string expectedBody) + { + // Assign + var headers = new Dictionary { { "Content-Type", new[] { "application/xml" } } }; + var request = new RequestMessage(new UrlDetails($"{_server.Urls[0]}{prepend}/{_guid}{append}"), "POST", ClientIp, new BodyData { DetectedBodyType = BodyType.Json, BodyAsJson = new { a = 1 } }, headers); + var responseBuilder = Response.Create().WithProxy(_server.Urls[0]); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(request.ProxyUrl).IsNotNull(); + Check.That(response.Message.BodyData.BodyAsString).IsEqualTo(expectedBody); + Check.That(response.Message.StatusCode).IsEqualTo(201); + Check.That(response.Message.Headers["Content-Type"].ToString()).IsEqualTo("application/json"); + } + + [Fact] + public void Response_WithProxy_WebProxySettings() + { + // Assign + var settings = new ProxyAndRecordSettings { - _guid = Guid.NewGuid(); - - _server = WireMockServer.Start(); - _server.Given(Request.Create().UsingPost().WithPath($"/{_guid}")) - .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 42 }).WithHeader("Content-Type", "application/json")); - _server.Given(Request.Create().UsingPost().WithPath($"/{_guid}/append")) - .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 10 }).WithHeader("Content-Type", "application/json")); - _server.Given(Request.Create().UsingPost().WithPath($"/prepend/{_guid}")) - .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 11 }).WithHeader("Content-Type", "application/json")); - _server.Given(Request.Create().UsingPost().WithPath($"/prepend/{_guid}/append")) - .RespondWith(Response.Create().WithStatusCode(201).WithBodyAsJson(new { p = 12 }).WithHeader("Content-Type", "application/json")); - } - - [Theory] - [InlineData("", "", "{\"p\":42}")] - [InlineData("", "/append", "{\"p\":10}")] - [InlineData("/prepend", "", "{\"p\":11}")] - [InlineData("/prepend", "/append", "{\"p\":12}")] - public async Task Response_WithProxy(string prepend, string append, string expectedBody) - { - // Assign - var headers = new Dictionary { { "Content-Type", new[] { "application/xml" } } }; - var request = new RequestMessage(new UrlDetails($"{_server.Urls[0]}{prepend}/{_guid}{append}"), "POST", ClientIp, new BodyData { DetectedBodyType = BodyType.Json, BodyAsJson = new { a = 1 } }, headers); - var responseBuilder = Response.Create().WithProxy(_server.Urls[0]); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(request.ProxyUrl).IsNotNull(); - Check.That(response.Message.BodyData.BodyAsString).IsEqualTo(expectedBody); - Check.That(response.Message.StatusCode).IsEqualTo(201); - Check.That(response.Message.Headers["Content-Type"].ToString()).IsEqualTo("application/json"); - } - - [Fact] - public void Response_WithProxy_WebProxySettings() - { - // Assign - var settings = new ProxyAndRecordSettings + Url = "http://test.nl", + WebProxySettings = new WebProxySettings { - Url = "http://test.nl", - WebProxySettings = new WebProxySettings - { - Address = "http://company", - UserName = "x", - Password = "y" - } - }; - var responseBuilder = Response.Create().WithProxy(settings); + Address = "http://company", + UserName = "x", + Password = "y" + } + }; + var responseBuilder = Response.Create().WithProxy(settings); - // Act - var request = new RequestMessage(new UrlDetails($"{_server.Urls[0]}/{_guid}"), "GET", ClientIp); + // Act + var request = new RequestMessage(new UrlDetails($"{_server.Urls[0]}/{_guid}"), "GET", ClientIp); - Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(request, _settings)).Throws(); - } + Check.ThatAsyncCode(() => responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings)).Throws(); + } - public void Dispose() - { - _server?.Stop(); - _server?.Dispose(); - } + public void Dispose() + { + _server?.Stop(); + _server?.Dispose(); } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithScribanTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithScribanTests.cs index d7dbc146..d0e8db92 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithScribanTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithScribanTests.cs @@ -16,59 +16,60 @@ using Microsoft.Owin; using Microsoft.AspNetCore.Http; #endif -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithScribanTests { - public class ResponseWithScribanTests + private const string ClientIp = "::1"; + private readonly WireMockServerSettings _settings = new(); + + private readonly Mock _mappingMock; + + public ResponseWithScribanTests() { - private const string ClientIp = "::1"; + _mappingMock = new Mock(); - private readonly Mock _filesystemHandlerMock; - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithScribanTests() - { - _filesystemHandlerMock = new Mock(MockBehavior.Strict); - _filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).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 responseBuilder = Response.Create().WithTransformer(TransformerType.ScribanDotLiquid); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - response.Message.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 responseBuilder = Response.Create() - .WithBody("test {{request.Url}} {{request.Path}} {{request.Method}}") - .WithTransformer(TransformerType.Scriban); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt"); - } + _settings.FileSystemHandler = filesystemHandlerMock.Object; } -} \ No newline at end of file + + [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 responseBuilder = Response.Create().WithTransformer(TransformerType.ScribanDotLiquid); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + response.Message.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 responseBuilder = Response.Create() + .WithBody("test {{request.Url}} {{request.Path}} {{request.Method}}") + .WithTransformer(TransformerType.Scriban); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt"); + } +} diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithStatusCodeTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithStatusCodeTests.cs index 7707a44f..8a37faf9 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithStatusCodeTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithStatusCodeTests.cs @@ -7,43 +7,42 @@ using WireMock.ResponseBuilders; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithStatusCodeTests { - public class ResponseWithStatusCodeTests + private readonly Mock _settingsMock = new(); + private const string ClientIp = "::1"; + + [Theory] + [InlineData("201", "201")] + [InlineData(201, 201)] + [InlineData(HttpStatusCode.Created, 201)] + public async Task Response_ProvideResponse_WithStatusCode(object statusCode, object expectedStatusCode) { - private readonly Mock _settingsMock = new Mock(); - private const string ClientIp = "::1"; + // Arrange + var request = new RequestMessage(new UrlDetails("http://localhost/fault"), "GET", ClientIp); - [Theory] - [InlineData("201", "201")] - [InlineData(201, 201)] - [InlineData(HttpStatusCode.Created, 201)] - public async Task Response_ProvideResponse_WithStatusCode(object statusCode, object expectedStatusCode) + // Act + var responseBuilder = Response.Create(); + switch (statusCode) { - // Arrange - var request = new RequestMessage(new UrlDetails("http://localhost/fault"), "GET", ClientIp); + case string statusCodeAsString: + responseBuilder = responseBuilder.WithStatusCode(statusCodeAsString); + break; - // Act - var responseBuilder = Response.Create(); - switch (statusCode) - { - case string statusCodeAsString: - responseBuilder = responseBuilder.WithStatusCode(statusCodeAsString); - break; + case int statusCodeAInteger: + responseBuilder = responseBuilder.WithStatusCode(statusCodeAInteger); + break; - case int statusCodeAInteger: - responseBuilder = responseBuilder.WithStatusCode(statusCodeAInteger); - break; - - case HttpStatusCode statusCodeAsEnum: - responseBuilder = responseBuilder.WithStatusCode(statusCodeAsEnum); - break; - } - - var response = await responseBuilder.ProvideResponseAsync(request, _settingsMock.Object).ConfigureAwait(false); - - // Assert - response.Message.StatusCode.Should().Be(expectedStatusCode); + case HttpStatusCode statusCodeAsEnum: + responseBuilder = responseBuilder.WithStatusCode(statusCodeAsEnum); + break; } + + var response = await responseBuilder.ProvideResponseAsync(new Mock().Object, request, _settingsMock.Object).ConfigureAwait(false); + + // Assert + response.Message.StatusCode.Should().Be(expectedStatusCode); } -} +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithTransformerTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithTransformerTests.cs index 7b08773d..3cf177e3 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithTransformerTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithTransformerTests.cs @@ -20,709 +20,736 @@ using Microsoft.Owin; using Microsoft.AspNetCore.Http; #endif -namespace WireMock.Net.Tests.ResponseBuilders +namespace WireMock.Net.Tests.ResponseBuilders; + +public class ResponseWithTransformerTests { - public class ResponseWithTransformerTests + private readonly WireMockServerSettings _settings = new(); + private const string ClientIp = "::1"; + + private readonly Mock _mappingMock; + + public ResponseWithTransformerTests() { - private readonly WireMockServerSettings _settings = new WireMockServerSettings(); + _mappingMock = new Mock(); - private const string ClientIp = "::1"; + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); - public ResponseWithTransformerTests() + _settings.FileSystemHandler = filesystemHandlerMock.Object; + } + + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_WithNullBody_ShouldNotThrowException(TransformerType transformerType) + { + // Assign + var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); + var request = new RequestMessage(urlDetails, "GET", ClientIp); + + var responseBuilder = Response.Create().WithTransformer(transformerType); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + response.Message.BodyData.Should().BeNull(); + } + + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_UrlPathVerb(TransformerType transformerType) + { + // Assign + var body = new BodyData { - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns("abc"); + BodyAsString = "whatever", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POSt", ClientIp, body); - _settings.FileSystemHandler = filesystemHandlerMock.Object; - } + var responseBuilder = Response.Create() + .WithBody("test {{request.Url}} {{request.Path}} {{request.Method}}") + .WithTransformer(transformerType); - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_WithNullBody_ShouldNotThrowException(TransformerType transformerType) + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt"); + } + + [Theory] + [InlineData(TransformerType.Handlebars, "Get")] + [InlineData(TransformerType.Handlebars, "Post")] + [InlineData(TransformerType.Scriban, "Get")] + [InlineData(TransformerType.Scriban, "Post")] + [InlineData(TransformerType.ScribanDotLiquid, "Get")] + [InlineData(TransformerType.ScribanDotLiquid, "Post")] + public async Task Response_ProvideResponse_Transformer_UrlPath(TransformerType transformerType, string httpMethod) + { + // Assign + var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); + var request = new RequestMessage(urlDetails, httpMethod, ClientIp); + + var responseBuilder = Response.Create() + .WithBody("url={{request.Url}} absoluteurl={{request.AbsoluteUrl}} path={{request.Path}} absolutepath={{request.AbsolutePath}}") + .WithTransformer(transformerType); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("url=http://localhost/a/b absoluteurl=http://localhost/wiremock/a/b path=/a/b absolutepath=/wiremock/a/b"); + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_PathSegments() + { + // Assign + var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); + var request = new RequestMessage(urlDetails, "POST", ClientIp); + + var responseBuilder = Response.Create() + .WithBody("{{request.PathSegments.[0]}} {{request.AbsolutePathSegments.[0]}}") + .WithTransformer(); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("a wiremock"); + } + + [Theory(Skip = "Invalid token `OpenBracket`")] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Scriban_PathSegments(TransformerType transformerType) + { + // Assign + var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); + var request = new RequestMessage(urlDetails, "POST", ClientIp); + + var responseBuilder = Response.Create() + .WithBody("{{request.PathSegments.[0]}} {{request.AbsolutePathSegments.[0]}}") + .WithTransformer(transformerType); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("a wiremock"); + } + + [Fact] + public async Task Response_ProvideResponse_Handlebars_Query() + { + // Assign + var body = new BodyData { - // Assign - var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); - var request = new RequestMessage(urlDetails, "GET", ClientIp); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=1&a=2&b=5"), "POST", ClientIp, body); - var responseBuilder = Response.Create().WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBody("test keya={{request.query.a}} idx={{request.query.a.[0]}} idx={{request.query.a.[1]}} keyb={{request.query.b}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - response.Message.BodyData.Should().BeNull(); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test keya=1,2 idx=1 idx=2 keyb=5"); + } - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_UrlPathVerb(TransformerType transformerType) + [Theory(Skip = "Invalid token `OpenBracket`")] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Scriban_Query(TransformerType transformerType) + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "whatever", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POSt", ClientIp, body); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=1&a=2&b=5"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithBody("test {{request.Url}} {{request.Path}} {{request.Method}}") - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBody("test keya={{request.query.a}} idx={{request.query.a.[0]}} idx={{request.query.a.[1]}} keyb={{request.query.b}}") + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test keya=1 idx=1 idx=2 keyb=5"); + } - [Theory] - [InlineData(TransformerType.Handlebars, "Get")] - [InlineData(TransformerType.Handlebars, "Post")] - [InlineData(TransformerType.Scriban, "Get")] - [InlineData(TransformerType.Scriban, "Post")] - [InlineData(TransformerType.ScribanDotLiquid, "Get")] - [InlineData(TransformerType.ScribanDotLiquid, "Post")] - public async Task Response_ProvideResponse_Transformer_UrlPath(TransformerType transformerType, string httpMethod) + [Fact] + public async Task Response_ProvideResponse_Handlebars_StatusCode() + { + // Assign + var body = new BodyData { - // Assign - var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); - var request = new RequestMessage(urlDetails, httpMethod, ClientIp); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithBody("url={{request.Url}} absoluteurl={{request.AbsoluteUrl}} path={{request.Path}} absolutepath={{request.AbsolutePath}}") - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithStatusCode("{{request.query.a}}") + .WithBody("test") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("url=http://localhost/a/b absoluteurl=http://localhost/wiremock/a/b path=/a/b absolutepath=/wiremock/a/b"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test"); + Check.That(response.Message.StatusCode).Equals("400"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_PathSegments() + [Theory(Skip = "WireMockList is not supported by Scriban")] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Scriban_StatusCode(TransformerType transformerType) + { + // Assign + var body = new BodyData { - // Assign - var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); - var request = new RequestMessage(urlDetails, "POST", ClientIp); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithBody("{{request.PathSegments.[0]}} {{request.AbsolutePathSegments.[0]}}") - .WithTransformer(); + var responseBuilder = Response.Create() + .WithStatusCode("{{request.Query.a}}") + .WithBody("test") + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("a wiremock"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test"); + Check.That(response.Message.StatusCode).Equals("400"); + } - [Theory(Skip = "Invalid token `OpenBracket`")] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Scriban_PathSegments(TransformerType transformerType) + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_StatusCodeIsNull(TransformerType transformerType) + { + // Assign + var body = new BodyData { - // Assign - var urlDetails = UrlUtils.Parse(new Uri("http://localhost/wiremock/a/b"), new PathString("/wiremock")); - var request = new RequestMessage(urlDetails, "POST", ClientIp); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithBody("{{request.PathSegments.[0]}} {{request.AbsolutePathSegments.[0]}}") - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBody("test") + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("a wiremock"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test"); + Check.That(response.Message.StatusCode).Equals(null); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_Query() + [Fact] + public async Task Response_ProvideResponse_Handlebars_Header() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=1&a=2&b=5"), "POST", ClientIp, body); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body, new Dictionary { { "Content-Type", new[] { "text/plain" } } }); - var responseBuilder = Response.Create() - .WithBody("test keya={{request.query.a}} idx={{request.query.a.[0]}} idx={{request.query.a.[1]}} keyb={{request.query.b}}") - .WithTransformer(); + var responseBuilder = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}").WithBody("test").WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test keya=1,2 idx=1 idx=2 keyb=5"); - } + // Assert + Check.That(response.Message.BodyData!.BodyAsString).Equals("test"); + Check.That(response.Message.Headers).ContainsKey("x"); + Check.That(response.Message.Headers!["x"]).ContainsExactly("text/plain"); + } - [Theory(Skip = "Invalid token `OpenBracket`")] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Scriban_Query(TransformerType transformerType) + [Fact] + public async Task Response_ProvideResponse_Handlebars_Header_TransformMapping() + { + // Assign + var guid = Guid.NewGuid(); + _mappingMock.SetupGet(m => m.Guid).Returns(guid); + + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=1&a=2&b=5"), "POST", ClientIp, body); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithBody("test keya={{request.query.a}} idx={{request.query.a.[0]}} idx={{request.query.a.[1]}} keyb={{request.query.b}}") - .WithTransformer(transformerType); + var responseBuilder = Response.Create().WithHeader("x", "{{mapping.Guid}}").WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test keya=1 idx=1 idx=2 keyb=5"); - } + // Assert + response.Message.Headers.Should().NotBeNull(); + Check.That(response.Message.Headers).ContainsKey("x"); + Check.That(response.Message.Headers!["x"]).ContainsExactly(guid.ToString()); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_StatusCode() + [Fact] + public async Task Response_ProvideResponse_Handlebars_Headers() + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body, new Dictionary { { "Content-Type", new[] { "text/plain" } } }); - var responseBuilder = Response.Create() - .WithStatusCode("{{request.query.a}}") - .WithBody("test") - .WithTransformer(); + var responseBuilder = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}", "{{request.url}}").WithBody("test").WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test"); - Check.That(response.Message.StatusCode).Equals("400"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test"); + Check.That(response.Message.Headers).ContainsKey("x"); + Check.That(response.Message.Headers["x"]).Contains("text/plain"); + Check.That(response.Message.Headers["x"]).Contains("http://localhost/foo"); + } - [Theory(Skip = "WireMockList is not supported by Scriban")] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Scriban_StatusCode(TransformerType transformerType) + [Theory(Skip = "WireMockList is not supported by Scriban")] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Scriban_Headers(TransformerType transformerType) + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body, new Dictionary { { "Content-Type", new[] { "text/plain" } } }); - var responseBuilder = Response.Create() - .WithStatusCode("{{request.Query.a}}") - .WithBody("test") - .WithTransformer(transformerType); + var responseBuilder = Response.Create().WithHeader("x", "{{request.Headers[\"Content-Type\"]}}", "{{request.Url}}").WithBody("test").WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test"); - Check.That(response.Message.StatusCode).Equals("400"); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test"); + Check.That(response.Message.Headers).ContainsKey("x"); + Check.That(response.Message.Headers["x"]).Contains("text/plain"); + Check.That(response.Message.Headers["x"]).Contains("http://localhost/foo"); + } - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_StatusCodeIsNull(TransformerType transformerType) + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_Origin_Port_Protocol_Host(TransformerType transformerType) + { + // Assign + var body = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo?a=400"), "POST", ClientIp, body); + BodyAsString = "abc", + DetectedBodyType = BodyType.String + }; + var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); - var responseBuilder = Response.Create() - .WithBody("test") - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBody("test {{request.Origin}} {{request.Port}} {{request.Protocol}} {{request.Host}}") + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test"); - Check.That(response.Message.StatusCode).Equals(null); - } + // Assert + Check.That(response.Message.BodyData.BodyAsString).Equals("test http://localhost:1234 1234 http localhost"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_Header() + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsObject(TransformerType transformerType) + { + // Assign + string jsonString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"WireMock\" } ] }"; + var bodyData = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body, new Dictionary { { "Content-Type", new[] { "text/plain" } } }); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}").WithBody("test").WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new { x = "test {{request.Path}}" }) + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test"); - Check.That(response.Message.Headers).ContainsKey("x"); - Check.That(response.Message.Headers["x"]).ContainsExactly("text/plain"); - } + // Assert + Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"x\":\"test /foo_object\"}"); + } - [Fact] - public async Task Response_ProvideResponse_Handlebars_Headers() + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_ResultAsArray(TransformerType transformerType) + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithBodyAsJson(new[] { new { x = "test" } }) + .WithTransformer(transformerType); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be("[{\"x\":\"test\"}]"); + } + + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_ResultAsJArray(TransformerType transformerType) + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "GET", ClientIp); + + var array = JArray.Parse("[{\"x\":\"test\"}]"); + var responseBuilder = Response.Create() + .WithBodyAsJson(array) + .WithTransformer(transformerType); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be("[{\"x\":\"test\"}]"); + } + + //[Theory] + //[InlineData(TransformerType.Handlebars, "a")] + //[InlineData(TransformerType.Handlebars, "42")] + //[InlineData(TransformerType.Handlebars, "{")] + //[InlineData(TransformerType.Handlebars, "]")] + //[InlineData(TransformerType.Handlebars, " ")] + //public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithExtraQuotes_AndSpecialOption_MakesAString_ResultAsObject(TransformerType transformerType, string text) + //{ + // string jsonString = $"{{ \"x\": \"{text}\" }}"; + // var bodyData = new BodyData + // { + // BodyAsJson = JsonConvert.DeserializeObject(jsonString), + // DetectedBodyType = BodyType.Json, + // Encoding = Encoding.UTF8 + // }; + // var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); + + // var responseBuilder = Response.Create() + // .WithBodyAsJson(new { text = "\"{{request.bodyAsJson.x}}\"" }) + // .WithTransformer(transformerType, false, ReplaceNodeOptions.Default); + + // // Act + // var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // // Assert + // JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":\"{text}\"}}"); + //} + + [Theory] + [InlineData(TransformerType.Handlebars, "\"\"", "\"\"")] + [InlineData(TransformerType.Handlebars, "\"a\"", "\"a\"")] + [InlineData(TransformerType.Handlebars, "\" \"", "\" \"")] + [InlineData(TransformerType.Handlebars, "\"'\"", "\"'\"")] + [InlineData(TransformerType.Handlebars, "\"false\"", "false")] // bool is special + [InlineData(TransformerType.Handlebars, "false", "false")] + [InlineData(TransformerType.Handlebars, "\"true\"", "true")] // bool is special + [InlineData(TransformerType.Handlebars, "true", "true")] + [InlineData(TransformerType.Handlebars, "\"-42\"", "-42")] // todo + [InlineData(TransformerType.Handlebars, "-42", "-42")] + [InlineData(TransformerType.Handlebars, "\"2147483647\"", "2147483647")] // todo + [InlineData(TransformerType.Handlebars, "2147483647", "2147483647")] + [InlineData(TransformerType.Handlebars, "\"9223372036854775807\"", "9223372036854775807")] // todo + [InlineData(TransformerType.Handlebars, "9223372036854775807", "9223372036854775807")] + public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_And_ReplaceNodeOptionsKeep(TransformerType transformerType, string value, string expected) + { + string jsonString = $"{{ \"x\": {value} }}"; + var bodyData = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body, new Dictionary { { "Content-Type", new[] { "text/plain" } } }); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}", "{{request.url}}").WithBody("test").WithTransformer(); + var responseBuilder = Response.Create() + .WithBodyAsJson(new { text = "{{request.bodyAsJson.x}}" }) + .WithTransformer(transformerType, false, ReplaceNodeOptions.None); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test"); - Check.That(response.Message.Headers).ContainsKey("x"); - Check.That(response.Message.Headers["x"]).Contains("text/plain"); - Check.That(response.Message.Headers["x"]).Contains("http://localhost/foo"); - } + // Assert + JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":{expected}}}"); + } - [Theory(Skip = "WireMockList is not supported by Scriban")] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Scriban_Headers(TransformerType transformerType) + [Theory] + [InlineData(TransformerType.Handlebars, "\"\"", "\"\"")] + [InlineData(TransformerType.Handlebars, "\"a\"", "\"a\"")] + [InlineData(TransformerType.Handlebars, "\" \"", "\" \"")] + [InlineData(TransformerType.Handlebars, "\"'\"", "\"'\"")] + [InlineData(TransformerType.Handlebars, "\"false\"", "false")] // bool is special + [InlineData(TransformerType.Handlebars, "false", "false")] + [InlineData(TransformerType.Handlebars, "\"true\"", "true")] // bool is special + [InlineData(TransformerType.Handlebars, "true", "true")] + [InlineData(TransformerType.Handlebars, "\"-42\"", "\"-42\"")] + [InlineData(TransformerType.Handlebars, "-42", "\"-42\"")] + [InlineData(TransformerType.Handlebars, "\"2147483647\"", "\"2147483647\"")] + [InlineData(TransformerType.Handlebars, "2147483647", "\"2147483647\"")] + [InlineData(TransformerType.Handlebars, "\"9223372036854775807\"", "\"9223372036854775807\"")] + [InlineData(TransformerType.Handlebars, "9223372036854775807", "\"9223372036854775807\"")] + public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithExtraQuotes_AlwaysMakesString(TransformerType transformerType, string value, string expected) + { + string jsonString = $"{{ \"x\": {value} }}"; + var bodyData = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo"), "POST", ClientIp, body, new Dictionary { { "Content-Type", new[] { "text/plain" } } }); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create().WithHeader("x", "{{request.Headers[\"Content-Type\"]}}", "{{request.Url}}").WithBody("test").WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBodyAsJson(new { text = "\"{{request.bodyAsJson.x}}\"" }) + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test"); - Check.That(response.Message.Headers).ContainsKey("x"); - Check.That(response.Message.Headers["x"]).Contains("text/plain"); - Check.That(response.Message.Headers["x"]).Contains("http://localhost/foo"); - } + // Assert + JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":{expected}}}"); + } - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_Origin_Port_Protocol_Host(TransformerType transformerType) + [Theory] + [InlineData(TransformerType.Handlebars)] + //[InlineData(TransformerType.Scriban)] Scriban cannot access dynamic Json Objects + //[InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsArray(TransformerType transformerType) + { + // Assign + string jsonString = "{ \"a\": \"test 1\", \"b\": \"test 2\" }"; + var bodyData = new BodyData { - // Assign - var body = new BodyData - { - BodyAsString = "abc", - DetectedBodyType = BodyType.String - }; - var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", ClientIp, body); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_array"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create() - .WithBody("test {{request.Origin}} {{request.Port}} {{request.Protocol}} {{request.Host}}") - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBodyAsJson(new[] { "first", "{{request.path}}", "{{request.bodyAsJson.a}}", "{{request.bodyAsJson.b}}", "last" }) + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(response.Message.BodyData.BodyAsString).Equals("test http://localhost:1234 1234 http localhost"); - } + // Assert + Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("[\"first\",\"/foo_array\",\"test 1\",\"test 2\",\"last\"]"); + } - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsObject(TransformerType transformerType) + [Fact] + public async Task Response_ProvideResponse_Handlebars_WithBodyAsFile() + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost/foo?MyUniqueNumber=1"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithTransformer() + .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\\test.xml"); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); + } + + [Theory(Skip = @"Does not work in Scriban --> c:\\[""1""]\\test.xml")] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Scriban_WithBodyAsFile(TransformerType transformerType) + { + // Assign + var request = new RequestMessage(new UrlDetails("http://localhost/foo?MyUniqueNumber=1"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithTransformer(transformerType) + .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\\test.xml"); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); + } + + [Theory] + [InlineData(TransformerType.Handlebars)] + //[InlineData(TransformerType.Scriban)] ["c:\\["1"]\\test.xml"] + //[InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_WithBodyAsFile_And_TransformContentFromBodyAsFile(TransformerType transformerType) + { + // Assign + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns(""); + + _settings.FileSystemHandler = filesystemHandlerMock.Object; + + var request = new RequestMessage(new UrlDetails("http://localhost/foo?MyUniqueNumber=1"), "GET", ClientIp); + + var responseBuilder = Response.Create() + .WithTransformer(transformerType, true) + .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\\test.xml"); + + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); + + // Assert + Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); + Check.That(response.Message.BodyData.DetectedBodyType).Equals(BodyType.String); + Check.That(response.Message.BodyData.BodyAsString).Equals(""); + } + + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsNormalString(TransformerType transformerType) + { + // Assign + string jsonString = "{ \"name\": \"WireMock\" }"; + var bodyData = new BodyData { - // Assign - string jsonString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"WireMock\" } ] }"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create() - .WithBodyAsJson(new { x = "test {{request.Path}}" }) - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBodyAsJson("test") + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"x\":\"test /foo_object\"}"); - } + // Assert + Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("\"test\""); + } - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_ResultAsArray(TransformerType transformerType) + [Fact(Skip = "todo...")] + public async Task Response_ProvideResponse_Handlebars_WithBodyAsJson_ResultAsTemplatedString() + { + // Assign + string jsonString = "{ \"name\": \"WireMock\" }"; + var bodyData = new BodyData { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "GET", ClientIp); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create() - .WithBodyAsJson(new [] { new { x = "test" }}) - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBodyAsJson("{{{request.BodyAsJson}}}") + .WithTransformer(); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be("[{\"x\":\"test\"}]"); - } + // Assert + Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"name\":\"WireMock\"}"); + } - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_ResultAsJArray(TransformerType transformerType) + [Theory(Skip = "{{{ }}} Does not work in Scriban")] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Scriban_WithBodyAsJson_ResultAsTemplatedString(TransformerType transformerType) + { + // Assign + string jsonString = "{ \"name\": \"WireMock\" }"; + var bodyData = new BodyData { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "GET", ClientIp); + BodyAsJson = JsonConvert.DeserializeObject(jsonString), + DetectedBodyType = BodyType.Json, + Encoding = Encoding.UTF8 + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var array = JArray.Parse("[{\"x\":\"test\"}]"); - var responseBuilder = Response.Create() - .WithBodyAsJson(array) - .WithTransformer(transformerType); + var responseBuilder = Response.Create() + .WithBodyAsJson("{{{request.BodyAsJson}}}") + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be("[{\"x\":\"test\"}]"); - } + // Assert + Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"name\":\"WireMock\"}"); + } - //[Theory] - //[InlineData(TransformerType.Handlebars, "a")] - //[InlineData(TransformerType.Handlebars, "42")] - //[InlineData(TransformerType.Handlebars, "{")] - //[InlineData(TransformerType.Handlebars, "]")] - //[InlineData(TransformerType.Handlebars, " ")] - //public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithExtraQuotes_AndSpecialOption_MakesAString_ResultAsObject(TransformerType transformerType, string text) - //{ - // string jsonString = $"{{ \"x\": \"{text}\" }}"; - // var bodyData = new BodyData - // { - // BodyAsJson = JsonConvert.DeserializeObject(jsonString), - // DetectedBodyType = BodyType.Json, - // Encoding = Encoding.UTF8 - // }; - // var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - - // var responseBuilder = Response.Create() - // .WithBodyAsJson(new { text = "\"{{request.bodyAsJson.x}}\"" }) - // .WithTransformer(transformerType, false, ReplaceNodeOptions.Default); - - // // Act - // var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // // Assert - // JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":\"{text}\"}}"); - //} - - [Theory] - [InlineData(TransformerType.Handlebars, "\"\"", "\"\"")] - [InlineData(TransformerType.Handlebars, "\"a\"", "\"a\"")] - [InlineData(TransformerType.Handlebars, "\" \"", "\" \"")] - [InlineData(TransformerType.Handlebars, "\"'\"", "\"'\"")] - [InlineData(TransformerType.Handlebars, "\"false\"", "false")] // bool is special - [InlineData(TransformerType.Handlebars, "false", "false")] - [InlineData(TransformerType.Handlebars, "\"true\"", "true")] // bool is special - [InlineData(TransformerType.Handlebars, "true", "true")] - [InlineData(TransformerType.Handlebars, "\"-42\"", "-42")] // todo - [InlineData(TransformerType.Handlebars, "-42", "-42")] - [InlineData(TransformerType.Handlebars, "\"2147483647\"", "2147483647")] // todo - [InlineData(TransformerType.Handlebars, "2147483647", "2147483647")] - [InlineData(TransformerType.Handlebars, "\"9223372036854775807\"", "9223372036854775807")] // todo - [InlineData(TransformerType.Handlebars, "9223372036854775807", "9223372036854775807")] - public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_And_ReplaceNodeOptionsKeep(TransformerType transformerType, string value, string expected) + [Theory] + [InlineData(TransformerType.Handlebars)] + [InlineData(TransformerType.Scriban)] + [InlineData(TransformerType.ScribanDotLiquid)] + public async Task Response_ProvideResponse_Transformer_WithBodyAsString_KeepsEncoding(TransformerType transformerType) + { + // Assign + const string text = "my-text"; + Encoding enc = Encoding.Unicode; + var bodyData = new BodyData { - string jsonString = $"{{ \"x\": {value} }}"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); + BodyAsString = text, + DetectedBodyType = BodyType.String, + Encoding = enc + }; + var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - var responseBuilder = Response.Create() - .WithBodyAsJson(new { text = "{{request.bodyAsJson.x}}" }) - .WithTransformer(transformerType, false, ReplaceNodeOptions.None); + var responseBuilder = Response.Create() + .WithBody("{{request.Body}}", BodyDestinationFormat.SameAsSource, enc) + .WithTransformer(transformerType); - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); + // Act + var response = await responseBuilder.ProvideResponseAsync(_mappingMock.Object, request, _settings).ConfigureAwait(false); - // Assert - JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":{expected}}}"); - } - - [Theory] - [InlineData(TransformerType.Handlebars, "\"\"", "\"\"")] - [InlineData(TransformerType.Handlebars, "\"a\"", "\"a\"")] - [InlineData(TransformerType.Handlebars, "\" \"", "\" \"")] - [InlineData(TransformerType.Handlebars, "\"'\"", "\"'\"")] - [InlineData(TransformerType.Handlebars, "\"false\"", "false")] // bool is special - [InlineData(TransformerType.Handlebars, "false", "false")] - [InlineData(TransformerType.Handlebars, "\"true\"", "true")] // bool is special - [InlineData(TransformerType.Handlebars, "true", "true")] - [InlineData(TransformerType.Handlebars, "\"-42\"", "\"-42\"")] - [InlineData(TransformerType.Handlebars, "-42", "\"-42\"")] - [InlineData(TransformerType.Handlebars, "\"2147483647\"", "\"2147483647\"")] - [InlineData(TransformerType.Handlebars, "2147483647", "\"2147483647\"")] - [InlineData(TransformerType.Handlebars, "\"9223372036854775807\"", "\"9223372036854775807\"")] - [InlineData(TransformerType.Handlebars, "9223372036854775807", "\"9223372036854775807\"")] - public async Task Response_ProvideResponse_Transformer_WithBodyAsJsonWithExtraQuotes_AlwaysMakesString(TransformerType transformerType, string value, string expected) - { - string jsonString = $"{{ \"x\": {value} }}"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - - var responseBuilder = Response.Create() - .WithBodyAsJson(new { text = "\"{{request.bodyAsJson.x}}\"" }) - .WithTransformer(transformerType); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson).Should().Be($"{{\"text\":{expected}}}"); - } - - [Theory] - [InlineData(TransformerType.Handlebars)] - //[InlineData(TransformerType.Scriban)] Scriban cannot access dynamic Json Objects - //[InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsArray(TransformerType transformerType) - { - // Assign - string jsonString = "{ \"a\": \"test 1\", \"b\": \"test 2\" }"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_array"), "POST", ClientIp, bodyData); - - var responseBuilder = Response.Create() - .WithBodyAsJson(new[] { "first", "{{request.path}}", "{{request.bodyAsJson.a}}", "{{request.bodyAsJson.b}}", "last" }) - .WithTransformer(transformerType); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("[\"first\",\"/foo_array\",\"test 1\",\"test 2\",\"last\"]"); - } - - [Fact] - public async Task Response_ProvideResponse_Handlebars_WithBodyAsFile() - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost/foo?MyUniqueNumber=1"), "GET", ClientIp); - - var responseBuilder = Response.Create() - .WithTransformer() - .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\\test.xml"); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); - } - - [Theory(Skip = @"Does not work in Scriban --> c:\\[""1""]\\test.xml")] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Scriban_WithBodyAsFile(TransformerType transformerType) - { - // Assign - var request = new RequestMessage(new UrlDetails("http://localhost/foo?MyUniqueNumber=1"), "GET", ClientIp); - - var responseBuilder = Response.Create() - .WithTransformer(transformerType) - .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\\test.xml"); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); - } - - [Theory] - [InlineData(TransformerType.Handlebars)] - //[InlineData(TransformerType.Scriban)] ["c:\\["1"]\\test.xml"] - //[InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_WithBodyAsFile_And_TransformContentFromBodyAsFile(TransformerType transformerType) - { - // Assign - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.ReadResponseBodyAsString(It.IsAny())).Returns(""); - - _settings.FileSystemHandler = filesystemHandlerMock.Object; - - var request = new RequestMessage(new UrlDetails("http://localhost/foo?MyUniqueNumber=1"), "GET", ClientIp); - - var responseBuilder = Response.Create() - .WithTransformer(transformerType, true) - .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\\test.xml"); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(response.Message.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); - Check.That(response.Message.BodyData.DetectedBodyType).Equals(BodyType.String); - Check.That(response.Message.BodyData.BodyAsString).Equals(""); - } - - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_WithBodyAsJson_ResultAsNormalString(TransformerType transformerType) - { - // Assign - string jsonString = "{ \"name\": \"WireMock\" }"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - - var responseBuilder = Response.Create() - .WithBodyAsJson("test") - .WithTransformer(transformerType); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("\"test\""); - } - - [Fact(Skip = "todo...")] - public async Task Response_ProvideResponse_Handlebars_WithBodyAsJson_ResultAsTemplatedString() - { - // Assign - string jsonString = "{ \"name\": \"WireMock\" }"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - - var responseBuilder = Response.Create() - .WithBodyAsJson("{{{request.BodyAsJson}}}") - .WithTransformer(); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"name\":\"WireMock\"}"); - } - - [Theory(Skip = "{{{ }}} Does not work in Scriban")] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Scriban_WithBodyAsJson_ResultAsTemplatedString(TransformerType transformerType) - { - // Assign - string jsonString = "{ \"name\": \"WireMock\" }"; - var bodyData = new BodyData - { - BodyAsJson = JsonConvert.DeserializeObject(jsonString), - DetectedBodyType = BodyType.Json, - Encoding = Encoding.UTF8 - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - - var responseBuilder = Response.Create() - .WithBodyAsJson("{{{request.BodyAsJson}}}") - .WithTransformer(transformerType); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - Check.That(JsonConvert.SerializeObject(response.Message.BodyData.BodyAsJson)).Equals("{\"name\":\"WireMock\"}"); - } - - [Theory] - [InlineData(TransformerType.Handlebars)] - [InlineData(TransformerType.Scriban)] - [InlineData(TransformerType.ScribanDotLiquid)] - public async Task Response_ProvideResponse_Transformer_WithBodyAsString_KeepsEncoding(TransformerType transformerType) - { - // Assign - const string text = "my-text"; - Encoding enc = Encoding.Unicode; - var bodyData = new BodyData - { - BodyAsString = text, - DetectedBodyType = BodyType.String, - Encoding = enc - }; - var request = new RequestMessage(new UrlDetails("http://localhost/foo_object"), "POST", ClientIp, bodyData); - - var responseBuilder = Response.Create() - .WithBody("{{request.Body}}", BodyDestinationFormat.SameAsSource, enc) - .WithTransformer(transformerType); - - // Act - var response = await responseBuilder.ProvideResponseAsync(request, _settings).ConfigureAwait(false); - - // Assert - response.Message.BodyData.BodyAsString.Should().Be(text); - response.Message.BodyData.Encoding.Should().Be(enc); - } + // Assert + response.Message.BodyData.BodyAsString.Should().Be(text); + response.Message.BodyData.Encoding.Should().Be(enc); } } \ No newline at end of file