jschema 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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