Skip to content

Commit

Permalink
Add an option where the consumer of the library can set the host
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnWinston329 committed Nov 8, 2017
1 parent 7bdeb6c commit 0226999
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 41 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
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();
}
}
12 changes: 6 additions & 6 deletions PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ 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, string host = "") :
this(new PactCoreHost<MockProviderHostConfig>(
new MockProviderHostConfig(baseUri.Port,
baseUri.Scheme.ToUpperInvariant().Equals("HTTPS"),
new MockProviderHostConfig(baseUri.Port,
baseUri.Scheme.ToUpperInvariant().Equals("HTTPS"),
consumerName,
providerName, config)),
providerName, config, host)),
new AdminHttpClient(baseUri))
{
}
Expand All @@ -35,7 +35,7 @@ internal class RubyHttpHost : IHttpHost
_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
4 changes: 2 additions & 2 deletions PactNet/Mocks/MockHttpService/MockProviderService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ public class MockProviderService : IMockProviderService
_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),
baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config,host),
port,
enableSsl,
baseUri => new AdminHttpClient(baseUri))
Expand Down
17 changes: 9 additions & 8 deletions PactNet/PactBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ public class PactBuilder : IPactBuilder
{
public string ConsumerName { get; private set; }
public string ProviderName { get; private set; }
private readonly Func<int, bool, string, string, IMockProviderService> _mockProviderServiceFactory;
private readonly Func<int, bool, string, string, string, IMockProviderService> _mockProviderServiceFactory;

private IMockProviderService _mockProviderService;

internal PactBuilder(Func<int, bool, string, string, IMockProviderService> mockProviderServiceFactory)
internal PactBuilder(Func<int, bool, string, string, string, IMockProviderService> mockProviderServiceFactory)
{
_mockProviderServiceFactory = mockProviderServiceFactory;
}
Expand All @@ -25,7 +26,7 @@ public PactBuilder()
}

public PactBuilder(PactConfig config)
: this((port, enableSsl, consumerName, providerName) => new MockProviderService(port, enableSsl, consumerName, providerName, config))
: this((port, enableSsl, consumerName, providerName, host) => new MockProviderService(port, enableSsl, consumerName, providerName, config, host))
{
}

Expand Down Expand Up @@ -53,12 +54,12 @@ public IPactBuilder HasPactWith(string providerName)
return this;
}

public IMockProviderService MockService(int port, bool enableSsl = false)
public IMockProviderService MockService(int port, bool enableSsl = false, string host = "")
{
return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl);
return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl, host: host);
}
public IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false)

public IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, string host = "")
{
if (String.IsNullOrEmpty(ConsumerName))
{
Expand All @@ -80,7 +81,7 @@ public IMockProviderService MockService(int port, JsonSerializerSettings jsonSer
JsonConfig.ApiSerializerSettings = jsonSerializerSettings;
}

_mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName);
_mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, host);

_mockProviderService.Start();

Expand Down

0 comments on commit 0226999

Please sign in to comment.