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