From 7d7f1f8fbbfa56151b81d0c41a79cb4ec22d4847 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Mon, 9 Sep 2024 20:48:09 +0200 Subject: [PATCH] Allow mapping without Path or Url (#1169) --- .../Server/WireMockServer.Admin.cs | 2 +- .../Server/WireMockServer.ConvertMapping.cs | 27 ++++---------- .../WireMockServer.Admin.cs | 36 ++++++++++++++++++- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/WireMock.Net/Server/WireMockServer.Admin.cs b/src/WireMock.Net/Server/WireMockServer.Admin.cs index 7ffe78e9..a7cf33ca 100644 --- a/src/WireMock.Net/Server/WireMockServer.Admin.cs +++ b/src/WireMock.Net/Server/WireMockServer.Admin.cs @@ -623,7 +623,7 @@ public partial class WireMockServer { var requestModel = DeserializeObject(requestMessage); - var request = (Request)InitRequestBuilder(requestModel, false)!; + var request = (Request)InitRequestBuilder(requestModel); var dict = new Dictionary(); foreach (var logEntry in LogEntries.Where(le => !le.RequestMessage.Path.StartsWith("/__admin/"))) diff --git a/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs b/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs index 10c042dd..c3fa6dff 100644 --- a/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs +++ b/src/WireMock.Net/Server/WireMockServer.ConvertMapping.cs @@ -36,17 +36,13 @@ public partial class WireMockServer } } - private Guid? ConvertMappingAndRegisterAsRespondProvider(MappingModel mappingModel, Guid? guid = null, string? path = null) + private Guid ConvertMappingAndRegisterAsRespondProvider(MappingModel mappingModel, Guid? guid = null, string? path = null) { Guard.NotNull(mappingModel); Guard.NotNull(mappingModel.Request); Guard.NotNull(mappingModel.Response); - var requestBuilder = InitRequestBuilder(mappingModel.Request, true); - if (requestBuilder == null) - { - return null; - } + var requestBuilder = InitRequestBuilder(mappingModel.Request); var respondProvider = Given(requestBuilder, mappingModel.SaveToFile == true); @@ -126,9 +122,9 @@ public partial class WireMockServer return respondProvider.Guid; } - private IRequestBuilder? InitRequestBuilder(RequestModel requestModel, bool pathOrUrlRequired) + private IRequestBuilder InitRequestBuilder(RequestModel requestModel) { - IRequestBuilder requestBuilder = Request.Create(); + var requestBuilder = Request.Create(); if (requestModel.ClientIP != null) { @@ -146,13 +142,11 @@ public partial class WireMockServer } } - bool pathOrUrlMatchersValid = false; if (requestModel.Path != null) { if (requestModel.Path is string path) { requestBuilder = requestBuilder.WithPath(path); - pathOrUrlMatchersValid = true; } else { @@ -161,7 +155,6 @@ public partial class WireMockServer { var matchOperator = StringUtils.ParseMatchOperator(pathModel.MatchOperator); requestBuilder = requestBuilder.WithPath(matchOperator, pathModel.Matchers.Select(_matcherMapper.Map).OfType().ToArray()); - pathOrUrlMatchersValid = true; } } } @@ -170,7 +163,6 @@ public partial class WireMockServer if (requestModel.Url is string url) { requestBuilder = requestBuilder.WithUrl(url); - pathOrUrlMatchersValid = true; } else { @@ -179,17 +171,10 @@ public partial class WireMockServer { var matchOperator = StringUtils.ParseMatchOperator(urlModel.MatchOperator); requestBuilder = requestBuilder.WithUrl(matchOperator, urlModel.Matchers.Select(_matcherMapper.Map).OfType().ToArray()); - pathOrUrlMatchersValid = true; } } } - if (pathOrUrlRequired && !pathOrUrlMatchersValid) - { - _settings.Logger.Error("Path or Url matcher is missing for this mapping, this mapping will not be added."); - return null; - } - if (requestModel.Methods != null) { var matchBehaviour = requestModel.MethodsRejectOnMatch == true ? MatchBehaviour.RejectOnMatch : MatchBehaviour.AcceptOnMatch; @@ -233,7 +218,7 @@ public partial class WireMockServer { foreach (var paramModel in requestModel.Params.Where(p => p is { Matchers: { } })) { - bool ignoreCase = paramModel.IgnoreCase == true; + var ignoreCase = paramModel.IgnoreCase == true; requestBuilder = requestBuilder.WithParam(paramModel.Name, ignoreCase, paramModel.Matchers!.Select(_matcherMapper.Map).OfType().ToArray()); } } @@ -253,7 +238,7 @@ public partial class WireMockServer private static IResponseBuilder InitResponseBuilder(ResponseModel responseModel) { - IResponseBuilder responseBuilder = Response.Create(); + var responseBuilder = Response.Create(); if (responseModel.Delay > 0) { diff --git a/test/WireMock.Net.Tests/WireMockServer.Admin.cs b/test/WireMock.Net.Tests/WireMockServer.Admin.cs index 2e80e1b9..b1a919ef 100644 --- a/test/WireMock.Net.Tests/WireMockServer.Admin.cs +++ b/test/WireMock.Net.Tests/WireMockServer.Admin.cs @@ -11,9 +11,11 @@ using FluentAssertions; using Moq; using Newtonsoft.Json; using NFluent; -using WireMock.Admin.Settings; +using RestEase; +using WireMock.Client; using WireMock.Handlers; using WireMock.Logging; +using WireMock.Matchers.Request; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Server; @@ -244,6 +246,38 @@ public class WireMockServerAdminTests loggerMock.Verify(l => l.Info(It.Is(s => s.StartsWith("The Static Mapping folder")), It.IsAny()), Times.Once); } + [Fact] + public async Task WireMockServer_Admin_Mapping_WithoutPathOrUrl() + { + // Arrange + using var server = WireMockServer.StartWithAdminInterface(); + + // Act + server.Given(Request.Create().UsingGet()) + .RespondWith(Response.Create()); + + // Assert + var mapping = server.Mappings.First(m => !m.IsAdminInterface); + var request = (Request) mapping.RequestMatcher; + var pathMatcher = request.GetRequestMessageMatcher(); + pathMatcher.Should().BeNull(); + + var api = RestClient.For(server.Url); + var mappingModels = await api.GetMappingsAsync(); + var mappingModel = mappingModels.First(); + mappingModel.Request.Path.Should().BeNull(); + mappingModel.Request.Url.Should().BeNull(); + + await api.DeleteMappingsAsync(); + + await api.PostMappingAsync(mappingModel); + await api.GetMappingsAsync(); + mappingModels = await api.GetMappingsAsync(); + mappingModel = mappingModels.First(); + mappingModel.Request.Path.Should().BeNull(); + mappingModel.Request.Url.Should().BeNull(); + } + [Fact] public void WireMockServer_Admin_Mappings_WithGuid_Get() {