diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs index e0e07c64..56664493 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageCookieMatcher.cs @@ -86,17 +86,19 @@ namespace WireMock.Matchers.Request private double IsMatch(RequestMessage requestMessage) { - if (Funcs != null) - return MatchScores.ToScore(requestMessage.Cookies != null && Funcs.Any(cf => cf(requestMessage.Cookies))); - if (requestMessage.Cookies == null) return MatchScores.Mismatch; + if (Funcs != null) + return MatchScores.ToScore(Funcs.Any(f => f(requestMessage.Cookies))); + + if (Matchers == null) + return MatchScores.Mismatch; + if (!requestMessage.Cookies.ContainsKey(Name)) return MatchScores.Mismatch; string value = requestMessage.Cookies[Name]; - return Matchers.Max(m => m.IsMatch(value)); } } diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs index 24c3c7da..7127f324 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageHeaderMatcher.cs @@ -86,18 +86,20 @@ namespace WireMock.Matchers.Request private double IsMatch(RequestMessage requestMessage) { - if (Funcs != null) - return MatchScores.ToScore(requestMessage.Headers != null && Funcs.Any(hf => hf(requestMessage.Headers))); - if (requestMessage.Headers == null) return MatchScores.Mismatch; + if (Funcs != null) + return MatchScores.ToScore(Funcs.Any(f => f(requestMessage.Headers))); + + if (Matchers == null) + return MatchScores.Mismatch; + if (!requestMessage.Headers.ContainsKey(Name)) return MatchScores.Mismatch; - string headerValue = requestMessage.Headers[Name]; - - return Matchers.Max(m => m.IsMatch(headerValue)); + string value = requestMessage.Headers[Name]; + return Matchers.Max(m => m.IsMatch(value)); } } } \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs b/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs index 2f215c27..942b123b 100644 --- a/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs +++ b/src/WireMock.Net/Matchers/Request/RequestMessageParamMatcher.cs @@ -36,10 +36,9 @@ namespace WireMock.Matchers.Request /// /// The values. /// - public RequestMessageParamMatcher([NotNull] string key, [NotNull] IEnumerable values) + public RequestMessageParamMatcher([NotNull] string key, [CanBeNull] IEnumerable values) { Check.NotNull(key, nameof(key)); - Check.NotNull(values, nameof(values)); Key = key; Values = values; diff --git a/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs index 5aa52039..c979b91e 100644 --- a/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IBodyRequestBuilder.cs @@ -35,13 +35,13 @@ namespace WireMock.RequestBuilders /// /// The body string function. /// The . - IRequestBuilder WithBody(Func body); + IRequestBuilder WithBody([NotNull] Func body); /// /// The with body byte[] func. /// /// The body byte[] function. /// The . - IRequestBuilder WithBody(Func body); + IRequestBuilder WithBody([NotNull] Func body); } } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IParamsRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IParamsRequestBuilder.cs index fb7ba015..590eefa8 100644 --- a/src/WireMock.Net/RequestBuilders/IParamsRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IParamsRequestBuilder.cs @@ -16,7 +16,7 @@ namespace WireMock.RequestBuilders /// The key. /// The values. /// The . - IRequestBuilder WithParam([NotNull] string key, params string[] values); + IRequestBuilder WithParam([NotNull] string key, [CanBeNull] params string[] values); /// /// The with parameters. diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs index cee17dda..144a2adf 100644 --- a/src/WireMock.Net/RequestBuilders/Request.cs +++ b/src/WireMock.Net/RequestBuilders/Request.cs @@ -5,6 +5,7 @@ using System.Linq; using WireMock.Matchers; using WireMock.Matchers.Request; using WireMock.Util; +using WireMock.Validation; namespace WireMock.RequestBuilders { @@ -60,6 +61,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithPath(params IMatcher[] matchers) { + Check.NotEmpty(matchers, nameof(matchers)); + _requestMatchers.Add(new RequestMessagePathMatcher(matchers)); return this; } @@ -71,6 +74,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithPath(params string[] paths) { + Check.NotEmpty(paths, nameof(paths)); + _requestMatchers.Add(new RequestMessagePathMatcher(paths)); return this; } @@ -82,6 +87,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithPath(params Func[] funcs) { + Check.NotEmpty(funcs, nameof(funcs)); + _requestMatchers.Add(new RequestMessagePathMatcher(funcs)); return this; } @@ -89,11 +96,13 @@ namespace WireMock.RequestBuilders /// /// The with url. /// - /// The matcher. + /// The matchers. /// The . - public IRequestBuilder WithUrl(params IMatcher[] matcher) + public IRequestBuilder WithUrl(params IMatcher[] matchers) { - _requestMatchers.Add(new RequestMessageUrlMatcher(matcher)); + Check.NotEmpty(matchers, nameof(matchers)); + + _requestMatchers.Add(new RequestMessageUrlMatcher(matchers)); return this; } @@ -104,6 +113,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithUrl(params string[] urls) { + Check.NotEmpty(urls, nameof(urls)); + _requestMatchers.Add(new RequestMessageUrlMatcher(urls)); return this; } @@ -115,6 +126,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithUrl(params Func[] funcs) { + Check.NotEmpty(funcs, nameof(funcs)); + _requestMatchers.Add(new RequestMessageUrlMatcher(funcs)); return this; } @@ -201,6 +214,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder UsingVerb(params string[] verbs) { + Check.NotEmpty(verbs, nameof(verbs)); + _requestMatchers.Add(new RequestMessageMethodMatcher(verbs)); return this; } @@ -240,6 +255,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithBody(Func func) { + Check.NotNull(func, nameof(func)); + _requestMatchers.Add(new RequestMessageBodyMatcher(func)); return this; } @@ -253,6 +270,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithBody(Func func) { + Check.NotNull(func, nameof(func)); + _requestMatchers.Add(new RequestMessageBodyMatcher(func)); return this; } @@ -264,6 +283,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithBody(IMatcher matcher) { + Check.NotNull(matcher, nameof(matcher)); + _requestMatchers.Add(new RequestMessageBodyMatcher(matcher)); return this; } @@ -280,6 +301,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithParam(string key, params string[] values) { + Check.NotNull(key, nameof(key)); + _requestMatchers.Add(new RequestMessageParamMatcher(key, values)); return this; } @@ -291,6 +314,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithParam(params Func>, bool>[] funcs) { + Check.NotEmpty(funcs, nameof(funcs)); + _requestMatchers.Add(new RequestMessageParamMatcher(funcs)); return this; } @@ -304,6 +329,9 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithHeader(string name, string pattern, bool ignoreCase = true) { + Check.NotNull(name, nameof(name)); + Check.NotNull(pattern, nameof(pattern)); + _requestMatchers.Add(new RequestMessageHeaderMatcher(name, pattern, ignoreCase)); return this; } @@ -316,6 +344,9 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithHeader(string name, params IMatcher[] matchers) { + Check.NotNull(name, nameof(name)); + Check.NotEmpty(matchers, nameof(matchers)); + _requestMatchers.Add(new RequestMessageHeaderMatcher(name, matchers)); return this; } @@ -327,6 +358,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithHeader(params Func, bool>[] funcs) { + Check.NotEmpty(funcs, nameof(funcs)); + _requestMatchers.Add(new RequestMessageHeaderMatcher(funcs)); return this; } @@ -352,6 +385,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithCookie(string name, params IMatcher[] matchers) { + Check.NotEmpty(matchers, nameof(matchers)); + _requestMatchers.Add(new RequestMessageCookieMatcher(name, matchers)); return this; } @@ -363,6 +398,8 @@ namespace WireMock.RequestBuilders /// The . public IRequestBuilder WithCookie(params Func, bool>[] funcs) { + Check.NotEmpty(funcs, nameof(funcs)); + _requestMatchers.Add(new RequestMessageCookieMatcher(funcs)); return this; } diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 52fc2045..55c2094f 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -85,7 +85,7 @@ namespace WireMock.Server .WithGuid(guid) .RespondWith(responseBuilder); - return new ResponseMessage { Body = "Mapping updated" }; + return new ResponseMessage { Body = "Mapping added or updated" }; } private ResponseMessage MappingDelete(RequestMessage requestMessage)