From 1562958172a81d9886550b2adae9f6583853a48d Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 07:36:13 +0000 Subject: [PATCH 1/7] Add more QueryParameterMultipleValueSupport NoComma tests --- .../Request/RequestMessageBodyMatcher.cs | 2 +- .../RequestMessageParamMatcherTests.cs | 22 +++++++++++++++++++ .../Util/QueryStringParserTests.cs | 19 +++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageBodyMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageBodyMatcher.cs index 36d790092..f5e130475 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageBodyMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageBodyMatcher.cs @@ -104,7 +104,7 @@ public RequestMessageBodyMatcher(Func func) /// Initializes a new instance of the class. /// /// The function. - public RequestMessageBodyMatcher(Func func) + public RequestMessageBodyMatcher(Func func) { BodyDataFunc = Guard.NotNull(func); } diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs index 048040e6c..cd9dcd4dd 100644 --- a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs @@ -1,7 +1,9 @@ +using FluentAssertions; using NFluent; using WireMock.Matchers; using WireMock.Matchers.Request; using WireMock.Models; +using WireMock.Owin; using Xunit; namespace WireMock.Net.Tests.RequestMatchers @@ -172,5 +174,25 @@ public void RequestMessageParamMatcher_GetMatchingScore_KeyWithValuePresentInUrl // Assert Check.That(score).IsEqualTo(1.0d); } + + // Issue #849 + [Fact] + public void RequestMessageParamMatcher_With1ParamContainingComma_Using_QueryParameterMultipleValueSupport_NoComma() + { + // Assign + var options = new WireMockMiddlewareOptions + { + QueryParameterMultipleValueSupport = QueryParameterMultipleValueSupport.NoComma + }; + var requestMessage = new RequestMessage(options, new UrlDetails("http://localhostquery=SELECT id, value FROM table WHERE id = 1&test=42"), "GET", "127.0.0.1"); + var matcher = new RequestMessageParamMatcher(MatchBehaviour.AcceptOnMatch, "query", false, "SELECT id, value FROM table WHERE id = 1"); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + score.Should().Be(1.0); + } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs index c273c297f..1d9d8fdd3 100644 --- a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs +++ b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs @@ -274,7 +274,7 @@ public void Parse_WithMultipleParamWithSameKey() } [Fact] - public void Parse_With1ParamContainingSpacesAndEqualSign() + public void Parse_With1ParamContainingSpacesSingleQuoteAndEqualSign() { // Assign string query = "?q=SELECT Id from User where username='user@gmail.com'"; @@ -287,6 +287,23 @@ public void Parse_With1ParamContainingSpacesAndEqualSign() result["q"].Should().Equal(new WireMockList("SELECT Id from User where username='user@gmail.com'")); } + + // Issue #849 + [Fact] + public void Parse_With1ParamContainingComma_Using_QueryParameterMultipleValueSupport_NoComma() + { + // Assign + string query = "?query=SELECT id, value FROM table WHERE id = 1&test=42"; + + // Act + var result = QueryStringParser.Parse(query, QueryParameterMultipleValueSupport.NoComma); + + // Assert + result.Count.Should().Be(2); + result["query"].Should().Equal(new WireMockList("SELECT id, value FROM table WHERE id = 1")); + result["test"].Should().Equal(new WireMockList("42")); + } + [Fact] public void Parse_WithComplex() { From 7b534635b9da255fe8553bdba467b47e64419d17 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 08:19:10 +0000 Subject: [PATCH 2/7] fix tests --- .../RequestMatchers/RequestMessageParamMatcherTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs index cd9dcd4dd..58a929b1f 100644 --- a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs @@ -4,6 +4,7 @@ using WireMock.Matchers.Request; using WireMock.Models; using WireMock.Owin; +using WireMock.Types; using Xunit; namespace WireMock.Net.Tests.RequestMatchers @@ -184,7 +185,7 @@ public void RequestMessageParamMatcher_With1ParamContainingComma_Using_QueryPara { QueryParameterMultipleValueSupport = QueryParameterMultipleValueSupport.NoComma }; - var requestMessage = new RequestMessage(options, new UrlDetails("http://localhostquery=SELECT id, value FROM table WHERE id = 1&test=42"), "GET", "127.0.0.1"); + var requestMessage = new RequestMessage(options, new UrlDetails("http://localhost?query=SELECT id, value FROM table WHERE id = 1&test=42"), "GET", "127.0.0.1"); var matcher = new RequestMessageParamMatcher(MatchBehaviour.AcceptOnMatch, "query", false, "SELECT id, value FROM table WHERE id = 1"); // Act From e5ed6036ee3927cfbef5385f18b79d1d5748b995 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 10:03:41 +0100 Subject: [PATCH 3/7] fx --- .../Matchers/Request/RequestMessageParamMatcher.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs index 949ed7de0..41311838c 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs @@ -53,7 +53,8 @@ public RequestMessageParamMatcher(MatchBehaviour matchBehaviour, string key, boo /// The key. /// Defines if the key should be matched using case-ignore. /// The values. - public RequestMessageParamMatcher(MatchBehaviour matchBehaviour, string key, bool ignoreCase, string[]? values) : this(matchBehaviour, key, ignoreCase, values?.Select(value => new ExactMatcher(matchBehaviour, ignoreCase, false, MatchOperator.And, value)).Cast().ToArray()) + public RequestMessageParamMatcher(MatchBehaviour matchBehaviour, string key, bool ignoreCase, params string[]? values) : + this(matchBehaviour, key, ignoreCase, values?.Select(value => new ExactMatcher(matchBehaviour, ignoreCase, false, MatchOperator.And, value)).Cast().ToArray()) { } @@ -64,7 +65,7 @@ public RequestMessageParamMatcher(MatchBehaviour matchBehaviour, string key, boo /// The key. /// Defines if the key should be matched using case-ignore. /// The matchers. - public RequestMessageParamMatcher(MatchBehaviour matchBehaviour, string key, bool ignoreCase, IStringMatcher[]? matchers) + public RequestMessageParamMatcher(MatchBehaviour matchBehaviour, string key, bool ignoreCase, params IStringMatcher[]? matchers) { MatchBehaviour = matchBehaviour; Key = Guard.NotNull(key); @@ -95,7 +96,7 @@ private double IsMatch(IRequestMessage requestMessage) return MatchScores.ToScore(requestMessage.Query != null && Funcs.Any(f => f(requestMessage.Query))); } - var valuesPresentInRequestMessage = ((RequestMessage)requestMessage).GetParameter(Key!, IgnoreCase ?? false); + var valuesPresentInRequestMessage = ((RequestMessage)requestMessage).GetParameter(Key, IgnoreCase ?? false); if (valuesPresentInRequestMessage == null) { // Key is not present at all, just return Mismatch From 0a4aca9ae9d4530effc3a2d2729fdceba4c8d658 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 11:55:31 +0100 Subject: [PATCH 4/7] cf --- test/WireMock.Net.Tests/Util/QueryStringParserTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs index 1d9d8fdd3..7ef71388f 100644 --- a/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs +++ b/test/WireMock.Net.Tests/Util/QueryStringParserTests.cs @@ -287,7 +287,6 @@ public void Parse_With1ParamContainingSpacesSingleQuoteAndEqualSign() result["q"].Should().Equal(new WireMockList("SELECT Id from User where username='user@gmail.com'")); } - // Issue #849 [Fact] public void Parse_With1ParamContainingComma_Using_QueryParameterMultipleValueSupport_NoComma() From c8ad9f49e4149304ae7742e4e149a8ed262b9b3b Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 15:23:36 +0100 Subject: [PATCH 5/7] Fix --- .../Owin/Mappers/OwinRequestMapper.cs | 2 +- .../WireMockServerTests.WithParam.cs | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs diff --git a/src/WireMock.Net/Owin/Mappers/OwinRequestMapper.cs b/src/WireMock.Net/Owin/Mappers/OwinRequestMapper.cs index 29afe592e..ccd00f436 100644 --- a/src/WireMock.Net/Owin/Mappers/OwinRequestMapper.cs +++ b/src/WireMock.Net/Owin/Mappers/OwinRequestMapper.cs @@ -68,7 +68,7 @@ public async Task MapAsync(IRequest request, IWireMockMiddleware body = await BodyParser.ParseAsync(bodyParserSettings).ConfigureAwait(false); } - return new RequestMessage(urlDetails, method, clientIP, body, headers, cookies) { DateTime = DateTime.UtcNow }; + return new RequestMessage(options, urlDetails, method, clientIP, body, headers, cookies) { DateTime = DateTime.UtcNow }; } private static (UrlDetails UrlDetails, string ClientIP) ParseRequest(IRequest request) diff --git a/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs b/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs new file mode 100644 index 000000000..bff02e83d --- /dev/null +++ b/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs @@ -0,0 +1,47 @@ +using System; +using System.Net; +using System.Threading.Tasks; +using FluentAssertions; +using WireMock.RequestBuilders; +using WireMock.ResponseBuilders; +using WireMock.Server; +using WireMock.Settings; +using WireMock.Types; +using Xunit; + +namespace WireMock.Net.Tests; + +public partial class WireMockServerTests +{ + + + [Fact] + public async Task WireMockServer_WithParam_QueryParameterMultipleValueSupport_NoComma_Should_Ignore_Comma() + { + // Arrange + var queryValue = "SELECT id, value FROM table WHERE id = 1"; + var settings = new WireMockServerSettings + { + QueryParameterMultipleValueSupport = QueryParameterMultipleValueSupport.NoComma + }; + var server = WireMockServer.Start(settings); + server.Given( + Request.Create() + .UsingGet() + .WithPath("/foo") + .WithParam("query", queryValue) + ) + .RespondWith( + Response.Create().WithStatusCode(200) + ); + + // Act + var requestUri = new Uri($"http://localhost:{server.Port}/foo?query={queryValue}"); + var response = await server.CreateClient().GetAsync(requestUri).ConfigureAwait(false); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.OK); + + server.Stop(); + } +} \ No newline at end of file From d5026e83b50572892e23d9d572a428b8444f2ca2 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 15:39:09 +0100 Subject: [PATCH 6/7] cf --- test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs b/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs index bff02e83d..5ee42d854 100644 --- a/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs +++ b/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs @@ -13,8 +13,6 @@ namespace WireMock.Net.Tests; public partial class WireMockServerTests { - - [Fact] public async Task WireMockServer_WithParam_QueryParameterMultipleValueSupport_NoComma_Should_Ignore_Comma() { From 88ff2a72db12fb0e413423d06e2aa5f3e2d48601 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Wed, 30 Nov 2022 18:53:50 +0100 Subject: [PATCH 7/7] select id, name, value from table where id in (1, 2, 3, 4, 5) --- test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs b/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs index 5ee42d854..f4d9fcf16 100644 --- a/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs +++ b/test/WireMock.Net.Tests/WireMockServerTests.WithParam.cs @@ -13,11 +13,12 @@ namespace WireMock.Net.Tests; public partial class WireMockServerTests { - [Fact] - public async Task WireMockServer_WithParam_QueryParameterMultipleValueSupport_NoComma_Should_Ignore_Comma() + [Theory] + [InlineData("SELECT id, value FROM table WHERE id = 1")] + [InlineData("select id, name, value from table where id in (1, 2, 3, 4, 5)")] + public async Task WireMockServer_WithParam_QueryParameterMultipleValueSupport_NoComma_Should_Ignore_Comma(string queryValue) { // Arrange - var queryValue = "SELECT id, value FROM table WHERE id = 1"; var settings = new WireMockServerSettings { QueryParameterMultipleValueSupport = QueryParameterMultipleValueSupport.NoComma