-
Notifications
You must be signed in to change notification settings - Fork 114
/
have_json_type.rb
54 lines (47 loc) · 1.4 KB
/
have_json_type.rb
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
module JsonSpec
module Matchers
class HaveJsonType
include JsonSpec::Helpers
def initialize(type)
@classes = type_to_classes(type)
end
def matches?(json)
@ruby = parse_json(json, @path)
@classes.any?{|c| c === @ruby }
end
def at_path(path)
@path = path
self
end
def failure_message_for_should
message = "Expected JSON value type to be #{@classes.join(", ")}, got #{@ruby.class}"
message << %( at path "#{@path}") if @path
message
end
def failure_message_for_should_not
message = "Expected JSON value type to not be #{@classes.join(", ")}, got #{@ruby.class}"
message << %( at path "#{@path}") if @path
message
end
def description
message = %(have JSON type "#{@classes.join(", ")}")
message << %( at path "#{@path}") if @path
message
end
private
def type_to_classes(type)
case type
when Class then [type]
when Array then type.map{|t| type_to_classes(t) }.flatten
else
case type.to_s.downcase
when "boolean" then [TrueClass, FalseClass]
when "object" then [Hash]
when "nil", "null" then [NilClass]
else [Module.const_get(type.to_s.capitalize)]
end
end
end
end
end
end