diff --git a/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs b/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs index 7d1e16b8..8f7c3712 100644 --- a/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs +++ b/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs @@ -18,7 +18,8 @@ namespace WireMock.Net.Console.Record.NETCoreApp Url = "https://www.google.com", //X509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", SaveMapping = true, - SaveMappingToFile = false + SaveMappingToFile = false, + BlackListedHeaders = new [] { "dnt", "Content-Length" } } }); diff --git a/src/WireMock.Net.StandAlone/StandAloneApp.cs b/src/WireMock.Net.StandAlone/StandAloneApp.cs index 2ce4b8e1..59924152 100644 --- a/src/WireMock.Net.StandAlone/StandAloneApp.cs +++ b/src/WireMock.Net.StandAlone/StandAloneApp.cs @@ -67,7 +67,8 @@ namespace WireMock.Net.StandAlone Url = proxyURL, SaveMapping = parser.GetBoolValue("SaveMapping"), SaveMappingToFile = parser.GetBoolValue("SaveMappingToFile"), - X509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("X509Certificate2ThumbprintOrSubjectName") + X509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("X509Certificate2ThumbprintOrSubjectName"), + BlackListedHeaders = parser.GetValues("BlackListedHeaders") }; } @@ -75,7 +76,7 @@ namespace WireMock.Net.StandAlone FluentMockServer server = Start(settings); - Console.WriteLine("WireMock.Net server listening at {0}", string.Join(" and ", server.Urls)); + Console.WriteLine("WireMock.Net server listening at {0}", string.Join(",", server.Urls)); return server; } diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index e09747a6..7202a6d8 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -149,7 +149,7 @@ namespace WireMock.Server if (settings.SaveMapping) { - var mapping = ToMapping(requestMessage, responseMessage); + var mapping = ToMapping(requestMessage, responseMessage, settings.BlackListedHeaders ?? new string[] { }); _options.Mappings.Add(mapping); if (settings.SaveMappingToFile) @@ -161,16 +161,23 @@ namespace WireMock.Server return responseMessage; } - private Mapping ToMapping(RequestMessage requestMessage, ResponseMessage responseMessage) + private Mapping ToMapping(RequestMessage requestMessage, ResponseMessage responseMessage, string[] blacklistedHeaders) { var request = Request.Create(); request.WithPath(requestMessage.Path); request.UsingVerb(requestMessage.Method); requestMessage.Query.Loop((key, value) => request.WithParam(key, value.ToArray())); - requestMessage.Headers.Loop((key, value) => request.WithHeader(key, value.ToArray())); requestMessage.Cookies.Loop((key, value) => request.WithCookie(key, value)); + requestMessage.Headers.Loop((key, value) => + { + if (!blacklistedHeaders.Any(b => string.Equals(key, b, StringComparison.OrdinalIgnoreCase))) + { + request.WithHeader(key, value.ToArray()); + } + }); + if (requestMessage.Body != null) { request.WithBody(new ExactMatcher(requestMessage.Body)); diff --git a/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs b/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs index e5f0a4e0..005c63b8 100644 --- a/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs +++ b/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs @@ -1,7 +1,7 @@ namespace WireMock.Settings { /// - /// IRecordAndSaveSettings + /// IProxyAndRecordSettings /// public interface IProxyAndRecordSettings { @@ -24,5 +24,10 @@ /// The clientCertificate thumbprint or subject name fragment to use. Example thumbprint : "D2DBF135A8D06ACCD0E1FAD9BFB28678DF7A9818". Example subject name: "www.google.com"" /// string X509Certificate2ThumbprintOrSubjectName { get; set; } + + /// + /// Defines a list from headers which will excluded from the saved mappings. + /// + string[] BlackListedHeaders { get; set; } } } diff --git a/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs b/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs index c1f4d10a..ed1df0be 100644 --- a/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs +++ b/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs @@ -3,7 +3,7 @@ namespace WireMock.Settings { /// - /// RecordAndSaveSettings + /// ProxyAndRecordSettings /// public class ProxyAndRecordSettings : IProxyAndRecordSettings { @@ -22,5 +22,9 @@ namespace WireMock.Settings /// [PublicAPI] public string X509Certificate2ThumbprintOrSubjectName { get; set; } + + /// + [PublicAPI] + public string[] BlackListedHeaders { get; set; } } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/FluentMockServerTests.Proxy.cs b/test/WireMock.Net.Tests/FluentMockServerTests.Proxy.cs index d3d28c77..775182cc 100644 --- a/test/WireMock.Net.Tests/FluentMockServerTests.Proxy.cs +++ b/test/WireMock.Net.Tests/FluentMockServerTests.Proxy.cs @@ -5,9 +5,11 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using NFluent; +using WireMock.Matchers.Request; using WireMock.RequestBuilders; using WireMock.ResponseBuilders; using WireMock.Server; +using WireMock.Settings; using Xunit; namespace WireMock.Net.Tests @@ -41,7 +43,16 @@ namespace WireMock.Net.Tests .Given(Request.Create().WithPath("/*")) .RespondWith(Response.Create()); - _server = FluentMockServer.Start(); + var settings = new FluentMockServerSettings + { + ProxyAndRecordSettings = new ProxyAndRecordSettings + { + Url = _serverForProxyForwarding.Urls[0], + SaveMapping = true, + SaveMappingToFile = false + } + }; + _server = FluentMockServer.Start(settings); _server .Given(Request.Create().WithPath("/*")) .RespondWith(Response.Create().WithProxy(_serverForProxyForwarding.Urls[0])); @@ -54,6 +65,7 @@ namespace WireMock.Net.Tests Content = new StringContent("stringContent") }; requestMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain"); + requestMessage.Content.Headers.Add("bbb", "test"); await new HttpClient().SendAsync(requestMessage); // then @@ -61,6 +73,54 @@ namespace WireMock.Net.Tests Check.That(receivedRequest.Body).IsEqualTo("stringContent"); Check.That(receivedRequest.Headers).ContainsKey("Content-Type"); Check.That(receivedRequest.Headers["Content-Type"]).ContainsExactly("text/plain"); + Check.That(receivedRequest.Headers).ContainsKey("bbb"); + + var mapping = _server.Mappings.Last(); + var matcher = ((Request) mapping.RequestMatcher).GetRequestMessageMatchers().FirstOrDefault(m => m.Name == "bbb"); + Check.That(matcher).IsNotNull(); + } + + [Fact] + public async Task FluentMockServer_Proxy_Should_exclude_blacklisted_content_header_in_mapping() + { + // given + _serverForProxyForwarding = FluentMockServer.Start(); + _serverForProxyForwarding + .Given(Request.Create().WithPath("/*")) + .RespondWith(Response.Create()); + + var settings = new FluentMockServerSettings + { + ProxyAndRecordSettings = new ProxyAndRecordSettings + { + Url = _serverForProxyForwarding.Urls[0], + SaveMapping = true, + SaveMappingToFile = false, + BlackListedHeaders = new[] { "bbb" } + } + }; + _server = FluentMockServer.Start(settings); + _server + .Given(Request.Create().WithPath("/*")) + .RespondWith(Response.Create()); + + // when + var requestMessage = new HttpRequestMessage + { + Method = HttpMethod.Post, + RequestUri = new Uri(_server.Urls[0]), + Content = new StringContent("stringContent") + }; + requestMessage.Content.Headers.Add("bbb", "test"); + await new HttpClient().SendAsync(requestMessage); + + // then + var receivedRequest = _serverForProxyForwarding.LogEntries.First().RequestMessage; + Check.That(receivedRequest.Headers).ContainsKey("bbb"); + + var mapping = _server.Mappings.Last(); + var matcher = ((Request)mapping.RequestMatcher).GetRequestMessageMatchers().FirstOrDefault(m => m.Name == "bbb"); + Check.That(matcher).IsNull(); } [Fact] diff --git a/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs b/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs index d5292efe..ca5c875e 100644 --- a/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs +++ b/test/WireMock.Net.Tests/ObservableLogEntriesTest.cs @@ -18,7 +18,7 @@ namespace WireMock.Net.Tests private FluentMockServer _server; [Fact] - public async void Test() + public async void FluentMockServer_LogEntriesChanged() { // Assign _server = FluentMockServer.Start(); @@ -41,9 +41,9 @@ namespace WireMock.Net.Tests } [Fact] - public async Task ParallelTest() + public async Task FluentMockServer_LogEntriesChanged_Parallel() { - var expectedCount = 100; + int expectedCount = 10; // Assign _server = FluentMockServer.Start(); @@ -65,11 +65,11 @@ namespace WireMock.Net.Tests var listOfTasks = new List>(); for (var i = 0; i < expectedCount; i++) { - Thread.Sleep(3); - listOfTasks.Add(http.GetAsync(_server.Urls[0] + $"/foo")); + Thread.Sleep(100); + listOfTasks.Add(http.GetAsync($"{_server.Urls[0]}/foo")); } var responses = await Task.WhenAll(listOfTasks); - var countResponsesWithStatusNotOk = responses.Where(r => r.StatusCode != HttpStatusCode.OK).Count(); + var countResponsesWithStatusNotOk = responses.Count(r => r.StatusCode != HttpStatusCode.OK); // Assert Check.That(countResponsesWithStatusNotOk).Equals(0); @@ -81,4 +81,4 @@ namespace WireMock.Net.Tests _server?.Dispose(); } } -} +} \ No newline at end of file diff --git a/test/WireMock.Net.Tests/RequestCookieTests.cs b/test/WireMock.Net.Tests/RequestCookieTests.cs new file mode 100644 index 00000000..2b88c882 --- /dev/null +++ b/test/WireMock.Net.Tests/RequestCookieTests.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using NFluent; +using WireMock.Matchers.Request; +using WireMock.RequestBuilders; +using Xunit; + +namespace WireMock.Net.Tests +{ + public class RequestCookieTests + { + private const string ClientIp = "::1"; + + [Fact] + public void Request_WithCookie_OK() + { + // given + var spec = Request.Create().UsingAnyVerb().WithCookie("session", "a*"); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, null, null, null, null, new Dictionary { { "session", "abc" } }); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(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 1d4c2f51..ea7d2c7f 100644 --- a/test/WireMock.Net.Tests/RequestTests.cs +++ b/test/WireMock.Net.Tests/RequestTests.cs @@ -4,85 +4,14 @@ using System.Text; using NFluent; using Xunit; using WireMock.RequestBuilders; -using WireMock.Matchers; using WireMock.Matchers.Request; namespace WireMock.Net.Tests { - //[TestFixture] - public partial class RequestTests + public class RequestTests { private const string ClientIp = "::1"; - [Fact] - public void Should_specify_requests_matching_given_path() - { - // given - var spec = Request.Create().WithPath("/foo"); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "blabla", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_paths() - { - var requestBuilder = Request.Create().WithPath("/x1", "/x2"); - - var request1 = new RequestMessage(new Uri("http://localhost/x1"), "blabla", ClientIp); - var request2 = new RequestMessage(new Uri("http://localhost/x2"), "blabla", ClientIp); - - var requestMatchResult = new RequestMatchResult(); - Check.That(requestBuilder.GetMatchingScore(request1, requestMatchResult)).IsEqualTo(1.0); - Check.That(requestBuilder.GetMatchingScore(request2, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_pathFuncs() - { - // given - var spec = Request.Create().WithPath(url => url.EndsWith("/foo")); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "blabla", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_path_prefix() - { - // given - var spec = Request.Create().WithPath(new RegexMatcher("^/foo")); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo/bar"), "blabla", ClientIp); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_exclude_requests_not_matching_given_path() - { - // given - var spec = Request.Create().WithPath("/foo"); - - // when - var request = new RequestMessage(new Uri("http://localhost/bar"), "blabla", 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() { @@ -97,22 +26,6 @@ namespace WireMock.Net.Tests Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); } - [Fact] - public void Should_specify_requests_matching_given_path_and_headers() - { - // given - var spec = Request.Create().WithPath("/foo").UsingAnyVerb().WithHeader("X-toto", "tata"); - - // 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" } } }); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - [Fact] public void Should_exclude_requests_not_matching_given_headers() { @@ -161,19 +74,7 @@ namespace WireMock.Net.Tests Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); } - [Fact] - public void Should_specify_requests_matching_given_cookies() - { - // given - var spec = Request.Create().UsingAnyVerb().WithCookie("session", "a*"); - - // when - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, null, null, null, null, new Dictionary { { "session", "abc" } }); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } + [Fact] public void Should_specify_requests_matching_given_body() @@ -191,192 +92,7 @@ namespace WireMock.Net.Tests Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); } - [Fact] - public void Should_specify_requests_matching_given_body_using_ExactMatcher_true() - { - // given - var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new ExactMatcher("cat")); - - // when - string bodyAsString = "cat"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_ExactMatcher_multiplePatterns() - { - // given - var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new ExactMatcher("cat", "dog")); - - // when - string bodyAsString = "cat"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(0.5); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_ExactMatcher_false() - { - // given - var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new ExactMatcher("cat")); - - // when - string bodyAsString = "caR"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsStrictlyLessThan(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_SimMetricsMatcher1() - { - // given - var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new SimMetricsMatcher("The cat walks in the street.")); - - // when - string bodyAsString = "The car drives in the street."; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsStrictlyLessThan(1.0).And.IsStrictlyGreaterThan(0.5); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_SimMetricsMatcher2() - { - // given - var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new SimMetricsMatcher("The cat walks in the street.")); - - // when - string bodyAsString = "Hello"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsStrictlyLessThan(0.1).And.IsStrictlyGreaterThan(0.05); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_WildcardMatcher() - { - // given - var spec = Request.Create().WithPath("/foo").UsingAnyVerb().WithBody(new WildcardMatcher("H*o*")); - - // when - string bodyAsString = "Hello world!"; - 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[] { "tatata" } } }); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_RegexMatcher() - { - // given - var spec = Request.Create().UsingAnyVerb().WithBody(new RegexMatcher("H.*o")); - - // when - string bodyAsString = "Hello world!"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", 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_body_using_XPathMatcher_true() - { - // given - var spec = Request.Create().UsingAnyVerb().WithBody(new XPathMatcher("/todo-list[count(todo-item) = 3]")); - - // when - string xmlBodyAsString = @" - - abc - def - xyz - "; - byte[] body = Encoding.UTF8.GetBytes(xmlBodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, xmlBodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_XPathMatcher_false() - { - // given - var spec = Request.Create().UsingAnyVerb().WithBody(new XPathMatcher("/todo-list[count(todo-item) = 99]")); - - // when - string xmlBodyAsString = @" - - abc - def - xyz - "; - byte[] body = Encoding.UTF8.GetBytes(xmlBodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, xmlBodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); - } - - [Fact] - public void Should_specify_requests_matching_given_body_using_JsonPathMatcher_true() - { - // given - var spec = Request.Create().UsingAnyVerb().WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]")); - - // when - string bodyAsString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"Wiremock\" } ] }"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", 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_body_using_JsonPathMatcher_false() - { - // given - var spec = Request.Create().UsingAnyVerb().WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]")); - - // when - string bodyAsString = "{ \"things\": { \"name\": \"Wiremock\" } }"; - byte[] body = Encoding.UTF8.GetBytes(bodyAsString); - var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, bodyAsString, Encoding.UTF8); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); - } - + [Fact] public void Should_exclude_requests_not_matching_given_body() { diff --git a/test/WireMock.Net.Tests/RequestWithBodyTests.cs b/test/WireMock.Net.Tests/RequestWithBodyTests.cs new file mode 100644 index 00000000..6942e6b5 --- /dev/null +++ b/test/WireMock.Net.Tests/RequestWithBodyTests.cs @@ -0,0 +1,202 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NFluent; +using WireMock.Matchers; +using WireMock.Matchers.Request; +using WireMock.RequestBuilders; +using Xunit; + +namespace WireMock.Net.Tests +{ + public class RequestWithBodyTests + { + private const string ClientIp = "::1"; + + [Fact] + public void Request_WithBodyExactMatcher() + { + // given + var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new ExactMatcher("cat")); + + // when + string bodyAsString = "cat"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithBodyExactMatcher_multiplePatterns() + { + // given + var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new ExactMatcher("cat", "dog")); + + // when + string bodyAsString = "cat"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsEqualTo(0.5); + } + + [Fact] + public void Request_WithBodyExactMatcher_false() + { + // given + var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new ExactMatcher("cat")); + + // when + string bodyAsString = "caR"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsStrictlyLessThan(1.0); + } + + [Fact] + public void Request_WithBodySimMetricsMatcher1() + { + // given + var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new SimMetricsMatcher("The cat walks in the street.")); + + // when + string bodyAsString = "The car drives in the street."; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsStrictlyLessThan(1.0).And.IsStrictlyGreaterThan(0.5); + } + + [Fact] + public void Request_WithBodySimMetricsMatcher2() + { + // given + var requestBuilder = Request.Create().UsingAnyVerb().WithBody(new SimMetricsMatcher("The cat walks in the street.")); + + // when + string bodyAsString = "Hello"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "POST", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(requestBuilder.GetMatchingScore(request, requestMatchResult)).IsStrictlyLessThan(0.1).And.IsStrictlyGreaterThan(0.05); + } + + [Fact] + public void Request_WithBodyWildcardMatcher() + { + // given + var spec = Request.Create().WithPath("/foo").UsingAnyVerb().WithBody(new WildcardMatcher("H*o*")); + + // when + string bodyAsString = "Hello world!"; + 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[] { "tatata" } } }); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithBodyRegexMatcher() + { + // given + var spec = Request.Create().UsingAnyVerb().WithBody(new RegexMatcher("H.*o")); + + // when + string bodyAsString = "Hello world!"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithBodyXPathMatcher_true() + { + // given + var spec = Request.Create().UsingAnyVerb().WithBody(new XPathMatcher("/todo-list[count(todo-item) = 3]")); + + // when + string xmlBodyAsString = @" + + abc + def + xyz + "; + byte[] body = Encoding.UTF8.GetBytes(xmlBodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, xmlBodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithBodyXPathMatcher_false() + { + // given + var spec = Request.Create().UsingAnyVerb().WithBody(new XPathMatcher("/todo-list[count(todo-item) = 99]")); + + // when + string xmlBodyAsString = @" + + abc + def + xyz + "; + byte[] body = Encoding.UTF8.GetBytes(xmlBodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, xmlBodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); + } + + [Fact] + public void Request_WithBodyJsonPathMatcher_true() + { + // given + var spec = Request.Create().UsingAnyVerb().WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]")); + + // when + string bodyAsString = "{ \"things\": [ { \"name\": \"RequiredThing\" }, { \"name\": \"Wiremock\" } ] }"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, bodyAsString, Encoding.UTF8); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithBodyJsonPathMatcher_false() + { + // given + var spec = Request.Create().UsingAnyVerb().WithBody(new JsonPathMatcher("$.things[?(@.name == 'RequiredThing')]")); + + // when + string bodyAsString = "{ \"things\": { \"name\": \"Wiremock\" } }"; + byte[] body = Encoding.UTF8.GetBytes(bodyAsString); + var request = new RequestMessage(new Uri("http://localhost/foo"), "PUT", ClientIp, body, bodyAsString, Encoding.UTF8); + + // 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.ClientIP.cs b/test/WireMock.Net.Tests/RequestWithClientIPTests.cs similarity index 91% rename from test/WireMock.Net.Tests/RequestTests.ClientIP.cs rename to test/WireMock.Net.Tests/RequestWithClientIPTests.cs index 397311fb..3381491f 100644 --- a/test/WireMock.Net.Tests/RequestTests.ClientIP.cs +++ b/test/WireMock.Net.Tests/RequestWithClientIPTests.cs @@ -1,40 +1,39 @@ -using System; -using NFluent; -using WireMock.Matchers.Request; -using WireMock.RequestBuilders; -using Xunit; - -namespace WireMock.Net.Tests -{ - //[TestFixture] - public partial class RequestTests - { - [Fact] - public void Request_WithClientIP_Match_Ok() - { - // given - var spec = Request.Create().WithClientIP("127.0.0.2", "1.1.1.1"); - - // when - var request = new RequestMessage(new Uri("http://localhost"), "GET", "127.0.0.2"); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); - } - - [Fact] - public void Request_WithClientIP_Match_Fail() - { - // given - var spec = Request.Create().WithClientIP("127.0.0.2"); - - // when - var request = new RequestMessage(new Uri("http://localhost"), "GET", "192.1.1.1"); - - // then - var requestMatchResult = new RequestMatchResult(); - Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(0.0); - } - } +using System; +using NFluent; +using WireMock.Matchers.Request; +using WireMock.RequestBuilders; +using Xunit; + +namespace WireMock.Net.Tests +{ + public class RequestWithClientIPTests + { + [Fact] + public void Request_WithClientIP_Match_Ok() + { + // given + var spec = Request.Create().WithClientIP("127.0.0.2", "1.1.1.1"); + + // when + var request = new RequestMessage(new Uri("http://localhost"), "GET", "127.0.0.2"); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithClientIP_Match_Fail() + { + // given + var spec = Request.Create().WithClientIP("127.0.0.2"); + + // when + var request = new RequestMessage(new Uri("http://localhost"), "GET", "192.1.1.1"); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(0.0); + } + } } \ No newline at end of file diff --git a/test/WireMock.Net.Tests/RequestTests.PathAndMethod.cs b/test/WireMock.Net.Tests/RequestWithPathTests.cs similarity index 53% rename from test/WireMock.Net.Tests/RequestTests.PathAndMethod.cs rename to test/WireMock.Net.Tests/RequestWithPathTests.cs index 5b4e8170..6c89b09f 100644 --- a/test/WireMock.Net.Tests/RequestTests.PathAndMethod.cs +++ b/test/WireMock.Net.Tests/RequestWithPathTests.cs @@ -1,15 +1,103 @@ using System; +using System.Collections.Generic; using System.Text; using NFluent; +using WireMock.Matchers; using Xunit; using WireMock.RequestBuilders; using WireMock.Matchers.Request; namespace WireMock.Net.Tests { - //[TestFixture] - public partial class RequestTests + public class RequestWithPathTests { + private const string ClientIp = "::1"; + + [Fact] + public void Request_WithPath_WithHeader_Match() + { + // given + var spec = Request.Create().WithPath("/foo").UsingAnyVerb().WithHeader("X-toto", "tata"); + + // 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" } } }); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithPath() + { + // given + var spec = Request.Create().WithPath("/foo"); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "blabla", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithPaths() + { + var requestBuilder = Request.Create().WithPath("/x1", "/x2"); + + var request1 = new RequestMessage(new Uri("http://localhost/x1"), "blabla", ClientIp); + var request2 = new RequestMessage(new Uri("http://localhost/x2"), "blabla", ClientIp); + + var requestMatchResult = new RequestMatchResult(); + Check.That(requestBuilder.GetMatchingScore(request1, requestMatchResult)).IsEqualTo(1.0); + Check.That(requestBuilder.GetMatchingScore(request2, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithPathFunc() + { + // given + var spec = Request.Create().WithPath(url => url.EndsWith("/foo")); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo"), "blabla", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithPathRegexMatcher() + { + // given + var spec = Request.Create().WithPath(new RegexMatcher("^/foo")); + + // when + var request = new RequestMessage(new Uri("http://localhost/foo/bar"), "blabla", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsEqualTo(1.0); + } + + [Fact] + public void Request_WithPathRegex_false() + { + // given + var spec = Request.Create().WithPath("/foo"); + + // when + var request = new RequestMessage(new Uri("http://localhost/bar"), "blabla", ClientIp); + + // then + var requestMatchResult = new RequestMatchResult(); + Check.That(spec.GetMatchingScore(request, requestMatchResult)).IsNotEqualTo(1.0); + } + [Fact] public void Should_specify_requests_matching_given_path_and_method_delete() { diff --git a/test/WireMock.Net.Tests/RequestTests.Url.cs b/test/WireMock.Net.Tests/RequestWithUrlTests.cs similarity index 84% rename from test/WireMock.Net.Tests/RequestTests.Url.cs rename to test/WireMock.Net.Tests/RequestWithUrlTests.cs index ccea4f00..054fe3c3 100644 --- a/test/WireMock.Net.Tests/RequestTests.Url.cs +++ b/test/WireMock.Net.Tests/RequestWithUrlTests.cs @@ -6,10 +6,12 @@ using Xunit; namespace WireMock.Net.Tests { - public partial class RequestTests + public class RequestWithUrlTests { + private const string ClientIp = "::1"; + [Fact] - public void Should_specify_requests_matching_given_url_wildcard() + public void Request_WithUrl() { // given var spec = Request.Create().WithUrl("*/foo"); @@ -23,7 +25,7 @@ namespace WireMock.Net.Tests } [Fact] - public void Should_specify_requests_matching_given_url_exact() + public void Request_WithUrlExact() { // given var spec = Request.Create().WithUrl("http://localhost/foo"); diff --git a/test/WireMock.Net.Tests/ResponseTests.Handlebars.cs b/test/WireMock.Net.Tests/ResponseWithBodyHandlebarsTests.cs similarity index 97% rename from test/WireMock.Net.Tests/ResponseTests.Handlebars.cs rename to test/WireMock.Net.Tests/ResponseWithBodyHandlebarsTests.cs index daf793b8..0e987c5c 100644 --- a/test/WireMock.Net.Tests/ResponseTests.Handlebars.cs +++ b/test/WireMock.Net.Tests/ResponseWithBodyHandlebarsTests.cs @@ -8,8 +8,10 @@ using Xunit; namespace WireMock.Net.Tests { - public partial class ResponseTests + public class ResponseWithBodyHandlebarsTests { + private const string ClientIp = "::1"; + [Fact] public async Task Response_ProvideResponse_Handlebars_UrlPathVerb() { diff --git a/test/WireMock.Net.Tests/ResponseTests.cs b/test/WireMock.Net.Tests/ResponseWithBodyTests.cs similarity index 98% rename from test/WireMock.Net.Tests/ResponseTests.cs rename to test/WireMock.Net.Tests/ResponseWithBodyTests.cs index acf05d75..78a3d95f 100644 --- a/test/WireMock.Net.Tests/ResponseTests.cs +++ b/test/WireMock.Net.Tests/ResponseWithBodyTests.cs @@ -7,7 +7,7 @@ using Xunit; namespace WireMock.Net.Tests { - public partial class ResponseTests + public class ResponseWithBodyTests { private const string ClientIp = "::1";