1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
module JsonSpec
module Matchers
class BeJsonEql
include JsonSpec::Helpers
include JsonSpec::Exclusion
include JsonSpec::Messages
attr_reader :expected, :actual
def diffable?
true
end
def initialize(expected_json = nil)
@expected_json = expected_json
@path = nil
end
def matches?(actual_json)
raise "Expected equivalent JSON not provided" if @expected_json.nil?
@actual, @expected = scrub(actual_json, @path), scrub(@expected_json)
@actual == @expected
end
def at_path(path)
@path = path
self
end
def to_file(path)
@expected_json = load_json(path)
self
end
def excluding(*keys)
excluded_keys.merge(keys.map(&:to_s))
self
end
def including(*keys)
excluded_keys.subtract(keys.map(&:to_s))
self
end
def failure_message
message_with_path("Expected equivalent JSON")
end
alias :failure_message_for_should :failure_message
def failure_message_when_negated
message_with_path("Expected inequivalent JSON")
end
alias :failure_message_for_should_not :failure_message_when_negated
def description
message_with_path("equal JSON")
end
private
def scrub(json, path = nil)
generate_normalized_json(exclude_keys(parse_json(json, path))).chomp + "\n"
end
end
end
end
|