jschema 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/jschema.rb +41 -0
- data/lib/jschema/json_reference.rb +65 -0
- data/lib/jschema/schema.rb +84 -0
- data/lib/jschema/schema_ref.rb +13 -0
- data/lib/jschema/simple_validator.rb +86 -0
- data/lib/jschema/string_length_validator.rb +17 -0
- data/lib/jschema/validator.rb +14 -0
- data/lib/jschema/validator/all_of.rb +29 -0
- data/lib/jschema/validator/any_of.rb +29 -0
- data/lib/jschema/validator/dependencies.rb +63 -0
- data/lib/jschema/validator/enum.rb +23 -0
- data/lib/jschema/validator/format.rb +75 -0
- data/lib/jschema/validator/items.rb +79 -0
- data/lib/jschema/validator/max_items.rb +28 -0
- data/lib/jschema/validator/max_length.rb +23 -0
- data/lib/jschema/validator/max_properties.rb +31 -0
- data/lib/jschema/validator/maximum.rb +31 -0
- data/lib/jschema/validator/min_items.rb +28 -0
- data/lib/jschema/validator/min_length.rb +23 -0
- data/lib/jschema/validator/min_properties.rb +31 -0
- data/lib/jschema/validator/minimum.rb +31 -0
- data/lib/jschema/validator/multiple_of.rb +32 -0
- data/lib/jschema/validator/not.rb +23 -0
- data/lib/jschema/validator/one_of.rb +29 -0
- data/lib/jschema/validator/pattern.rb +36 -0
- data/lib/jschema/validator/properties.rb +106 -0
- data/lib/jschema/validator/required.rb +34 -0
- data/lib/jschema/validator/type.rb +57 -0
- data/lib/jschema/validator/unique_items.rb +27 -0
- data/test/assert_received.rb +15 -0
- data/test/string_length_validator_tests.rb +18 -0
- data/test/test_assert_received.rb +39 -0
- data/test/test_integration.rb +30 -0
- data/test/test_json_reference.rb +84 -0
- data/test/test_schema.rb +125 -0
- data/test/test_schema_ref.rb +11 -0
- data/test/test_validator.rb +29 -0
- data/test/validator/argument_is_array_of_schemas_tests.rb +22 -0
- data/test/validator/assertions.rb +56 -0
- data/test/validator/properties_limit_tests.rb +13 -0
- data/test/validator/schema_validation_helpers.rb +29 -0
- data/test/validator/test_all_of.rb +30 -0
- data/test/validator/test_any_of.rb +31 -0
- data/test/validator/test_dependencies.rb +106 -0
- data/test/validator/test_enum.rb +30 -0
- data/test/validator/test_format.rb +70 -0
- data/test/validator/test_items.rb +113 -0
- data/test/validator/test_max_items.rb +26 -0
- data/test/validator/test_max_length.rb +30 -0
- data/test/validator/test_max_properties.rb +29 -0
- data/test/validator/test_maximum.rb +58 -0
- data/test/validator/test_min_items.rb +27 -0
- data/test/validator/test_min_length.rb +30 -0
- data/test/validator/test_min_properties.rb +29 -0
- data/test/validator/test_minimum.rb +58 -0
- data/test/validator/test_multiple_of.rb +38 -0
- data/test/validator/test_not.rb +32 -0
- data/test/validator/test_one_of.rb +31 -0
- data/test/validator/test_pattern.rb +32 -0
- data/test/validator/test_properties.rb +136 -0
- data/test/validator/test_required.rb +30 -0
- data/test/validator/test_simple_validator.rb +100 -0
- data/test/validator/test_type.rb +97 -0
- data/test/validator/test_unique_items.rb +30 -0
- data/test/validator/validation_against_schemas_tests.rb +24 -0
- metadata +144 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
|
6
|
+
class TestMinimum < Minitest::Test
|
7
|
+
include Assertions
|
8
|
+
|
9
|
+
def test_that_minimum_is_a_number
|
10
|
+
assert_raises_unless 'minimum', :integer, :number
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_that_exclusive_minimum_is_boolean
|
14
|
+
assert_raises(JSchema::InvalidSchema) do
|
15
|
+
build_from_schema('minimum' => 1, 'exclusiveMinimum' => 0)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_that_exclusive_minimum_can_not_be_specified_without_minimum
|
20
|
+
assert_raises(JSchema::InvalidSchema) do
|
21
|
+
build_from_schema('exclusiveMinimum' => false)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_passing_validation_when_exclusive_minimum_is_not_specified
|
26
|
+
assert build_from_schema('minimum' => 1).valid?(2)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_passing_validation_when_exclusive_minimum_is_false
|
30
|
+
schema = build_from_schema('minimum' => 2, 'exclusiveMinimum' => false)
|
31
|
+
assert schema.valid?(2)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_passing_validation_when_exclusive_minimum_is_true
|
35
|
+
schema = build_from_schema('minimum' => 1, 'exclusiveMinimum' => true)
|
36
|
+
assert schema.valid?(2)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_failing_validation_when_exclusive_minumum_is_not_specified
|
40
|
+
refute build_from_schema('minimum' => 2).valid?(1)
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_failing_validation_when_exclusive_minimum_is_false
|
44
|
+
schema = build_from_schema('minimum' => 2, 'exclusiveMinimum' => false)
|
45
|
+
refute schema.valid?(1)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_failing_validation_when_exclusive_minimum_is_true
|
49
|
+
schema = build_from_schema('minimum' => 1, 'exclusiveMinimum' => true)
|
50
|
+
refute schema.valid?(1)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def validator_class
|
56
|
+
JSchema::Validator::Minimum
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
|
6
|
+
class TestMultipleOf < Minitest::Test
|
7
|
+
include Assertions
|
8
|
+
|
9
|
+
def test_that_argument_is_a_number
|
10
|
+
assert_raises_unless 'multipleOf', :number, :integer
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_that_argument_is_a_positive_number
|
14
|
+
assert_raises_for_values 'multipleOf', [0, -0.5]
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_passing_validation_when_argument_is_integer
|
18
|
+
assert validator(2).valid?(4)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_passing_validation_when_argument_is_float
|
22
|
+
assert validator(1.2).valid?(3.6)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_passing_validation_when_instance_is_negative
|
26
|
+
assert validator(1.2).valid?(-3.6)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_failing_validation
|
30
|
+
refute validator(3).valid?(7)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def validator_class
|
36
|
+
JSchema::Validator::MultipleOf
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
require_relative 'schema_validation_helpers'
|
6
|
+
|
7
|
+
class TestNot < Minitest::Test
|
8
|
+
include Assertions
|
9
|
+
include SchemaValidationHelpers
|
10
|
+
|
11
|
+
def test_that_argument_is_schema
|
12
|
+
assert_raises_unless_schema 'not'
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_passing_validation
|
16
|
+
stub_schema_validations(false) do
|
17
|
+
assert validator({}).valid?('test')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_failing_validation
|
22
|
+
stub_schema_validations(true) do
|
23
|
+
refute validator({}).valid?('test')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def validator_class
|
30
|
+
JSchema::Validator::Not
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
require_relative 'schema_validation_helpers'
|
6
|
+
require_relative 'validation_against_schemas_tests'
|
7
|
+
|
8
|
+
class TestOneOf < Minitest::Test
|
9
|
+
include Assertions
|
10
|
+
include SchemaValidationHelpers
|
11
|
+
include ValidationAgainstSchemasTests
|
12
|
+
|
13
|
+
def test_passing_validation_against_schemas
|
14
|
+
stub_schema_validations(true, false, false) do
|
15
|
+
schemas = [generate_schema, generate_schema, generate_schema]
|
16
|
+
assert validator(schemas).valid?('test')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_failing_validation_when_more_than_one_validation_passes
|
21
|
+
stub_schema_validations(true) do
|
22
|
+
refute validator([generate_schema, generate_schema]).valid?('test')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def validator_class
|
29
|
+
JSchema::Validator::OneOf
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
|
6
|
+
class TestPattern < Minitest::Test
|
7
|
+
include Assertions
|
8
|
+
|
9
|
+
def test_that_only_valid_regexp_is_allowed
|
10
|
+
assert_raises_unless 'pattern', :string
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_that_validation_always_passes_for_non_strings
|
14
|
+
assert validator('123').valid?(nil)
|
15
|
+
assert validator('123').valid?([])
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_passing_validation
|
19
|
+
assert validator('123').valid?('test123')
|
20
|
+
assert validator('\d+$').valid?('test123')
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_failing_validation
|
24
|
+
refute validator('123').valid?('test')
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def validator_class
|
30
|
+
JSchema::Validator::Pattern
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
require_relative 'schema_validation_helpers'
|
6
|
+
|
7
|
+
# rubocop:disable ClassLength
|
8
|
+
class TestProperties < Minitest::Test
|
9
|
+
include Assertions
|
10
|
+
include SchemaValidationHelpers
|
11
|
+
|
12
|
+
def test_invalid_properties_argument
|
13
|
+
keywords.each do |keyword|
|
14
|
+
assert_raises(JSchema::InvalidSchema) do
|
15
|
+
build_from_schema(keyword => 1)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_invalid_properties_schema_argument
|
21
|
+
keywords.each do |keyword|
|
22
|
+
assert_raises(JSchema::InvalidSchema) do
|
23
|
+
build_from_schema(keyword => { 'test' => 1 })
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_passing_properties_validation_by_sub_schema
|
29
|
+
keywords.each do |keyword|
|
30
|
+
assert_passing_validation keyword
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_failing_properties_validation_by_sub_schema
|
35
|
+
keywords.each do |keyword|
|
36
|
+
assert_failing_validation keyword
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_passing_validation_when_additional_properties_are_not_allowed
|
41
|
+
assert validator_with_additional_properties.valid?('test' => 123)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_failing_validation_when_additional_properties_are_not_allowed
|
45
|
+
refute validator_with_additional_properties.valid?(
|
46
|
+
'test' => 123, 'additional' => 321)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_passing_validation_when_additional_properties_are_allowed
|
50
|
+
validator = build_from_schema(
|
51
|
+
'additionalProperties' => true,
|
52
|
+
'properties' => { 'test' => {} }
|
53
|
+
)
|
54
|
+
|
55
|
+
assert validator.valid?('test' => 123, 'additional' => true)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_passing_validation_with_additional_and_pattern_properties
|
59
|
+
validator = validator_with_additional_and_pattern_properties
|
60
|
+
assert validator.valid?('test123' => true)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_failing_validation_with_additional_and_pattern_properties
|
64
|
+
validator = validator_with_additional_and_pattern_properties
|
65
|
+
refute validator.valid?('test' => true)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_passing_validation_when_any_properties_are_disallowed
|
69
|
+
assert validator_with_disallowed_properties.valid?({})
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_failing_validation_when_any_properties_are_disallowed
|
73
|
+
refute validator_with_disallowed_properties.valid?('test' => 123)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_that_validation_always_passes_for_non_object_instances
|
77
|
+
validator = build_from_schema('additionalProperties' => false)
|
78
|
+
assert validator.valid?('test')
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_building_validator_from_properties
|
82
|
+
validator = build_from_schema('properties' => { 'test' => {} })
|
83
|
+
assert_instance_of JSchema::Validator::Properties, validator
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_building_validator_from_additional_properties
|
87
|
+
validator = build_from_schema('additionalProperties' => false)
|
88
|
+
assert_instance_of JSchema::Validator::Properties, validator
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_building_validator_from_empty_schema
|
92
|
+
assert_nil build_from_schema({})
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def validator_class
|
98
|
+
JSchema::Validator::Properties
|
99
|
+
end
|
100
|
+
|
101
|
+
def keywords
|
102
|
+
['properties', 'patternProperties', 'additionalProperties']
|
103
|
+
end
|
104
|
+
|
105
|
+
def validator_with_additional_properties
|
106
|
+
build_from_schema(
|
107
|
+
'additionalProperties' => false,
|
108
|
+
'properties' => { 'test' => {} }
|
109
|
+
)
|
110
|
+
end
|
111
|
+
|
112
|
+
def validator_with_additional_and_pattern_properties
|
113
|
+
build_from_schema(
|
114
|
+
'additionalProperties' => false,
|
115
|
+
'patternProperties' => { '\d+' => {} }
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
119
|
+
def validator_with_disallowed_properties
|
120
|
+
build_from_schema('additionalProperties' => false)
|
121
|
+
end
|
122
|
+
|
123
|
+
def assert_passing_validation(keyword)
|
124
|
+
stub_schema_validations(true) do
|
125
|
+
validator = build_from_schema(keyword => { 'test' => {} })
|
126
|
+
assert validator.valid?('test' => 123)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def assert_failing_validation(keyword)
|
131
|
+
stub_schema_validations(false) do
|
132
|
+
validator = build_from_schema(keyword => { 'test' => {} })
|
133
|
+
refute validator.valid?('test' => 123)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
|
6
|
+
class TestRequired < Minitest::Test
|
7
|
+
include Assertions
|
8
|
+
|
9
|
+
def test_that_argument_is_string_array
|
10
|
+
assert_raises_unless_string_array 'required'
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_passing_validation
|
14
|
+
assert validator(['test']).valid?('test' => 123)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_passing_validation_when_property_has_false_value
|
18
|
+
assert validator(['test']).valid?('test' => false)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_failing_validation
|
22
|
+
refute validator(['test']).valid?({})
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def validator_class
|
28
|
+
JSchema::Validator::Required
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'jschema'
|
3
|
+
|
4
|
+
require_relative 'assertions'
|
5
|
+
|
6
|
+
class TestSimpleValidator < Minitest::Test
|
7
|
+
include Assertions
|
8
|
+
|
9
|
+
def setup
|
10
|
+
super
|
11
|
+
@validator_class = Class.new(JSchema::SimpleValidator) do
|
12
|
+
private
|
13
|
+
|
14
|
+
self.keywords = ['param']
|
15
|
+
|
16
|
+
def validate_args(param)
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
20
|
+
def post_initialize(param)
|
21
|
+
end
|
22
|
+
|
23
|
+
def validate_instance(param)
|
24
|
+
end
|
25
|
+
|
26
|
+
def applicable_types
|
27
|
+
[String]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_parent_attribute
|
33
|
+
parent = Object.new
|
34
|
+
example = @validator_class.new('param', parent)
|
35
|
+
assert_equal parent, example.parent
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_building_from_schema
|
39
|
+
validator_example = build_from_schema('param' => 'test')
|
40
|
+
assert_instance_of validator_class, validator_example
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_building_from_empty_schema
|
44
|
+
assert_nil build_from_schema
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_passing_validation
|
48
|
+
stub_validator nil, true do |vdr|
|
49
|
+
assert vdr.valid?('instance')
|
50
|
+
assert_nil vdr.validate('instance')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_failing_validation
|
55
|
+
stub_validator nil, false do |vdr|
|
56
|
+
refute vdr.valid?('instance')
|
57
|
+
assert_equal 'error', vdr.validate('instance')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_invalid_params
|
62
|
+
assert_raises(JSchema::InvalidSchema) do
|
63
|
+
Class.new(JSchema::SimpleValidator) do
|
64
|
+
private
|
65
|
+
|
66
|
+
def validate_args
|
67
|
+
false
|
68
|
+
end
|
69
|
+
end.new('test')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_that_validation_always_passes_if_validator_is_not_applicable
|
74
|
+
stub_validator [Fixnum], false do |vdr|
|
75
|
+
assert vdr.valid?('instance')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_applicable_types
|
80
|
+
stub_validator [Fixnum], false do |vdr|
|
81
|
+
refute vdr.valid?(0)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def stub_validator(applicable_types, valid)
|
88
|
+
validator_example = validator 'test'
|
89
|
+
validation_result = valid ? nil : 'error'
|
90
|
+
validator_example.stub :applicable_types, applicable_types do
|
91
|
+
validator_example.stub :validate_instance, validation_result do
|
92
|
+
yield validator_example
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def validator_class
|
98
|
+
@validator_class
|
99
|
+
end
|
100
|
+
end
|