From f0d6ed26bcbbd491c572e042ac6ed9b4cf59cc5f Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 22 Aug 2022 20:05:52 +0200 Subject: [PATCH] Add check for duplicate Guids when posting multiple mappings in one request (#795) * Add check for DuplicateGuids * Add check for duplicate Guids when posting mapping(s) * mappingModels * fix ut --- WireMock.Net Solution.sln.DotSettings | 1 + .../Server/WireMockServer.Admin.cs | 20 +- .../Server/WireMockServer.ConvertMapping.cs | 30 +- .../WireMock.Net.Tests.csproj | 2 +- .../WireMockAdminApiTests.cs | 914 +++++++++--------- .../WireMockServer.Admin.cs | 840 ++++++++-------- 6 files changed, 935 insertions(+), 872 deletions(-) diff --git a/WireMock.Net Solution.sln.DotSettings b/WireMock.Net Solution.sln.DotSettings index 6c092492..5504e424 100644 --- a/WireMock.Net Solution.sln.DotSettings +++ b/WireMock.Net Solution.sln.DotSettings @@ -16,6 +16,7 @@ True True True + True True True True diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index 7c477175..52a58d3f 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -188,16 +188,13 @@ public partial class WireMockServer if (FileHelper.TryReadMappingFileWithRetryAndDelay(_settings.FileSystemHandler, path, out var value)) { var mappingModels = DeserializeJsonToArray(value); - foreach (var mappingModel in mappingModels) + if (mappingModels.Length == 1 && Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) { - if (mappingModels.Length == 1 && Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename)) - { - ConvertMappingAndRegisterAsRespondProvider(mappingModel, guidFromFilename, path); - } - else - { - ConvertMappingAndRegisterAsRespondProvider(mappingModel, null, path); - } + ConvertMappingAndRegisterAsRespondProvider(mappingModels[0], guidFromFilename, path); + } + else + { + ConvertMappingsAndRegisterAsRespondProvider(mappingModels, path); } return true; @@ -422,10 +419,7 @@ public partial class WireMockServer return ResponseMessageBuilder.Create("Mapping added", 201, guid); } - foreach (var mappingModel in mappingModels) - { - ConvertMappingAndRegisterAsRespondProvider(mappingModel); - } + ConvertMappingsAndRegisterAsRespondProvider(mappingModels); return ResponseMessageBuilder.Create("Mappings added", 201); } diff --git a/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs b/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs index 5285a523..3c732ff6 100644 --- a/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs +++ b/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs @@ -14,6 +14,25 @@ namespace WireMock.Server; public partial class WireMockServer { + private void ConvertMappingsAndRegisterAsRespondProvider(MappingModel[] mappingModels, string? path = null) + { + var duplicateGuids = mappingModels + .Where(m => m.Guid != null) + .GroupBy(m => m.Guid) + .Where(g => g.Count() > 1) + .Select(g => $"'{g.Key}'") + .ToArray(); + if (duplicateGuids.Any()) + { + throw new ArgumentException($"The following Guids are duplicate : {string.Join(",", duplicateGuids)}", nameof(mappingModels)); + } + + foreach (var mappingModel in mappingModels) + { + ConvertMappingAndRegisterAsRespondProvider(mappingModel, null, path); + } + } + private Guid? ConvertMappingAndRegisterAsRespondProvider(MappingModel mappingModel, Guid? guid = null, string? path = null) { Guard.NotNull(mappingModel); @@ -37,9 +56,10 @@ public partial class WireMockServer respondProvider = respondProvider.WithGuid(mappingModel.Guid.Value); } - if (mappingModel.TimeSettings != null) + var timeSettings = TimeSettingsMapper.Map(mappingModel.TimeSettings); + if (timeSettings != null) { - respondProvider = respondProvider.WithTimeSettings(TimeSettingsMapper.Map(mappingModel.TimeSettings)); + respondProvider = respondProvider.WithTimeSettings(timeSettings); } if (path != null) @@ -101,7 +121,7 @@ public partial class WireMockServer else { var clientIPModel = JsonUtils.ParseJTokenToObject(requestModel.ClientIP); - if (clientIPModel?.Matchers != null) + if (clientIPModel.Matchers != null) { requestBuilder = requestBuilder.WithPath(clientIPModel.Matchers.Select(_matcherMapper.Map).OfType().ToArray()); } @@ -119,7 +139,7 @@ public partial class WireMockServer else { var pathModel = JsonUtils.ParseJTokenToObject(requestModel.Path); - if (pathModel?.Matchers != null) + if (pathModel.Matchers != null) { var matchOperator = StringUtils.ParseMatchOperator(pathModel.MatchOperator); requestBuilder = requestBuilder.WithPath(matchOperator, pathModel.Matchers.Select(_matcherMapper.Map).OfType().ToArray()); @@ -137,7 +157,7 @@ public partial class WireMockServer else { var urlModel = JsonUtils.ParseJTokenToObject(requestModel.Url); - if (urlModel?.Matchers != null) + if (urlModel.Matchers != null) { var matchOperator = StringUtils.ParseMatchOperator(urlModel.MatchOperator); requestBuilder = requestBuilder.WithUrl(matchOperator, urlModel.Matchers.Select(_matcherMapper.Map).OfType().ToArray()); diff --git a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj index 37f522c2..a85488e0 100644 --- a/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj +++ b/test/WireMock.Net.Tests/WireMock.Net.Tests.csproj @@ -73,7 +73,7 @@ - + diff --git a/test/WireMock.Net.Tests/WireMockAdminApiTests.cs b/test/WireMock.Net.Tests/WireMockAdminApiTests.cs index 4d5f0669..9fea0a0c 100644 --- a/test/WireMock.Net.Tests/WireMockAdminApiTests.cs +++ b/test/WireMock.Net.Tests/WireMockAdminApiTests.cs @@ -19,539 +19,589 @@ using WireMock.Server; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests +namespace WireMock.Net.Tests; + +public class WireMockAdminApiTests { - public class WireMockAdminApiTests + [Fact] + public async Task IWireMockAdminApi_GetSettingsAsync() { - [Fact] - public async Task IWireMockAdminApi_GetSettingsAsync() + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var settings = await api.GetSettingsAsync().ConfigureAwait(false); + Check.That(settings).IsNotNull(); + } + + [Fact] + public async Task IWireMockAdminApi_PostSettingsAsync() + { + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var settings = new SettingsModel(); + var status = await api.PostSettingsAsync(settings).ConfigureAwait(false); + Check.That(status.Status).Equals("Settings updated"); + } + + [Fact] + public async Task IWireMockAdminApi_PutSettingsAsync() + { + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var settings = new SettingsModel(); + var status = await api.PutSettingsAsync(settings).ConfigureAwait(false); + Check.That(status.Status).Equals("Settings updated"); + } + + // https://github.com/WireMock-Net/WireMock.Net/issues/325 + [Fact] + public async Task IWireMockAdminApi_PutMappingAsync() + { + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var model = new MappingModel { - // Arrange - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); + Request = new RequestModel { Path = "/1" }, + Response = new ResponseModel { Body = "txt", StatusCode = 200 }, + Priority = 500, + Title = "test" + }; + var result = await api.PutMappingAsync(new Guid("a0000000-0000-0000-0000-000000000000"), model).ConfigureAwait(false); - // Act - var settings = await api.GetSettingsAsync().ConfigureAwait(false); - Check.That(settings).IsNotNull(); - } + // Assert + Check.That(result).IsNotNull(); + Check.That(result.Status).Equals("Mapping added or updated"); + Check.That(result.Guid).IsNotNull(); - [Fact] - public async Task IWireMockAdminApi_PostSettingsAsync() + var mapping = server.Mappings.Single(m => m.Priority == 500); + Check.That(mapping).IsNotNull(); + Check.That(mapping.Title).Equals("test"); + + server.Stop(); + } + + [Theory] + [InlineData(null, null)] + [InlineData(-1, -1)] + [InlineData(0, 0)] + [InlineData(200, 200)] + [InlineData("200", "200")] + public async Task IWireMockAdminApi_PostMappingAsync_WithStatusCode(object statusCode, object expectedStatusCode) + { + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var model = new MappingModel { - // Arrange - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); + Request = new RequestModel { Path = "/1" }, + Response = new ResponseModel { Body = "txt", StatusCode = statusCode }, + Priority = 500, + Title = "test" + }; + var result = await api.PostMappingAsync(model).ConfigureAwait(false); - // Act - var settings = new SettingsModel(); - var status = await api.PostSettingsAsync(settings).ConfigureAwait(false); - Check.That(status.Status).Equals("Settings updated"); - } + // Assert + Check.That(result).IsNotNull(); + Check.That(result.Status).IsNotNull(); + Check.That(result.Guid).IsNotNull(); - [Fact] - public async Task IWireMockAdminApi_PutSettingsAsync() + var mapping = server.Mappings.Single(m => m.Priority == 500); + Check.That(mapping).IsNotNull(); + Check.That(mapping.Title).Equals("test"); + + var response = await mapping.ProvideResponseAsync(new RequestMessage(new UrlDetails("http://localhost/1"), "GET", "")).ConfigureAwait(false); + Check.That(response.Message.StatusCode).Equals(expectedStatusCode); + + server.Stop(); + } + + [Fact] + public async Task IWireMockAdminApi_PostMappingsAsync() + { + // Arrange + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var model1 = new MappingModel { - // Arrange - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); - - // Act - var settings = new SettingsModel(); - var status = await api.PutSettingsAsync(settings).ConfigureAwait(false); - Check.That(status.Status).Equals("Settings updated"); - } - - // https://github.com/WireMock-Net/WireMock.Net/issues/325 - [Fact] - public async Task IWireMockAdminApi_PutMappingAsync() + Request = new RequestModel { Path = "/1" }, + Response = new ResponseModel { Body = "txt 1" }, + Title = "test 1" + }; + var model2 = new MappingModel { - // Arrange - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); + Request = new RequestModel { Path = "/2" }, + Response = new ResponseModel { Body = "txt 2" }, + Title = "test 2" + }; + var result = await api.PostMappingsAsync(new[] { model1, model2 }).ConfigureAwait(false); - // Act - var model = new MappingModel - { - Request = new RequestModel { Path = "/1" }, - Response = new ResponseModel { Body = "txt", StatusCode = 200 }, - Priority = 500, - Title = "test" + // Assert + Check.That(result).IsNotNull(); + Check.That(result.Status).IsNotNull(); + Check.That(result.Guid).IsNull(); + Check.That(server.Mappings.Where(m => !m.IsAdminInterface)).HasSize(2); + + server.Stop(); + } + + [Fact] + public async Task IWireMockAdminApi_PostMappingsAsync_WithDuplicateGuids_Should_Return_400() + { + // Arrange + var guid = Guid.Parse("1b731398-4a5b-457f-a6e3-d65e541c428f"); + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var model1WithGuid = new MappingModel + { + Guid = guid, + Request = new RequestModel { Path = "/1g" }, + Response = new ResponseModel { Body = "txt 1g" }, + Title = "test 1g" + }; + var model2WithGuid = new MappingModel + { + Guid = guid, + Request = new RequestModel { Path = "/2g" }, + Response = new ResponseModel { Body = "txt 2g" }, + Title = "test 2g" + }; + var model1 = new MappingModel + { + Request = new RequestModel { Path = "/1" }, + Response = new ResponseModel { Body = "txt 1" }, + Title = "test 1" + }; + var model2 = new MappingModel + { + Request = new RequestModel { Path = "/2" }, + Response = new ResponseModel { Body = "txt 2" }, + Title = "test 2" + }; + + var models = new[] + { + model1WithGuid, + model2WithGuid, + model1, + model2 }; - var result = await api.PutMappingAsync(new Guid("a0000000-0000-0000-0000-000000000000"), model).ConfigureAwait(false); - // Assert - Check.That(result).IsNotNull(); - Check.That(result.Status).Equals("Mapping added or updated"); - Check.That(result.Guid).IsNotNull(); + var sutMethod = async () => await api.PostMappingsAsync(models); + var exceptionAssertions = await sutMethod.Should().ThrowAsync(); + exceptionAssertions.Which.Content.Should().Be(@"{""Status"":""The following Guids are duplicate : '1b731398-4a5b-457f-a6e3-d65e541c428f' (Parameter 'mappingModels')""}"); - var mapping = server.Mappings.Single(m => m.Priority == 500); - Check.That(mapping).IsNotNull(); - Check.That(mapping.Title).Equals("test"); + server.Stop(); + } - server.Stop(); - } - - [Theory] - [InlineData(null, null)] - [InlineData(-1, -1)] - [InlineData(0, 0)] - [InlineData(200, 200)] - [InlineData("200", "200")] - public async Task IWireMockAdminApi_PostMappingAsync_WithStatusCode(object statusCode, object expectedStatusCode) + [Fact] + public async Task IWireMockAdminApi_FindRequestsAsync() + { + // Arrange + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); + var serverUrl = "http://localhost:" + server.Ports[0]; + await new HttpClient().GetAsync(serverUrl + "/foo").ConfigureAwait(false); + var api = RestClient.For(serverUrl); - // Act - var model = new MappingModel - { - Request = new RequestModel { Path = "/1" }, - Response = new ResponseModel { Body = "txt", StatusCode = statusCode }, - Priority = 500, - Title = "test" - }; - var result = await api.PostMappingAsync(model).ConfigureAwait(false); + // Act + var requests = await api.FindRequestsAsync(new RequestModel { Methods = new[] { "GET" } }).ConfigureAwait(false); - // Assert - Check.That(result).IsNotNull(); - Check.That(result.Status).IsNotNull(); - Check.That(result.Guid).IsNotNull(); + // Assert + Check.That(requests).HasSize(1); + var requestLogged = requests.First(); + Check.That(requestLogged.Request.Method).IsEqualTo("GET"); + Check.That(requestLogged.Request.Body).IsNull(); + Check.That(requestLogged.Request.Path).IsEqualTo("/foo"); + } - var mapping = server.Mappings.Single(m => m.Priority == 500); - Check.That(mapping).IsNotNull(); - Check.That(mapping.Title).Equals("test"); - - var response = await mapping.ProvideResponseAsync(new RequestMessage(new UrlDetails("http://localhost/1"), "GET", "")).ConfigureAwait(false); - Check.That(response.Message.StatusCode).Equals(expectedStatusCode); - - server.Stop(); - } - - [Fact] - public async Task IWireMockAdminApi_PostMappingsAsync() + [Fact] + public async Task IWireMockAdminApi_GetRequestsAsync() + { + // Arrange + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); + var serverUrl = "http://localhost:" + server.Ports[0]; + await new HttpClient().GetAsync(serverUrl + "/foo").ConfigureAwait(false); + var api = RestClient.For(serverUrl); - // Act - var model1 = new MappingModel - { - Request = new RequestModel { Path = "/1" }, - Response = new ResponseModel { Body = "txt 1" }, - Title = "test 1" - }; - var model2 = new MappingModel - { - Request = new RequestModel { Path = "/2" }, - Response = new ResponseModel { Body = "txt 2" }, - Title = "test 2" - }; - var result = await api.PostMappingsAsync(new[] { model1, model2 }).ConfigureAwait(false); + // Act + var requests = await api.GetRequestsAsync().ConfigureAwait(false); - // Assert - Check.That(result).IsNotNull(); - Check.That(result.Status).IsNotNull(); - Check.That(result.Guid).IsNull(); - Check.That(server.Mappings.Where(m => !m.IsAdminInterface)).HasSize(2); + // Assert + Check.That(requests).HasSize(1); + var requestLogged = requests.First(); + Check.That(requestLogged.Request.Method).IsEqualTo("GET"); + Check.That(requestLogged.Request.Body).IsNull(); + Check.That(requestLogged.Request.Path).IsEqualTo("/foo"); + } - server.Stop(); - } - - [Fact] - public async Task IWireMockAdminApi_FindRequestsAsync() + [Fact] + public async Task IWireMockAdminApi_GetRequestsAsync_JsonApi() + { + // Arrange + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var server = WireMockServer.Start(new WireMockServerSettings - { - StartAdminInterface = true, - Logger = new WireMockNullLogger() - }); - var serverUrl = "http://localhost:" + server.Ports[0]; - await new HttpClient().GetAsync(serverUrl + "/foo").ConfigureAwait(false); - var api = RestClient.For(serverUrl); + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); + string serverUrl = server.Urls[0]; + string data = "{\"data\":[{\"type\":\"program\",\"attributes\":{\"alias\":\"T000001\",\"title\":\"Title Group Entity\"}}]}"; + string jsonApiAcceptHeader = "application/vnd.api+json"; + string jsonApiContentType = "application/vnd.api+json"; - // Act - var requests = await api.FindRequestsAsync(new RequestModel { Methods = new[] { "GET" } }).ConfigureAwait(false); + var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); + request.Headers.Accept.Clear(); + request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonApiAcceptHeader)); + request.Content = new StringContent(data); + request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); - // Assert - Check.That(requests).HasSize(1); - var requestLogged = requests.First(); - Check.That(requestLogged.Request.Method).IsEqualTo("GET"); - Check.That(requestLogged.Request.Body).IsNull(); - Check.That(requestLogged.Request.Path).IsEqualTo("/foo"); - } + var response = await new HttpClient().SendAsync(request); + Check.That(response).IsNotNull(); - [Fact] - public async Task IWireMockAdminApi_GetRequestsAsync() + var api = RestClient.For(serverUrl); + + // Act + var requests = await api.GetRequestsAsync().ConfigureAwait(false); + + // Assert + Check.That(requests).HasSize(1); + var requestLogged = requests.First(); + Check.That(requestLogged.Request.Method).IsEqualTo("POST"); + Check.That(requestLogged.Request.Body).IsNotNull(); + Check.That(requestLogged.Request.Body).Contains("T000001"); + } + + [Fact] + public async Task IWireMockAdminApi_GetMappingAsync_WithBodyModelMatcherModel_WithoutMethods_ShouldReturnCorrectMappingModel() + { + // Arrange + var guid = Guid.NewGuid(); + var server = WireMockServer.StartWithAdminInterface(); + var api = RestClient.For(server.Urls[0]); + + // Act + var model = new MappingModel { - // Arrange - var server = WireMockServer.Start(new WireMockServerSettings + Guid = guid, + Request = new RequestModel { - StartAdminInterface = true, - Logger = new WireMockNullLogger() - }); - var serverUrl = "http://localhost:" + server.Ports[0]; - await new HttpClient().GetAsync(serverUrl + "/foo").ConfigureAwait(false); - var api = RestClient.For(serverUrl); - - // Act - var requests = await api.GetRequestsAsync().ConfigureAwait(false); - - // Assert - Check.That(requests).HasSize(1); - var requestLogged = requests.First(); - Check.That(requestLogged.Request.Method).IsEqualTo("GET"); - Check.That(requestLogged.Request.Body).IsNull(); - Check.That(requestLogged.Request.Path).IsEqualTo("/foo"); - } - - [Fact] - public async Task IWireMockAdminApi_GetRequestsAsync_JsonApi() - { - // Arrange - var server = WireMockServer.Start(new WireMockServerSettings - { - StartAdminInterface = true, - Logger = new WireMockNullLogger() - }); - string serverUrl = server.Urls[0]; - string data = "{\"data\":[{\"type\":\"program\",\"attributes\":{\"alias\":\"T000001\",\"title\":\"Title Group Entity\"}}]}"; - string jsonApiAcceptHeader = "application/vnd.api+json"; - string jsonApiContentType = "application/vnd.api+json"; - - var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); - request.Headers.Accept.Clear(); - request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonApiAcceptHeader)); - request.Content = new StringContent(data); - request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); - - var response = await new HttpClient().SendAsync(request); - Check.That(response).IsNotNull(); - - var api = RestClient.For(serverUrl); - - // Act - var requests = await api.GetRequestsAsync().ConfigureAwait(false); - - // Assert - Check.That(requests).HasSize(1); - var requestLogged = requests.First(); - Check.That(requestLogged.Request.Method).IsEqualTo("POST"); - Check.That(requestLogged.Request.Body).IsNotNull(); - Check.That(requestLogged.Request.Body).Contains("T000001"); - } - - [Fact] - public async Task IWireMockAdminApi_GetMappingAsync_WithBodyModelMatcherModel_WithoutMethods_ShouldReturnCorrectMappingModel() - { - // Arrange - var guid = Guid.NewGuid(); - var server = WireMockServer.StartWithAdminInterface(); - var api = RestClient.For(server.Urls[0]); - - // Act - var model = new MappingModel - { - Guid = guid, - Request = new RequestModel + Path = "/1", + Body = new BodyModel { - Path = "/1", - Body = new BodyModel + Matcher = new MatcherModel { - Matcher = new MatcherModel - { - Name = "RegexMatcher", - Pattern = "hello", - IgnoreCase = true - } + Name = "RegexMatcher", + Pattern = "hello", + IgnoreCase = true } - }, - Response = new ResponseModel { Body = "world" } - }; - var postMappingResult = await api.PostMappingAsync(model).ConfigureAwait(false); + } + }, + Response = new ResponseModel { Body = "world" } + }; + var postMappingResult = await api.PostMappingAsync(model).ConfigureAwait(false); - // Assert - postMappingResult.Should().NotBeNull(); + // Assert + postMappingResult.Should().NotBeNull(); - var mapping = server.Mappings.FirstOrDefault(m => m.Guid == guid); - mapping.Should().NotBeNull(); + var mapping = server.Mappings.FirstOrDefault(m => m.Guid == guid); + mapping.Should().NotBeNull(); - var getMappingResult = await api.GetMappingAsync(guid).ConfigureAwait(false); - getMappingResult.Should().NotBeNull(); + var getMappingResult = await api.GetMappingAsync(guid).ConfigureAwait(false); + getMappingResult.Should().NotBeNull(); - getMappingResult.Request.Body.Should().BeEquivalentTo(model.Request.Body); + getMappingResult.Request.Body.Should().BeEquivalentTo(model.Request.Body); - server.Stop(); - } + server.Stop(); + } - [Fact] - public async Task IWireMockAdminApi_GetRequestsAsync_Json() + [Fact] + public async Task IWireMockAdminApi_GetRequestsAsync_Json() + { + // Arrange + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var server = WireMockServer.Start(new WireMockServerSettings - { - StartAdminInterface = true, - Logger = new WireMockNullLogger() - }); - string serverUrl = server.Urls[0]; - string data = "{\"alias\": \"T000001\"}"; - string jsonAcceptHeader = "application/json"; - string jsonApiContentType = "application/json"; + StartAdminInterface = true, + Logger = new WireMockNullLogger() + }); + string serverUrl = server.Urls[0]; + string data = "{\"alias\": \"T000001\"}"; + string jsonAcceptHeader = "application/json"; + string jsonApiContentType = "application/json"; - var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); - request.Headers.Accept.Clear(); - request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonAcceptHeader)); - request.Content = new StringContent(data); - request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); - var response = await new HttpClient().SendAsync(request); - Check.That(response).IsNotNull(); + var request = new HttpRequestMessage(HttpMethod.Post, serverUrl); + request.Headers.Accept.Clear(); + request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(jsonAcceptHeader)); + request.Content = new StringContent(data); + request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse(jsonApiContentType); + var response = await new HttpClient().SendAsync(request); + Check.That(response).IsNotNull(); - var api = RestClient.For(serverUrl); + var api = RestClient.For(serverUrl); - // Act - var requests = await api.GetRequestsAsync().ConfigureAwait(false); + // Act + var requests = await api.GetRequestsAsync().ConfigureAwait(false); - // Assert - Check.That(requests).HasSize(1); - var requestLogged = requests.First(); - Check.That(requestLogged.Request.Method).IsEqualTo("POST"); - Check.That(requestLogged.Request.Body).IsNotNull(); - Check.That(requestLogged.Request.Body).Contains("T000001"); - } + // Assert + Check.That(requests).HasSize(1); + var requestLogged = requests.First(); + Check.That(requestLogged.Request.Method).IsEqualTo("POST"); + Check.That(requestLogged.Request.Body).IsNotNull(); + Check.That(requestLogged.Request.Body).Contains("T000001"); + } - [Fact] - public async Task IWireMockAdminApi_PostFileAsync_Ascii() + [Fact] + public async Task IWireMockAdminApi_PostFileAsync_Ascii() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.GetMappingFolder()).Returns("__admin/mappings"); + filesystemHandlerMock.Setup(fs => fs.FolderExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); + + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.GetMappingFolder()).Returns("__admin/mappings"); - filesystemHandlerMock.Setup(fs => fs.FolderExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act + var request = await api.PostFileAsync("filename.txt", "abc").ConfigureAwait(false); - // Act - var request = await api.PostFileAsync("filename.txt", "abc").ConfigureAwait(false); + // Assert + Check.That(request.Guid).IsNull(); + Check.That(request.Status).Contains("File"); - // Assert - Check.That(request.Guid).IsNull(); - Check.That(request.Status).Contains("File"); + // Verify + filesystemHandlerMock.Verify(fs => fs.GetMappingFolder(), Times.Once); + filesystemHandlerMock.Verify(fs => fs.FolderExists(It.IsAny()), Times.Once); + filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.GetMappingFolder(), Times.Once); - filesystemHandlerMock.Verify(fs => fs.FolderExists(It.IsAny()), Times.Once); - filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public async Task IWireMockAdminApi_PutFileAsync_Ascii() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); - [Fact] - public async Task IWireMockAdminApi_PutFileAsync_Ascii() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.WriteFile(It.IsAny(), It.IsAny())); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act + var request = await api.PutFileAsync("filename.txt", "abc-abc").ConfigureAwait(false); - // Act - var request = await api.PutFileAsync("filename.txt", "abc-abc").ConfigureAwait(false); + // Assert + Check.That(request.Guid).IsNull(); + Check.That(request.Status).Contains("File"); - // Assert - Check.That(request.Guid).IsNull(); - Check.That(request.Status).Contains("File"); + // Verify + filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.WriteFile(It.Is(p => p == "filename.txt"), It.IsAny()), Times.Once); - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public void IWireMockAdminApi_PutFileAsync_NotFound() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); - [Fact] - public void IWireMockAdminApi_PutFileAsync_NotFound() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act and Assert + Check.ThatAsyncCode(() => api.PutFileAsync("filename.txt", "xxx")).Throws(); - // Act and Assert - Check.ThatAsyncCode(() => api.PutFileAsync("filename.txt", "xxx")).Throws(); + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public void IWireMockAdminApi_GetFileAsync_NotFound() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); + filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(Encoding.ASCII.GetBytes("Here's a string.")); - [Fact] - public void IWireMockAdminApi_GetFileAsync_NotFound() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); - filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(Encoding.ASCII.GetBytes("Here's a string.")); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act and Assert + Check.ThatAsyncCode(() => api.GetFileAsync("filename.txt")).Throws(); - // Act and Assert - Check.ThatAsyncCode(() => api.GetFileAsync("filename.txt")).Throws(); + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public async Task IWireMockAdminApi_GetFileAsync_Found() + { + // Arrange + string data = "Here's a string."; + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(Encoding.ASCII.GetBytes(data)); - [Fact] - public async Task IWireMockAdminApi_GetFileAsync_Found() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - string data = "Here's a string."; - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.ReadFile(It.IsAny())).Returns(Encoding.ASCII.GetBytes(data)); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act + string file = await api.GetFileAsync("filename.txt").ConfigureAwait(false); - // Act - string file = await api.GetFileAsync("filename.txt").ConfigureAwait(false); + // Assert + Check.That(file).Equals(data); - // Assert - Check.That(file).Equals(data); + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.Verify(fs => fs.ReadFile(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.Verify(fs => fs.ReadFile(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public async Task IWireMockAdminApi_DeleteFileAsync_Ok() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); + filesystemHandlerMock.Setup(fs => fs.DeleteFile(It.IsAny())); - [Fact] - public async Task IWireMockAdminApi_DeleteFileAsync_Ok() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(true); - filesystemHandlerMock.Setup(fs => fs.DeleteFile(It.IsAny())); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act + await api.DeleteFileAsync("filename.txt").ConfigureAwait(false); - // Act - await api.DeleteFileAsync("filename.txt").ConfigureAwait(false); + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.Verify(fs => fs.DeleteFile(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.Verify(fs => fs.DeleteFile(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public void IWireMockAdminApi_DeleteFileAsync_NotFound() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); + filesystemHandlerMock.Setup(fs => fs.DeleteFile(It.IsAny())); - [Fact] - public void IWireMockAdminApi_DeleteFileAsync_NotFound() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); - filesystemHandlerMock.Setup(fs => fs.DeleteFile(It.IsAny())); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act and Assert + Check.ThatAsyncCode(() => api.DeleteFileAsync("filename.txt")).Throws(); - // Act and Assert - Check.ThatAsyncCode(() => api.DeleteFileAsync("filename.txt")).Throws(); + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); + server.Stop(); + } - server.Stop(); - } + [Fact] + public void IWireMockAdminApi_FileExistsAsync_NotFound() + { + // Arrange + var filesystemHandlerMock = new Mock(MockBehavior.Strict); + filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); - [Fact] - public void IWireMockAdminApi_FileExistsAsync_NotFound() + var server = WireMockServer.Start(new WireMockServerSettings { - // Arrange - var filesystemHandlerMock = new Mock(MockBehavior.Strict); - filesystemHandlerMock.Setup(fs => fs.FileExists(It.IsAny())).Returns(false); + UseSSL = false, + StartAdminInterface = true, + FileSystemHandler = filesystemHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - UseSSL = false, - StartAdminInterface = true, - FileSystemHandler = filesystemHandlerMock.Object - }); + var api = RestClient.For(server.Urls[0]); - var api = RestClient.For(server.Urls[0]); + // Act and Assert + Check.ThatAsyncCode(() => api.FileExistsAsync("filename.txt")).Throws(); - // Act and Assert - Check.ThatAsyncCode(() => api.FileExistsAsync("filename.txt")).Throws(); + // Verify + filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); + filesystemHandlerMock.VerifyNoOtherCalls(); - // Verify - filesystemHandlerMock.Verify(fs => fs.FileExists(It.Is(p => p == "filename.txt")), Times.Once); - filesystemHandlerMock.VerifyNoOtherCalls(); - - server.Stop(); - } + server.Stop(); } } #endif \ No newline at end of file diff --git a/test/WireMock.Net.Tests/WireMockServer.Admin.cs b/test/WireMock.Net.Tests/WireMockServer.Admin.cs index bea1916c..f299c17d 100644 --- a/test/WireMock.Net.Tests/WireMockServer.Admin.cs +++ b/test/WireMock.Net.Tests/WireMockServer.Admin.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; @@ -17,467 +16,466 @@ using WireMock.Server; using WireMock.Settings; using Xunit; -namespace WireMock.Net.Tests +namespace WireMock.Net.Tests; + +public class WireMockServerAdminTests { - public class WireMockServerAdminTests + // For for AppVeyor + OpenCover + private string GetCurrentFolder() { - // For for AppVeyor + OpenCover - private string GetCurrentFolder() + string current = Directory.GetCurrentDirectory(); + //if (!current.EndsWith("WireMock.Net.Tests")) + // return Path.Combine(current, "test", "WireMock.Net.Tests"); + + return current; + } + + [Fact] + public void WireMockServer_Admin_ResetMappings() + { + var server = WireMockServer.Start(); + string folder = Path.Combine(GetCurrentFolder(), "__admin", "mappings"); + server.ReadStaticMappings(folder); + + Check.That(server.Mappings).HasSize(6); + Check.That(server.MappingModels).HasSize(6); + + // Act + server.ResetMappings(); + + // Assert + Check.That(server.Mappings).HasSize(0); + Check.That(server.MappingModels).HasSize(0); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_SaveStaticMappings() + { + // Assign + string guid = "791a3f31-6946-aaaa-8e6f-0237c7441111"; + 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 = WireMockServer.Start(new WireMockServerSettings { - string current = Directory.GetCurrentDirectory(); - //if (!current.EndsWith("WireMock.Net.Tests")) - // return Path.Combine(current, "test", "WireMock.Net.Tests"); + FileSystemHandler = staticMappingHandlerMock.Object + }); - return current; - } + server + .Given(Request.Create().WithPath($"/foo_{Guid.NewGuid()}")) + .WithGuid(guid) + .RespondWith(Response.Create().WithBody("save test")); - [Fact] - public void WireMockServer_Admin_ResetMappings() + // Act + server.SaveStaticMappings(); + + // 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); + } + + [Fact] + public void WireMockServer_Admin_ReadStaticMapping_WithNonGuidFilename() + { + var guid = Guid.Parse("04ee4872-9efd-4770-90d3-88d445265d0d"); + string title = "documentdb_root_title"; + + var server = WireMockServer.Start(); + + string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", "documentdb_root.json"); + server.ReadStaticMappingAndAddOrUpdate(path); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(1); + + Check.That(mappings.First().RequestMatcher).IsNotNull(); + Check.That(mappings.First().Provider).IsNotNull(); + Check.That(mappings.First().Guid).Equals(guid); + Check.That(mappings.First().Title).Equals(title); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_ReadStaticMapping_WithGuidFilename() + { + string guid = "00000002-ee28-4f29-ae63-1ac9b0802d86"; + + var server = WireMockServer.Start(); + string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", guid + ".json"); + server.ReadStaticMappingAndAddOrUpdate(path); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(1); + + Check.That(mappings.First().RequestMatcher).IsNotNull(); + Check.That(mappings.First().Provider).IsNotNull(); + Check.That(mappings.First().Guid).Equals(Guid.Parse(guid)); + Check.That(mappings.First().Title).IsNullOrEmpty(); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_ReadStaticMapping_WithArray() + { + var server = WireMockServer.Start(); + + string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", "array.json"); + server.ReadStaticMappingAndAddOrUpdate(path); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(2); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_ReadStaticMapping_WithResponseBodyFromFile() + { + string guid = "00000002-ee28-4f29-ae63-1ac9b0802d87"; + + string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", guid + ".json"); + string json = File.ReadAllText(path); + + string responseBodyFilePath = Path.Combine(GetCurrentFolder(), "responsebody.json"); + + dynamic jsonObj = JsonConvert.DeserializeObject(json); + jsonObj["Response"]["BodyAsFile"] = responseBodyFilePath; + + string output = JsonConvert.SerializeObject(jsonObj, Formatting.Indented); + File.WriteAllText(path, output); + + var server = WireMockServer.Start(); + server.ReadStaticMappingAndAddOrUpdate(path); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(1); + + Check.That(mappings.First().RequestMatcher).IsNotNull(); + Check.That(mappings.First().Provider).IsNotNull(); + Check.That(mappings.First().Guid).Equals(Guid.Parse(guid)); + Check.That(mappings.First().Title).IsNullOrEmpty(); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_ReadStaticMappings_FolderExistsIsTrue() + { + // Assign + var staticMappingHandlerMock = new Mock(); + staticMappingHandlerMock.Setup(m => m.GetMappingFolder()).Returns("folder"); + staticMappingHandlerMock.Setup(m => m.FolderExists(It.IsAny())).Returns(true); + staticMappingHandlerMock.Setup(m => m.EnumerateFiles(It.IsAny(), It.IsAny())).Returns(new string[0]); + + var server = WireMockServer.Start(new WireMockServerSettings { - var server = WireMockServer.Start(); - string folder = Path.Combine(GetCurrentFolder(), "__admin", "mappings"); - server.ReadStaticMappings(folder); + FileSystemHandler = staticMappingHandlerMock.Object + }); - Check.That(server.Mappings).HasSize(6); - Check.That(server.MappingModels).HasSize(6); + // Act + server.ReadStaticMappings(); - // Act - server.ResetMappings(); + // Assert and Verify + staticMappingHandlerMock.Verify(m => m.GetMappingFolder(), Times.Once); + staticMappingHandlerMock.Verify(m => m.FolderExists("folder"), Times.Once); + staticMappingHandlerMock.Verify(m => m.EnumerateFiles("folder", false), Times.Once); + } - // Assert - Check.That(server.Mappings).HasSize(0); - Check.That(server.MappingModels).HasSize(0); + [Fact] + public void WireMockServer_Admin_ReadStaticMappingAndAddOrUpdate() + { + // Assign + string mapping = "{\"Request\": {\"Path\": {\"Matchers\": [{\"Name\": \"WildcardMatcher\",\"Pattern\": \"/static/mapping\"}]},\"Methods\": [\"get\"]},\"Response\": {\"BodyAsJson\": { \"body\": \"static mapping\" }}}"; + var staticMappingHandlerMock = new Mock(); + staticMappingHandlerMock.Setup(m => m.ReadMappingFile(It.IsAny())).Returns(mapping); - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_SaveStaticMappings() + var server = WireMockServer.Start(new WireMockServerSettings { - // Assign - string guid = "791a3f31-6946-aaaa-8e6f-0237c7441111"; - 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())); + FileSystemHandler = staticMappingHandlerMock.Object + }); - var server = WireMockServer.Start(new WireMockServerSettings - { - FileSystemHandler = staticMappingHandlerMock.Object - }); + // Act + server.ReadStaticMappingAndAddOrUpdate(@"c:\test.json"); - server - .Given(Request.Create().WithPath($"/foo_{Guid.NewGuid()}")) - .WithGuid(guid) - .RespondWith(Response.Create().WithBody("save test")); + // Assert and Verify + staticMappingHandlerMock.Verify(m => m.ReadMappingFile(@"c:\test.json"), Times.Once); + } - // Act - server.SaveStaticMappings(); + [Fact] + public void WireMockServer_Admin_ReadStaticMappings() + { + var server = WireMockServer.Start(); - // 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); - } + string folder = Path.Combine(GetCurrentFolder(), "__admin", "mappings"); + server.ReadStaticMappings(folder); - [Fact] - public void WireMockServer_Admin_ReadStaticMapping_WithNonGuidFilename() + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(6); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_ReadStaticMappings_FolderDoesNotExist() + { + // Assign + var loggerMock = new Mock(); + loggerMock.Setup(l => l.Info(It.IsAny(), It.IsAny())); + var settings = new WireMockServerSettings { - var guid = Guid.Parse("04ee4872-9efd-4770-90d3-88d445265d0d"); - string title = "documentdb_root_title"; + Logger = loggerMock.Object + }; + var server = WireMockServer.Start(settings); - var server = WireMockServer.Start(); + // Act + server.ReadStaticMappings(Guid.NewGuid().ToString()); - string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", "documentdb_root.json"); - server.ReadStaticMappingAndAddOrUpdate(path); + // Assert + Check.That(server.Mappings).HasSize(0); - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(1); + // Verify + loggerMock.Verify(l => l.Info(It.Is(s => s.StartsWith("The Static Mapping folder")), It.IsAny()), Times.Once); + } - Check.That(mappings.First().RequestMatcher).IsNotNull(); - Check.That(mappings.First().Provider).IsNotNull(); - Check.That(mappings.First().Guid).Equals(guid); - Check.That(mappings.First().Title).Equals(title); + [Fact] + public void WireMockServer_Admin_Mappings_WithGuid_Get() + { + Guid guid = Guid.Parse("90356dba-b36c-469a-a17e-669cd84f1f05"); + var server = WireMockServer.Start(); - server.Stop(); - } + server.Given(Request.Create().WithPath("/foo1").UsingGet()).WithGuid(guid) + .RespondWith(Response.Create().WithStatusCode(201).WithBody("1")); - [Fact] - public void WireMockServer_Admin_ReadStaticMapping_WithGuidFilename() + server.Given(Request.Create().WithPath("/foo2").UsingGet()) + .RespondWith(Response.Create().WithStatusCode(202).WithBody("2")); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(2); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_Mappings_WithGuidAsString_Get() + { + string guid = "90356dba-b36c-469a-a17e-669cd84f1f05"; + var server = WireMockServer.Start(); + + server.Given(Request.Create().WithPath("/foo100").UsingGet()).WithGuid(guid) + .RespondWith(Response.Create().WithStatusCode(201).WithBody("1")); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(1); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_Mappings_Add_SameGuid() + { + var guid = Guid.Parse("90356dba-b36c-469a-a17e-669cd84f1f05"); + var server = WireMockServer.Start(); + + var response1 = Response.Create().WithStatusCode(500); + server.Given(Request.Create().UsingGet()) + .WithGuid(guid) + .RespondWith(response1); + + var mappings1 = server.Mappings.ToArray(); + Check.That(mappings1).HasSize(1); + Check.That(mappings1.First().Guid).Equals(guid); + + var response2 = Response.Create().WithStatusCode(400); + server.Given(Request.Create().WithPath("/2").UsingGet()) + .WithGuid(guid) + .RespondWith(response2); + + var mappings2 = server.Mappings.ToArray(); + Check.That(mappings2).HasSize(1); + Check.That(mappings2.First().Guid).Equals(guid); + Check.That(mappings2.First().Provider).Equals(response2); + + server.Stop(); + } + + [Fact] + public async Task WireMockServer_Admin_Mappings_AtPriority() + { + var server = WireMockServer.Start(); + + // given + server.Given(Request.Create().WithPath("/1").UsingGet()) + .AtPriority(2) + .RespondWith(Response.Create().WithStatusCode(200)); + + server.Given(Request.Create().WithPath("/1").UsingGet()) + .AtPriority(1) + .RespondWith(Response.Create().WithStatusCode(400)); + + var mappings = server.Mappings.ToArray(); + Check.That(mappings).HasSize(2); + + // when + var response = await new HttpClient().GetAsync("http://localhost:" + server.Port + "/1").ConfigureAwait(false); + + // then + Check.That((int)response.StatusCode).IsEqualTo(400); + + server.Stop(); + } + + [Fact] + public async Task WireMockServer_Admin_Requests_Get() + { + // given + var server = WireMockServer.Start(); + + // when + await new HttpClient().GetAsync("http://localhost:" + server.Ports[0] + "/foo").ConfigureAwait(false); + + // then + Check.That(server.LogEntries).HasSize(1); + var requestLogged = server.LogEntries.First(); + Check.That(requestLogged.RequestMessage.Method).IsEqualTo("GET"); + Check.That(requestLogged.RequestMessage.BodyData).IsNull(); + + server.Stop(); + } + + [Fact] + public async Task WireMockServer_Admin_Logging_SetMaxRequestLogCount() + { + // Assign + var client = new HttpClient(); + // Act + var server = WireMockServer.Start(); + server.SetMaxRequestLogCount(2); + + await client.GetAsync("http://localhost:" + server.Ports[0] + "/foo1").ConfigureAwait(false); + await client.GetAsync("http://localhost:" + server.Ports[0] + "/foo2").ConfigureAwait(false); + await client.GetAsync("http://localhost:" + server.Ports[0] + "/foo3").ConfigureAwait(false); + + // Assert + Check.That(server.LogEntries).HasSize(2); + + var requestLoggedA = server.LogEntries.First(); + Check.That(requestLoggedA.RequestMessage.Path).EndsWith("/foo2"); + + var requestLoggedB = server.LogEntries.Last(); + Check.That(requestLoggedB.RequestMessage.Path).EndsWith("/foo3"); + + server.Stop(); + } + + [Fact] + public void WireMockServer_Admin_WatchStaticMappings() + { + // Assign + var fileMock = new Mock(); + var settings = new WireMockServerSettings { - string guid = "00000002-ee28-4f29-ae63-1ac9b0802d86"; + FileSystemHandler = fileMock.Object + }; + var server = WireMockServer.Start(settings); - var server = WireMockServer.Start(); - string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", guid + ".json"); - server.ReadStaticMappingAndAddOrUpdate(path); + // Act + server.WatchStaticMappings(); - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(1); + // Verify + fileMock.Verify(f => f.GetMappingFolder(), Times.Once); + fileMock.Verify(f => f.FolderExists(It.IsAny()), Times.Once); + } - Check.That(mappings.First().RequestMatcher).IsNotNull(); - Check.That(mappings.First().Provider).IsNotNull(); - Check.That(mappings.First().Guid).Equals(Guid.Parse(guid)); - Check.That(mappings.First().Title).IsNullOrEmpty(); + [Fact] + public void WireMockServer_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())); - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_ReadStaticMapping_WithArray() + var server = WireMockServer.Start(new WireMockServerSettings { - var server = WireMockServer.Start(); + FileSystemHandler = staticMappingHandlerMock.Object + }); - string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", "array.json"); - server.ReadStaticMappingAndAddOrUpdate(path); + // Act + server + .Given(Request.Create().WithPath($"/foo_{Guid.NewGuid()}"), true) + .WithGuid(guid) + .RespondWith(Response.Create().WithBody("post and save test")); - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(2); + // 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); + } - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_ReadStaticMapping_WithResponseBodyFromFile() + [Fact] + public async Task WireMockServer_Admin_DeleteMappings() + { + // Arrange + var server = WireMockServer.Start(new WireMockServerSettings { - string guid = "00000002-ee28-4f29-ae63-1ac9b0802d87"; + StartAdminInterface = true, + ReadStaticMappings = false, + WatchStaticMappings = false, + WatchStaticMappingsInSubdirectories = false + }); - string path = Path.Combine(GetCurrentFolder(), "__admin", "mappings", guid + ".json"); - string json = File.ReadAllText(path); + server + .Given(Request.Create().WithPath("/path1")) + .AtPriority(0) + .RespondWith(Response.Create().WithStatusCode(200)); + server + .Given(Request.Create().WithPath("/path2")) + .AtPriority(1) + .RespondWith(Response.Create().WithStatusCode(200)); + server + .Given(Request.Create().WithPath("/path3")) + .AtPriority(2) + .RespondWith(Response.Create().WithStatusCode(200)); - string responseBodyFilePath = Path.Combine(GetCurrentFolder(), "responsebody.json"); + Check.That(server.MappingModels.Count()).Equals(3); - dynamic jsonObj = JsonConvert.DeserializeObject(json); - jsonObj["Response"]["BodyAsFile"] = responseBodyFilePath; + Guid? guid1 = server.MappingModels.ElementAt(0).Guid; + Guid? guid2 = server.MappingModels.ElementAt(1).Guid; + Guid? guid3 = server.MappingModels.ElementAt(2).Guid; - string output = JsonConvert.SerializeObject(jsonObj, Formatting.Indented); - File.WriteAllText(path, output); + Check.That(guid1).IsNotNull(); + Check.That(guid2).IsNotNull(); + Check.That(guid3).IsNotNull(); - var server = WireMockServer.Start(); - server.ReadStaticMappingAndAddOrUpdate(path); + string guidsJsonBody = $"[" + + $"{{\"Guid\": \"{guid1}\"}}," + + $"{{\"Guid\": \"{guid2}\"}}" + + $"]"; - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(1); - - Check.That(mappings.First().RequestMatcher).IsNotNull(); - Check.That(mappings.First().Provider).IsNotNull(); - Check.That(mappings.First().Guid).Equals(Guid.Parse(guid)); - Check.That(mappings.First().Title).IsNullOrEmpty(); - - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_ReadStaticMappings_FolderExistsIsTrue() + // Act + var request = new HttpRequestMessage() { - // Assign - var staticMappingHandlerMock = new Mock(); - staticMappingHandlerMock.Setup(m => m.GetMappingFolder()).Returns("folder"); - staticMappingHandlerMock.Setup(m => m.FolderExists(It.IsAny())).Returns(true); - staticMappingHandlerMock.Setup(m => m.EnumerateFiles(It.IsAny(), It.IsAny())).Returns(new string[0]); + Method = HttpMethod.Delete, + RequestUri = new Uri($"http://localhost:{server.Ports[0]}/__admin/mappings"), + Content = new StringContent(guidsJsonBody, Encoding.UTF8, "application/json") + }; - var server = WireMockServer.Start(new WireMockServerSettings - { - FileSystemHandler = staticMappingHandlerMock.Object - }); + var response = await new HttpClient().SendAsync(request).ConfigureAwait(false); - // Act - server.ReadStaticMappings(); - - // Assert and Verify - staticMappingHandlerMock.Verify(m => m.GetMappingFolder(), Times.Once); - staticMappingHandlerMock.Verify(m => m.FolderExists("folder"), Times.Once); - staticMappingHandlerMock.Verify(m => m.EnumerateFiles("folder", false), Times.Once); - } - - [Fact] - public void WireMockServer_Admin_ReadStaticMappingAndAddOrUpdate() - { - // Assign - string mapping = "{\"Request\": {\"Path\": {\"Matchers\": [{\"Name\": \"WildcardMatcher\",\"Pattern\": \"/static/mapping\"}]},\"Methods\": [\"get\"]},\"Response\": {\"BodyAsJson\": { \"body\": \"static mapping\" }}}"; - var staticMappingHandlerMock = new Mock(); - staticMappingHandlerMock.Setup(m => m.ReadMappingFile(It.IsAny())).Returns(mapping); - - var server = WireMockServer.Start(new WireMockServerSettings - { - FileSystemHandler = staticMappingHandlerMock.Object - }); - - // Act - server.ReadStaticMappingAndAddOrUpdate(@"c:\test.json"); - - // Assert and Verify - staticMappingHandlerMock.Verify(m => m.ReadMappingFile(@"c:\test.json"), Times.Once); - } - - [Fact] - public void WireMockServer_Admin_ReadStaticMappings() - { - var server = WireMockServer.Start(); - - string folder = Path.Combine(GetCurrentFolder(), "__admin", "mappings"); - server.ReadStaticMappings(folder); - - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(6); - - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_ReadStaticMappings_FolderDoesNotExist() - { - // Assign - var loggerMock = new Mock(); - loggerMock.Setup(l => l.Info(It.IsAny(), It.IsAny())); - var settings = new WireMockServerSettings - { - Logger = loggerMock.Object - }; - var server = WireMockServer.Start(settings); - - // Act - server.ReadStaticMappings(Guid.NewGuid().ToString()); - - // Assert - Check.That(server.Mappings).HasSize(0); - - // Verify - loggerMock.Verify(l => l.Info(It.Is(s => s.StartsWith("The Static Mapping folder")), It.IsAny()), Times.Once); - } - - [Fact] - public void WireMockServer_Admin_Mappings_WithGuid_Get() - { - Guid guid = Guid.Parse("90356dba-b36c-469a-a17e-669cd84f1f05"); - var server = WireMockServer.Start(); - - server.Given(Request.Create().WithPath("/foo1").UsingGet()).WithGuid(guid) - .RespondWith(Response.Create().WithStatusCode(201).WithBody("1")); - - server.Given(Request.Create().WithPath("/foo2").UsingGet()) - .RespondWith(Response.Create().WithStatusCode(202).WithBody("2")); - - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(2); - - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_Mappings_WithGuidAsString_Get() - { - string guid = "90356dba-b36c-469a-a17e-669cd84f1f05"; - var server = WireMockServer.Start(); - - server.Given(Request.Create().WithPath("/foo100").UsingGet()).WithGuid(guid) - .RespondWith(Response.Create().WithStatusCode(201).WithBody("1")); - - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(1); - - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_Mappings_Add_SameGuid() - { - var guid = Guid.Parse("90356dba-b36c-469a-a17e-669cd84f1f05"); - var server = WireMockServer.Start(); - - var response1 = Response.Create().WithStatusCode(500); - server.Given(Request.Create().UsingGet()) - .WithGuid(guid) - .RespondWith(response1); - - var mappings1 = server.Mappings.ToArray(); - Check.That(mappings1).HasSize(1); - Check.That(mappings1.First().Guid).Equals(guid); - - var response2 = Response.Create().WithStatusCode(400); - server.Given(Request.Create().WithPath("/2").UsingGet()) - .WithGuid(guid) - .RespondWith(response2); - - var mappings2 = server.Mappings.ToArray(); - Check.That(mappings2).HasSize(1); - Check.That(mappings2.First().Guid).Equals(guid); - Check.That(mappings2.First().Provider).Equals(response2); - - server.Stop(); - } - - [Fact] - public async Task WireMockServer_Admin_Mappings_AtPriority() - { - var server = WireMockServer.Start(); - - // given - server.Given(Request.Create().WithPath("/1").UsingGet()) - .AtPriority(2) - .RespondWith(Response.Create().WithStatusCode(200)); - - server.Given(Request.Create().WithPath("/1").UsingGet()) - .AtPriority(1) - .RespondWith(Response.Create().WithStatusCode(400)); - - var mappings = server.Mappings.ToArray(); - Check.That(mappings).HasSize(2); - - // when - var response = await new HttpClient().GetAsync("http://localhost:" + server.Port + "/1").ConfigureAwait(false); - - // then - Check.That((int)response.StatusCode).IsEqualTo(400); - - server.Stop(); - } - - [Fact] - public async Task WireMockServer_Admin_Requests_Get() - { - // given - var server = WireMockServer.Start(); - - // when - await new HttpClient().GetAsync("http://localhost:" + server.Ports[0] + "/foo").ConfigureAwait(false); - - // then - Check.That(server.LogEntries).HasSize(1); - var requestLogged = server.LogEntries.First(); - Check.That(requestLogged.RequestMessage.Method).IsEqualTo("GET"); - Check.That(requestLogged.RequestMessage.BodyData).IsNull(); - - server.Stop(); - } - - [Fact] - public async Task WireMockServer_Admin_Logging_SetMaxRequestLogCount() - { - // Assign - var client = new HttpClient(); - // Act - var server = WireMockServer.Start(); - server.SetMaxRequestLogCount(2); - - await client.GetAsync("http://localhost:" + server.Ports[0] + "/foo1").ConfigureAwait(false); - await client.GetAsync("http://localhost:" + server.Ports[0] + "/foo2").ConfigureAwait(false); - await client.GetAsync("http://localhost:" + server.Ports[0] + "/foo3").ConfigureAwait(false); - - // Assert - Check.That(server.LogEntries).HasSize(2); - - var requestLoggedA = server.LogEntries.First(); - Check.That(requestLoggedA.RequestMessage.Path).EndsWith("/foo2"); - - var requestLoggedB = server.LogEntries.Last(); - Check.That(requestLoggedB.RequestMessage.Path).EndsWith("/foo3"); - - server.Stop(); - } - - [Fact] - public void WireMockServer_Admin_WatchStaticMappings() - { - // Assign - var fileMock = new Mock(); - var settings = new WireMockServerSettings - { - FileSystemHandler = fileMock.Object - }; - var server = WireMockServer.Start(settings); - - // Act - server.WatchStaticMappings(); - - // Verify - fileMock.Verify(f => f.GetMappingFolder(), Times.Once); - fileMock.Verify(f => f.FolderExists(It.IsAny()), Times.Once); - } - - [Fact] - public void WireMockServer_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 = WireMockServer.Start(new WireMockServerSettings - { - 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); - } - - [Fact] - public async Task WireMockServer_Admin_DeleteMappings() - { - // Arrange - var server = WireMockServer.Start(new WireMockServerSettings - { - StartAdminInterface = true, - ReadStaticMappings = false, - WatchStaticMappings = false, - WatchStaticMappingsInSubdirectories = false - }); - - server - .Given(Request.Create().WithPath("/path1")) - .AtPriority(0) - .RespondWith(Response.Create().WithStatusCode(200)); - server - .Given(Request.Create().WithPath("/path2")) - .AtPriority(1) - .RespondWith(Response.Create().WithStatusCode(200)); - server - .Given(Request.Create().WithPath("/path3")) - .AtPriority(2) - .RespondWith(Response.Create().WithStatusCode(200)); - - Check.That(server.MappingModels.Count()).Equals(3); - - Guid? guid1 = server.MappingModels.ElementAt(0).Guid; - Guid? guid2 = server.MappingModels.ElementAt(1).Guid; - Guid? guid3 = server.MappingModels.ElementAt(2).Guid; - - Check.That(guid1).IsNotNull(); - Check.That(guid2).IsNotNull(); - Check.That(guid3).IsNotNull(); - - string guidsJsonBody = $"[" + - $"{{\"Guid\": \"{guid1}\"}}," + - $"{{\"Guid\": \"{guid2}\"}}" + - $"]"; - - // Act - var request = new HttpRequestMessage() - { - Method = HttpMethod.Delete, - RequestUri = new Uri($"http://localhost:{server.Ports[0]}/__admin/mappings"), - Content = new StringContent(guidsJsonBody, Encoding.UTF8, "application/json") - }; - - var response = await new HttpClient().SendAsync(request).ConfigureAwait(false); - - // Assert - IEnumerable guids = server.MappingModels.Select(mapping => mapping.Guid.Value); - Check.That(guids.Contains(guid1.Value)).IsFalse(); - Check.That(guids.Contains(guid2.Value)).IsFalse(); - Check.That(guids.Contains(guid3.Value)).IsTrue(); - Check.That(response.StatusCode).Equals(HttpStatusCode.OK); - Check.That(await response.Content.ReadAsStringAsync().ConfigureAwait(false)).Equals($"{{\"Status\":\"Mappings deleted. Affected GUIDs: [{guid1}, {guid2}]\"}}"); - } + // Assert + var guids = server.MappingModels.Select(mapping => mapping.Guid!.Value).ToArray(); + Check.That(guids.Contains(guid1.Value)).IsFalse(); + Check.That(guids.Contains(guid2.Value)).IsFalse(); + Check.That(guids.Contains(guid3.Value)).IsTrue(); + Check.That(response.StatusCode).Equals(HttpStatusCode.OK); + Check.That(await response.Content.ReadAsStringAsync().ConfigureAwait(false)).Equals($"{{\"Status\":\"Mappings deleted. Affected GUIDs: [{guid1}, {guid2}]\"}}"); } } \ No newline at end of file