diff --git a/src/WireMock.Net/Client/IFluentMockServerAdmin.cs b/src/WireMock.Net/Client/IFluentMockServerAdmin.cs index 48bb2d50..38fdfbee 100644 --- a/src/WireMock.Net/Client/IFluentMockServerAdmin.cs +++ b/src/WireMock.Net/Client/IFluentMockServerAdmin.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using WireMock.Admin.Mappings; using WireMock.Admin.Requests; using WireMock.Admin.Settings; -using WireMock.Logging; namespace WireMock.Client { diff --git a/src/WireMock.Net/Owin/OwinRequestMapper.cs b/src/WireMock.Net/Owin/OwinRequestMapper.cs index 94923178..4ac662f3 100644 --- a/src/WireMock.Net/Owin/OwinRequestMapper.cs +++ b/src/WireMock.Net/Owin/OwinRequestMapper.cs @@ -91,8 +91,9 @@ namespace WireMock.Owin TRACE - Body not supported. OPTIONS - Body supported but no semantics on usage (maybe in the future). CONNECT - No defined body semantics + PATCH - Body supported. */ - return new[] { "PUT", "POST", "OPTIONS" }.Contains(method.ToUpper()); + return new[] { "PUT", "POST", "OPTIONS", "PATCH" }.Contains(method.ToUpper()); } } } \ No newline at end of file diff --git a/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs index 5b1b1806..b5a43b90 100644 --- a/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs +++ b/src/WireMock.Net/RequestBuilders/IMethodRequestBuilder.cs @@ -7,6 +7,14 @@ namespace WireMock.RequestBuilders /// public interface IMethodRequestBuilder : IHeadersAndCookiesRequestBuilder { + /// + /// The using delete. + /// + /// + /// The . + /// + IRequestBuilder UsingDelete(); + /// /// The using get. /// @@ -15,6 +23,14 @@ namespace WireMock.RequestBuilders /// IRequestBuilder UsingGet(); + /// + /// The using head. + /// + /// + /// The . + /// + IRequestBuilder UsingHead(); + /// /// The using post. /// @@ -24,12 +40,12 @@ namespace WireMock.RequestBuilders IRequestBuilder UsingPost(); /// - /// The using delete. + /// The using patch. /// /// /// The . /// - IRequestBuilder UsingDelete(); + IRequestBuilder UsingPatch(); /// /// The using put. @@ -39,14 +55,6 @@ namespace WireMock.RequestBuilders /// IRequestBuilder UsingPut(); - /// - /// The using head. - /// - /// - /// The . - /// - IRequestBuilder UsingHead(); - /// /// The using any verb. /// diff --git a/src/WireMock.Net/RequestBuilders/Request.cs b/src/WireMock.Net/RequestBuilders/Request.cs index d748c266..090d3336 100644 --- a/src/WireMock.Net/RequestBuilders/Request.cs +++ b/src/WireMock.Net/RequestBuilders/Request.cs @@ -171,70 +171,49 @@ namespace WireMock.RequestBuilders return this; } - /// - /// The using get. - /// - /// - /// The . - /// - public IRequestBuilder UsingGet() - { - _requestMatchers.Add(new RequestMessageMethodMatcher("get")); - return this; - } - - /// - /// The using post. - /// - /// - /// The . - /// - public IRequestBuilder UsingPost() - { - _requestMatchers.Add(new RequestMessageMethodMatcher("post")); - return this; - } - - /// - /// The using put. - /// - /// - /// The . - /// - public IRequestBuilder UsingPut() - { - _requestMatchers.Add(new RequestMessageMethodMatcher("put")); - return this; - } - - /// - /// The using delete. - /// - /// - /// The . - /// + /// public IRequestBuilder UsingDelete() { _requestMatchers.Add(new RequestMessageMethodMatcher("delete")); return this; } - /// - /// The using head. - /// - /// The . + /// + public IRequestBuilder UsingGet() + { + _requestMatchers.Add(new RequestMessageMethodMatcher("get")); + return this; + } + + /// public IRequestBuilder UsingHead() { _requestMatchers.Add(new RequestMessageMethodMatcher("head")); return this; } - /// - /// The using any verb. - /// - /// - /// The . - /// + /// + public IRequestBuilder UsingPost() + { + _requestMatchers.Add(new RequestMessageMethodMatcher("post")); + return this; + } + + /// + public IRequestBuilder UsingPatch() + { + _requestMatchers.Add(new RequestMessageMethodMatcher("patch")); + return this; + } + + /// + public IRequestBuilder UsingPut() + { + _requestMatchers.Add(new RequestMessageMethodMatcher("put")); + return this; + } + + /// public IRequestBuilder UsingAnyVerb() { var matchers = _requestMatchers.Where(m => m is RequestMessageMethodMatcher).ToList(); @@ -246,11 +225,7 @@ namespace WireMock.RequestBuilders return this; } - /// - /// The using verb. - /// - /// The verbs. - /// The . + /// public IRequestBuilder UsingVerb(params string[] verbs) { Check.NotEmpty(verbs, nameof(verbs)); diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.cs b/test/WireMock.Net.Tests/FluentMockServerTests.cs index 343256d0..deb1f6c7 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.cs @@ -175,6 +175,34 @@ namespace WireMock.Net.Tests Check.That(requestLogged.RequestMessage.BodyAsBytes).IsNull(); } + [Fact] + public async Task FluentMockServer_Should_respond_to_request_methodPatch() + { + // given + _server = FluentMockServer.Start(); + + _server.Given(Request.Create().WithPath("/foo").UsingVerb("patch")) + .RespondWith(Response.Create().WithBody("hello patch")); + + // when + var msg = new HttpRequestMessage(new HttpMethod("patch"), new Uri("http://localhost:" + _server.Ports[0] + "/foo")) + { + Content = new StringContent("{\"data\": {\"attr\":\"value\"}}") + }; + var response = await new HttpClient().SendAsync(msg); + + // then + Check.That(response.StatusCode).IsEqualTo(HttpStatusCode.OK); + var responseBody = await response.Content.ReadAsStringAsync(); + Check.That(responseBody).IsEqualTo("hello patch"); + + Check.That(_server.LogEntries).HasSize(1); + var requestLogged = _server.LogEntries.First(); + Check.That(requestLogged.RequestMessage.Method).IsEqualTo("patch"); + Check.That(requestLogged.RequestMessage.Body).IsNotNull(); + Check.That(requestLogged.RequestMessage.Body).IsEqualTo("{\"data\": {\"attr\":\"value\"}}"); + } + [Fact] public async Task FluentMockServer_Should_respond_to_request_bodyAsString() { diff --git a/test/WireMock.Net.Tests/RequestTests.PathAndMethod.cs b/test/WireMock.Net.Tests/RequestTests.PathAndMethod.cs new file mode 100644 index 00000000..5b4e8170 --- /dev/null +++ b/test/WireMock.Net.Tests/RequestTests.PathAndMethod.cs @@ -0,0 +1,113 @@ +using System; +using System.Text; +using NFluent; +using Xunit; +using WireMock.RequestBuilders; +using WireMock.Matchers.Request; + +namespace WireMock.Net.Tests +{ + //[TestFixture] + public partial class RequestTests + { + [Fact] + public void Should_specify_requests_matching_given_path_and_method_delete() + { + // given + var spec = Request.Create().WithPath("/foo").UsingDelete(); + + // when + string bodyAsString = "whatever"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "Delete", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Should_specify_requests_matching_given_path_and_method_get() + { + // given + var spec = Request.Create().WithPath("/foo").UsingGet(); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "GET", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Should_specify_requests_matching_given_path_and_method_head() + { + // given + var spec = Request.Create().WithPath("/foo").UsingHead(); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "HEAD", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Should_specify_requests_matching_given_path_and_method_post() + { + // given + var spec = Request.Create().WithPath("/foo").UsingPost(); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Should_specify_requests_matching_given_path_and_method_put() + { + // given + var spec = Request.Create().WithPath("/foo").UsingPut(); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Should_specify_requests_matching_given_path_and_method_patch() + { + // given + var spec = Request.Create().WithPath("/foo").UsingPatch(); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "PATCH", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Should_exclude_requests_matching_given_path_but_not_http_method() + { + // given + var spec = Request.Create().WithPath("/foo").UsingPut(); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "HEAD", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); + } + } +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/RequestTests.cs b/test/WireMock.Net.Tests/RequestTests.cs index b28370f3..c7e4bfba 100644 --- a/test/WireMock.Net.Tests/RequestTests.cs +++ b/test/WireMock.Net.Tests/RequestTests.cs @@ -97,92 +97,6 @@ namespace WireMock.Net.Tests Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); } - [Fact] - public void Should_specify_requests_matching_given_path_and_method_put() - { - // given - var spec = Request.Create().WithPath("/foo").UsingPut(); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_path_and_method_post() - { - // given - var spec = Request.Create().WithPath("/foo").UsingPost(); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_path_and_method_get() - { - // given - var spec = Request.Create().WithPath("/foo").UsingGet(); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "GET", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_path_and_method_delete() - { - // given - var spec = Request.Create().WithPath("/foo").UsingDelete(); - - // when - string bodyAsString = "whatever"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "Delete", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_path_and_method_head() - { - // given - var spec = Request.Create().WithPath("/foo").UsingHead(); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "HEAD", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_exclude_requests_matching_given_path_but_not_http_method() - { - // given - var spec = Request.Create().WithPath("/foo").UsingPut(); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "HEAD", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); - } - [Fact] public void Should_exclude_requests_matching_given_http_method_but_not_url() { @@ -206,7 +120,7 @@ namespace WireMock.Net.Tests // when string bodyAsString = "whatever"; byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", new [] { "tata" } } }); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, bodyAsString, Encoding.UTF8, new Dictionary { { "X-toto", new[] { "tata" } } }); // then var requestMatchResult = new RequestMatchResult();