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,125 @@
1
+ require 'minitest/autorun'
2
+ require 'jschema'
3
+
4
+ require_relative 'assert_received'
5
+
6
+ class TestSchema < Minitest::Test
7
+ def test_empty_schema
8
+ JSchema::Validator.stub :build, [] do
9
+ empty_schema = JSchema::Schema.build
10
+ assert empty_schema.valid?('test')
11
+ end
12
+ end
13
+
14
+ def test_passing_validation
15
+ stub_validators(true) do |schema|
16
+ assert schema.valid?('instance')
17
+ assert_empty schema.validate('instance')
18
+ end
19
+ end
20
+
21
+ def test_failing_validation
22
+ stub_validators(false) do |schema|
23
+ refute schema.valid?('instance')
24
+ refute_empty schema.validate('instance')
25
+ end
26
+ end
27
+
28
+ def test_default_schema_uri
29
+ assert_equal URI('#'), schema_uri
30
+ end
31
+
32
+ def test_schema_uri_when_parent_is_not_specified
33
+ assert_equal URI('test'), schema_uri('test')
34
+ end
35
+
36
+ def test_schema_uri_when_parent_uri_is_absolute
37
+ uri = schema_uri('test', 'http://example.com/')
38
+ assert_equal URI('http://example.com/test'), uri
39
+ end
40
+
41
+ def test_schema_uri_when_parent_uri_is_relative
42
+ assert_raises(JSchema::InvalidSchema) do
43
+ schema_uri('relative/', 'relative/')
44
+ end
45
+ end
46
+
47
+ def test_schema_uri_when_both_parent_and_schema_uri_are_absolute
48
+ schema_id = 'http://example.com/'
49
+ parent_id = 'http://localhost/'
50
+ uri = schema_uri(schema_id, parent_id)
51
+ assert_equal URI(schema_id), uri
52
+ end
53
+
54
+ def test_schema_uri_when_ids_are_not_specified
55
+ assert_equal URI('#/child'), schema_uri(nil, nil, 'child')
56
+ end
57
+
58
+ def test_that_schema_uri_is_normalized
59
+ uri = schema_uri('etc/../path', 'http://Example.com')
60
+ assert_equal 'http://example.com/path', uri.to_s
61
+ end
62
+
63
+ def test_json_refenrece
64
+ schema = Object.new
65
+ JSchema::SchemaRef.stub :new, schema do
66
+ schema_ref = JSchema::Schema.build('$ref' => '#/sch')
67
+ assert_equal schema_ref, schema
68
+ end
69
+ end
70
+
71
+ def test_storing_schema_in_registry
72
+ sch = Object.new
73
+ JSchema::Schema.stub :new, sch do
74
+ assert_received JSchema::JSONReference, :register_schema, [sch] do
75
+ JSchema::Schema.build
76
+ end
77
+ end
78
+ end
79
+
80
+ # TODO: Make it isolated.
81
+ def test_definitions
82
+ schema_def_uri = '#/definitions/schema1'
83
+ schema = JSchema::Schema.build('definitions' => { 'schema1' => {} })
84
+ definition = JSchema::SchemaRef.new(schema_def_uri, schema)
85
+ assert_equal URI(schema_def_uri), definition.uri
86
+ end
87
+
88
+ def test_that_exception_is_raised_when_schema_version_is_not_supported
89
+ assert_raises(JSchema::InvalidSchema) do
90
+ JSchema::Schema.build('$schema' => 'unsupported')
91
+ end
92
+ end
93
+
94
+ def test_to_s
95
+ schema = JSchema::Schema.build
96
+ assert_equal '#', schema.to_s
97
+ end
98
+
99
+ def test_simplified_syntax
100
+ assert_instance_of JSchema::Schema, JSchema.build
101
+ end
102
+
103
+ private
104
+
105
+ def stub_validators(ret_val)
106
+ validator = validator_stub.new(ret_val)
107
+ JSchema::Validator.stub :build, [validator] do
108
+ yield JSchema::Schema.build
109
+ end
110
+ end
111
+
112
+ def validator_stub
113
+ Struct.new(:valid) do
114
+ def validate(_)
115
+ valid ? nil : ['error']
116
+ end
117
+ end
118
+ end
119
+
120
+ def schema_uri(schema_id = nil, parent_id = nil, id = nil)
121
+ parent = JSchema::Schema.build('id' => parent_id) if parent_id || id
122
+ child = JSchema::Schema.build({ 'id' => schema_id }, parent, id)
123
+ child.uri
124
+ end
125
+ end
@@ -0,0 +1,11 @@
1
+ require 'minitest/autorun'
2
+ require 'jschema'
3
+
4
+ class TestSchemaRef < Minitest::Test
5
+ def test_that_schema_ref_acts_like_schema
6
+ schema = JSchema::Schema.build
7
+ JSchema::JSONReference.stub :dereference, schema do
8
+ assert_equal JSchema::SchemaRef.new(schema.uri, nil), schema
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ require 'minitest/autorun'
2
+ require 'jschema'
3
+
4
+ class TestValidatorInstantiation < Minitest::Test
5
+ def test_creating_of_validators
6
+ return_validator = Object.new
7
+ assert_equal [return_validator], build_validators(return_validator)
8
+ end
9
+
10
+ def test_parsing_of_empty_schema
11
+ assert_empty build_validators(nil)
12
+ end
13
+
14
+ private
15
+
16
+ def build_validators(return_validator)
17
+ schema = { 'keyword' => 'arg' }
18
+ parent_schema = Object.new
19
+ validator_class = MiniTest::Mock.new
20
+ validator_class.expect :build, return_validator, [schema, parent_schema]
21
+ result = JSchema::Validator.stub :constants, [:Test] do
22
+ JSchema::Validator.stub :const_get, validator_class do
23
+ JSchema::Validator.build(schema, parent_schema)
24
+ end
25
+ end
26
+ validator_class.verify
27
+ result
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ module ArgumentIsArrayOfSchemasTests
2
+ def test_that_argument_is_array
3
+ assert_raises(JSchema::InvalidSchema) { validator(0) }
4
+ end
5
+
6
+ def test_that_argument_is_not_empty_array
7
+ assert_raises(JSchema::InvalidSchema) { validator [] }
8
+ end
9
+
10
+ def test_that_argument_contains_only_unique_values
11
+ assert_raises(JSchema::InvalidSchema) { validator [{}, {}] }
12
+ end
13
+
14
+ def test_that_argument_contains_only_valid_json_schemas
15
+ assert_raises(JSchema::InvalidSchema) do
16
+ raises_error = ->(*_) { fail JSchema::InvalidSchema }
17
+ JSchema::Schema.stub :build, raises_error do
18
+ validator [{}]
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,56 @@
1
+ module Assertions
2
+ def assert_raises_unless(keyword, *valid_types)
3
+ basic_types = {
4
+ array: [], boolean: true, integer: 1,
5
+ number: 1.2, object: {}, string: 'test'
6
+ }
7
+
8
+ invalid_values = basic_types.select do |type, _|
9
+ !valid_types.include?(type)
10
+ end.values
11
+
12
+ assert_raises_for_values keyword, invalid_values
13
+ end
14
+
15
+ def assert_raises_unless_schema(keyword, value = {})
16
+ raises_error = ->(*_) { fail JSchema::InvalidSchema }
17
+ JSchema::Schema.stub :build, raises_error do
18
+ assert_raises_for_values keyword, [value]
19
+ end
20
+ end
21
+
22
+ def assert_raises_unless_schema_array(keyword)
23
+ assert_raises_unless_schema keyword, [{}]
24
+ end
25
+
26
+ def assert_raises_unless_string_array(keyword)
27
+ invalid_values = [0, [], ['test', 'test'], [0]]
28
+ assert_raises_for_values keyword, invalid_values
29
+ end
30
+
31
+ def assert_raises_unless_non_empty_array(keyword)
32
+ invalid_values = [0, [], ['test', 'test']]
33
+ assert_raises_for_values keyword, invalid_values
34
+ end
35
+
36
+ def assert_raises_unless_non_negative_integer(keyword)
37
+ assert_raises_unless keyword, :integer
38
+ assert_raises_for_values keyword, [-1]
39
+ end
40
+
41
+ def assert_raises_for_values(keyword, invalid_values)
42
+ invalid_values.each do |invalid_value|
43
+ assert_raises(JSchema::InvalidSchema) do
44
+ build_from_schema keyword => invalid_value
45
+ end
46
+ end
47
+ end
48
+
49
+ def validator(*args)
50
+ validator_class.new(*args, nil)
51
+ end
52
+
53
+ def build_from_schema(schema = {})
54
+ validator_class.build(schema, nil)
55
+ end
56
+ end
@@ -0,0 +1,13 @@
1
+ module PropertiesLimitTests
2
+ def test_that_argument_is_an_integer
3
+ assert_raises(JSchema::InvalidSchema) { validator 'string' }
4
+ end
5
+
6
+ def test_that_argument_can_be_big_integer
7
+ validator 2**64
8
+ end
9
+
10
+ def test_that_argument_is_not_negative
11
+ assert_raises(JSchema::InvalidSchema) { validator(-1) }
12
+ end
13
+ end
@@ -0,0 +1,29 @@
1
+ module SchemaValidationHelpers
2
+ class SchemaStub
3
+ def initialize(validation_results)
4
+ @validation_results = validation_results.cycle
5
+ end
6
+
7
+ def valid?(instance)
8
+ validate(instance).empty?
9
+ end
10
+
11
+ def validate(instance)
12
+ result = @validation_results.next
13
+ result ? [] : ['error']
14
+ end
15
+ end
16
+
17
+ def stub_schema_validations(*validation_results)
18
+ schema = SchemaStub.new(validation_results)
19
+ JSchema::Schema.stub :build, schema do
20
+ yield
21
+ end
22
+ end
23
+
24
+ def generate_schema
25
+ @id ||= 0
26
+ @id += 1
27
+ { 'id' => @id.to_s }
28
+ end
29
+ end
@@ -0,0 +1,30 @@
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 TestAllOf < Minitest::Test
9
+ include Assertions
10
+ include SchemaValidationHelpers
11
+ include ValidationAgainstSchemasTests
12
+
13
+ def test_passing_validation_against_schemas
14
+ stub_schema_validations(true, true) do
15
+ assert validator([generate_schema, generate_schema]).valid?('test')
16
+ end
17
+ end
18
+
19
+ def test_failing_validation_against_schemas
20
+ stub_schema_validations(false, true) do
21
+ refute validator([generate_schema, generate_schema]).valid?('test')
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def validator_class
28
+ JSchema::Validator::AllOf
29
+ end
30
+ 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 TestAnyOf < Minitest::Test
9
+ include Assertions
10
+ include SchemaValidationHelpers
11
+ include ValidationAgainstSchemasTests
12
+
13
+ def test_passing_validation_agaist_schemas
14
+ stub_schema_validations(true, false, true) do
15
+ schema = [generate_schema, generate_schema, generate_schema]
16
+ assert validator(schema).valid?('test')
17
+ end
18
+ end
19
+
20
+ def test_failing_validation_against_schemas
21
+ stub_schema_validations(false, false) 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::AnyOf
30
+ end
31
+ end
@@ -0,0 +1,106 @@
1
+ require 'minitest/autorun'
2
+ require 'jschema'
3
+
4
+ require_relative 'assertions'
5
+ require_relative 'schema_validation_helpers'
6
+
7
+ class TestDependencies < Minitest::Test
8
+ include Assertions
9
+ include SchemaValidationHelpers
10
+
11
+ def test_that_argument_is_an_object
12
+ assert_raises_unless 'dependencies', :object
13
+ end
14
+
15
+ def test_that_each_value_of_argument_object_is_either_an_object_or_an_array
16
+ assert_raises(JSchema::InvalidSchema) do
17
+ validator('test' => 0)
18
+ end
19
+ end
20
+
21
+ def test_that_property_dependency_has_at_least_one_element
22
+ assert_raises(JSchema::InvalidSchema) do
23
+ validator('test' => [])
24
+ end
25
+ end
26
+
27
+ def test_that_property_dependency_includes_only_strings
28
+ assert_raises(JSchema::InvalidSchema) do
29
+ validator('test' => [0])
30
+ end
31
+ end
32
+
33
+ def test_that_property_dependency_containt_uniq_elements
34
+ assert_raises(JSchema::InvalidSchema) do
35
+ validator('test' => ['property', 'property'])
36
+ end
37
+ end
38
+
39
+ def test_that_argument_can_contain_schema_and_property_dependencies
40
+ validator('schema_dependency' => {}, 'property_dependency' => ['test'])
41
+ end
42
+
43
+ def test_passing_schema_dependency_validation
44
+ stub_schema_validations(true) do
45
+ assert schema_dependencies_validator.valid?('test' => 0)
46
+ end
47
+ end
48
+
49
+ def test_failing_schema_dependency_validation
50
+ stub_schema_validations(false) do
51
+ refute schema_dependencies_validator.valid?('test' => 0)
52
+ end
53
+ end
54
+
55
+ def test_passing_validation_when_instance_has_no_dependencies
56
+ stub_schema_validations(false) do
57
+ assert schema_dependencies_validator.valid?('other' => 0)
58
+ end
59
+ end
60
+
61
+ def test_passing_property_dependency_validation
62
+ expect_required_validation(true) do
63
+ assert property_dependencies_validator.valid?('test' => 0)
64
+ end
65
+ end
66
+
67
+ def test_failing_property_dependency_validation
68
+ expect_required_validation(false) do
69
+ refute property_dependencies_validator.valid?('test' => 0)
70
+ end
71
+ end
72
+
73
+ def test_passing_property_dependency_validation_no_dependencies
74
+ expect_required_validation(false) do
75
+ assert property_dependencies_validator.valid?('other' => 0)
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def validator_class
82
+ JSchema::Validator::Dependencies
83
+ end
84
+
85
+ def schema_dependencies_validator
86
+ validator('test' => {})
87
+ end
88
+
89
+ def property_dependencies_validator
90
+ validator('test' => ['required_property'])
91
+ end
92
+
93
+ def expect_required_validation(valid)
94
+ validator_stub =
95
+ Struct.new(:valid) do
96
+ def validate(_)
97
+ valid ? [] : ['error']
98
+ end
99
+ end
100
+
101
+ validator = validator_stub.new(valid)
102
+ JSchema::Validator::Required.stub :new, validator do
103
+ yield
104
+ end
105
+ end
106
+ end