diff --git a/CHANGELOG.md b/CHANGELOG.md index 952b8992..6f1ef987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 1.0.3.8 (10 March 2018) + + - [#106](https://github.com/WireMock-Net/WireMock.Net/issues/106) - Issue: Params does not work, when there are multiple values for a key + +Commits: f604be3c02...f604be3c02 + + # 1.0.3.7 (09 March 2018) - [#104](https://github.com/WireMock-Net/WireMock.Net/issues/104) - Issue: PlatformNotSupportedException diff --git a/GitReleaseNotes.txt b/GitReleaseNotes.txt index f950fa57..acf885a5 100644 --- a/GitReleaseNotes.txt +++ b/GitReleaseNotes.txt @@ -1,5 +1,5 @@ https://github.com/GitTools/GitReleaseNotes -GitReleaseNotes.exe . /OutputFile CHANGELOG.md /Version 1.0.3.7 +GitReleaseNotes.exe . /OutputFile CHANGELOG.md /Version 1.0.3.8 GitReleaseNotes.exe . /OutputFile CHANGELOG.md /allTags diff --git a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj index d1d0eac3..05c10f55 100644 --- a/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj +++ b/src/WireMock.Net.StandAlone/WireMock.Net.StandAlone.csproj @@ -3,7 +3,7 @@ Lightweight StandAlone Http Mocking Server for .Net. WireMock.Net.StandAlone - 1.0.3.7 + 1.0.3.8 Stef Heyenrath net452;net46;netstandard1.3;netstandard2.0 true diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs index 43d3bb05..1564ef32 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs @@ -65,9 +65,15 @@ namespace WireMock.Matchers.Request return MatchScores.ToScore(requestMessage.Query != null && Funcs.Any(f => f(requestMessage.Query))); } - List values = requestMessage.GetParameter(Key); + var values = requestMessage.GetParameter(Key); + if (values == null && !Values.Any()) + { + // Key is present, but no values, just return match + return MatchScores.Perfect; + } - return MatchScores.ToScore(values?.Intersect(Values).Count() == Values.Count()); + var matches = Values.Select(v => values != null && values.Contains(v)); + return MatchScores.ToScore(matches); } } } \ No newline at end of file diff --git a/src/WireMock.Net/RequestMessage.cs b/src/WireMock.Net/RequestMessage.cs index f2d3346b..8540c533 100644 --- a/src/WireMock.Net/RequestMessage.cs +++ b/src/WireMock.Net/RequestMessage.cs @@ -180,10 +180,11 @@ namespace WireMock queryString = queryString.Substring(1); } - return queryString.Split('&').Aggregate(new Dictionary>(), + return queryString.Split(new[] { '&' }, StringSplitOptions.RemoveEmptyEntries) + .Aggregate(new Dictionary>(), (dict, term) => { - var parts = term.Split('='); + string[] parts = term.Split(new[] { '=' }, StringSplitOptions.RemoveEmptyEntries); string key = parts[0]; if (!dict.ContainsKey(key)) { @@ -192,7 +193,8 @@ namespace WireMock if (parts.Length == 2) { - dict[key].Add(parts[1]); + string[] values = parts[1].Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); + dict[key].AddRange(values); } return dict; diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index 4712e30a..ff769002 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -3,7 +3,7 @@ Lightweight Http Mocking Server for .Net, inspired by WireMock from the Java landscape. WireMock.Net - 1.0.3.7 + 1.0.3.8 Alexandre Victoor;Stef Heyenrath net452;net46;netstandard1.3;netstandard2.0 true diff --git a/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs new file mode 100644 index 00000000..c4879ea8 --- /dev/null +++ b/test/WireMock.Net.Tests/RequestMatchers/RequestMessageParamMatcherTests.cs @@ -0,0 +1,55 @@ +using System; +using NFluent; +using WireMock.Matchers.Request; +using Xunit; + +namespace WireMock.Net.Tests.RequestMatchers +{ + public class RequestMessageParamMatcherTests + { + [Fact] + public void RequestMessageParamMatcher_GetMatchingScore_AllMatch() + { + // Assign + var requestMessage = new RequestMessage(new Uri("http://localhost?key=test1,test2"), "GET", "127.0.0.1"); + var matcher = new RequestMessageParamMatcher("key", new[] { "test1", "test2" }); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(1.0d); + } + + [Fact] + public void RequestMessageParamMatcher_GetMatchingScore_PartialMatch() + { + // Assign + var requestMessage = new RequestMessage(new Uri("http://localhost?key=test0,test2"), "GET", "127.0.0.1"); + var matcher = new RequestMessageParamMatcher("key", new[] { "test1", "test2" }); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(0.5d); + } + + [Fact] + public void RequestMessageParamMatcher_GetMatchingScore_OnlyKeyPresent() + { + // Assign + var requestMessage = new RequestMessage(new Uri("http://localhost?key"), "GET", "127.0.0.1"); + var matcher = new RequestMessageParamMatcher("key", new[] { "test1", "test2" }); + + // Act + var result = new RequestMatchResult(); + double score = matcher.GetMatchingScore(requestMessage, result); + + // Assert + Check.That(score).IsEqualTo(0.0d); + } + } +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/RequestMessageTests.cs b/test/WireMock.Net.Tests/RequestMessageTests.cs index d3ec7235..14742b44 100644 --- a/test/WireMock.Net.Tests/RequestMessageTests.cs +++ b/test/WireMock.Net.Tests/RequestMessageTests.cs @@ -1,17 +1,15 @@ using System; -using System.Text; using NFluent; using Xunit; namespace WireMock.Net.Tests { - //[TestFixture] public class RequestMessageTests { private const string ClientIp = "::1"; [Fact] - public void Should_handle_empty_query() + public void RequestMessage_ParseQuery_NoKeys() { // given var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp); @@ -21,17 +19,36 @@ namespace WireMock.Net.Tests } [Fact] - public void Should_parse_query_params() + public void RequestMessage_ParseQuery_SingleKey_SingleValue() { - // given - string bodyAsString = "whatever"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost?foo=bar&multi=1&multi=2"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); + // Assign + var request = new RequestMessage(new Uri("http://localhost?foo=bar"), "POST", ClientIp); - // then - Check.That(request.GetParameter("foo")).Contains("bar"); - Check.That(request.GetParameter("multi")).Contains("1"); - Check.That(request.GetParameter("multi")).Contains("2"); + // Assert + Check.That(request.GetParameter("foo")).ContainsExactly("bar"); + } + + [Fact] + public void RequestMessage_ParseQuery_MultipleKeys_MultipleValues() + { + // Assign + var request = new RequestMessage(new Uri("http://localhost?key=1&key=2"), "POST", ClientIp); + + // Assert + Check.That(request.GetParameter("key")).Contains("1"); + Check.That(request.GetParameter("key")).Contains("2"); + } + + [Fact] + public void RequestMessage_ParseQuery_SingleKey_MultipleValues() + { + // Assign + var request = new RequestMessage(new Uri("http://localhost?key=1,2&foo=bar&key=3"), "POST", ClientIp); + + // Assert + Check.That(request.GetParameter("key")).Contains("1"); + Check.That(request.GetParameter("key")).Contains("2"); + Check.That(request.GetParameter("key")).Contains("3"); } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/RequestTests.cs b/test/WireMock.Net.Tests/RequestTests.cs index ea7d2c7f..dbb40711 100644 --- a/test/WireMock.Net.Tests/RequestTests.cs +++ b/test/WireMock.Net.Tests/RequestTests.cs @@ -123,20 +123,6 @@ namespace WireMock.Net.Tests Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); } - [Fact] - public void Should_specify_requests_matching_given_paramNoValue() - { - // given - var spec = Request.Create().WithParam("bar"); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo?bar"), "PUT", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - [Fact] public void Should_specify_requests_matching_given_param_func() {