compare_hash

in elasticsearch-api/api-spec-testing/rspec_matchers.rb [194:259]


  def compare_hash(expected_pairs, actual_hash, test)
    expected_pairs.each do |expected_key, expected_value|
      
      if (match = expected_key.match(/(^\$[a-z]+)/))
        keys = expected_key.split('.')
        keys.delete(match[1])
        dynamic_key = test.cached_values[match[1].gsub('$', '')]
        value = dynamic_key.dig(*keys)

        if expected_pairs.values.first.is_a?(String) && expected_pairs.values.first.match?(/^\$/)
          return test.cached_values[expected_pairs.values.first.gsub('$','')] == value
        else
          return expected_pairs.values.first == value
        end

      else
        split_key = TestFile::Test.split_and_parse_key(expected_key).collect do |k|
          
          test.get_cached_value(k)
        end
      end
      
      
      begin
        actual_value = TestFile::Test.find_value_in_document(split_key, actual_hash)
      rescue TypeError => e
        actual_value = TestFile::Test.find_value_in_document(expected_key, actual_hash)
      rescue StandardError => e
        raise e
      end
      
      actual_value = actual_hash if split_key.empty?
      
      actual_value = TestFile::Test.find_value_in_document(expected_key, actual_hash) if actual_value.nil?

      
      
      expected_value = test.get_cached_value(expected_value)

      case expected_value
      when Hash
        compare_hash(expected_value, actual_value, test)
      when Array
        begin
          unless compare_array(expected_value.sort, actual_value.sort, test, actual_hash)
            @mismatched_pairs.merge!(expected_key => expected_value)
          end
        rescue TypeError, ArgumentError
          unless compare_array(expected_value, actual_value, test, actual_hash)
            @mismatched_pairs.merge!(expected_key => expected_value)
          end
        end
      when String
        unless compare_string(expected_value, actual_value, test, actual_hash)
          @mismatched_pairs.merge!(expected_key => expected_value)
        end
      when Time
        compare_string(expected_value.to_s, Time.new(actual_value).to_s, test, actual_hash)
      else
        unless expected_value == actual_value
          @mismatched_pairs.merge!(expected_key => expected_value)
        end
      end
    end
  end