jschema 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/lib/jschema.rb +41 -0
  3. data/lib/jschema/json_reference.rb +65 -0
  4. data/lib/jschema/schema.rb +84 -0
  5. data/lib/jschema/schema_ref.rb +13 -0
  6. data/lib/jschema/simple_validator.rb +86 -0
  7. data/lib/jschema/string_length_validator.rb +17 -0
  8. data/lib/jschema/validator.rb +14 -0
  9. data/lib/jschema/validator/all_of.rb +29 -0
  10. data/lib/jschema/validator/any_of.rb +29 -0
  11. data/lib/jschema/validator/dependencies.rb +63 -0
  12. data/lib/jschema/validator/enum.rb +23 -0
  13. data/lib/jschema/validator/format.rb +75 -0
  14. data/lib/jschema/validator/items.rb +79 -0
  15. data/lib/jschema/validator/max_items.rb +28 -0
  16. data/lib/jschema/validator/max_length.rb +23 -0
  17. data/lib/jschema/validator/max_properties.rb +31 -0
  18. data/lib/jschema/validator/maximum.rb +31 -0
  19. data/lib/jschema/validator/min_items.rb +28 -0
  20. data/lib/jschema/validator/min_length.rb +23 -0
  21. data/lib/jschema/validator/min_properties.rb +31 -0
  22. data/lib/jschema/validator/minimum.rb +31 -0
  23. data/lib/jschema/validator/multiple_of.rb +32 -0
  24. data/lib/jschema/validator/not.rb +23 -0
  25. data/lib/jschema/validator/one_of.rb +29 -0
  26. data/lib/jschema/validator/pattern.rb +36 -0
  27. data/lib/jschema/validator/properties.rb +106 -0
  28. data/lib/jschema/validator/required.rb +34 -0
  29. data/lib/jschema/validator/type.rb +57 -0
  30. data/lib/jschema/validator/unique_items.rb +27 -0
  31. data/test/assert_received.rb +15 -0
  32. data/test/string_length_validator_tests.rb +18 -0
  33. data/test/test_assert_received.rb +39 -0
  34. data/test/test_integration.rb +30 -0
  35. data/test/test_json_reference.rb +84 -0
  36. data/test/test_schema.rb +125 -0
  37. data/test/test_schema_ref.rb +11 -0
  38. data/test/test_validator.rb +29 -0
  39. data/test/validator/argument_is_array_of_schemas_tests.rb +22 -0
  40. data/test/validator/assertions.rb +56 -0
  41. data/test/validator/properties_limit_tests.rb +13 -0
  42. data/test/validator/schema_validation_helpers.rb +29 -0
  43. data/test/validator/test_all_of.rb +30 -0
  44. data/test/validator/test_any_of.rb +31 -0
  45. data/test/validator/test_dependencies.rb +106 -0
  46. data/test/validator/test_enum.rb +30 -0
  47. data/test/validator/test_format.rb +70 -0
  48. data/test/validator/test_items.rb +113 -0
  49. data/test/validator/test_max_items.rb +26 -0
  50. data/test/validator/test_max_length.rb +30 -0
  51. data/test/validator/test_max_properties.rb +29 -0
  52. data/test/validator/test_maximum.rb +58 -0
  53. data/test/validator/test_min_items.rb +27 -0
  54. data/test/validator/test_min_length.rb +30 -0
  55. data/test/validator/test_min_properties.rb +29 -0
  56. data/test/validator/test_minimum.rb +58 -0
  57. data/test/validator/test_multiple_of.rb +38 -0
  58. data/test/validator/test_not.rb +32 -0
  59. data/test/validator/test_one_of.rb +31 -0
  60. data/test/validator/test_pattern.rb +32 -0
  61. data/test/validator/test_properties.rb +136 -0
  62. data/test/validator/test_required.rb +30 -0
  63. data/test/validator/test_simple_validator.rb +100 -0
  64. data/test/validator/test_type.rb +97 -0
  65. data/test/validator/test_unique_items.rb +30 -0
  66. data/test/validator/validation_against_schemas_tests.rb +24 -0
  67. 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