Skip to content

Commit 0226999

Browse files
committedNov 8, 2017
Add an option where the consumer of the library can set the host
Fix for this issue pact-foundation/pact-mock_service#79
1 parent 7bdeb6c commit 0226999

9 files changed

+65
-41
lines changed
 

‎PactNet.Tests/Core/MockProviderHostConfigTests.cs

+28-6
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ namespace PactNet.Tests.Core
66
{
77
public class MockProviderHostConfigTests
88
{
9-
private IPactCoreHostConfig GetSubject(int port = 2322, bool enableSsl = false, string consumerName = "My Test Consumer", string providerName = "My Test Provider", PactConfig pactConfig = null)
9+
private IPactCoreHostConfig GetSubject(int port = 2322, bool enableSsl = false, string consumerName = "My Test Consumer", string providerName = "My Test Provider", PactConfig pactConfig = null, string host = "")
1010
{
11-
return new MockProviderHostConfig(port, enableSsl, consumerName, providerName, pactConfig ?? new PactConfig());
11+
return new MockProviderHostConfig(port, enableSsl, consumerName, providerName, pactConfig ?? new PactConfig(), host);
1212
}
1313

1414
[Fact]
@@ -54,6 +54,25 @@ public void Ctor_WhenCalledWithSsl_SetsTheCorrectArgs()
5454
Assert.Equal(expectedArguments, config.Arguments);
5555
}
5656

57+
[Fact]
58+
public void Ctor_WhenCalledWithHost_SetsTheCorrectArgs()
59+
{
60+
var port = 9332;
61+
var pactConfig = new PactConfig();
62+
var consumerName = "Cons";
63+
var providerName = "The best one";
64+
var enableSsl = true;
65+
var host = "0.0.0.0";
66+
67+
var config = GetSubject(port, enableSsl, consumerName, providerName, pactConfig, host);
68+
69+
var expectedLogFilePath = BuildExpectedLogFilePath(pactConfig.LogDir, providerName);
70+
var expectedPactDir = BuildExpectedPactDir(pactConfig.PactDir);
71+
var expectedArguments = BuildExpectedArguments(port, expectedLogFilePath, expectedPactDir, pactConfig.SpecificationVersion, consumerName, providerName, enableSsl, host);
72+
73+
Assert.Equal(expectedArguments, config.Arguments);
74+
}
75+
5776
[Fact]
5877
public void Ctor_WhenCalledWithNonDefaultLogDirectory_SetsTheCorrectArgs()
5978
{
@@ -111,17 +130,20 @@ private string BuildExpectedPactDir(string pactDir)
111130
}
112131

113132
private string BuildExpectedArguments(
114-
int port,
115-
string logFilePath,
133+
int port,
134+
string logFilePath,
116135
string pactFileDir,
117136
string pactSpecificationVersion,
118137
string consumerName,
119138
string providerName,
120-
bool enableSsl = false)
139+
bool enableSsl = false,
140+
string host = "")
121141
{
122142

123143
var sslOption = enableSsl ? " --ssl" : "";
124-
return $"-p {port} -l \"{logFilePath}\" --pact-dir \"{pactFileDir}\" --pact-specification-version \"{pactSpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}";
144+
var hostOption = string.IsNullOrWhiteSpace(host) ? "" : $" --host={host}";
145+
146+
return $"-p {port} -l \"{logFilePath}\" --pact-dir \"{pactFileDir}\" --pact-specification-version \"{pactSpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}{hostOption}";
125147
}
126148
}
127149
}

‎PactNet.Tests/IntegrationTests/FailureIntegrationTestsMyApiPact.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ public FailureIntegrationTestsMyApiPact()
1616
{
1717
var pactConfig = new PactConfig();
1818

19-
PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
19+
PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
2020
new MockProviderService(
21-
baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig),
22-
port, enableSsl,
21+
baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig),
22+
port, enableSsl,
2323
baseUri => new AdminHttpClient(baseUri)))
2424
.ServiceConsumer("FailureIntegrationTests")
2525
.HasPactWith("MyApi");

‎PactNet.Tests/IntegrationTests/IntegrationTestsMyApiPact.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public IntegrationTestsMyApiPact()
1616
{
1717
var pactConfig = new PactConfig();
1818

19-
PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
19+
PactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
2020
new MockProviderService(
2121
baseUri => new RubyHttpHost(baseUri, "MyConsumer", "MyApi", pactConfig),
2222
port, enableSsl,

‎PactNet.Tests/PactBuilderTests.cs

+11-11
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public void MockService_WhenCalled_StartIsCalledAndMockProviderServiceIsReturned
7575
{
7676
var mockMockProviderService = Substitute.For<IMockProviderService>();
7777

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

8080
pactBuilder
8181
.ServiceConsumer("Event Client")
@@ -92,7 +92,7 @@ public void MockService_WhenCalledTwice_StopIsCalledTheSecondTime()
9292
{
9393
var mockMockProviderService = Substitute.For<IMockProviderService>();
9494

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

9797
pactBuilder
9898
.ServiceConsumer("Event Client")
@@ -111,7 +111,7 @@ public void MockService_WhenCalled_MockProviderServiceFactoryIsInvokedWithSslNot
111111
var calledWithSslEnabled = false;
112112
var mockMockProviderService = Substitute.For<IMockProviderService>();
113113

114-
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
114+
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
115115
{
116116
calledWithSslEnabled = enableSsl;
117117
return mockMockProviderService;
@@ -132,7 +132,7 @@ public void MockService_WhenCalledWithEnableSslFalse_MockProviderServiceFactoryI
132132
var calledWithSslEnabled = false;
133133
var mockMockProviderService = Substitute.For<IMockProviderService>();
134134

135-
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
135+
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
136136
{
137137
calledWithSslEnabled = enableSsl;
138138
return mockMockProviderService;
@@ -153,7 +153,7 @@ public void MockService_WhenCalledWithEnableSslTrue_MockProviderServiceFactoryIs
153153
var calledWithSslEnabled = false;
154154
var mockMockProviderService = Substitute.For<IMockProviderService>();
155155

156-
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) =>
156+
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) =>
157157
{
158158
calledWithSslEnabled = enableSsl;
159159
return mockMockProviderService;
@@ -174,7 +174,7 @@ public void MockService_WhenCalledWithJsonSerializerSettings_SetsTheGlobalApiSer
174174
var serializerSettings = new JsonSerializerSettings();
175175
var mockMockProviderService = Substitute.For<IMockProviderService>();
176176

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

179179
pactBuilder
180180
.ServiceConsumer("Event Client")
@@ -197,7 +197,7 @@ public void MockService_WhenCalledWithNoJsonSerializerSettings_DoesNotSetTheGlob
197197
{
198198
var mockMockProviderService = Substitute.For<IMockProviderService>();
199199

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

202202
pactBuilder
203203
.ServiceConsumer("Event Client")
@@ -211,7 +211,7 @@ public void MockService_WhenCalledWithNoJsonSerializerSettings_DoesNotSetTheGlob
211211
[Fact]
212212
public void MockService_WhenCalledWithoutConsumerNameSet_ThrowsInvalidOperationException()
213213
{
214-
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName) => Substitute.For<IMockProviderService>());
214+
IPactBuilder pactBuilder = new PactBuilder((port, ssl, consumerName, providerName, host) => Substitute.For<IMockProviderService>());
215215
pactBuilder
216216
.HasPactWith("Event API");
217217

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

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

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

263-
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName) => mockMockProviderService)
263+
IPactBuilder pactBuilder = new PactBuilder((port, enableSsl, consumerName, providerName, host) => mockMockProviderService)
264264
.ServiceConsumer("Event Client")
265265
.HasPactWith("Event API");
266266

‎PactNet/Core/MockProviderHostConfig.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ internal class MockProviderHostConfig : IPactCoreHostConfig
1111
public bool WaitForExit { get; }
1212
public IEnumerable<IOutput> Outputters { get; }
1313

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

1920
Script = "pact-mock-service";
20-
Arguments = $"-p {port} -l \"{FixPathForRuby(logFile)}\" --pact-dir \"{FixPathForRuby(config.PactDir)}\" --pact-specification-version \"{config.SpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}";
21+
Arguments = $"-p {port} -l \"{FixPathForRuby(logFile)}\" --pact-dir \"{FixPathForRuby(config.PactDir)}\" --pact-specification-version \"{config.SpecificationVersion}\" --consumer \"{consumerName}\" --provider \"{providerName}\"{sslOption}{hostOption}";
2122
WaitForExit = false;
2223
Outputters = config?.Outputters;
2324
}

‎PactNet/IPactBuilder.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ public interface IPactBuilder
77
{
88
IPactBuilder ServiceConsumer(string consumerName);
99
IPactBuilder HasPactWith(string providerName);
10-
IMockProviderService MockService(int port, bool enableSsl = false);
11-
IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false);
10+
IMockProviderService MockService(int port, bool enableSsl = false, string host = "");
11+
IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, string host = "");
1212
void Build();
1313
}
1414
}

‎PactNet/Mocks/MockHttpService/Host/RubyHttpHost.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ internal class RubyHttpHost : IHttpHost
1111
private readonly AdminHttpClient _adminHttpClient;
1212

1313
internal RubyHttpHost(
14-
IPactCoreHost coreHost,
14+
IPactCoreHost coreHost,
1515
AdminHttpClient adminHttpClient)
1616
{
1717
_coreHost = coreHost;
1818
_adminHttpClient = adminHttpClient;
1919
}
2020

21-
public RubyHttpHost(Uri baseUri, string consumerName, string providerName, PactConfig config) :
21+
public RubyHttpHost(Uri baseUri, string consumerName, string providerName, PactConfig config, string host = "") :
2222
this(new PactCoreHost<MockProviderHostConfig>(
23-
new MockProviderHostConfig(baseUri.Port,
24-
baseUri.Scheme.ToUpperInvariant().Equals("HTTPS"),
23+
new MockProviderHostConfig(baseUri.Port,
24+
baseUri.Scheme.ToUpperInvariant().Equals("HTTPS"),
2525
consumerName,
26-
providerName, config)),
26+
providerName, config, host)),
2727
new AdminHttpClient(baseUri))
2828
{
2929
}
@@ -35,7 +35,7 @@ private Tuple<bool, Exception> IsMockProviderServiceRunning()
3535
_adminHttpClient.SendAdminHttpRequest(HttpVerb.Get, "/");
3636
return new Tuple<bool, Exception>(true, null);
3737
}
38-
catch(Exception ex)
38+
catch (Exception ex)
3939
{
4040
return new Tuple<bool, Exception>(false, ex);
4141
}

‎PactNet/Mocks/MockHttpService/MockProviderService.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ internal MockProviderService(
3030
_adminHttpClient = adminHttpClientFactory(BaseUri);
3131
}
3232

33-
public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config)
33+
public MockProviderService(int port, bool enableSsl, string consumerName, string providerName, PactConfig config,string host = "")
3434
: this(
35-
baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config),
35+
baseUri => new RubyHttpHost(baseUri, consumerName, providerName, config,host),
3636
port,
3737
enableSsl,
3838
baseUri => new AdminHttpClient(baseUri))

‎PactNet/PactBuilder.cs

+9-8
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ public class PactBuilder : IPactBuilder
1111
{
1212
public string ConsumerName { get; private set; }
1313
public string ProviderName { get; private set; }
14-
private readonly Func<int, bool, string, string, IMockProviderService> _mockProviderServiceFactory;
14+
private readonly Func<int, bool, string, string, string, IMockProviderService> _mockProviderServiceFactory;
15+
1516
private IMockProviderService _mockProviderService;
1617

17-
internal PactBuilder(Func<int, bool, string, string, IMockProviderService> mockProviderServiceFactory)
18+
internal PactBuilder(Func<int, bool, string, string, string, IMockProviderService> mockProviderServiceFactory)
1819
{
1920
_mockProviderServiceFactory = mockProviderServiceFactory;
2021
}
@@ -25,7 +26,7 @@ public PactBuilder()
2526
}
2627

2728
public PactBuilder(PactConfig config)
28-
: this((port, enableSsl, consumerName, providerName) => new MockProviderService(port, enableSsl, consumerName, providerName, config))
29+
: this((port, enableSsl, consumerName, providerName, host) => new MockProviderService(port, enableSsl, consumerName, providerName, config, host))
2930
{
3031
}
3132

@@ -53,12 +54,12 @@ public IPactBuilder HasPactWith(string providerName)
5354
return this;
5455
}
5556

56-
public IMockProviderService MockService(int port, bool enableSsl = false)
57+
public IMockProviderService MockService(int port, bool enableSsl = false, string host = "")
5758
{
58-
return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl);
59+
return MockService(port, jsonSerializerSettings: null, enableSsl: enableSsl, host: host);
5960
}
60-
61-
public IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false)
61+
62+
public IMockProviderService MockService(int port, JsonSerializerSettings jsonSerializerSettings, bool enableSsl = false, string host = "")
6263
{
6364
if (String.IsNullOrEmpty(ConsumerName))
6465
{
@@ -80,7 +81,7 @@ public IMockProviderService MockService(int port, JsonSerializerSettings jsonSer
8081
JsonConfig.ApiSerializerSettings = jsonSerializerSettings;
8182
}
8283

83-
_mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName);
84+
_mockProviderService = _mockProviderServiceFactory(port, enableSsl, ConsumerName, ProviderName, host);
8485

8586
_mockProviderService.Start();
8687

0 commit comments

Comments
 (0)