Skip to content

Commit

Permalink
Isolate the json serializer settings per PactBuilder object instead o…
Browse files Browse the repository at this point in the history
…f using global settings.

This allows us to use multiple PactBuilder objects with different serialization settings for mocking multiple services at the same time.
  • Loading branch information
Blackbaud-KrisMahon committed Feb 20, 2018
1 parent 96c7473 commit d870fc4
Show file tree
Hide file tree
Showing 8 changed files with 52 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down
4 changes: 2 additions & 2 deletions PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ private IHttpHost GetSubject(Func<HttpResponseMessage> aliveCheckResponseFactory

return new RubyHttpHost(
_mockCoreHost,
new AdminHttpClient(baseUri, _fakeHttpMessageHandler));
new AdminHttpClient(baseUri, _fakeHttpMessageHandler, null));
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
47 changes: 25 additions & 22 deletions PactNet.Tests/PactBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void MockService_WhenCalled_StartIsCalledAndMockProviderServiceIsReturned
{
var mockMockProviderService = Substitute.For<IMockProviderService>();

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")
Expand All @@ -92,7 +92,7 @@ public void MockService_WhenCalledTwice_StopIsCalledTheSecondTime()
{
var mockMockProviderService = Substitute.For<IMockProviderService>();

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")
Expand All @@ -111,7 +111,7 @@ public void MockService_WhenCalled_MockProviderServiceFactoryIsInvokedWithSslNot
var calledWithSslEnabled = false;
var mockMockProviderService = Substitute.For<IMockProviderService>();

IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) =>
{
calledWithSslEnabled = enableSsl;
return mockMockProviderService;
Expand All @@ -132,7 +132,7 @@ public void MockService_WhenCalledWithEnableSslFalse_MockProviderServiceFactoryI
var calledWithSslEnabled = false;
var mockMockProviderService = Substitute.For<IMockProviderService>();

IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) =>
{
calledWithSslEnabled = enableSsl;
return mockMockProviderService;
Expand All @@ -153,7 +153,7 @@ public void MockService_WhenCalledWithEnableSslTrue_MockProviderServiceFactoryIs
var calledWithSslEnabled = false;
var mockMockProviderService = Substitute.For<IMockProviderService>();

IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host, jsonSerializerSettings) =>
{
calledWithSslEnabled = enableSsl;
return mockMockProviderService;
Expand All @@ -169,49 +169,52 @@ 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<IMockProviderService>();

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")
.HasPactWith("Event API");

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

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")
.HasPactWith("Event API");

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<IMockProviderService>());
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host, jsonSerializerSettings) => Substitute.For<IMockProviderService>());
pactBuilder
.HasPactWith("Event API");

Expand All @@ -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<IMockProviderService>());
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host, jsonSerializerSettings) => Substitute.For<IMockProviderService>());
pactBuilder
.ServiceConsumer("Event Client");

Expand All @@ -243,7 +246,7 @@ public void Build_WhenCalledWithTheMockProviderServiceInitialised_CallsSendAdmin
const string testProviderName = "Event API";
var mockProviderService = Substitute.For<IMockProviderService>();

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);
Expand All @@ -260,7 +263,7 @@ public void Build_WhenCalledWithAnInitialisedMockProviderService_StopIsCalledOnT
{
var mockMockProviderService = Substitute.For<IMockProviderService>();

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

Expand Down
14 changes: 11 additions & 3 deletions PactNet/Mocks/MockHttpService/AdminHttpClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}

Expand All @@ -52,7 +60,7 @@ public void SendAdminHttpRequest<T>(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");
}

Expand Down
7 changes: 6 additions & 1 deletion PactNet/Mocks/MockHttpService/MockProviderService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
{
}

Expand Down
14 changes: 4 additions & 10 deletions PactNet/PactBuilder.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -11,11 +10,11 @@ public class PactBuilder : IPactBuilder
{
public string ConsumerName { get; private set; }
public string ProviderName { get; private set; }
private readonly Func<int, bool, string, string, IPAddress, IMockProviderService> _mockProviderServiceFactory;
private readonly Func<int, bool, string, string, IPAddress, JsonSerializerSettings, IMockProviderService> _mockProviderServiceFactory;

private IMockProviderService _mockProviderService;

internal PactBuilder(Func<int, bool, string, string, IPAddress, IMockProviderService> mockProviderServiceFactory)
internal PactBuilder(Func<int, bool, string, string, IPAddress, JsonSerializerSettings, IMockProviderService> mockProviderServiceFactory)
{
_mockProviderServiceFactory = mockProviderServiceFactory;
}
Expand All @@ -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))
{
}

Expand Down Expand Up @@ -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();

Expand Down

0 comments on commit d870fc4

Please sign in to comment.