Skip to content

Commit

Permalink
Merge remote branch 'japgolly/multi_json_fix' into merge-vapir
Browse files Browse the repository at this point in the history
  • Loading branch information
hoxworth committed May 29, 2012
2 parents 04ec7cf + 0c5ab31 commit a671cf2
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 6 deletions.
4 changes: 2 additions & 2 deletions lib/json-schema.rb
Expand Up @@ -11,7 +11,7 @@

# Force MultiJson to load an engine before we define the JSON constant here; otherwise,
# it looks for things that are under the JSON namespace that aren't there (since we have defined it here)
MultiJson.engine
MultiJson.respond_to?(:adapter) ? MultiJson.adapter : MultiJson.engine
end

$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/json-schema"
Expand All @@ -21,4 +21,4 @@
require 'validator'
Dir[File.join(File.dirname(__FILE__), "json-schema/attributes/*.rb")].each {|file| require file }
Dir[File.join(File.dirname(__FILE__), "json-schema/validators/*.rb")].each {|file| require file }
require 'uri/file'
require 'uri/file'
8 changes: 4 additions & 4 deletions lib/json-schema/validator.rb
Expand Up @@ -385,7 +385,7 @@ def register_default_validator(v)

def json_backend
if defined?(MultiJson)
MultiJson.engine
MultiJson.respond_to?(:adapter) ? MultiJson.adapter : MultiJson.engine
else
@@json_backend
end
Expand All @@ -394,7 +394,7 @@ def json_backend
def json_backend=(backend)
if defined?(MultiJson)
backend = backend == 'json' ? 'json_gem' : backend
MultiJson.engine = backend
MultiJson.respond_to?(:use) ? MultiJson.use(backend) : MultiJson.engine = backend
else
backend = backend.to_s
if @@available_json_backends.include?(backend)
Expand All @@ -407,7 +407,7 @@ def json_backend=(backend)

def parse(s)
if defined?(MultiJson)
MultiJson.decode(s)
MultiJson.respond_to?(:load) ? MultiJson.load(s) : MultiJson.decode(s)
else
case @@json_backend.to_s
when 'json'
Expand Down Expand Up @@ -473,7 +473,7 @@ def parse(s)

def serialize schema
if defined?(MultiJson)
MultiJson.encode(schema)
MultiJson.respond_to?(:dump) ? MultiJson.dump(schema) : MultiJson.encode(schema)
else
@@serializer.call(schema)
end
Expand Down
61 changes: 61 additions & 0 deletions test/test_full_validation.rb
Expand Up @@ -145,4 +145,65 @@ def test_full_validation_with_object_errors
assert(errors[1][:failed_attribute] == "Type")
assert(errors[1][:fragment] == "#/c")
end

def test_full_validation_with_nested_required_properties
schema = {
"$schema" => "http://json-schema.org/draft-03/schema#",
"type" => "object",
"properties" => {
"x" => {
"required" => true,
"type" => "object",
"properties" => {
"a" => {"type"=>"integer","required"=>true},
"b" => {"type"=>"integer","required"=>true},
"c" => {"type"=>"integer","required"=>false},
"d" => {"type"=>"integer","required"=>false},
"e" => {"type"=>"integer","required"=>false},
}
}
}
}
data = {"x" => {"a"=>5, "d"=>5, "e"=>"what?"}}

errors = JSON::Validator.fully_validate(schema,data,:errors_as_objects => true)
assert_equal 2, errors.length
assert_equal '#/x', errors[0][:fragment]
assert_equal 'Properties', errors[0][:failed_attribute]
assert_equal '#/x/e', errors[1][:fragment]
assert_equal 'Type', errors[1][:failed_attribute]
end

def test_full_validation_with_nested_required_propertiesin_array
schema = {
"$schema" => "http://json-schema.org/draft-03/schema#",
"type" => "object",
"properties" => {
"x" => {
"required" => true,
"type" => "array",
"items" => {
"type" => "object",
"properties" => {
"a" => {"type"=>"integer","required"=>true},
"b" => {"type"=>"integer","required"=>true},
"c" => {"type"=>"integer","required"=>false},
"d" => {"type"=>"integer","required"=>false},
"e" => {"type"=>"integer","required"=>false},
}
}
}
}
}
missing_b= {"a"=>5}
e_is_wrong_type= {"a"=>5,"b"=>5,"e"=>"what?"}
data = {"x" => [missing_b, e_is_wrong_type]}

errors = JSON::Validator.fully_validate(schema,data,:errors_as_objects => true)
assert_equal 2, errors.length
assert_equal '#/x/0', errors[0][:fragment]
assert_equal 'Properties', errors[0][:failed_attribute]
assert_equal '#/x/1/e', errors[1][:fragment]
assert_equal 'Type', errors[1][:failed_attribute]
end
end

0 comments on commit a671cf2

Please sign in to comment.