schemacop 2.4.6 → 3.0.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.releaser_config +0 -1
  4. data/.rubocop.yml +25 -1
  5. data/.travis.yml +3 -1
  6. data/CHANGELOG.md +33 -0
  7. data/README.md +53 -710
  8. data/README_V2.md +775 -0
  9. data/README_V3.md +1197 -0
  10. data/Rakefile +8 -12
  11. data/VERSION +1 -1
  12. data/lib/schemacop.rb +35 -36
  13. data/lib/schemacop/base_schema.rb +37 -0
  14. data/lib/schemacop/railtie.rb +10 -0
  15. data/lib/schemacop/schema.rb +1 -60
  16. data/lib/schemacop/schema2.rb +22 -0
  17. data/lib/schemacop/schema3.rb +21 -0
  18. data/lib/schemacop/scoped_env.rb +25 -13
  19. data/lib/schemacop/v2.rb +25 -0
  20. data/lib/schemacop/{caster.rb → v2/caster.rb} +16 -2
  21. data/lib/schemacop/{collector.rb → v2/collector.rb} +5 -2
  22. data/lib/schemacop/{dupper.rb → v2/dupper.rb} +1 -1
  23. data/lib/schemacop/{field_node.rb → v2/field_node.rb} +4 -3
  24. data/lib/schemacop/v2/node.rb +142 -0
  25. data/lib/schemacop/{node_resolver.rb → v2/node_resolver.rb} +1 -1
  26. data/lib/schemacop/v2/node_supporting_field.rb +70 -0
  27. data/lib/schemacop/{node_supporting_type.rb → v2/node_supporting_type.rb} +8 -5
  28. data/lib/schemacop/{node_with_block.rb → v2/node_with_block.rb} +3 -2
  29. data/lib/schemacop/v2/root_node.rb +0 -0
  30. data/lib/schemacop/v2/validator/array_validator.rb +32 -0
  31. data/lib/schemacop/{validator → v2/validator}/boolean_validator.rb +1 -1
  32. data/lib/schemacop/v2/validator/float_validator.rb +7 -0
  33. data/lib/schemacop/v2/validator/hash_validator.rb +37 -0
  34. data/lib/schemacop/v2/validator/integer_validator.rb +7 -0
  35. data/lib/schemacop/{validator → v2/validator}/nil_validator.rb +1 -1
  36. data/lib/schemacop/v2/validator/number_validator.rb +21 -0
  37. data/lib/schemacop/v2/validator/object_validator.rb +29 -0
  38. data/lib/schemacop/v2/validator/string_validator.rb +39 -0
  39. data/lib/schemacop/{validator → v2/validator}/symbol_validator.rb +1 -1
  40. data/lib/schemacop/v3.rb +45 -0
  41. data/lib/schemacop/v3/all_of_node.rb +27 -0
  42. data/lib/schemacop/v3/any_of_node.rb +28 -0
  43. data/lib/schemacop/v3/array_node.rb +218 -0
  44. data/lib/schemacop/v3/boolean_node.rb +16 -0
  45. data/lib/schemacop/v3/combination_node.rb +45 -0
  46. data/lib/schemacop/v3/context.rb +17 -0
  47. data/lib/schemacop/v3/dsl_scope.rb +46 -0
  48. data/lib/schemacop/v3/global_context.rb +114 -0
  49. data/lib/schemacop/v3/hash_node.rb +258 -0
  50. data/lib/schemacop/v3/integer_node.rb +13 -0
  51. data/lib/schemacop/v3/is_not_node.rb +32 -0
  52. data/lib/schemacop/v3/node.rb +219 -0
  53. data/lib/schemacop/v3/node_registry.rb +49 -0
  54. data/lib/schemacop/v3/number_node.rb +18 -0
  55. data/lib/schemacop/v3/numeric_node.rb +76 -0
  56. data/lib/schemacop/v3/object_node.rb +40 -0
  57. data/lib/schemacop/v3/one_of_node.rb +28 -0
  58. data/lib/schemacop/v3/reference_node.rb +49 -0
  59. data/lib/schemacop/v3/result.rb +58 -0
  60. data/lib/schemacop/v3/string_node.rb +124 -0
  61. data/lib/schemacop/v3/symbol_node.rb +13 -0
  62. data/schemacop.gemspec +24 -27
  63. data/test/lib/test_helper.rb +152 -0
  64. data/test/schemas/nested/group.rb +6 -0
  65. data/test/schemas/user.rb +7 -0
  66. data/test/unit/schemacop/v2/casting_test.rb +120 -0
  67. data/test/unit/schemacop/v2/collector_test.rb +47 -0
  68. data/test/unit/schemacop/v2/custom_check_test.rb +95 -0
  69. data/test/unit/schemacop/v2/custom_if_test.rb +97 -0
  70. data/test/unit/schemacop/v2/defaults_test.rb +95 -0
  71. data/test/unit/schemacop/v2/empty_test.rb +16 -0
  72. data/test/unit/schemacop/v2/nil_dis_allow_test.rb +43 -0
  73. data/test/unit/schemacop/v2/node_resolver_test.rb +28 -0
  74. data/test/unit/schemacop/v2/short_forms_test.rb +351 -0
  75. data/test/unit/schemacop/v2/types_test.rb +88 -0
  76. data/test/unit/schemacop/v2/validator_array_test.rb +99 -0
  77. data/test/unit/schemacop/v2/validator_boolean_test.rb +17 -0
  78. data/test/unit/schemacop/v2/validator_float_test.rb +59 -0
  79. data/test/unit/schemacop/v2/validator_hash_test.rb +95 -0
  80. data/test/unit/schemacop/v2/validator_integer_test.rb +48 -0
  81. data/test/unit/schemacop/v2/validator_nil_test.rb +15 -0
  82. data/test/unit/schemacop/v2/validator_number_test.rb +62 -0
  83. data/test/unit/schemacop/v2/validator_object_test.rb +141 -0
  84. data/test/unit/schemacop/v2/validator_string_test.rb +78 -0
  85. data/test/unit/schemacop/v2/validator_symbol_test.rb +18 -0
  86. data/test/unit/schemacop/v3/all_of_node_test.rb +198 -0
  87. data/test/unit/schemacop/v3/any_of_node_test.rb +218 -0
  88. data/test/unit/schemacop/v3/array_node_test.rb +815 -0
  89. data/test/unit/schemacop/v3/boolean_node_test.rb +126 -0
  90. data/test/unit/schemacop/v3/global_context_test.rb +164 -0
  91. data/test/unit/schemacop/v3/hash_node_test.rb +884 -0
  92. data/test/unit/schemacop/v3/integer_node_test.rb +323 -0
  93. data/test/unit/schemacop/v3/is_not_node_test.rb +173 -0
  94. data/test/unit/schemacop/v3/node_test.rb +148 -0
  95. data/test/unit/schemacop/v3/number_node_test.rb +292 -0
  96. data/test/unit/schemacop/v3/object_node_test.rb +170 -0
  97. data/test/unit/schemacop/v3/one_of_node_test.rb +187 -0
  98. data/test/unit/schemacop/v3/reference_node_test.rb +351 -0
  99. data/test/unit/schemacop/v3/string_node_test.rb +334 -0
  100. data/test/unit/schemacop/v3/symbol_node_test.rb +75 -0
  101. metadata +157 -150
  102. data/doc/Schemacop.html +0 -146
  103. data/doc/Schemacop/ArrayValidator.html +0 -329
  104. data/doc/Schemacop/BooleanValidator.html +0 -145
  105. data/doc/Schemacop/Caster.html +0 -379
  106. data/doc/Schemacop/Collector.html +0 -787
  107. data/doc/Schemacop/Dupper.html +0 -214
  108. data/doc/Schemacop/Exceptions.html +0 -115
  109. data/doc/Schemacop/Exceptions/InvalidSchemaError.html +0 -124
  110. data/doc/Schemacop/Exceptions/ValidationError.html +0 -124
  111. data/doc/Schemacop/FieldNode.html +0 -421
  112. data/doc/Schemacop/FloatValidator.html +0 -158
  113. data/doc/Schemacop/HashValidator.html +0 -293
  114. data/doc/Schemacop/IntegerValidator.html +0 -158
  115. data/doc/Schemacop/NilValidator.html +0 -145
  116. data/doc/Schemacop/Node.html +0 -1438
  117. data/doc/Schemacop/NodeResolver.html +0 -258
  118. data/doc/Schemacop/NodeSupportingField.html +0 -590
  119. data/doc/Schemacop/NodeSupportingType.html +0 -612
  120. data/doc/Schemacop/NodeWithBlock.html +0 -289
  121. data/doc/Schemacop/NumberValidator.html +0 -232
  122. data/doc/Schemacop/ObjectValidator.html +0 -298
  123. data/doc/Schemacop/RootNode.html +0 -171
  124. data/doc/Schemacop/Schema.html +0 -699
  125. data/doc/Schemacop/StringValidator.html +0 -295
  126. data/doc/Schemacop/SymbolValidator.html +0 -145
  127. data/doc/ScopedEnv.html +0 -351
  128. data/doc/_index.html +0 -379
  129. data/doc/class_list.html +0 -51
  130. data/doc/css/common.css +0 -1
  131. data/doc/css/full_list.css +0 -58
  132. data/doc/css/style.css +0 -496
  133. data/doc/file.README.html +0 -833
  134. data/doc/file_list.html +0 -56
  135. data/doc/frames.html +0 -17
  136. data/doc/index.html +0 -833
  137. data/doc/inheritance.graphml +0 -524
  138. data/doc/inheritance.pdf +0 -825
  139. data/doc/js/app.js +0 -303
  140. data/doc/js/full_list.js +0 -216
  141. data/doc/js/jquery.js +0 -4
  142. data/doc/method_list.html +0 -587
  143. data/doc/top-level-namespace.html +0 -112
  144. data/lib/schemacop/node.rb +0 -139
  145. data/lib/schemacop/node_supporting_field.rb +0 -58
  146. data/lib/schemacop/root_node.rb +0 -4
  147. data/lib/schemacop/validator/array_validator.rb +0 -30
  148. data/lib/schemacop/validator/float_validator.rb +0 -5
  149. data/lib/schemacop/validator/hash_validator.rb +0 -35
  150. data/lib/schemacop/validator/integer_validator.rb +0 -5
  151. data/lib/schemacop/validator/number_validator.rb +0 -19
  152. data/lib/schemacop/validator/object_validator.rb +0 -27
  153. data/lib/schemacop/validator/string_validator.rb +0 -37
  154. data/test/casting_test.rb +0 -100
  155. data/test/collector_test.rb +0 -45
  156. data/test/custom_check_test.rb +0 -93
  157. data/test/custom_if_test.rb +0 -95
  158. data/test/defaults_test.rb +0 -93
  159. data/test/empty_test.rb +0 -14
  160. data/test/nil_dis_allow_test.rb +0 -41
  161. data/test/node_resolver_test.rb +0 -26
  162. data/test/short_forms_test.rb +0 -349
  163. data/test/test_helper.rb +0 -13
  164. data/test/types_test.rb +0 -84
  165. data/test/validator_array_test.rb +0 -97
  166. data/test/validator_boolean_test.rb +0 -15
  167. data/test/validator_float_test.rb +0 -57
  168. data/test/validator_hash_test.rb +0 -93
  169. data/test/validator_integer_test.rb +0 -46
  170. data/test/validator_nil_test.rb +0 -13
  171. data/test/validator_number_test.rb +0 -60
  172. data/test/validator_object_test.rb +0 -139
  173. data/test/validator_string_test.rb +0 -76
  174. data/test/validator_symbol_test.rb +0 -16
@@ -0,0 +1,323 @@
1
+ require 'test_helper'
2
+
3
+ module Schemacop
4
+ module V3
5
+ class IntegerNodeTest < V3Test
6
+ EXP_INVALID_TYPE = 'Invalid type, expected "integer".'.freeze
7
+
8
+ def test_basic
9
+ schema :integer
10
+
11
+ assert_json(type: :integer)
12
+
13
+ assert_validation 25
14
+ assert_validation(-14)
15
+ end
16
+
17
+ def test_hash
18
+ schema { int! :age }
19
+
20
+ assert_json(
21
+ type: :object,
22
+ properties: {
23
+ age: { type: :integer }
24
+ },
25
+ required: %i[age],
26
+ additionalProperties: false
27
+ )
28
+
29
+ assert_validation age: 30
30
+ end
31
+
32
+ def test_array
33
+ schema(:array) { int }
34
+
35
+ assert_json(
36
+ type: :array,
37
+ items: [
38
+ {
39
+ type: :integer
40
+ }
41
+ ],
42
+ additionalItems: false
43
+ )
44
+
45
+ assert_validation [30]
46
+ assert_validation [30, 42] do
47
+ error '/', 'Array has 2 items but must have exactly 1.'
48
+ end
49
+ assert_validation [30, '30'] do
50
+ error '/', 'Array has 2 items but must have exactly 1.'
51
+ end
52
+ end
53
+
54
+ def test_type
55
+ schema :integer
56
+
57
+ assert_json(
58
+ type: :integer
59
+ )
60
+
61
+ assert_validation 42.5 do
62
+ error '/', EXP_INVALID_TYPE
63
+ end
64
+
65
+ assert_validation '42.5' do
66
+ error '/', EXP_INVALID_TYPE
67
+ end
68
+
69
+ schema { int! :age }
70
+
71
+ assert_json(
72
+ type: :object,
73
+ properties: {
74
+ age: { type: :integer }
75
+ },
76
+ required: %i[age],
77
+ additionalProperties: false
78
+ )
79
+
80
+ assert_validation age: :foo do
81
+ error '/age', EXP_INVALID_TYPE
82
+ end
83
+
84
+ assert_validation age: '234' do
85
+ error '/age', EXP_INVALID_TYPE
86
+ end
87
+
88
+ assert_validation age: 10.0 do
89
+ error '/age', EXP_INVALID_TYPE
90
+ end
91
+
92
+ assert_validation age: 4r do
93
+ error '/age', EXP_INVALID_TYPE
94
+ end
95
+
96
+ assert_validation age: (4 + 0i) do
97
+ error '/age', EXP_INVALID_TYPE
98
+ end
99
+
100
+ assert_validation age: BigDecimal(5) do
101
+ error '/age', EXP_INVALID_TYPE
102
+ end
103
+ end
104
+
105
+ def test_minimum
106
+ schema :integer, minimum: 0
107
+
108
+ assert_json(
109
+ type: :integer,
110
+ minimum: 0
111
+ )
112
+
113
+ assert_validation 5
114
+ assert_validation 0
115
+ assert_validation(-1) do
116
+ error '/', 'Value must have a minimum of 0.'
117
+ end
118
+ end
119
+
120
+ def test_exclusive_minimum
121
+ schema :integer, exclusive_minimum: 0
122
+
123
+ assert_json(
124
+ type: :integer,
125
+ exclusiveMinimum: 0
126
+ )
127
+
128
+ assert_validation 5
129
+ assert_validation 1
130
+ assert_validation(0) do
131
+ error '/', 'Value must have an exclusive minimum of 0.'
132
+ end
133
+ assert_validation(-5) do
134
+ error '/', 'Value must have an exclusive minimum of 0.'
135
+ end
136
+ end
137
+
138
+ def test_maximum
139
+ schema :integer, maximum: 5
140
+
141
+ assert_json(
142
+ type: :integer,
143
+ maximum: 5
144
+ )
145
+
146
+ assert_validation 5
147
+ assert_validation 0
148
+ assert_validation(6) do
149
+ error '/', 'Value must have a maximum of 5.'
150
+ end
151
+ end
152
+
153
+ def test_exclusive_maximum
154
+ schema :integer, exclusive_maximum: 5
155
+
156
+ assert_json(
157
+ type: :integer,
158
+ exclusiveMaximum: 5
159
+ )
160
+
161
+ assert_validation 4
162
+ assert_validation 1
163
+ assert_validation(5) do
164
+ error '/', 'Value must have an exclusive maximum of 5.'
165
+ end
166
+ assert_validation(9) do
167
+ error '/', 'Value must have an exclusive maximum of 5.'
168
+ end
169
+ end
170
+
171
+ def test_multiple_of
172
+ schema :integer, multiple_of: 2
173
+
174
+ assert_json(
175
+ type: :integer,
176
+ multipleOf: 2
177
+ )
178
+
179
+ assert_validation(-4)
180
+ assert_validation(-2)
181
+ assert_validation(0)
182
+ assert_validation(2)
183
+ assert_validation(300)
184
+
185
+ assert_validation(5) do
186
+ error '/', 'Value must be a multiple of 2.'
187
+ end
188
+ end
189
+
190
+ def test_default
191
+ schema :integer, default: 5
192
+
193
+ assert_json(
194
+ type: :integer,
195
+ default: 5
196
+ )
197
+
198
+ assert_validation(nil)
199
+ assert_validation(50)
200
+ assert_validation(5.2) do
201
+ error '/', 'Invalid type, expected "integer".'
202
+ end
203
+
204
+ assert_cast(5, 5)
205
+ assert_cast(6, 6)
206
+ assert_cast(nil, 5)
207
+ end
208
+
209
+ # Helper function that checks for all the options if the option is
210
+ # an integer or something else, in which case it needs to raise
211
+ def validate_self_should_error(value_to_check)
212
+ assert_raises_with_message Exceptions::InvalidSchemaError,
213
+ 'Option "minimum" must be a "integer"' do
214
+ schema :integer, minimum: value_to_check
215
+ end
216
+
217
+ assert_raises_with_message Exceptions::InvalidSchemaError,
218
+ 'Option "maximum" must be a "integer"' do
219
+ schema :integer, maximum: value_to_check
220
+ end
221
+
222
+ assert_raises_with_message Exceptions::InvalidSchemaError,
223
+ 'Option "exclusive_minimum" must be a "integer"' do
224
+ schema :integer, exclusive_minimum: value_to_check
225
+ end
226
+
227
+ assert_raises_with_message Exceptions::InvalidSchemaError,
228
+ 'Option "exclusive_maximum" must be a "integer"' do
229
+ schema :integer, exclusive_maximum: value_to_check
230
+ end
231
+
232
+ assert_raises_with_message Exceptions::InvalidSchemaError,
233
+ 'Option "multiple_of" must be a "integer"' do
234
+ schema :integer, multiple_of: value_to_check
235
+ end
236
+ end
237
+
238
+ def test_validate_self
239
+ assert_raises_with_message Exceptions::InvalidSchemaError,
240
+ 'Option "minimum" can\'t be greater than "maximum".' do
241
+ schema :integer, minimum: 5, maximum: 4
242
+ end
243
+
244
+ assert_raises_with_message Exceptions::InvalidSchemaError,
245
+ 'Option "exclusive_minimum" can\'t be '\
246
+ 'greater than "exclusive_maximum".' do
247
+ schema :integer, exclusive_minimum: 5, exclusive_maximum: 4
248
+ end
249
+
250
+ assert_raises_with_message Exceptions::InvalidSchemaError,
251
+ 'Option "multiple_of" can\'t be 0.' do
252
+ schema :integer, multiple_of: 0
253
+ end
254
+
255
+ validate_self_should_error(1.0) # Float
256
+ validate_self_should_error(1r) # Rational
257
+ validate_self_should_error(1 + 0i) # Complex
258
+ validate_self_should_error(BigDecimal(5)) # BigDecimal
259
+ validate_self_should_error(Object.new)
260
+ validate_self_should_error(true)
261
+ validate_self_should_error(false)
262
+ validate_self_should_error('1')
263
+ validate_self_should_error('String')
264
+ end
265
+
266
+ def test_enum_schema
267
+ schema :integer, enum: [1, 2, 'foo', :bar, { qux: 42 }]
268
+
269
+ assert_json({
270
+ type: :integer,
271
+ enum: [1, 2, 'foo', :bar, { qux: 42 }]
272
+ })
273
+
274
+ assert_validation(nil)
275
+ assert_validation(1)
276
+
277
+ # Even we put those types in the enum, they need to fail the validations,
278
+ # as they are not integers
279
+ assert_validation('foo') do
280
+ error '/', 'Invalid type, expected "integer".'
281
+ end
282
+ assert_validation(:bar) do
283
+ error '/', 'Invalid type, expected "integer".'
284
+ end
285
+ assert_validation({ qux: 42 }) do
286
+ error '/', 'Invalid type, expected "integer".'
287
+ end
288
+
289
+ # This needs to fail as it is a number (float) and not an integer
290
+ assert_validation(4.2) do
291
+ error '/', 'Invalid type, expected "integer".'
292
+ end
293
+
294
+ # These need to fail validation, as they are not in the enum list
295
+ assert_validation(13) do
296
+ error '/', 'Value not included in enum [1, 2, "foo", :bar, {:qux=>42}].'
297
+ end
298
+ assert_validation(4) do
299
+ error '/', 'Value not included in enum [1, 2, "foo", :bar, {:qux=>42}].'
300
+ end
301
+ end
302
+
303
+ def test_with_generic_keywords
304
+ schema :integer, enum: [1, 'foo'],
305
+ title: 'Integer schema',
306
+ description: 'Integer schema holding generic keywords',
307
+ examples: [
308
+ 1
309
+ ]
310
+
311
+ assert_json({
312
+ type: :integer,
313
+ enum: [1, 'foo'],
314
+ title: 'Integer schema',
315
+ description: 'Integer schema holding generic keywords',
316
+ examples: [
317
+ 1
318
+ ]
319
+ })
320
+ end
321
+ end
322
+ end
323
+ end
@@ -0,0 +1,173 @@
1
+ require 'test_helper'
2
+
3
+ module Schemacop
4
+ module V3
5
+ class IsNotNodeTest < V3Test
6
+ def test_optional
7
+ schema :is_not do
8
+ int minimum: 5
9
+ end
10
+
11
+ assert_json(
12
+ not: { type: :integer, minimum: 5 }
13
+ )
14
+
15
+ assert_validation(nil)
16
+ assert_validation({})
17
+ assert_validation(:foo)
18
+ assert_validation(4)
19
+ assert_validation(8) do
20
+ error '/', 'Must not match schema: {"type"=>"integer", "minimum"=>5}.'
21
+ end
22
+ end
23
+
24
+ def test_required
25
+ schema :is_not, required: true do
26
+ int minimum: 5
27
+ end
28
+
29
+ assert_json(
30
+ not: { type: :integer, minimum: 5 }
31
+ )
32
+
33
+ assert_validation(:foo)
34
+ assert_validation(4)
35
+ assert_validation(nil) do
36
+ error '/', 'Value must be given.'
37
+ end
38
+ assert_validation({})
39
+ assert_validation(8) do
40
+ error '/', 'Must not match schema: {"type"=>"integer", "minimum"=>5}.'
41
+ end
42
+ end
43
+
44
+ def test_enum_schema
45
+ schema :is_not do
46
+ str enum: ['bar', 'qux', 123, :faz]
47
+ end
48
+
49
+ assert_json({
50
+ not: {
51
+ type: :string,
52
+ enum: ['bar', 'qux', 123, :faz]
53
+ }
54
+ })
55
+ assert_validation(nil)
56
+ assert_validation({ foo: 'bar' })
57
+ assert_validation('baz')
58
+ assert_validation(123)
59
+ assert_validation(:faz)
60
+
61
+ # Needs to fail the validation, as the value is included in the enum
62
+ # and a string (which the not turns into "failing the validation")
63
+ assert_validation('bar') do
64
+ error '/', 'Must not match schema: {"type"=>"string", "enum"=>["bar", "qux", 123, "faz"]}.'
65
+ end
66
+
67
+ assert_validation('qux') do
68
+ error '/', 'Must not match schema: {"type"=>"string", "enum"=>["bar", "qux", 123, "faz"]}.'
69
+ end
70
+ end
71
+
72
+ def test_with_generic_keywords
73
+ schema :is_not do
74
+ str enum: ['bar', 'qux', 123, :faz], title: 'Short title', description: 'Longer description', examples: ['foo']
75
+ end
76
+
77
+ assert_json({
78
+ not: {
79
+ type: :string,
80
+ enum: ['bar', 'qux', 123, :faz],
81
+ title: 'Short title',
82
+ description: 'Longer description',
83
+ examples: ['foo']
84
+ }
85
+ })
86
+
87
+ # rubocop:disable Layout/LineLength
88
+
89
+ # Needs to fail the validation, as the value is included in the enum
90
+ # and a string (which the not turns into "failing the validation")
91
+ assert_validation('bar') do
92
+ error '/', 'Must not match schema: {"type"=>"string", "title"=>"Short title", "examples"=>["foo"], "description"=>"Longer description", "enum"=>["bar", "qux", 123, "faz"]}.'
93
+ end
94
+
95
+ assert_validation('qux') do
96
+ error '/', 'Must not match schema: {"type"=>"string", "title"=>"Short title", "examples"=>["foo"], "description"=>"Longer description", "enum"=>["bar", "qux", 123, "faz"]}.'
97
+ end
98
+
99
+ # rubocop:enable Layout/LineLength
100
+ end
101
+
102
+ def test_not_object_json
103
+ schema :is_not do
104
+ hsh do
105
+ int! :foo
106
+ str! :bar
107
+ add :integer
108
+ end
109
+ end
110
+
111
+ assert_json(
112
+ not: {
113
+ properties: {
114
+ foo: {
115
+ type: :integer
116
+ },
117
+ bar: {
118
+ type: :string
119
+ }
120
+ },
121
+ additionalProperties: {
122
+ type: :integer
123
+ },
124
+ required: %i[foo bar],
125
+ type: :object
126
+ }
127
+ )
128
+ end
129
+
130
+ def test_not_array
131
+ schema :is_not do
132
+ ary do
133
+ list :integer
134
+ end
135
+ end
136
+
137
+ assert_validation(nil)
138
+ assert_validation([]) do
139
+ error '/', 'Must not match schema: {"type"=>"array", "items"=>{"type"=>"integer"}}.'
140
+ end
141
+ assert_validation('foo')
142
+ assert_validation(['foo'])
143
+ assert_validation([1]) do
144
+ error '/', 'Must not match schema: {"type"=>"array", "items"=>{"type"=>"integer"}}.'
145
+ end
146
+ end
147
+
148
+ def test_invalid_schema
149
+ assert_raises_with_message Exceptions::InvalidSchemaError,
150
+ 'Node "is_not" only allows exactly one item.' do
151
+ schema :is_not do
152
+ int
153
+ str
154
+ end
155
+ end
156
+ end
157
+
158
+ def test_casting
159
+ schema :is_not do
160
+ str format: :date
161
+ end
162
+
163
+ assert_validation(nil)
164
+ assert_validation([])
165
+ assert_validation(:bar)
166
+
167
+ assert_cast([], [])
168
+ assert_cast(1, 1)
169
+ assert_cast({ foo: :bar, baz: 'Str' }, { foo: :bar, baz: 'Str' })
170
+ end
171
+ end
172
+ end
173
+ end