From 7a4814e3359934185c6c78e46183e1f40ad31c0b Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 17 Jun 2019 20:34:16 +0200 Subject: [PATCH] Add SaveToFile in the mapping (#284) * savetofile * fix ! --- Directory.Build.props | 2 +- GitHubReleaseNotes.txt | 2 +- .../Admin/Mappings/MappingModel.cs | 9 +++- .../Admin/Mappings/ResponseModel.cs | 4 +- src/WireMock.Net/IMapping.cs | 10 ++++- src/WireMock.Net/Mapping.cs | 16 +++++-- .../MappingRegistrationCallback.cs | 3 +- src/WireMock.Net/ResponseBuilders/Response.cs | 27 +++++------- src/WireMock.Net/ResponseMessageBuilder.cs | 6 ++- .../DynamicAsyncResponseProvider.cs | 9 ++-- .../DynamicResponseProvider.cs | 9 ++-- .../ResponseProviders/IResponseProvider.cs | 4 +- .../ProxyAsyncResponseProvider.cs | 14 +++--- .../Serialization/MappingConverter.cs | 16 ++++--- .../Server/FluentMockServer.Admin.cs | 24 +++++------ src/WireMock.Net/Server/FluentMockServer.cs | 14 ++++-- .../Server/RespondWithAProvider.cs | 11 ++++- .../Settings/FluentMockServerSettings.cs | 2 +- .../FluentMockServerTests.Admin.cs | 27 ++++++++++++ .../ResponseBuilders/ResponseCreateTests.cs | 6 ++- .../ResponseBuilders/ResponseWithBodyTests.cs | 43 ++++++++++--------- .../ResponseWithCallbackTests.cs | 8 +++- .../ResponseWithHandlebarsFileTests.cs | 13 ++---- .../ResponseWithHandlebarsJsonPathTests.cs | 17 +++++--- .../ResponseWithHandlebarsLinqTests.cs | 32 ++++++++------ .../ResponseWithHandlebarsRandomTests.cs | 16 ++++--- .../ResponseWithHandlebarsRegexTests.cs | 17 +++++--- .../ResponseWithHandlebarsTests.cs | 25 ++++++----- .../ResponseWithHandlebarsXegerTests.cs | 7 ++- .../ResponseWithHeadersTests.cs | 13 +++--- .../ResponseWithProxyTests.cs | 5 ++- .../Serialization/MappingConverterTests.cs | 34 ++++++++++++--- 32 files changed, 277 insertions(+), 168 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 9937770d..13eb4ee4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,7 @@ - 1.0.19 + 1.0.20 diff --git a/GitHubReleaseNotes.txt b/GitHubReleaseNotes.txt index 5dd7de2e..88cae14c 100644 --- a/GitHubReleaseNotes.txt +++ b/GitHubReleaseNotes.txt @@ -1,3 +1,3 @@ https://github.com/StefH/GitHubReleaseNotes -GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.19.0 \ No newline at end of file +GitHubReleaseNotes.exe --output CHANGELOG.md --skip-empty-releases --version 1.0.20.0 \ No newline at end of file diff --git a/src/WireMock.Net/Admin/Mappings/MappingModel.cs b/src/WireMock.Net/Admin/Mappings/MappingModel.cs index 2e005729..f5eb8afe 100644 --- a/src/WireMock.Net/Admin/Mappings/MappingModel.cs +++ b/src/WireMock.Net/Admin/Mappings/MappingModel.cs @@ -39,13 +39,18 @@ namespace WireMock.Admin.Mappings public string SetStateTo { get; set; } /// - /// The request. + /// The request model. /// public RequestModel Request { get; set; } /// - /// The response. + /// The response model. /// public ResponseModel Response { get; set; } + + /// + /// Saves this mapping as a static mapping file. + /// + public bool? SaveToFile { get; set; } } } \ No newline at end of file diff --git a/src/WireMock.Net/Admin/Mappings/ResponseModel.cs b/src/WireMock.Net/Admin/Mappings/ResponseModel.cs index 5998d4e8..29c71b44 100644 --- a/src/WireMock.Net/Admin/Mappings/ResponseModel.cs +++ b/src/WireMock.Net/Admin/Mappings/ResponseModel.cs @@ -58,9 +58,9 @@ namespace WireMock.Admin.Mappings public EncodingModel BodyEncoding { get; set; } /// - /// Gets or sets a value indicating whether [use transformer]. + /// Use Handlebars transformer. /// - public bool UseTransformer { get; set; } + public bool? UseTransformer { get; set; } /// /// Gets or sets the headers. diff --git a/src/WireMock.Net/IMapping.cs b/src/WireMock.Net/IMapping.cs index 4dca9571..3d3beefa 100644 --- a/src/WireMock.Net/IMapping.cs +++ b/src/WireMock.Net/IMapping.cs @@ -1,6 +1,7 @@ -using System; +using JetBrains.Annotations; +using System; using System.Threading.Tasks; -using JetBrains.Annotations; +using WireMock.Handlers; using WireMock.Matchers.Request; using WireMock.ResponseProviders; @@ -60,6 +61,11 @@ namespace WireMock /// IResponseProvider Provider { get; } + /// + /// The FileSystemHandler. + /// + IFileSystemHandler FileSystemHandler { get; } + /// /// Is State started ? /// diff --git a/src/WireMock.Net/Mapping.cs b/src/WireMock.Net/Mapping.cs index cbf24ec5..dd4d818b 100644 --- a/src/WireMock.Net/Mapping.cs +++ b/src/WireMock.Net/Mapping.cs @@ -1,6 +1,7 @@ -using System; +using JetBrains.Annotations; +using System; using System.Threading.Tasks; -using JetBrains.Annotations; +using WireMock.Handlers; using WireMock.Matchers.Request; using WireMock.ResponseProviders; @@ -38,6 +39,9 @@ namespace WireMock /// public IResponseProvider Provider { get; } + /// + public IFileSystemHandler FileSystemHandler { get; } + /// public bool IsStartState => Scenario == null || Scenario != null && NextState != null && ExecutionConditionState == null; @@ -50,17 +54,21 @@ namespace WireMock /// The unique identifier. /// The unique title (can be null). /// The full file path from this mapping title (can be null). + /// The fileSystemHandler. /// The request matcher. /// The provider. /// The priority for this mapping. /// The scenario. [Optional] /// State in which the current mapping can occur. [Optional] /// The next state which will occur after the current mapping execution. [Optional] - public Mapping(Guid guid, [CanBeNull] string title, [CanBeNull] string path, IRequestMatcher requestMatcher, IResponseProvider provider, int priority, [CanBeNull] string scenario, [CanBeNull] string executionConditionState, [CanBeNull] string nextState) + public Mapping(Guid guid, [CanBeNull] string title, [CanBeNull] string path, + [NotNull] IFileSystemHandler fileSystemHandler, [NotNull] IRequestMatcher requestMatcher, [NotNull] IResponseProvider provider, + int priority, [CanBeNull] string scenario, [CanBeNull] string executionConditionState, [CanBeNull] string nextState) { Guid = guid; Title = title; Path = path; + FileSystemHandler = fileSystemHandler; RequestMatcher = requestMatcher; Provider = provider; Priority = priority; @@ -72,7 +80,7 @@ namespace WireMock /// public async Task ResponseToAsync(RequestMessage requestMessage) { - return await Provider.ProvideResponseAsync(requestMessage); + return await Provider.ProvideResponseAsync(requestMessage, FileSystemHandler); } /// diff --git a/src/WireMock.Net/MappingRegistrationCallback.cs b/src/WireMock.Net/MappingRegistrationCallback.cs index cd5ad6f3..0a78d11a 100644 --- a/src/WireMock.Net/MappingRegistrationCallback.cs +++ b/src/WireMock.Net/MappingRegistrationCallback.cs @@ -4,5 +4,6 @@ /// The registration callback. /// /// The mapping. - public delegate void RegistrationCallback(IMapping mapping); + /// Optional boolean to indicate if this mapping should be saved as static mapping file. + public delegate void RegistrationCallback(IMapping mapping, bool saveToFile = false); } \ No newline at end of file diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 6e2fd7cf..f806ee84 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -21,8 +21,6 @@ namespace WireMock.ResponseBuilders /// public class Response : IResponseBuilder { - private readonly IFileSystemHandler _fileSystemHandler; - private readonly ResponseMessageTransformer _responseMessageTransformer; private HttpClient _httpClientForProxy; /// @@ -94,9 +92,6 @@ namespace WireMock.ResponseBuilders private Response(ResponseMessage responseMessage) { ResponseMessage = responseMessage; - - _fileSystemHandler = new LocalFileSystemHandler(); - _responseMessageTransformer = new ResponseMessageTransformer(_fileSystemHandler); } /// @@ -225,18 +220,17 @@ namespace WireMock.ResponseBuilders ResponseMessage.BodyData = new BodyData { - BodyAsFileIsCached = cache + BodyAsFileIsCached = cache, + BodyAsFile = filename }; if (cache && !UseTransformer) { ResponseMessage.BodyData.DetectedBodyType = BodyType.Bytes; - ResponseMessage.BodyData.BodyAsBytes = _fileSystemHandler.ReadResponseBodyAsFile(filename); } else { ResponseMessage.BodyData.DetectedBodyType = BodyType.File; - ResponseMessage.BodyData.BodyAsFile = filename; } return this; @@ -377,12 +371,7 @@ namespace WireMock.ResponseBuilders return this; } - /// - /// The provide response. - /// - /// The request. - /// The . - public async Task ProvideResponseAsync(RequestMessage requestMessage) + public async Task ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) { Check.NotNull(requestMessage, nameof(requestMessage)); @@ -421,10 +410,16 @@ namespace WireMock.ResponseBuilders if (UseTransformer) { - return _responseMessageTransformer.Transform(requestMessage, ResponseMessage); + var responseMessageTransformer = new ResponseMessageTransformer(fileSystemHandler); + return responseMessageTransformer.Transform(requestMessage, ResponseMessage); + } + + if (!UseTransformer && ResponseMessage.BodyData?.BodyAsFileIsCached == true) + { + ResponseMessage.BodyData.BodyAsBytes = fileSystemHandler.ReadResponseBodyAsFile(ResponseMessage.BodyData.BodyAsFile); + ResponseMessage.BodyData.BodyAsFile = null; } - // Just return normal defined ResponseMessage return ResponseMessage; } } diff --git a/src/WireMock.Net/ResponseMessageBuilder.cs b/src/WireMock.Net/ResponseMessageBuilder.cs index a6d85bb5..1e213976 100644 --- a/src/WireMock.Net/ResponseMessageBuilder.cs +++ b/src/WireMock.Net/ResponseMessageBuilder.cs @@ -27,7 +27,11 @@ namespace WireMock response.BodyData = new BodyData { DetectedBodyType = BodyType.Json, - BodyAsJson = new StatusModel { Status = message, Guid = guid } + BodyAsJson = new StatusModel + { + Guid = guid, + Status = message + } }; } diff --git a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs index afbaa664..f1456b31 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicAsyncResponseProvider.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; -using JetBrains.Annotations; -using WireMock.Validation; +using WireMock.Handlers; namespace WireMock.ResponseProviders { @@ -9,14 +8,12 @@ namespace WireMock.ResponseProviders { private readonly Func> _responseMessageFunc; - public DynamicAsyncResponseProvider([NotNull] Func> responseMessageFunc) + public DynamicAsyncResponseProvider(Func> responseMessageFunc) { - Check.NotNull(responseMessageFunc, nameof(responseMessageFunc)); - _responseMessageFunc = responseMessageFunc; } - public Task ProvideResponseAsync(RequestMessage requestMessage) + public Task ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) { return _responseMessageFunc(requestMessage); } diff --git a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs index d04b9fe5..534f7a5e 100644 --- a/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/DynamicResponseProvider.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; -using JetBrains.Annotations; -using WireMock.Validation; +using WireMock.Handlers; namespace WireMock.ResponseProviders { @@ -9,14 +8,12 @@ namespace WireMock.ResponseProviders { private readonly Func _responseMessageFunc; - public DynamicResponseProvider([NotNull] Func responseMessageFunc) + public DynamicResponseProvider(Func responseMessageFunc) { - Check.NotNull(responseMessageFunc, nameof(responseMessageFunc)); - _responseMessageFunc = responseMessageFunc; } - public Task ProvideResponseAsync(RequestMessage requestMessage) + public Task ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) { return Task.FromResult(_responseMessageFunc(requestMessage)); } diff --git a/src/WireMock.Net/ResponseProviders/IResponseProvider.cs b/src/WireMock.Net/ResponseProviders/IResponseProvider.cs index 38271f7d..ca4f65d4 100644 --- a/src/WireMock.Net/ResponseProviders/IResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/IResponseProvider.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using JetBrains.Annotations; +using WireMock.Handlers; namespace WireMock.ResponseProviders { @@ -12,7 +13,8 @@ namespace WireMock.ResponseProviders /// The provide response. /// /// The request. + /// The fileSystemHandler. /// The . - Task ProvideResponseAsync([NotNull] RequestMessage requestMessage); + Task ProvideResponseAsync([NotNull] RequestMessage requestMessage, [NotNull] IFileSystemHandler fileSystemHandler); } } \ No newline at end of file diff --git a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs index f1283138..748a0822 100644 --- a/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs +++ b/src/WireMock.Net/ResponseProviders/ProxyAsyncResponseProvider.cs @@ -1,26 +1,22 @@ using System; using System.Threading.Tasks; -using JetBrains.Annotations; +using WireMock.Handlers; using WireMock.Settings; -using WireMock.Validation; namespace WireMock.ResponseProviders { internal class ProxyAsyncResponseProvider : IResponseProvider { - private readonly Func> _responseMessageFunc; - private readonly IProxyAndRecordSettings _settings; + private readonly Func> _responseMessageFunc; + private readonly IFluentMockServerSettings _settings; - public ProxyAsyncResponseProvider([NotNull] Func> responseMessageFunc, [NotNull] IProxyAndRecordSettings settings) + public ProxyAsyncResponseProvider(Func> responseMessageFunc, IFluentMockServerSettings settings) { - Check.NotNull(responseMessageFunc, nameof(responseMessageFunc)); - Check.NotNull(settings, nameof(settings)); - _responseMessageFunc = responseMessageFunc; _settings = settings; } - public Task ProvideResponseAsync(RequestMessage requestMessage) + public Task ProvideResponseAsync(RequestMessage requestMessage, IFileSystemHandler fileSystemHandler) { return _responseMessageFunc(requestMessage, _settings); } diff --git a/src/WireMock.Net/Serialization/MappingConverter.cs b/src/WireMock.Net/Serialization/MappingConverter.cs index 5f848b48..0a8f9010 100644 --- a/src/WireMock.Net/Serialization/MappingConverter.cs +++ b/src/WireMock.Net/Serialization/MappingConverter.cs @@ -28,7 +28,7 @@ namespace WireMock.Serialization { Guid = mapping.Guid, Title = mapping.Title, - Priority = mapping.Priority, + Priority = mapping.Priority != 0 ? mapping.Priority : (int?) null, Scenario = mapping.Scenario, WhenStateIs = mapping.ExecutionConditionState, SetStateTo = mapping.NextState, @@ -66,7 +66,7 @@ namespace WireMock.Serialization Params = paramsMatchers != null && paramsMatchers.Any() ? paramsMatchers.Select(pm => new ParamModel { Name = pm.Key, - IgnoreCase = pm.IgnoreCase, + IgnoreCase = pm.IgnoreCase == true ? true : (bool?) null, Matchers = MatcherMapper.Map(pm.Matchers) }).ToList() : null, @@ -92,7 +92,7 @@ namespace WireMock.Serialization mappingModel.Response.BodyAsBytes = null; mappingModel.Response.BodyAsFile = null; mappingModel.Response.BodyAsFileIsCached = null; - mappingModel.Response.UseTransformer = false; + mappingModel.Response.UseTransformer = null; mappingModel.Response.BodyEncoding = null; mappingModel.Response.ProxyUrl = response.ProxyUrl; } @@ -101,7 +101,10 @@ namespace WireMock.Serialization mappingModel.Response.BodyDestination = response.ResponseMessage.BodyDestination; mappingModel.Response.StatusCode = response.ResponseMessage.StatusCode; mappingModel.Response.Headers = Map(response.ResponseMessage.Headers); - mappingModel.Response.UseTransformer = response.UseTransformer; + if (response.UseTransformer) + { + mappingModel.Response.UseTransformer = response.UseTransformer; + } if (response.ResponseMessage.BodyData != null) { @@ -113,7 +116,10 @@ namespace WireMock.Serialization case BodyType.Json: mappingModel.Response.BodyAsJson = response.ResponseMessage.BodyData.BodyAsJson; - mappingModel.Response.BodyAsJsonIndented = response.ResponseMessage.BodyData.BodyAsJsonIndented; + if (response.ResponseMessage.BodyData.BodyAsJsonIndented == true) + { + mappingModel.Response.BodyAsJsonIndented = response.ResponseMessage.BodyData.BodyAsJsonIndented; + } break; case BodyType.Bytes: diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 1da20c3c..971c655b 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -43,7 +43,7 @@ namespace WireMock.Server private readonly RegexMatcher _adminMappingsGuidPathMatcher = new RegexMatcher(MatchBehaviour.AcceptOnMatch, @"^\/__admin\/mappings\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$"); private readonly RegexMatcher _adminRequestsGuidPathMatcher = new RegexMatcher(MatchBehaviour.AcceptOnMatch, @"^\/__admin\/requests\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$"); - private readonly JsonSerializerSettings _settings = new JsonSerializerSettings + private readonly JsonSerializerSettings _jsonSerializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore @@ -242,23 +242,23 @@ namespace WireMock.Server respondProvider.AtPriority(ProxyPriority); } - respondProvider.RespondWith(new ProxyAsyncResponseProvider(ProxyAndRecordAsync, settings.ProxyAndRecordSettings)); + respondProvider.RespondWith(new ProxyAsyncResponseProvider(ProxyAndRecordAsync, settings)); } - private async Task ProxyAndRecordAsync(RequestMessage requestMessage, IProxyAndRecordSettings settings) + private async Task ProxyAndRecordAsync(RequestMessage requestMessage, IFluentMockServerSettings settings) { var requestUri = new Uri(requestMessage.Url); - var proxyUri = new Uri(settings.Url); + var proxyUri = new Uri(settings.ProxyAndRecordSettings.Url); var proxyUriWithRequestPathAndQuery = new Uri(proxyUri, requestUri.PathAndQuery); var responseMessage = await HttpClientHelper.SendAsync(_httpClientForProxy, requestMessage, proxyUriWithRequestPathAndQuery.AbsoluteUri); - if (settings.SaveMapping) + if (settings.ProxyAndRecordSettings.SaveMapping) { - var mapping = ToMapping(requestMessage, responseMessage, settings.BlackListedHeaders ?? new string[] { }); + var mapping = ToMapping(requestMessage, responseMessage, settings.ProxyAndRecordSettings.BlackListedHeaders ?? new string[] { }); _options.Mappings.TryAdd(mapping.Guid, mapping); - if (settings.SaveMappingToFile) + if (settings.ProxyAndRecordSettings.SaveMappingToFile) { SaveMappingToFile(mapping); } @@ -302,7 +302,7 @@ namespace WireMock.Server var response = Response.Create(responseMessage); - return new Mapping(Guid.NewGuid(), string.Empty, null, request, response, 0, null, null, null); + return new Mapping(Guid.NewGuid(), string.Empty, null, _fileSystemHandler, request, response, 0, null, null, null); } #endregion @@ -407,7 +407,7 @@ namespace WireMock.Server _logger.Info("Saving Mapping file {0}", filename); - _fileSystemHandler.WriteMappingFile(path, JsonConvert.SerializeObject(model, _settings)); + _fileSystemHandler.WriteMappingFile(path, JsonConvert.SerializeObject(model, _jsonSerializerSettings)); } private static string SanitizeFileName(string name, char replaceChar = '_') @@ -471,7 +471,7 @@ namespace WireMock.Server var responseBuilder = InitResponseBuilder(mappingModel.Response); - var respondProvider = Given(requestBuilder); + var respondProvider = Given(requestBuilder, mappingModel.SaveToFile == true); if (guid != null) { @@ -722,7 +722,7 @@ namespace WireMock.Server responseBuilder = responseBuilder.WithDelay(responseModel.Delay.Value); } - if (responseModel.UseTransformer) + if (responseModel.UseTransformer == true) { responseBuilder = responseBuilder.WithTransformer(); } @@ -793,7 +793,7 @@ namespace WireMock.Server BodyData = new BodyData { DetectedBodyType = BodyType.String, - BodyAsString = JsonConvert.SerializeObject(result, keepNullValues ? _settingsIncludeNullValues : _settings) + BodyAsString = JsonConvert.SerializeObject(result, keepNullValues ? _settingsIncludeNullValues : _jsonSerializerSettings) }, StatusCode = 200, Headers = new Dictionary> { { HttpKnownHeaderNames.ContentType, new WireMockList(ContentTypeJson) } } diff --git a/src/WireMock.Net/Server/FluentMockServer.cs b/src/WireMock.Net/Server/FluentMockServer.cs index 6ac06198..c9ba2d92 100644 --- a/src/WireMock.Net/Server/FluentMockServer.cs +++ b/src/WireMock.Net/Server/FluentMockServer.cs @@ -203,7 +203,7 @@ namespace WireMock.Server Urls = new[] { $"{(settings.UseSSL == true ? "https" : "http")}://localhost:{port}" }; } - _options.FileSystemHandler = settings.FileSystemHandler; + _options.FileSystemHandler = _fileSystemHandler; _options.PreWireMockMiddlewareInit = settings.PreWireMockMiddlewareInit; _options.PostWireMockMiddlewareInit = settings.PostWireMockMiddlewareInit; _options.Logger = _logger; @@ -430,14 +430,15 @@ namespace WireMock.Server /// The given. /// /// The request matcher. + /// Optional boolean to indicate if this mapping should be saved as static mapping file. /// The . [PublicAPI] - public IRespondWithAProvider Given(IRequestMatcher requestMatcher) + public IRespondWithAProvider Given(IRequestMatcher requestMatcher, bool saveToFile = false) { - return new RespondWithAProvider(RegisterMapping, requestMatcher); + return new RespondWithAProvider(RegisterMapping, requestMatcher, _fileSystemHandler, saveToFile); } - private void RegisterMapping(IMapping mapping) + private void RegisterMapping(IMapping mapping, bool saveToFile) { // Check a mapping exists with the same Guid, if so, replace it. if (_options.Mappings.ContainsKey(mapping.Guid)) @@ -448,6 +449,11 @@ namespace WireMock.Server { _options.Mappings.TryAdd(mapping.Guid, mapping); } + + if (saveToFile) + { + SaveMappingToFile(mapping); + } } } } \ No newline at end of file diff --git a/src/WireMock.Net/Server/RespondWithAProvider.cs b/src/WireMock.Net/Server/RespondWithAProvider.cs index b4325d69..1db7db6b 100644 --- a/src/WireMock.Net/Server/RespondWithAProvider.cs +++ b/src/WireMock.Net/Server/RespondWithAProvider.cs @@ -1,4 +1,5 @@ using System; +using WireMock.Handlers; using WireMock.Matchers.Request; using WireMock.ResponseProviders; @@ -17,6 +18,8 @@ namespace WireMock.Server private string _scenario; private readonly RegistrationCallback _registrationCallback; private readonly IRequestMatcher _requestMatcher; + private readonly IFileSystemHandler _fileSystemHandler; + private readonly bool _saveToFile; public Guid Guid { get; private set; } = Guid.NewGuid(); @@ -25,10 +28,14 @@ namespace WireMock.Server /// /// The registration callback. /// The request matcher. - public RespondWithAProvider(RegistrationCallback registrationCallback, IRequestMatcher requestMatcher) + /// The fileSystemHandler. + /// Optional boolean to indicate if this mapping should be saved as static mapping file. + public RespondWithAProvider(RegistrationCallback registrationCallback, IRequestMatcher requestMatcher, IFileSystemHandler fileSystemHandler, bool saveToFile = false) { _registrationCallback = registrationCallback; _requestMatcher = requestMatcher; + _fileSystemHandler = fileSystemHandler; + _saveToFile = saveToFile; } /// @@ -37,7 +44,7 @@ namespace WireMock.Server /// The provider. public void RespondWith(IResponseProvider provider) { - _registrationCallback(new Mapping(Guid, _title, _path, _requestMatcher, provider, _priority, _scenario, _executionConditionState, _nextState)); + _registrationCallback(new Mapping(Guid, _title, _path, _fileSystemHandler, _requestMatcher, provider, _priority, _scenario, _executionConditionState, _nextState), _saveToFile); } /// diff --git a/src/WireMock.Net/Settings/FluentMockServerSettings.cs b/src/WireMock.Net/Settings/FluentMockServerSettings.cs index 9859ae58..ab02e13d 100644 --- a/src/WireMock.Net/Settings/FluentMockServerSettings.cs +++ b/src/WireMock.Net/Settings/FluentMockServerSettings.cs @@ -82,6 +82,6 @@ namespace WireMock.Settings /// [PublicAPI] [JsonIgnore] - public IFileSystemHandler FileSystemHandler { get; set; } = new LocalFileSystemHandler(); + public IFileSystemHandler FileSystemHandler { get; set; } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs b/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs index 471d1b85..06b6a30a 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.Admin.cs @@ -375,5 +375,32 @@ namespace WireMock.Net.Tests fileMock.Verify(f => f.GetMappingFolder(), Times.Once); fileMock.Verify(f => f.FolderExists(It.IsAny()), Times.Once); } + + [Fact] + public void FluentMockServer_Admin_AddMappingsAndSaveToFile() + { + // Assign + string guid = "791a3f31-6946-aaaa-8e6f-0237c7442222"; + var staticMappingHandlerMock = new Mock(); + staticMappingHandlerMock.Setup(m => m.GetMappingFolder()).Returns("folder"); + staticMappingHandlerMock.Setup(m => m.FolderExists(It.IsAny())).Returns(true); + staticMappingHandlerMock.Setup(m => m.WriteMappingFile(It.IsAny(), It.IsAny())); + + var server = FluentMockServer.Start(new FluentMockServerSettings + { + FileSystemHandler = staticMappingHandlerMock.Object + }); + + // Act + server + .Given(Request.Create().WithPath($"/foo_{Guid.NewGuid()}"), true) + .WithGuid(guid) + .RespondWith(Response.Create().WithBody("post and save test")); + + // Assert and Verify + staticMappingHandlerMock.Verify(m => m.GetMappingFolder(), Times.Once); + staticMappingHandlerMock.Verify(m => m.FolderExists("folder"), Times.Once); + staticMappingHandlerMock.Verify(m => m.WriteMappingFile(Path.Combine("folder", guid + ".json"), It.IsAny()), Times.Once); + } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs index 54bbbc69..aa0d0eb0 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseCreateTests.cs @@ -1,5 +1,7 @@ using System.Threading.Tasks; +using Moq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using Xunit; @@ -8,6 +10,8 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseCreateTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); + [Fact] public async Task Response_Create_Func() { @@ -18,7 +22,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create(() => responseMessage); // Act - var providedResponse = await response.ProvideResponseAsync(request); + var providedResponse = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(providedResponse).Equals(responseMessage); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs index 4328fd4c..2080c515 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithBodyTests.cs @@ -1,17 +1,20 @@ -using System; +using Moq; +using Newtonsoft.Json.Linq; +using NFluent; +using System; using System.Text; using System.Threading.Tasks; -using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; using Xunit; -using Newtonsoft.Json.Linq; namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithBodyTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -28,7 +31,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBody(new byte[] { 48, 49 }, BodyDestinationFormat.String, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // then Check.That(responseMessage.BodyData.BodyAsString).Equals("01"); @@ -50,7 +53,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBody(new byte[] { 48, 49 }, BodyDestinationFormat.SameAsSource, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // then Check.That(responseMessage.BodyData.BodyAsBytes).ContainsExactly(new byte[] { 48, 49 }); @@ -72,7 +75,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBody("test", null, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // then Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); @@ -94,7 +97,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBodyAsJson(x, Encoding.ASCII); // act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // then Check.That(responseMessage.BodyData.BodyAsJson).Equals(x); @@ -116,7 +119,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBodyAsJson(x, true); // act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // then Check.That(responseMessage.BodyData.BodyAsJson).Equals(x); @@ -132,7 +135,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBody("r", BodyDestinationFormat.SameAsSource, Encoding.ASCII); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsBytes).IsNull(); @@ -150,7 +153,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBody("r", BodyDestinationFormat.Bytes, Encoding.ASCII); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsNull(); @@ -168,7 +171,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithBody("{ \"value\": 42 }", BodyDestinationFormat.Json, Encoding.ASCII); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsNull(); @@ -190,7 +193,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithBody(req => $"path: {req.Path}"); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("path: /test"); @@ -201,7 +204,7 @@ namespace WireMock.Net.Tests.ResponseBuilders Check.That(responseMessage.Headers["H1"].ToString()).IsEqualTo("X1"); Check.That(responseMessage.Headers["H2"].ToString()).IsEqualTo("X2"); } - + [Fact] public async Task Response_ProvideResponse_WithJsonBodyAndTransform_Func() { @@ -211,15 +214,15 @@ namespace WireMock.Net.Tests.ResponseBuilders var request1 = new RequestMessage(new UrlDetails($"http://localhost/test?id={request1Id}"), "GET", ClientIp); var request2 = new RequestMessage(new UrlDetails($"http://localhost/test?id={request2Id}"), "GET", ClientIp); - + var response = Response.Create() .WithStatusCode(200) .WithBodyAsJson(JObject.Parse("{ \"id\": \"{{request.query.id}}\" }")) .WithTransformer(); // Act - var response1Message = await response.ProvideResponseAsync(request1); - var response2Message = await response.ProvideResponseAsync(request2); + var response1Message = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); + var response2Message = await response.ProvideResponseAsync(request2, _fileSystemHandlerMock.Object); // Assert Check.That(((JToken)response1Message.BodyData.BodyAsJson).SelectToken("id")?.Value()).IsEqualTo(request1Id); @@ -237,13 +240,13 @@ namespace WireMock.Net.Tests.ResponseBuilders public async Task Response_ProvideResponse_WithBodyAsFile() { var fileContents = "testFileContents" + Guid.NewGuid(); - var bodyDataAsFile = new BodyData {BodyAsFile = fileContents}; + var bodyDataAsFile = new BodyData { BodyAsFile = fileContents }; var request1 = new RequestMessage(new UrlDetails("http://localhost/__admin/files/filename.txt"), "PUT", ClientIp, bodyDataAsFile); var response = Response.Create().WithStatusCode(200).WithBody(fileContents); - var provideResponseAsync = await response.ProvideResponseAsync(request1); + var provideResponseAsync = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); Check.That(provideResponseAsync.StatusCode).IsEqualTo(200); Check.That(provideResponseAsync.BodyData.BodyAsString).Contains(fileContents); @@ -259,7 +262,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithStatusCode(200).WithBody(fileContents); - var provideResponseAsync = await response.ProvideResponseAsync(request1); + var provideResponseAsync = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); Check.That(provideResponseAsync.StatusCode).IsEqualTo(200); Check.That(provideResponseAsync.BodyData.BodyAsString).Contains(fileContents); @@ -275,7 +278,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithStatusCode(200).WithBody("File deleted."); - var provideResponseAsync = await response.ProvideResponseAsync(request1); + var provideResponseAsync = await response.ProvideResponseAsync(request1, _fileSystemHandlerMock.Object); Check.That(provideResponseAsync.StatusCode).IsEqualTo(200); Check.That(provideResponseAsync.BodyData.BodyAsString).Contains("File deleted."); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs index 910717c3..76912fbc 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithCallbackTests.cs @@ -1,5 +1,7 @@ -using System.Threading.Tasks; +using Moq; using NFluent; +using System.Threading.Tasks; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; @@ -9,6 +11,8 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithCallbackTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); + [Fact] public async Task Response_WithCallback() { @@ -17,7 +21,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithCallback(req => new ResponseMessage { BodyData = new BodyData { DetectedBodyType = BodyType.String, BodyAsString = req.Path + "Bar" }, StatusCode = 302 }); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("/fooBar"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs index 27eff07b..05f387d1 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsFileTests.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; -using WireMock.Transformers; using Xunit; namespace WireMock.Net.Tests.ResponseBuilders @@ -35,11 +34,8 @@ namespace WireMock.Net.Tests.ResponseBuilders }) .WithTransformer(); - response.SetPrivateFieldValue("_fileSystemHandler", _filesystemHandlerMock.Object); - response.SetPrivateFieldValue("_responseMessageTransformer", new ResponseMessageTransformer(_filesystemHandlerMock.Object)); - // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _filesystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -63,11 +59,8 @@ namespace WireMock.Net.Tests.ResponseBuilders }) .WithTransformer(); - response.SetPrivateFieldValue("_fileSystemHandler", _filesystemHandlerMock.Object); - response.SetPrivateFieldValue("_responseMessageTransformer", new ResponseMessageTransformer(_filesystemHandlerMock.Object)); - // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _filesystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -92,7 +85,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _filesystemHandlerMock.Object)).Throws(); // Verify _filesystemHandlerMock.Verify(fs => fs.ReadResponseBodyAsString(It.IsAny()), Times.Never); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs index 88809e1d..f0bda9aa 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsJsonPathTests.cs @@ -1,7 +1,9 @@ using System; using System.Threading.Tasks; +using Moq; using Newtonsoft.Json.Linq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; @@ -11,6 +13,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsJsonPathTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -60,7 +63,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -86,7 +89,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -140,7 +143,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals($"{{{Environment.NewLine} \"Name\": \"Acme Co\",{Environment.NewLine} \"Products\": [{Environment.NewLine} {{{Environment.NewLine} \"Name\": \"Anvil\",{Environment.NewLine} \"Price\": 50{Environment.NewLine} }}{Environment.NewLine} ]{Environment.NewLine}}}"); @@ -193,7 +196,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals($"{{{Environment.NewLine} \"Name\": \"Acme Co\",{Environment.NewLine} \"Products\": [{Environment.NewLine} {{{Environment.NewLine} \"Name\": \"Anvil\",{Environment.NewLine} \"Price\": 50{Environment.NewLine} }}{Environment.NewLine} ]{Environment.NewLine}}}"); @@ -246,7 +249,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); @@ -299,7 +302,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("%0:Anvil%%1:Elbow Grease%"); @@ -328,7 +331,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs index f43e8110..4043bc46 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsLinqTests.cs @@ -1,7 +1,9 @@ -using System; -using System.Threading.Tasks; +using Moq; using Newtonsoft.Json.Linq; using NFluent; +using System; +using System.Threading.Tasks; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; @@ -11,11 +13,13 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsLinqTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); + [Fact] public async Task Response_ProvideResponse_Handlebars_Linq1_String0() { // Assign - var body = new BodyData { }; + var body = new BodyData(); var request = new RequestMessage(new UrlDetails("http://localhost:1234/pathtest"), "POST", "::1", body); @@ -25,7 +29,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -55,7 +59,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -85,7 +89,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -115,7 +119,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -140,14 +144,14 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); } [Fact] public void Response_ProvideResponse_Handlebars_Linq1_Throws_ArgumentNullException() { // Assign - var body = new BodyData { }; + var body = new BodyData(); var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); @@ -156,14 +160,14 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); } [Fact] public void Response_ProvideResponse_Handlebars_Linq1_Throws_ArgumentException() { // Assign - var body = new BodyData { }; + var body = new BodyData(); var request = new RequestMessage(new UrlDetails("http://localhost:1234"), "POST", "::1", body); @@ -172,7 +176,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); } [Fact] @@ -196,7 +200,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -224,7 +228,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs index 4d119153..aa78f166 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRandomTests.cs @@ -1,8 +1,9 @@ -using System; -using System.Linq; +using System.Linq; using System.Threading.Tasks; +using Moq; using Newtonsoft.Json.Linq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using Xunit; @@ -11,6 +12,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsRandomTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -30,7 +32,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -53,7 +55,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -75,7 +77,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -99,7 +101,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -121,7 +123,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs index 4f98d351..e9365016 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsRegexTests.cs @@ -1,6 +1,8 @@ using System; using System.Threading.Tasks; +using Moq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; @@ -10,6 +12,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsRegexTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -25,7 +28,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("abc"); @@ -44,7 +47,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals(""); @@ -63,7 +66,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("d"); @@ -82,7 +85,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("5000-https"); @@ -101,7 +104,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals(""); @@ -120,7 +123,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // assert Check.That(responseMessage.BodyData.BodyAsString).Equals("x"); @@ -139,7 +142,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act and Assert - Check.ThatAsyncCode(() => response.ProvideResponseAsync(request)).Throws(); + Check.ThatAsyncCode(() => response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object)).Throws(); } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs index fad6d28d..57ca8d1d 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsTests.cs @@ -2,8 +2,10 @@ using System.Collections.Generic; using System.Text; using System.Threading.Tasks; +using Moq; using Newtonsoft.Json; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; @@ -18,6 +20,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -38,7 +41,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(JsonConvert.SerializeObject(responseMessage.BodyData.BodyAsJson)).Equals("{\"x\":\"test /foo_object\"}"); @@ -60,7 +63,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test http://localhost/foo /foo POSt"); @@ -78,7 +81,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("http://localhost/a/b http://localhost/wiremock/a/b /a/b /wiremock/a/b"); @@ -96,7 +99,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("a wiremock"); @@ -118,7 +121,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test keya=1 idx=1 idx=2 keyb=5"); @@ -138,7 +141,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}").WithBody("test").WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); @@ -160,7 +163,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithHeader("x", "{{request.headers.Content-Type}}", "{{request.url}}").WithBody("test").WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test"); @@ -185,7 +188,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).Equals("test http://localhost:1234 1234 http localhost"); @@ -209,7 +212,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(JsonConvert.SerializeObject(responseMessage.BodyData.BodyAsJson)).Equals("[\"first\",\"/foo_array\",\"test 1\",\"test 2\",\"last\"]"); @@ -226,7 +229,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithBodyFromFile(@"c:\\{{request.query.MyUniqueNumber}}\test.xml"); // why use a \\ here ? // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsFile).Equals(@"c:\1\test.xml"); @@ -253,7 +256,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithBodyFromFile(@"c:\\{{JsonPath.SelectToken request.body " + jsonPath + "}}\\test.json"); // why use a \\ here ? // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsFile).Equals(@"c:\1\test.json"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs index abca4648..869f2d75 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHandlebarsXegerTests.cs @@ -1,6 +1,8 @@ using System.Threading.Tasks; +using Moq; using Newtonsoft.Json.Linq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using Xunit; @@ -9,6 +11,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHandlebarsXegerTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Fact] @@ -26,7 +29,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); @@ -49,7 +52,7 @@ namespace WireMock.Net.Tests.ResponseBuilders .WithTransformer(); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert JObject j = JObject.FromObject(responseMessage.BodyData.BodyAsJson); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs index ad596373..448591d8 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithHeadersTests.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Moq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.ResponseBuilders; using WireMock.Util; @@ -10,6 +12,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithHeadersTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); private const string ClientIp = "::1"; [Theory] @@ -23,7 +26,7 @@ namespace WireMock.Net.Tests.ResponseBuilders IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValue); // Act - var response = await builder.ProvideResponseAsync(requestMock); + var response = await builder.ProvideResponseAsync(requestMock, _fileSystemHandlerMock.Object); // Assert Check.That(response.Headers[headerName].ToString()).Equals(headerValue); @@ -39,7 +42,7 @@ namespace WireMock.Net.Tests.ResponseBuilders IResponseBuilder builder = Response.Create().WithHeader(headerName, headerValues); // Act - var response = await builder.ProvideResponseAsync(requestMock); + var response = await builder.ProvideResponseAsync(requestMock, _fileSystemHandlerMock.Object); // Assert Check.That(response.Headers[headerName].ToArray()).Equals(headerValues); @@ -54,7 +57,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithHeaders(headers); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.Headers["h"]).ContainsExactly("x"); @@ -69,7 +72,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithHeaders(headers); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.Headers["h"]).ContainsExactly("x"); @@ -84,7 +87,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithHeaders(headers); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.Headers["h"]).ContainsExactly("x"); diff --git a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs index 28b3aafb..a920f27c 100644 --- a/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs +++ b/test/WireMock.Net.Tests/ResponseBuilders/ResponseWithProxyTests.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Moq; using NFluent; +using WireMock.Handlers; using WireMock.Models; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; @@ -13,6 +15,7 @@ namespace WireMock.Net.Tests.ResponseBuilders { public class ResponseWithProxyTests : IDisposable { + private readonly Mock _fileSystemHandlerMock = new Mock(); private readonly FluentMockServer _server; private readonly Guid _guid; @@ -34,7 +37,7 @@ namespace WireMock.Net.Tests.ResponseBuilders var response = Response.Create().WithProxy(_server.Urls[0]); // Act - var responseMessage = await response.ProvideResponseAsync(request); + var responseMessage = await response.ProvideResponseAsync(request, _fileSystemHandlerMock.Object); // Assert Check.That(responseMessage.BodyData.BodyAsString).IsEqualTo("{\"p\":42}"); diff --git a/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs b/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs index 1a351e5b..ebe68c33 100644 --- a/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs +++ b/test/WireMock.Net.Tests/Serialization/MappingConverterTests.cs @@ -1,5 +1,7 @@ -using System; -using NFluent; +using FluentAssertions; +using Moq; +using System; +using WireMock.Handlers; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Serialization; @@ -9,19 +11,41 @@ namespace WireMock.Net.Tests.Serialization { public class MappingConverterTests { + private readonly Mock _fileSystemHandlerMock = new Mock(); + [Fact] - public void MappingConverter_ToMappingModel() + public void ToMappingModel() { // Assign var request = Request.Create(); var response = Response.Create(); - var mapping = new Mapping(Guid.NewGuid(), "", null, request, response, 0, null, null, null); + var mapping = new Mapping(Guid.NewGuid(), "", null, _fileSystemHandlerMock.Object, request, response, 0, null, null, null); // Act var model = MappingConverter.ToMappingModel(mapping); // Assert - Check.That(model).IsNotNull(); + model.Should().NotBeNull(); + model.Priority.Should().BeNull(); + model.Response.BodyAsJsonIndented.Should().BeNull(); + model.Response.UseTransformer.Should().BeNull(); + } + + [Fact] + public void ToMappingModel_WithPriority_ReturnsPriority() + { + // Assign + var request = Request.Create(); + var response = Response.Create().WithBodyAsJson(new { x = "x" }).WithTransformer(); + var mapping = new Mapping(Guid.NewGuid(), "", null, _fileSystemHandlerMock.Object, request, response, 42, null, null, null); + + // Act + var model = MappingConverter.ToMappingModel(mapping); + + // Assert + model.Should().NotBeNull(); + model.Priority.Should().Be(42); + model.Response.UseTransformer.Should().BeTrue(); } } } \ No newline at end of file