public ComparisonResult Compare(ProviderServiceResponse expected, ProviderServiceResponse actual) { var result = new ComparisonResult("returns a response which"); if (expected == null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected response cannot be null")); return(result); } var statusResult = _httpStatusCodeComparer.Compare(expected.Status, actual.Status); result.AddChildResult(statusResult); if (expected.Headers != null && expected.Headers.Any()) { var headerResult = _httpHeaderComparer.Compare(expected.Headers, actual.Headers); result.AddChildResult(headerResult); } if (expected.Body != null) { var bodyResult = _httpBodyComparer.Compare(expected.Body, actual.Body, expected.MatchingRules); result.AddChildResult(bodyResult); } else if (expected.Body == null && expected.ShouldSerializeBody() && //Body was explicitly set actual.Body != null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected response body was explicitly set to null however the actual response body was not null")); } return(result); }
public void Failures_WithNestedChildResultsWithFailures_ReturnsAllFailuresFromNestedResultsInCorrectOrder() { var failure1 = "Failure 1"; var failure2 = "Failure 2"; var failure3 = "Failure 3"; var nestedChildResult2 = new ComparisonResult(); nestedChildResult2.RecordFailure(new ErrorMessageComparisonFailure(failure3)); var nestedChildResult = new ComparisonResult(); nestedChildResult.RecordFailure(new ErrorMessageComparisonFailure(failure2)); nestedChildResult.AddChildResult(nestedChildResult2); var comparisonResult = GetSubject(); comparisonResult.RecordFailure(new ErrorMessageComparisonFailure(failure1)); comparisonResult.AddChildResult(nestedChildResult); var failures = comparisonResult.Failures; Assert.Equal(3, failures.Count()); Assert.Equal(failure1, failures.First().Result); Assert.Equal(failure2, failures.Skip(1).First().Result); Assert.Equal(failure3, failures.Last().Result); }
public ComparisonResult Compare(dynamic expected, dynamic actual) { var result = new ComparisonResult("includes metadata"); if (expected == null) { return(result); } if (expected != null && actual == null) { result.RecordFailure(new ErrorMessageComparisonFailure("Actual metadata is null")); return(result); } var expectedToken = JToken.FromObject(expected); //serializing first to match the same process as loading the pact from file var actualToken = JToken.Parse(JsonConvert.SerializeObject(actual)); if (!JToken.DeepEquals(expectedToken, actualToken)) { result.RecordFailure(new DiffComparisonFailure(expected, actual)); } else { result.AddChildResult(new ComparisonResult(JsonConvert.SerializeObject(actualToken))); } return(result); }
public ComparisonResult Compare(ProviderServiceRequest expected, ProviderServiceRequest actual) { var result = new ComparisonResult("sends a request which"); if (expected == null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected request cannot be null")); return(result); } var methodResult = _httpMethodComparer.Compare(expected.Method, actual.Method); result.AddChildResult(methodResult); var pathResult = _httpPathComparer.Compare(expected.Path, actual.Path); result.AddChildResult(pathResult); var queryResult = _httpQueryStringComparer.Compare(expected.Query, actual.Query); result.AddChildResult(queryResult); if (expected.Headers != null && expected.Headers.Any()) { var headerResult = _httpHeaderComparer.Compare(expected.Headers, actual.Headers); result.AddChildResult(headerResult); } if (expected.Body != null) { var bodyResult = _httpBodyComparer.Compare(expected.Body, actual.Body, expected.MatchingRules); result.AddChildResult(bodyResult); } else if (expected.Body == null && expected.ShouldSerializeBody() && //Body was explicitly set actual.Body != null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected request body was explicitly set to null however the actual request body was not null")); } return(result); }
public ComparisonResult Compare(IDictionary <string, string> expected, IDictionary <string, string> actual) { var result = new ComparisonResult("includes headers"); if (actual == null) { result.RecordFailure(new ErrorMessageComparisonFailure("Actual Headers are null")); return(result); } actual = MakeDictionaryCaseInsensitive(actual); foreach (var header in expected) { var headerResult = new ComparisonResult("'{0}' with value {1}", header.Key, header.Value); string actualValue; if (actual.TryGetValue(header.Key, out actualValue)) { var expectedValue = header.Value; var actualValueSplit = actualValue.Split(new[] { ',', ';' }); if (actualValueSplit.Length == 1) { if (!header.Value.Equals(actualValue)) { headerResult.RecordFailure(new DiffComparisonFailure(expectedValue, actualValue)); } } else { var expectedValueSplit = expectedValue.Split(new[] { ',', ';' }); var expectedValueSplitJoined = String.Join(",", expectedValueSplit.Select(x => x.Trim())); var actualValueSplitJoined = String.Join(",", actualValueSplit.Select(x => x.Trim())); if (!expectedValueSplitJoined.Equals(actualValueSplitJoined)) { headerResult.RecordFailure(new DiffComparisonFailure(expectedValue, actualValue)); } } } else { headerResult.RecordFailure(new ErrorMessageComparisonFailure(String.Format("Header with key '{0}', does not exist in actual", header.Key))); } result.AddChildResult(headerResult); } return(result); }
public ComparisonResult Compare(Message expected, Message actual) { var result = new ComparisonResult("returns a message which"); if (expected == null) { result.RecordFailure(new ErrorMessageComparisonFailure("Expected message cannot be null")); return(result); } if (expected.MetaData != null) { var metaDataComparerResult = metaDataComparer.Compare(expected.MetaData, actual.MetaData); result.AddChildResult(metaDataComparerResult); } if (expected.Contents != null) { var contentComparerResult = contentsComparer.Compare(expected.Contents, actual.Contents, expected.MatchingRules); result.AddChildResult(contentComparerResult); } return(result); }
public void Flush_WithAReportedSummaryThatContainsAChildResultWithMultipleFailuresOnTheComparisonResult_CallsOutputterWithMessage() { const string comparisonMessage1 = "The thing I am testing"; const string comparisonMessage2 = "The thing I am testing 2"; var reporter = GetSubject(); var comparisonResult2 = new ComparisonResult(comparisonMessage2); comparisonResult2.RecordFailure(new ErrorMessageComparisonFailure("Failure 2")); var comparisonResult = new ComparisonResult(comparisonMessage1); comparisonResult.RecordFailure(new ErrorMessageComparisonFailure("Failure 1")); comparisonResult.AddChildResult(comparisonResult2); reporter.ReportSummary(comparisonResult); reporter.Flush(); _reportOutputter.Received(1).Write(Arg.Is <string>(x => x.Contains(comparisonMessage1 + " (FAILED - 1)") && x.Contains(comparisonMessage2 + " (FAILED - 2)"))); }
public void Validate(ProviderServicePactFile pactFile, ProviderStates providerStates) { if (pactFile == null) { throw new ArgumentException("Please supply a non null pactFile"); } if (pactFile.Consumer == null || String.IsNullOrEmpty(pactFile.Consumer.Name)) { throw new ArgumentException("Please supply a non null or empty Consumer name in the pactFile"); } if (pactFile.Provider == null || String.IsNullOrEmpty(pactFile.Provider.Name)) { throw new ArgumentException("Please supply a non null or empty Provider name in the pactFile"); } if (pactFile.Interactions != null && pactFile.Interactions.Any()) { _reporter.ReportInfo(String.Format("Verifying a Pact between {0} and {1}", pactFile.Consumer.Name, pactFile.Provider.Name)); var comparisonResult = new ComparisonResult(); foreach (var interaction in pactFile.Interactions) { InvokePactSetUpIfApplicable(providerStates); _reporter.ResetIndentation(); ProviderState providerStateItem = null; if (interaction.ProviderState != null) { try { providerStateItem = providerStates.Find(interaction.ProviderState); } catch (Exception) { providerStateItem = null; } if (providerStateItem == null) { throw new InvalidOperationException(String.Format("providerState '{0}' was defined by a consumer, however could not be found. Please supply this provider state.", interaction.ProviderState)); } } InvokeProviderStateSetUpIfApplicable(providerStateItem); if (!String.IsNullOrEmpty(interaction.ProviderState)) { _reporter.Indent(); _reporter.ReportInfo(String.Format("Given {0}", interaction.ProviderState)); } _reporter.Indent(); _reporter.ReportInfo(String.Format("{0}", interaction.Description)); if (interaction.Request != null) { _reporter.Indent(); _reporter.ReportInfo(String.Format("with {0} {1}", interaction.Request.Method.ToString().ToUpper(), interaction.Request.Path)); } try { var interactionComparisonResult = ValidateInteraction(interaction); comparisonResult.AddChildResult(interactionComparisonResult); _reporter.Indent(); _reporter.ReportSummary(interactionComparisonResult); } finally { InvokeProviderStateTearDownIfApplicable(providerStateItem); InvokeTearDownIfApplicable(providerStates); } } _reporter.ResetIndentation(); _reporter.ReportFailureReasons(comparisonResult); _reporter.Flush(); if (comparisonResult.HasFailure) { throw new PactFailureException(String.Format("See test output or {0} for failure details.", !String.IsNullOrEmpty(_config.LoggerName) ? LogProvider.CurrentLogProvider.ResolveLogPath(_config.LoggerName) : "logs")); } } }
public void Validate(MessagePactFile pactFile, ProviderStates providerStates) { if (pactFile == null) { throw new ArgumentException("Please supply a non null pactFile"); } if (pactFile.Consumer == null || String.IsNullOrEmpty(pactFile.Consumer.Name)) { throw new ArgumentException("Please supply a non null or empty Consumer name in the pactFile"); } if (pactFile.Provider == null || String.IsNullOrEmpty(pactFile.Provider.Name)) { throw new ArgumentException("Please supply a non null or empty Provider name in the pactFile"); } if (pactFile.Messages != null && pactFile.Messages.Any()) { _reporter.ReportInfo(String.Format("Verifying a Pact between {0} and {1}", pactFile.Consumer.Name, pactFile.Provider.Name)); var comparisonResult = new ComparisonResult(); foreach (var interaction in pactFile.Messages) { InvokePactSetUpIfApplicable(providerStates); _reporter.ResetIndentation(); ProviderState providerStateItem = null; Message actualMessage = null; if (interaction.ProviderState != null) { try { providerStateItem = providerStates.Find(interaction.ProviderState); } catch (Exception) { providerStateItem = null; } //either not found in providerStates or exception was caught if (providerStateItem == null) { throw new InvalidOperationException(String.Format( "providerState '{0}' was defined by a consumer, however could not be found. Please supply this provider state.", interaction.ProviderState)); } try { actualMessage = InvokeProviderStateSetUp(providerStateItem); } catch (Exception e) { throw new InvalidOperationException(String.Format( "Actual message could not be generated for providerState '{0}'. error: {1}", interaction.ProviderState, e.Message)); } } if (!String.IsNullOrEmpty(interaction.ProviderState)) { _reporter.Indent(); _reporter.ReportInfo(String.Format("Given {0}", interaction.ProviderState)); } _reporter.Indent(); _reporter.ReportInfo(String.Format("Upon receiving {0}", interaction.Description)); try { var interactionComparisonResult = ValidateInteraction(interaction, actualMessage); comparisonResult.AddChildResult(interactionComparisonResult); _reporter.Indent(); _reporter.ReportSummary(interactionComparisonResult); } finally { InvokeProviderStateTearDownIfApplicable(providerStateItem); InvokeTearDownIfApplicable(providerStates); } } _reporter.ResetIndentation(); _reporter.ReportFailureReasons(comparisonResult); _reporter.Flush(); if (comparisonResult.HasFailure) { throw new PactFailureException(String.Format("See test output or {0} for failure details.", !String.IsNullOrEmpty(_config.LoggerName) ? LogProvider.CurrentLogProvider.ResolveLogPath(_config.LoggerName) : "logs")); } } }