Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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"));
                }
            }
        }