From 7a8582fef580f91b9d5b2d9aa8cfba27a2a9d93d Mon Sep 17 00:00:00 2001 From: Dmytro Nikitin Date: Sun, 9 Aug 2026 18:49:13 +0200 Subject: [PATCH] Fix #1494: WithClientIP(MatchOperator, IStringMatcher[]) ignores the operator (#1495) --- .../RequestBuilders/Request.ClientIP.cs | 2 +- .../RequestBuilderWithClientIPTests.cs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/WireMock.Net.Minimal/RequestBuilders/Request.ClientIP.cs b/src/WireMock.Net.Minimal/RequestBuilders/Request.ClientIP.cs index 2352a065..cc255df8 100644 --- a/src/WireMock.Net.Minimal/RequestBuilders/Request.ClientIP.cs +++ b/src/WireMock.Net.Minimal/RequestBuilders/Request.ClientIP.cs @@ -19,7 +19,7 @@ public partial class Request { Guard.NotNullOrEmpty(matchers); - _requestMatchers.Add(new RequestMessageClientIPMatcher(MatchBehaviour.AcceptOnMatch, MatchOperator.Or, matchers)); + _requestMatchers.Add(new RequestMessageClientIPMatcher(MatchBehaviour.AcceptOnMatch, matchOperator, matchers)); return this; } diff --git a/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderWithClientIPTests.cs b/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderWithClientIPTests.cs index b2e24890..596ba680 100644 --- a/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderWithClientIPTests.cs +++ b/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderWithClientIPTests.cs @@ -64,4 +64,23 @@ public class RequestBuilderWithClientIPTests var requestMatchResult = new RequestMatchResult(); spec.GetMatchingScore(request, requestMatchResult).Should().Be(1.0); } + + [Fact] + public void Request_WithClientIP_MatchOperator_And_RequiresAllMatchers() + { + // given: two matchers combined with And (the client IP must satisfy BOTH) + var spec = Request.Create().WithClientIP(MatchOperator.And, new WildcardMatcher("1.2.*"), new WildcardMatcher("*.3.4")); + + // when: an IP matching both matchers -> perfect match + var matchesBoth = new RequestMessage(new UrlDetails("http://localhost"), "GET", "1.2.3.4"); + spec.GetMatchingScore(matchesBoth, new RequestMatchResult()).Should().Be(1.0); + + // when: an IP matching only the first matcher -> mismatch + var matchesFirstOnly = new RequestMessage(new UrlDetails("http://localhost"), "GET", "1.2.9.9"); + spec.GetMatchingScore(matchesFirstOnly, new RequestMatchResult()).Should().Be(0.0); + + // when: an IP matching only the second matcher -> mismatch + var matchesSecondOnly = new RequestMessage(new UrlDetails("http://localhost"), "GET", "9.3.4"); + spec.GetMatchingScore(matchesSecondOnly, new RequestMatchResult()).Should().Be(0.0); + } } \ No newline at end of file