diff --git a/src/WireMock.Net/Http/HttpRequestMethods.cs b/src/WireMock.Net/Http/HttpRequestMethods.cs new file mode 100644 index 00000000..66e012c0 --- /dev/null +++ b/src/WireMock.Net/Http/HttpRequestMethods.cs @@ -0,0 +1,18 @@ +namespace WireMock.Http +{ + /// + /// https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods + /// + internal static class HttpRequestMethods + { + public const string CONNECT = "CONNECT"; + public const string DELETE = "DELETE"; + public const string GET = "GET"; + public const string HEAD = "HEAD"; + public const string OPTIONS = "OPTIONS"; + public const string PATCH = "PATCH"; + public const string POST = "POST"; + public const string PUT = "PUT"; + public const string TRACE = "TRACE"; + } +} \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs index 2e27bdc1..3c8cc8b6 100644 --- a/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs @@ -9,6 +9,13 @@ namespace WireMock.RequestBuilders /// public interface IMethodRequestBuilder : IHeadersRequestBuilder { + /// + /// UsingConnect: add HTTP Method matching on `CONNECT` and matchBehaviour (optional). + /// + /// The match behaviour. + /// The . + IRequestBuilder UsingConnect(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + /// /// UsingDelete: add HTTP Method matching on `DELETE` and matchBehaviour (optional). /// @@ -24,7 +31,7 @@ namespace WireMock.RequestBuilders IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); /// - /// Add HTTP Method matching on `HEAD` and matchBehaviour (optional). + /// UsingHead: Add HTTP Method matching on `HEAD` and matchBehaviour (optional). /// /// The match behaviour. /// The . @@ -44,6 +51,13 @@ namespace WireMock.RequestBuilders /// The . IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + /// + /// UsingPut: add HTTP Method matching on `OPTIONS` and matchBehaviour (optional). + /// + /// The match behaviour. + /// The . + IRequestBuilder UsingOptions(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + /// /// UsingPut: add HTTP Method matching on `PUT` and matchBehaviour (optional). /// @@ -51,6 +65,13 @@ namespace WireMock.RequestBuilders /// The . IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + /// + /// UsingTrace: add HTTP Method matching on `TRACE` and matchBehaviour (optional). + /// + /// The match behaviour. + /// The . + IRequestBuilder UsingTrace(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch); + /// /// UsingAnyMethod: add HTTP Method matching on any method. /// diff --git a/src/WireMock.Net/RequestBuilders/Request.UsingMethods.cs b/src/WireMock.Net/RequestBuilders/Request.UsingMethods.cs new file mode 100644 index 00000000..4a92e3c6 --- /dev/null +++ b/src/WireMock.Net/RequestBuilders/Request.UsingMethods.cs @@ -0,0 +1,113 @@ +using System.Linq; +using WireMock.Http; +using WireMock.Matchers; +using WireMock.Matchers.Request; +using WireMock.Validation; + +namespace WireMock.RequestBuilders +{ + public partial class Request + { + /// + public IRequestBuilder UsingConnect(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.CONNECT)); + return this; + } + + /// + public IRequestBuilder UsingDelete(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.DELETE)); + return this; + } + + /// + public IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.GET)); + return this; + } + + /// + public IRequestBuilder UsingHead(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.HEAD)); + return this; + } + + /// + public IRequestBuilder UsingOptions(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.OPTIONS)); + return this; + } + + /// + public IRequestBuilder UsingPost(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.POST)); + return this; + } + + /// + public IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.PATCH)); + return this; + } + + /// + public IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.PUT)); + return this; + } + + /// + public IRequestBuilder UsingTrace(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) + { + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, HttpRequestMethods.TRACE)); + return this; + } + + /// + public IRequestBuilder UsingAnyMethod() + { + var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList(); + foreach (var matcher in matchers) + { + _requestMatchers.Remove(matcher); + } + + return this; + } + + /// + public IRequestBuilder UsingAnyVerb() + { + return UsingAnyMethod(); + } + + /// + public IRequestBuilder UsingMethod(params string[] methods) + { + return UsingMethod(MatchBehaviour.AcceptOnMatch, methods); + } + + /// + public IRequestBuilder UsingVerb(params string[] verbs) + { + return UsingMethod(verbs); + } + + /// + public IRequestBuilder UsingMethod(MatchBehaviour matchBehaviour, params string[] methods) + { + Check.NotNullOrEmpty(methods, nameof(methods)); + + _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, methods)); + return this; + } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs index 50d92498..728ab11b 100644 --- a/src/WireMock.Net/RequestBuilders/Request.cs +++ b/src/WireMock.Net/RequestBuilders/Request.cs @@ -151,86 +151,5 @@ namespace WireMock.RequestBuilders _requestMatchers.Add(new RequestMessageUrlMatcher(funcs)); return this; } - - /// - public IRequestBuilder UsingDelete(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "DELETE")); - return this; - } - - /// - public IRequestBuilder UsingGet(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "GET")); - return this; - } - - /// - public IRequestBuilder UsingHead(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "HEAD")); - return this; - } - - /// - public IRequestBuilder UsingPost(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "POST")); - return this; - } - - /// - public IRequestBuilder UsingPatch(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "PATCH")); - return this; - } - - /// - public IRequestBuilder UsingPut(MatchBehaviour matchBehaviour = MatchBehaviour.AcceptOnMatch) - { - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, "PUT")); - return this; - } - - /// - public IRequestBuilder UsingAnyMethod() - { - var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList(); - foreach (var matcher in matchers) - { - _requestMatchers.Remove(matcher); - } - - return this; - } - - /// - public IRequestBuilder UsingAnyVerb() - { - return UsingAnyMethod(); - } - - /// - public IRequestBuilder UsingMethod(params string[] methods) - { - return UsingMethod(MatchBehaviour.AcceptOnMatch, methods); - } - - /// - public IRequestBuilder UsingVerb(params string[] verbs) - { - return UsingMethod(verbs); - } - - /// - public IRequestBuilder UsingMethod(MatchBehaviour matchBehaviour, params string[] methods) - { - Check.NotNullOrEmpty(methods, nameof(methods)); - - _requestMatchers.Add(new RequestMessageMethodMatcher(matchBehaviour, methods)); - return this; - } } } \ No newline at end of file diff --git a/src/WireMock.Net/Util/BodyParser.cs b/src/WireMock.Net/Util/BodyParser.cs index 6a6ff102..546e93c4 100644 --- a/src/WireMock.Net/Util/BodyParser.cs +++ b/src/WireMock.Net/Util/BodyParser.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using JetBrains.Annotations; using Newtonsoft.Json; +using WireMock.Http; using WireMock.Matchers; using WireMock.Types; using WireMock.Validation; @@ -30,15 +31,15 @@ namespace WireMock.Util */ private static readonly IDictionary BodyAllowedForMethods = new Dictionary { - { "HEAD", false }, - { "GET", false }, - { "PUT", true }, - { "POST", true }, - { "DELETE", true }, - { "TRACE", false }, - { "OPTIONS", true }, - { "CONNECT", false }, - { "PATCH", true } + { HttpRequestMethods.HEAD, false }, + { HttpRequestMethods.GET, false }, + { HttpRequestMethods.PUT, true }, + { HttpRequestMethods.POST, true }, + { HttpRequestMethods.DELETE, true }, + { HttpRequestMethods.TRACE, false }, + { HttpRequestMethods.OPTIONS, true }, + { HttpRequestMethods.CONNECT, false }, + { HttpRequestMethods.PATCH, true } }; private static readonly IStringMatcher[] MultipartContentTypesMatchers = { diff --git a/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs b/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs index 0872d659..4bfeedc6 100644 --- a/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs +++ b/test/WireMock.Net.Tests/RequestBuilders/RequestBuilderUsingMethodTests.cs @@ -8,18 +8,54 @@ namespace WireMock.Net.Tests.RequestBuilders { public class RequestBuilderUsingMethodTests { + [Fact] + public void RequestBuilder_UsingConnect() + { + // Act + var requestBuilder = (Request)Request.Create().UsingConnect(); + + // Assert + var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers"); + Check.That(matchers.Count).IsEqualTo(1); + Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("CONNECT"); + } + + [Fact] + public void RequestBuilder_UsingOptions() + { + // Act + var requestBuilder = (Request)Request.Create().UsingOptions(); + + // Assert + var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers"); + Check.That(matchers.Count).IsEqualTo(1); + Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("OPTIONS"); + } + [Fact] public void RequestBuilder_UsingPatch() { // Act var requestBuilder = (Request)Request.Create().UsingPatch(); - // Assert 1 + // Assert var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers"); Check.That(matchers.Count).IsEqualTo(1); Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("PATCH"); } + [Fact] + public void RequestBuilder_UsingTrace() + { + // Act + var requestBuilder = (Request)Request.Create().UsingTrace(); + + // Assert + var matchers = requestBuilder.GetPrivateFieldValue>("_requestMatchers"); + Check.That(matchers.Count).IsEqualTo(1); + Check.That((matchers[0] as RequestMessageMethodMatcher).Methods).ContainsExactly("TRACE"); + } + [Fact] public void RequestBuilder_UsingAnyMethod_ClearsAllOtherMatches() {