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();