Skip to content

Commit

Permalink
Merge pull request #137 from Blackbaud-KrisMahon/serializer-settings-…
Browse files Browse the repository at this point in the history
…not-global

Isolate the json serializer settings per PactBuilder object
  • Loading branch information
neilcampbell authored Feb 25, 2018
2 parents 96c7473 + d870fc4 commit 385b55b
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 385b55b

Please sign in to comment.