Allow mapping without Path or Url (#1169)

This commit is contained in:
Stef Heyenrath
2024-09-09 20:48:09 +02:00
committed by GitHub
parent af124d556d
commit 7d7f1f8fbb
3 changed files with 42 additions and 23 deletions

View File

@@ -623,7 +623,7 @@ public partial class WireMockServer
{
var requestModel = DeserializeObject<RequestModel>(requestMessage);
var request = (Request)InitRequestBuilder(requestModel, false)!;
var request = (Request)InitRequestBuilder(requestModel);
var dict = new Dictionary<ILogEntry, RequestMatchResult>();
foreach (var logEntry in LogEntries.Where(le => !le.RequestMessage.Path.StartsWith("/__admin/")))

View File

@@ -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<IStringMatcher>().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<IStringMatcher>().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<IStringMatcher>().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)
{

View File

@@ -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<string>(s => s.StartsWith("The Static Mapping folder")), It.IsAny<object[]>()), 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<RequestMessagePathMatcher>();
pathMatcher.Should().BeNull();
var api = RestClient.For<IWireMockAdminApi>(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()
{