Skip to content

Commit

Permalink
Merge pull request #123 from waelemara/master
Browse files Browse the repository at this point in the history
Add an option where the consumer of the library can set the host
  • Loading branch information
neilcampbell authored Nov 9, 2017
2 parents 17599fe + 28cd469 commit e883aab
Show file tree
Hide file tree
Showing 10 changed files with 86 additions and 48 deletions.
34 changes: 28 additions & 6 deletions PactNet.Tests/Core/MockProviderHostConfigTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ namespace PactNet.Tests.Core
{
public class MockProviderHostConfigTests
{
private IPactCoreHostConfig GetSubject(int port = 2322, bool enableSsl = false, string consumerName = "My Test Consumer", string providerName = "My Test Provider", PactConfig pactConfig = null)
private IPactCoreHostConfig GetSubject(int port = 2322, bool enableSsl = false, string consumerName = "My Test Consumer", string providerName = "My Test Provider", PactConfig pactConfig = null, string host = "")
{
return new MockProviderHostConfig(port, enableSsl, consumerName, providerName, pactConfig ?? new PactConfig());
return new MockProviderHostConfig(port, enableSsl, consumerName, providerName, pactConfig ?? new PactConfig(), host);
}

[Fact]
Expand Down Expand Up @@ -54,6 +54,25 @@ public void Ctor_WhenCalledWithSsl_SetsTheCorrectArgs()
Assert.Equal(expectedArguments, config.Arguments);
}

[Fact]
public void Ctor_WhenCalledWithHost_SetsTheCorrectArgs()
{
var port = 9332;
var pactConfig = new PactConfig();
var consumerName = "Cons";
var providerName = "The best one";
var enableSsl = true;
var host = "0.0.0.0";

var config = GetSubject(port, enableSsl, consumerName, providerName, pactConfig, host);

var expectedLogFilePath = BuildExpectedLogFilePath(pactConfig.LogDir, providerName);
var expectedPactDir = BuildExpectedPactDir(pactConfig.PactDir);
var expectedArguments = BuildExpectedArguments(port, expectedLogFilePath, expectedPactDir, pactConfig.SpecificationVersion, consumerName, providerName, enableSsl, host);

Assert.Equal(expectedArguments, config.Arguments);
}

[Fact]
public void Ctor_WhenCalledWithNonDefaultLogDirectory_SetsTheCorrectArgs()
{
Expand Down Expand Up @@ -111,17 +130,20 @@ private string BuildExpectedPactDir(string pactDir)
}

private string BuildExpectedArguments(
int port,
string logFilePath,
int port,
string logFilePath,
string pactFileDir,
string pactSpecificationVersion,
string consumerName,
string providerName,
bool enableSsl = false)
bool enableSsl = false,
string host = "")
{

var sslOption = enableSsl ? " --ssl" : "";
return $"-p {port} -l \"{logFilePath}\" --pact-dir \"{pactFileDir}\" --pact-specification-version \"{pactSpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}";
var hostOption = !string.IsNullOrWhiteSpace(host) ? $" --host={host}" : "";

return $"-p {port} -l \"{logFilePath}\" --pact-dir \"{pactFileDir}\" --pact-specification-version \"{pactSpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}{hostOption}";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ public FailureIntegrationTestsMyApiPact()
{
var pactConfig = new PactConfig();

PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
new MockProviderService(
baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig),
port, enableSsl,
baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig),
port, enableSsl,
baseUri => new AdminHttpClient(baseUri)))
.ServiceConsumer("FailureIntegrationTests")
.HasPactWith("MyApi");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public IntegrationTestsMyApiPact()
{
var pactConfig = new PactConfig();

PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
new MockProviderService(
baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig),
port, enableSsl,
Expand Down
17 changes: 13 additions & 4 deletions PactNet.Tests/Mocks/MockHttpService/MockProviderServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class MockProviderServiceTests
private FakeHttpMessageHandler _fakeHttpMessageHandler;
private int _mockHttpHostFactoryCallCount;

private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false)
private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false, string host = "")
{
_mockHttpHost = Substitute.For<IHttpHost>();
_fakeHttpMessageHandler = new FakeHttpMessageHandler();
Expand All @@ -33,7 +33,8 @@ private IMockProviderService GetSubject(int port = 1234, bool enableSsl = false)
},
port,
enableSsl,
baseUri => new AdminHttpClient(baseUri, _fakeHttpMessageHandler));
baseUri => new AdminHttpClient(baseUri, _fakeHttpMessageHandler),
host);
}

[Fact]
Expand All @@ -51,15 +52,23 @@ public void Ctor_WhenCalledWithEnableSslFalse_SetsBaseUriWithHttpScheme()
{
var mockService = GetSubject(enableSsl: false);

Assert.True(((MockProviderService)mockService).BaseUri.Scheme.ToUpperInvariant().Equals("HTTP"), "BaseUri has a http scheme");
Assert.True(((MockProviderService)mockService).BaseUri.Scheme.Equals("HTTP", StringComparison.OrdinalIgnoreCase), "BaseUri has a http scheme");
}

[Fact]
public void Ctor_WhenCalledWithEnableSslTrue_SetsBaseUriWithHttpsScheme()
{
var mockService = GetSubject(enableSsl: true);

Assert.True(((MockProviderService)mockService).BaseUri.Scheme.ToUpperInvariant().Equals("HTTPS"), "BaseUri has a https scheme");
Assert.True(((MockProviderService)mockService).BaseUri.Scheme.Equals("HTTPS", StringComparison.OrdinalIgnoreCase), "BaseUri has a https scheme");
}

[Fact]
public void Ctor_WhenCalledWithHost_UsesTheHostInsteadOfLocalhost()
{
var mockService = GetSubject(host: "0.0.0.0");

Assert.True(((MockProviderService)mockService).BaseUri.Host.Equals("0.0.0.0"), "BaseUri has a 0.0.0.0 as a host");
}

[Fact]
Expand Down
22 changes: 11 additions & 11 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) => mockMockProviderService);
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => 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) => mockMockProviderService);
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => 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) =>
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
{
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) =>
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
{
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) =>
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
{
calledWithSslEnabled = enableSsl;
return mockMockProviderService;
Expand All @@ -174,7 +174,7 @@ public void MockService_WhenCalledWithJsonSerializerSettings_SetsTheGlobalApiSer
var serializerSettings = new JsonSerializerSettings();
var mockMockProviderService = Substitute.For<IMockProviderService>();

IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) => mockMockProviderService);
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService);

pactBuilder
.ServiceConsumer("Event Client")
Expand All @@ -197,7 +197,7 @@ public void MockService_WhenCalledWithNoJsonSerializerSettings_DoesNotSetTheGlob
{
var mockMockProviderService = Substitute.For<IMockProviderService>();

IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) => mockMockProviderService);
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService);

pactBuilder
.ServiceConsumer("Event Client")
Expand All @@ -211,7 +211,7 @@ public void MockService_WhenCalledWithNoJsonSerializerSettings_DoesNotSetTheGlob
[Fact]
public void MockService_WhenCalledWithoutConsumerNameSet_ThrowsInvalidOperationException()
{
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName) => Substitute.For<IMockProviderService>());
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host) => Substitute.For<IMockProviderService>());
pactBuilder
.HasPactWith("Event API");

Expand All @@ -221,7 +221,7 @@ public void MockService_WhenCalledWithoutConsumerNameSet_ThrowsInvalidOperationE
[Fact]
public void MockService_WhenCalledWithoutProviderNameSet_ThrowsInvalidOperationException()
{
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName) => Substitute.For<IMockProviderService>());
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, hsot) => Substitute.For<IMockProviderService>());
pactBuilder
.ServiceConsumer("Event Client");

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

IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName) => mockProviderService);
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host) => mockProviderService);
pactBuilder
.ServiceConsumer(testConsumerName)
.HasPactWith(testProviderName);
Expand All @@ -260,7 +260,7 @@ public void Build_WhenCalledWithAnInitialisedMockProviderService_StopIsCalledOnT
{
var mockMockProviderService = Substitute.For<IMockProviderService>();

IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) => mockMockProviderService)
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService)
.ServiceConsumer("Event Client")
.HasPactWith("Event API");

Expand Down
5 changes: 3 additions & 2 deletions PactNet/Core/MockProviderHostConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,14 @@ internal class MockProviderHostConfig : IPactCoreHostConfig
public bool WaitForExit { get; }
public IEnumerable<IOutput> Outputters { get; }

public MockProviderHostConfig(int port, bool enableSsl, string consumerName, string providerName, PactConfig config)
public MockProviderHostConfig(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, string host = "")
{
var logFile = $"{config.LogDir}{providerName.ToLowerSnakeCase()}_mock_service.log";
var sslOption = enableSsl ? " --ssl" : "";
var hostOption = string.IsNullOrWhiteSpace(host) ? "" : $" --host={host}";

Script = "pact-mock-service";
Arguments = $"-p {port} -l \"{FixPathForRuby(logFile)}\" --pact-dir \"{FixPathForRuby(config.PactDir)}\" --pact-specification-version \"{config.SpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}";
Arguments = $"-p {port} -l \"{FixPathForRuby(logFile)}\" --pact-dir \"{FixPathForRuby(config.PactDir)}\" --pact-specification-version \"{config.SpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}{hostOption}";
WaitForExit = false;
Outputters = config?.Outputters;
}
Expand Down
4 changes: 2 additions & 2 deletions PactNet/IPactBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ public interface IPactBuilder
{
IPactBuilder ServiceConsumer(string consumerName);
IPactBuilder HasPactWith(string providerName);
IMockProviderService MockService(int port, bool enableSsl = false);
IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false);
IMockProviderService MockService(int port, bool enableSsl = false, string host = "");
IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, string host = "");
void Build();
}
}
14 changes: 8 additions & 6 deletions PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,21 @@ internal class RubyHttpHost : IHttpHost
private readonly AdminHttpClient _adminHttpClient;

internal RubyHttpHost(
IPactCoreHost coreHost,
IPactCoreHost coreHost,
AdminHttpClient adminHttpClient)
{
_coreHost = coreHost;
_adminHttpClient = adminHttpClient;
}

public RubyHttpHost(Uri baseUri, string consumerName, string providerName, PactConfig config) :
public RubyHttpHost(Uri baseUri, string consumerName, string providerName, PactConfig config) :
this(new PactCoreHost<MockProviderHostConfig>(
new MockProviderHostConfig(baseUri.Port,
baseUri.Scheme.ToUpperInvariant().Equals("HTTPS"),
new MockProviderHostConfig(baseUri.Port,
baseUri.Scheme.Equals("HTTPS", StringComparison.OrdinalIgnoreCase),
consumerName,
providerName, config)),
providerName,
config,
baseUri.Host)),
new AdminHttpClient(baseUri))
{
}
Expand All @@ -35,7 +37,7 @@ private Tuple<bool, Exception> IsMockProviderServiceRunning()
_adminHttpClient.SendAdminHttpRequest(HttpVerb.Get, "/");
return new Tuple<bool, Exception>(true, null);
}
catch(Exception ex)
catch (Exception ex)
{
return new Tuple<bool, Exception>(false, ex);
}
Expand Down
13 changes: 8 additions & 5 deletions PactNet/Mocks/MockHttpService/MockProviderService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,22 @@ internal MockProviderService(
Func<Uri, IHttpHost> hostFactory,
int port,
bool enableSsl,
Func<Uri, AdminHttpClient> adminHttpClientFactory)
Func<Uri, AdminHttpClient> adminHttpClientFactory,
string host = "")
{
_hostFactory = hostFactory;
BaseUri = new Uri($"{(enableSsl ? "https" : "http")}://localhost:{port}");
BaseUri = new Uri(
$"{(enableSsl ? "https" : "http")}://{(IsNullOrWhiteSpace(host) ? "localhost" : host)}:{port}");
_adminHttpClient = adminHttpClientFactory(BaseUri);
}

public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config)
public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config, string host = "")
: this(
baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config),
port,
enableSsl,
baseUri => new AdminHttpClient(baseUri))
baseUri => new AdminHttpClient(baseUri),
host)
{
}

Expand Down Expand Up @@ -81,7 +84,7 @@ public IMockProviderService With(ProviderServiceRequest request)
}

_request = request;

return this;
}

Expand Down
Loading

0 comments on commit e883aab

Please sign in to comment.