mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-05-03 21:54:13 +02:00
* feat(request matchers): Add support for early mismatch in mapping processing * test(request matchers): Add unit test for early mismatch functionality * test(grpc): Add test for grpc requests early mismatch and error logging (Issue #1442) * feat(request matchers): RequestMatcherType Add `RequestMatcherType` to request matchers for improved type identification Closes #1442 * refactor(request matchers): Request Replace `EarlyMatcherSelector` with `EarlyMatcherType` for improved clarity and consistency Closes #1442 * feat(request): conversion Add EarlyMatcherType support in request models and mapping conversion Closes #1442 * test(mapping): new tests add unit tests for EarlyMatcherType in mapping conversion and serialization Closes #1442 * refactor(request matchers): RequestMessageEarlyMatcher Replaced inline `EarlyMatcherType` logic with the new `RequestMessageEarlyMatcher` class to support cases when several matchers of the same type are present. For instance - Header, Cookie, Param Closes #1442 * test(request matchers): Early Mismatch add unit tests for early mismatch scenarios with several matchers of same type. Currently, headers and parameters Closes #1442 * refactor(mapping): RequestModel.EarlyMatcherType use fully qualified enum for EarlyMatcherType in serialization Closes #1442 * style(review): fixes - removed unused method - added missing curly brackets Closes #1442
64 lines
2.2 KiB
C#
64 lines
2.2 KiB
C#
// Copyright © WireMock.Net
|
|
|
|
using System.Linq;
|
|
using Stef.Validation;
|
|
|
|
namespace WireMock.Matchers.Request;
|
|
|
|
/// <summary>
|
|
/// The composite request matcher.
|
|
/// </summary>
|
|
public abstract class RequestMessageCompositeMatcher : IRequestMatcher
|
|
{
|
|
private readonly CompositeMatcherType _type;
|
|
|
|
/// <summary>
|
|
/// Gets the request matchers.
|
|
/// </summary>
|
|
/// <value>
|
|
/// The request matchers.
|
|
/// </value>
|
|
private IEnumerable<IRequestMatcher> RequestMatchers { get; }
|
|
|
|
/// <summary>
|
|
/// Selected type to choose the matcher from <see cref="RequestMatchers"/> which will immediately return a mismatch.
|
|
/// </summary>
|
|
internal RequestMatcherType? EarlyMatcherType { get; private protected set; }
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="RequestMessageCompositeMatcher"/> class.
|
|
/// </summary>
|
|
/// <param name="requestMatchers">The request matchers.</param>
|
|
/// <param name="type">The CompositeMatcherType type (Defaults to 'And')</param>
|
|
protected RequestMessageCompositeMatcher(IEnumerable<IRequestMatcher> requestMatchers, CompositeMatcherType type = CompositeMatcherType.And)
|
|
{
|
|
RequestMatchers = Guard.NotNull(requestMatchers);
|
|
_type = type;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public RequestMatcherType Type => RequestMatcherType.Composite;
|
|
|
|
/// <inheritdoc />
|
|
public double GetMatchingScore(IRequestMessage requestMessage, IRequestMatchResult requestMatchResult)
|
|
{
|
|
if (!RequestMatchers.Any())
|
|
{
|
|
return MatchScores.Mismatch;
|
|
}
|
|
|
|
var earlyMatcher = new RequestMessageEarlyMatcher(EarlyMatcherType, RequestMatchers);
|
|
var earlyMatchResult = earlyMatcher.GetMatchingScore(requestMessage, requestMatchResult);
|
|
if (!MatchScores.IsPerfect(earlyMatchResult))
|
|
{
|
|
return MatchScores.Mismatch;
|
|
}
|
|
|
|
if (_type == CompositeMatcherType.And)
|
|
{
|
|
return RequestMatchers.Average(requestMatcher => requestMatcher.GetMatchingScore(requestMessage, requestMatchResult));
|
|
}
|
|
|
|
return RequestMatchers.Max(requestMatcher => requestMatcher.GetMatchingScore(requestMessage, requestMatchResult));
|
|
}
|
|
} |