class Pact::Provider::RSpec::JsonFormatter

Public Instance Methods

calculate_status(example) click to toggle source
# File lib/pact/provider/rspec/json_formatter.rb, line 47
def calculate_status(example)
  if example.execution_result.status == :failed && example.metadata[:pact_ignore_failures]
    'pending'
  else
    example.execution_result.status.to_s
  end
end
create_custom_summary(summary) click to toggle source
# File lib/pact/provider/rspec/json_formatter.rb, line 79
def create_custom_summary(summary)
  ::RSpec::Core::Notifications::SummaryNotification.new(
    summary.duration,
    summary.examples,
    summary.examples.select{ | example | example.execution_result.status == :failed && !example.metadata[:pact_ignore_failures] },
    summary.examples.select{ | example | example.execution_result.status == :failed && example.metadata[:pact_ignore_failures] },
    summary.load_time,
    summary.errors_outside_of_examples_count
  )
end
dump_summary(summary) click to toggle source
Calls superclass method
# File lib/pact/provider/rspec/json_formatter.rb, line 9
def dump_summary(summary)
  super(create_custom_summary(summary))
  output_hash[:summary][:pacts] = pacts(summary)
end
extract_differences(example) click to toggle source
# File lib/pact/provider/rspec/json_formatter.rb, line 90
def extract_differences(example)
  if example.metadata[:pact_diff]
    Pact::Matchers::ExtractDiffMessages.call(example.metadata[:pact_diff]).to_a
  else
    []
  end
end
format_example(example) click to toggle source
# File lib/pact/provider/rspec/json_formatter.rb, line 14
def format_example(example)
  {
    :id => example.id,
    :interaction_index => example.metadata[:pact_interaction].index,
    :description => example.description,
    :full_description => example.full_description,
    :status => calculate_status(example),
    :file_path => example.metadata[:file_path],
    :line_number  => example.metadata[:line_number],
    :run_time => example.execution_result.run_time,
    :mismatches => extract_differences(example),
    :pact_url => example.metadata[:pact_uri].uri
  }
end
pacts(summary) click to toggle source

There will most likely be only one pact associated with this RSpec execution, because the most likely user of this formatter is the Go implementation that parses the JSON and builds Go tests from them. If the JSON formatter is used by someone else and they have multiple pacts, all the notices for the pacts will be mushed together in one collection, so it will be hard to know which notice belongs to which pact.

# File lib/pact/provider/rspec/json_formatter.rb, line 61
def pacts(summary)
  unique_pact_metadatas(summary).collect do | example_metadata |
    pact_uri = example_metadata[:pact_uri]
    notices = (pact_uri.metadata[:notices] && pact_uri.metadata[:notices].before_verification_notices) || []
    {
      notices: notices,
      url: pact_uri.uri,
      consumer_name: example_metadata[:pact_consumer_contract].consumer.name,
      provider_name: example_metadata[:pact_consumer_contract].provider.name,
      short_description: pact_uri.metadata[:short_description]
    }
  end
end
stop(notification) click to toggle source
# File lib/pact/provider/rspec/json_formatter.rb, line 29
def stop(notification)
  output_hash[:examples] = notification.examples.map do |example|
    format_example(example).tap do |hash|
      e = example.exception
      if e
        hash[:exception] =  {
          class: e.class.name,
          message: e.message,
        }
        # No point providing a backtrace for a mismatch, too much noise
        if !e.is_a?(::RSpec::Expectations::ExpectationNotMetError)
          hash[:exception][:backtrace]
        end
      end
    end
  end
end
unique_pact_metadatas(summary) click to toggle source
# File lib/pact/provider/rspec/json_formatter.rb, line 75
def unique_pact_metadatas(summary)
  summary.examples.collect(&:metadata).group_by{ | metadata | metadata[:pact_uri].uri }.values.collect(&:first)
end