Sha256: 022795000e2f38ba93a57283b8874a46c29951b60247488db443b04568c87c21

Contents?: true

Size: 1.99 KB

Versions: 36

Compression:

Stored size: 1.99 KB

Contents

require 'json'

module PactBroker
  module Pacts
    module Merger

      extend self

      def conflict? original_json, additional_json
        original, additional = [original_json, additional_json].map{|str| JSON.parse(str, PACT_PARSING_OPTIONS) }

        additional["interactions"].any? do |new_interaction|
          original["interactions"].any? do |original_interaction|
            same_description_and_state?(original_interaction, new_interaction) &&
              !same_request_properties?(original_interaction["request"], new_interaction["request"])
          end
        end
      end

      # Accepts two hashes representing pacts, outputs a merged hash
      # Does not make any guarantees about order of interactions
      def merge_pacts original_json, additional_json
        original, additional = [original_json, additional_json].map{|str| JSON.parse(str, PACT_PARSING_OPTIONS) }

        new_pact = original

        additional["interactions"].each do |new_interaction|
          # check to see if this interaction matches an existing interaction
          overwrite_index = original["interactions"].find_index do |original_interaction|
            same_description_and_state?(original_interaction, new_interaction)
          end

          # overwrite existing interaction if a match is found, otherwise appends the new interaction
          if overwrite_index
            new_pact["interactions"][overwrite_index] = new_interaction
          else
            new_pact["interactions"] << new_interaction
          end
        end

        new_pact.to_json
      end

      private

      def same_description_and_state? original, additional
        original["description"] == additional["description"] &&
          original["provider_state"] == additional["provider_state"]
      end

      def same_request_properties? original, additional
        attributes_match = %w(method path query body headers).all? do |attribute|
          original[attribute] == additional[attribute]
        end
      end
    end
  end
end

Version data entries

36 entries across 36 versions & 1 rubygems

Version Path
pact_broker-2.5.1 lib/pact_broker/pacts/merger.rb
pact_broker-2.5.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.4.2 lib/pact_broker/pacts/merger.rb
pact_broker-2.4.1 lib/pact_broker/pacts/merger.rb
pact_broker-2.4.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.3.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.2.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.1.1 lib/pact_broker/pacts/merger.rb
pact_broker-2.1.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.5 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.4 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.3 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.2 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.1 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.0.beta.8 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.0.beta.7 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.0.beta.6 lib/pact_broker/pacts/merger.rb
pact_broker-1.18.0 lib/pact_broker/pacts/merger.rb
pact_broker-2.0.0.beta.5 lib/pact_broker/pacts/merger.rb