From d870fc4b518336cd7b5e03d4ea7f00286354ce61 Mon Sep 17 00:00:00 2001 From: Kris Mahon Date: Tue, 20 Feb 2018 15:06:07 -0500 Subject: [PATCH] Isolate the json serializer settings per PactBuilder object instead of using global settings. This allows us to use multiple PactBuilder objects with different serialization settings for mocking multiple services at the same time. --- .../FailureIntegrationTestsMyApiPact.cs | 4 +- .../IntegrationTestsMyApiPact.cs | 4 +- .../MockHttpService/Host/RubyHttpHostTests.cs | 2 +- .../MockProviderServiceTests.cs | 2 +- PactNet.Tests/PactBuilderTests.cs | 47 ++++++++++--------- .../Mocks/MockHttpService/AdminHttpClient.cs | 14 ++++-- .../MockHttpService/MockProviderService.cs | 7 ++- PactNet/PactBuilder.cs | 14 ++---- 8 files changed, 52 insertions(+), 42 deletions(-) diff --git a/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs b/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs index d6813112..5d6e449c 100644 --- a/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs +++ b/PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs @@ -16,11 +16,11 @@ public FailureIntegrationTestsMyApiPact() { var pactConfig = new PactConfig(); - PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => new MockProviderService( baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig, host), port, enableSsl, - baseUri => new AdminHttpClient(baseUri))) + baseUri => new AdminHttpClient(baseUri, jsonSerializerSettings))) .ServiceConsumer("FailureIntegrationTests") .HasPactWith("MyApi"); diff --git a/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs b/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs index 16100fb0..d8c938ee 100644 --- a/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs +++ b/PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs @@ -16,11 +16,11 @@ public IntegrationTestsMyApiPact() { var pactConfig = new PactConfig(); - PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => new MockProviderService( baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig, host), port, enableSsl, - baseUri => new AdminHttpClient(baseUri))) + baseUri => new AdminHttpClient(baseUri, jsonSerializerSettings))) .ServiceConsumer("IntegrationTests") .HasPactWith("MyApi"); diff --git a/PactNet.Tests/Mocks/MockHttpService/Host/RubyHttpHostTests.cs b/PactNet.Tests/Mocks/MockHttpService/Host/RubyHttpHostTests.cs index d3924ef1..8bbc1330 100644 --- a/PactNet.Tests/Mocks/MockHttpService/Host/RubyHttpHostTests.cs +++ b/PactNet.Tests/Mocks/MockHttpService/Host/RubyHttpHostTests.cs @@ -27,7 +27,7 @@ private IHttpHost GetSubject(Func aliveCheckResponseFactory return new RubyHttpHost( _mockCoreHost, - new AdminHttpClient(baseUri, _fakeHttpMessageHandler)); + new AdminHttpClient(baseUri, _fakeHttpMessageHandler, null)); } [Fact] diff --git a/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs b/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs index e8da23a4..89a5c252 100644 --- a/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs +++ b/PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs @@ -32,7 +32,7 @@ private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false) }, port, enableSsl, - baseUri => new AdminHttpClient(baseUri, _fakeHttpMessageHandler)); + baseUri => new AdminHttpClient(baseUri, _fakeHttpMessageHandler, null)); } [Fact] diff --git a/PactNet.Tests/PactBuilderTests.cs b/PactNet.Tests/PactBuilderTests.cs index 60a4bd43..3c7bd158 100644 --- a/PactNet.Tests/PactBuilderTests.cs +++ b/PactNet.Tests/PactBuilderTests.cs @@ -75,7 +75,7 @@ public void MockService_WhenCalled_StartIsCalledAndMockProviderServiceIsReturned { var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService); + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => mockMockProviderService); pactBuilder .ServiceConsumer("Event Client") @@ -92,7 +92,7 @@ public void MockService_WhenCalledTwice_StopIsCalledTheSecondTime() { var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService); + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => mockMockProviderService); pactBuilder .ServiceConsumer("Event Client") @@ -111,7 +111,7 @@ public void MockService_WhenCalled_MockProviderServiceFactoryIsInvokedWithSslNot var calledWithSslEnabled = false; var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => { calledWithSslEnabled = enableSsl; return mockMockProviderService; @@ -132,7 +132,7 @@ public void MockService_WhenCalledWithEnableSslFalse_MockProviderServiceFactoryI var calledWithSslEnabled = false; var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => { calledWithSslEnabled = enableSsl; return mockMockProviderService; @@ -153,7 +153,7 @@ public void MockService_WhenCalledWithEnableSslTrue_MockProviderServiceFactoryIs var calledWithSslEnabled = false; var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => { calledWithSslEnabled = enableSsl; return mockMockProviderService; @@ -169,12 +169,17 @@ public void MockService_WhenCalledWithEnableSslTrue_MockProviderServiceFactoryIs } [Fact] - public void MockService_WhenCalledWithJsonSerializerSettings_SetsTheGlobalApiSerializerSettings() + public void MockService_WhenCalledWithJsonSerializerSettings_MockProviderServiceFactoryIsInvokedWithJsonSerializerSettings() { + JsonSerializerSettings calledWithSerializerSettings = null; var serializerSettings = new JsonSerializerSettings(); var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService); + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => + { + calledWithSerializerSettings = jsonSerializerSettings; + return mockMockProviderService; + }); pactBuilder .ServiceConsumer("Event Client") @@ -182,22 +187,20 @@ public void MockService_WhenCalledWithJsonSerializerSettings_SetsTheGlobalApiSer pactBuilder.MockService(1234, serializerSettings); - Assert.Equal(serializerSettings, JsonConfig.ApiSerializerSettings); - - //Reset the settings - JsonConfig.ApiSerializerSettings = new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - Formatting = Formatting.None - }; + Assert.Equal(serializerSettings, calledWithSerializerSettings); } [Fact] - public void MockService_WhenCalledWithNoJsonSerializerSettings_DoesNotSetTheGlobalApiSerializerSettingsToNull() + public void MockService_WhenCalledWithNoJsonSerializerSettings_MockProviderServiceFactoryIsInvokedWithNullJsonSerializerSettings() { + var calledWithSerializerSettings = new JsonSerializerSettings(); var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService); + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => + { + calledWithSerializerSettings = jsonSerializerSettings; + return mockMockProviderService; + }); pactBuilder .ServiceConsumer("Event Client") @@ -205,13 +208,13 @@ public void MockService_WhenCalledWithNoJsonSerializerSettings_DoesNotSetTheGlob pactBuilder.MockService(1234); - Assert.NotNull(JsonConfig.ApiSerializerSettings); + Assert.Null(calledWithSerializerSettings); } [Fact] public void MockService_WhenCalledWithoutConsumerNameSet_ThrowsInvalidOperationException() { - IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host) => Substitute.For()); + IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host, jsonSerializerSettings) => Substitute.For()); pactBuilder .HasPactWith("Event API"); @@ -221,7 +224,7 @@ public void MockService_WhenCalledWithoutConsumerNameSet_ThrowsInvalidOperationE [Fact] public void MockService_WhenCalledWithoutProviderNameSet_ThrowsInvalidOperationException() { - IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, hsot) => Substitute.For()); + IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host, jsonSerializerSettings) => Substitute.For()); pactBuilder .ServiceConsumer("Event Client"); @@ -243,7 +246,7 @@ public void Build_WhenCalledWithTheMockProviderServiceInitialised_CallsSendAdmin const string testProviderName = "Event API"; var mockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host) => mockProviderService); + IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host, jsonSerializerSettings) => mockProviderService); pactBuilder .ServiceConsumer(testConsumerName) .HasPactWith(testProviderName); @@ -260,7 +263,7 @@ public void Build_WhenCalledWithAnInitialisedMockProviderService_StopIsCalledOnT { var mockMockProviderService = Substitute.For(); - IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService) + IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => mockMockProviderService) .ServiceConsumer("Event Client") .HasPactWith("Event API"); diff --git a/PactNet/Mocks/MockHttpService/AdminHttpClient.cs b/PactNet/Mocks/MockHttpService/AdminHttpClient.cs index a9b2f26b..7c37b1bf 100644 --- a/PactNet/Mocks/MockHttpService/AdminHttpClient.cs +++ b/PactNet/Mocks/MockHttpService/AdminHttpClient.cs @@ -16,17 +16,25 @@ internal class AdminHttpClient { private readonly HttpClient _httpClient; private readonly IHttpMethodMapper _httpMethodMapper; + private readonly JsonSerializerSettings _jsonSerializerSettings; internal AdminHttpClient( Uri baseUri, - HttpMessageHandler handler) + HttpMessageHandler handler, + JsonSerializerSettings jsonSerializerSettings) { _httpClient = new HttpClient(handler) { BaseAddress = baseUri }; _httpMethodMapper = new HttpMethodMapper(); + _jsonSerializerSettings = jsonSerializerSettings ?? JsonConfig.ApiSerializerSettings; } public AdminHttpClient(Uri baseUri) : - this(baseUri, new HttpClientHandler()) + this(baseUri, new HttpClientHandler(), null) + { + } + + public AdminHttpClient(Uri baseUri, JsonSerializerSettings jsonSerializerSettings) : + this(baseUri, new HttpClientHandler(), jsonSerializerSettings) { } @@ -52,7 +60,7 @@ public void SendAdminHttpRequest(HttpVerb method, string path, T requestConte if (requestContent != null) { - var requestContentJson = JsonConvert.SerializeObject(requestContent, JsonConfig.ApiSerializerSettings); + var requestContentJson = JsonConvert.SerializeObject(requestContent, _jsonSerializerSettings); request.Content = new StringContent(requestContentJson, Encoding.UTF8, "application/json"); } diff --git a/PactNet/Mocks/MockHttpService/MockProviderService.cs b/PactNet/Mocks/MockHttpService/MockProviderService.cs index e558bc9d..9d5be510 100644 --- a/PactNet/Mocks/MockHttpService/MockProviderService.cs +++ b/PactNet/Mocks/MockHttpService/MockProviderService.cs @@ -33,11 +33,16 @@ internal MockProviderService( } public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, IPAddress ipAddress) + : this(port, enableSsl, consumerName, providerName, config, ipAddress, null) + { + } + + public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, IPAddress ipAddress, Newtonsoft.Json.JsonSerializerSettings jsonSerializerSettings) : this( baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config, ipAddress), port, enableSsl, - baseUri => new AdminHttpClient(baseUri)) + baseUri => new AdminHttpClient(baseUri, jsonSerializerSettings)) { } diff --git a/PactNet/PactBuilder.cs b/PactNet/PactBuilder.cs index c2bda743..7302bd08 100644 --- a/PactNet/PactBuilder.cs +++ b/PactNet/PactBuilder.cs @@ -1,6 +1,5 @@ using System; using Newtonsoft.Json; -using PactNet.Configuration.Json; using PactNet.Mocks.MockHttpService; using PactNet.Mocks.MockHttpService.Models; using PactNet.Models; @@ -11,11 +10,11 @@ public class PactBuilder : IPactBuilder { public string ConsumerName { get; private set; } public string ProviderName { get; private set; } - private readonly Func _mockProviderServiceFactory; + private readonly Func _mockProviderServiceFactory; private IMockProviderService _mockProviderService; - internal PactBuilder(Func mockProviderServiceFactory) + internal PactBuilder(Func mockProviderServiceFactory) { _mockProviderServiceFactory = mockProviderServiceFactory; } @@ -26,7 +25,7 @@ public PactBuilder() } public PactBuilder(PactConfig config) - : this((port, enableSsl, consumerName, providerName, host) => new MockProviderService(port, enableSsl, consumerName, providerName, config, host)) + : this((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) => new MockProviderService(port, enableSsl, consumerName, providerName, config, host, jsonSerializerSettings)) { } @@ -76,12 +75,7 @@ public IMockProviderService MockService(int port, JsonSerializerSettings jsonSer _mockProviderService.Stop(); } - if (jsonSerializerSettings != null) - { - JsonConfig.ApiSerializerSettings = jsonSerializerSettings; - } - - _mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, host); + _mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, host, jsonSerializerSettings); _mockProviderService.Start();