Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an option where the consumer of the library can set the host #123

Merged
merged 2 commits into from
Nov 9, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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