Skip to content

Commit

Permalink
Merge branch 'iamdavidfrancis-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
neilcampbell committed Jul 21, 2017
2 parents fa7d5da + 9337f38 commit e192bbe
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 7 deletions.
25 changes: 23 additions & 2 deletions PactNet.Tests/Core/PactVerifierHostConfigTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,24 @@ public void Ctor_WhenCalled_SetsOutputters()
Assert.Equal(verifierConfig.Outputters, config.Outputters);
}

[Fact]
public void Ctor_WhenCalledWithPublishVerificationResults_SetsTheCorrectArgs()
{
var baseUri = new Uri("http://127.0.0.1");
var pactUri = "./tester-pact/pact-file.json";
var providerStateSetupUri = new Uri("http://127.0.0.1/states/");

var verifierConfig = new PactVerifierConfig();
verifierConfig.PublishVerificationResults = true;
verifierConfig.ProviderVersion = "1.0.0";

var config = GetSubject(baseUri: baseUri, pactUri: pactUri, providerStateSetupUri: providerStateSetupUri, verifierConfig: verifierConfig);

var expectedArguments = BuildExpectedArguments(baseUri, pactUri, providerStateSetupUri, publishVerificationResults: true, providerVersion: "1.0.0");

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

[Fact]
public void Ctor_WhenVerifierConfigIsNull_SetsOutputtersToNull()
{
Expand All @@ -109,12 +127,15 @@ private string BuildExpectedArguments(
Uri baseUri,
string pactUri,
Uri providerStateSetupUri,
PactUriOptions pactUriOptions = null)
PactUriOptions pactUriOptions = null,
bool publishVerificationResults = false,
string providerVersion = "")
{
var providerStateOption = providerStateSetupUri != null ? $" --provider-states-setup-url {providerStateSetupUri.OriginalString}" : "";
var brokerCredentials = pactUriOptions != null ? $" --broker-username \"{pactUriOptions.Username}\" --broker-password \"{pactUriOptions.Password}\"" : "";
var publishResults = publishVerificationResults ? $" --publish-verification-results=true --provider-app-version=\"{providerVersion}\"" : string.Empty;

return $"--pact-urls \"{pactUri}\" --provider-base-url {baseUri.OriginalString}{providerStateOption}{brokerCredentials}";
return $"--pact-urls \"{pactUri}\" --provider-base-url {baseUri.OriginalString}{providerStateOption}{brokerCredentials}{publishResults}";
}
}
}
10 changes: 10 additions & 0 deletions PactNet.Tests/PactVerifierTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ private IPactVerifier GetSubject()
return new PactVerifier(hostConfig => _mockVerifierCoreHost, new PactVerifierConfig());
}

[Fact]
public void PactVerifier_WhenCalledWithPublishVerificationResultsAndNoProviderVersion_ThrowsArgumentException()
{
var config = new PactVerifierConfig();
config.PublishVerificationResults = true;
config.ProviderVersion = string.Empty;

Assert.Throws<ArgumentException>(() => new PactVerifier(config));
}

[Fact]
public void ProviderState_WhenCalledWithSetupUri_SetsProviderStateSetupUri()
{
Expand Down
7 changes: 4 additions & 3 deletions PactNet/Core/PactVerifierHostConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@ internal class PactVerifierHostConfig : IPactCoreHostConfig

public PactVerifierHostConfig(Uri baseUri, string pactUri, PactUriOptions pactBrokerUriOptions, Uri providerStateSetupUri, PactVerifierConfig config)
{
var providerStateOption = providerStateSetupUri != null ? $" --provider-states-setup-url {providerStateSetupUri.OriginalString}" : "";
var brokerCredentials = pactBrokerUriOptions != null ? $" --broker-username \"{pactBrokerUriOptions.Username}\" --broker-password \"{pactBrokerUriOptions.Password}\"" : "";
var providerStateOption = providerStateSetupUri != null ? $" --provider-states-setup-url {providerStateSetupUri.OriginalString}" : string.Empty;
var brokerCredentials = pactBrokerUriOptions != null ? $" --broker-username \"{pactBrokerUriOptions.Username}\" --broker-password \"{pactBrokerUriOptions.Password}\"" : string.Empty;
var publishResults = config?.PublishVerificationResults == true ? $" --publish-verification-results=true --provider-app-version=\"{config.ProviderVersion}\"" : string.Empty;

Script = "pact-provider-verifier.rb";
Arguments = $"--pact-urls \"{FixPathForRuby(pactUri)}\" --provider-base-url {baseUri.OriginalString}{providerStateOption}{brokerCredentials}";
Arguments = $"--pact-urls \"{FixPathForRuby(pactUri)}\" --provider-base-url {baseUri.OriginalString}{providerStateOption}{brokerCredentials}{publishResults}";
WaitForExit = true;
Outputters = config?.Outputters;
}
Expand Down
5 changes: 5 additions & 0 deletions PactNet/PactVerifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ internal PactVerifier(Func<PactVerifierHostConfig, IPactCoreHost> pactVerifierHo
{
_pactVerifierHostFactory = pactVerifierHostFactory;
_config = config;

if (config.PublishVerificationResults && IsNullOrEmpty(config.ProviderVersion))
{
throw new ArgumentException($"config.{nameof(config.ProviderVersion)} is required when config.{nameof(config.PublishVerificationResults)} is true.");
}
}

public PactVerifier(PactVerifierConfig config) :
Expand Down
4 changes: 4 additions & 0 deletions PactNet/PactVerifierConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ namespace PactNet
public class PactVerifierConfig
{
public IEnumerable<IOutput> Outputters { get; set; }

public bool PublishVerificationResults { get; set; }

public string ProviderVersion { get; set; }

public PactVerifierConfig()
{
Expand Down
26 changes: 24 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,9 +236,9 @@ public class SomethingApiTests
.HonoursPactWith("Consumer")
.PactUri("..\\..\\..\\Consumer.Tests\\pacts\\consumer-something_api.json")
//or
.PactUri("http://pact-broker/pacts/provider/Something%20Api/consumer/Consumer/version/latest") //You can specify a http or https uri
.PactUri("http://pact-broker/pacts/provider/Something%20Api/consumer/Consumer/latest") //You can specify a http or https uri
//or
.PactUri("http://pact-broker/pacts/provider/Something%20Api/consumer/Consumer/version/latest", new PactUriOptions("someuser", "somepassword")) //You can also specify http/https basic auth details
.PactUri("http://pact-broker/pacts/provider/Something%20Api/consumer/Consumer/latest", new PactUriOptions("someuser", "somepassword")) //You can also specify http/https basic auth details
.Verify();
}
}
Expand Down Expand Up @@ -360,6 +360,28 @@ pactPublisher.PublishToBroker(
"1.0.2", new [] { "master" });
```

### Publishing Provider Verification Results to a Broker
This feature allows the result of the Provider verification to be pushed to the broker and displayed on the index page.
In order for this to work you must set the ProviderVersion, PublishVerificationResults and use a pact broker uri. If you do not use a broker uri no verification results will be published. See the code snippet code below.
For more info and compatibility details [refer to this](https://github.com/pact-foundation/pact_broker/wiki/Provider-verification-results).

```c#
var buildNumber = Environment.GetEnvironmentVariable("BUILD_NUMBER");

//Assuming build number is only set in the CI environment
var config = new PactVerifierConfig
{
ProviderVersion = !string.IsNullOrEmpty(buildNumber) ? buildNumber : null, //NOTE: This is required for this feature to work
PublishVerificationResults = !string.IsNullOrEmpty(buildNumber)
};
IPactVerifier pactVerifier = new PactVerifier(config);
pactVerifier
.ServiceProvider("Something Api", serviceUri)
.HonoursPactWith("Consumer")
.PactUri("http://pact-broker/pacts/provider/Something%20Api/consumer/Consumer/latest") //NOTE: This must be a pact broker url for this feature to work
.Verify();
```

#### Related Tools
You might also find the following tool and library helpful:

Expand Down

0 comments on commit e192bbe

Please sign in to comment.