seomoz-json-schema 1.0.1

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 (49) hide show
  1. data/README.textile +216 -0
  2. data/lib/json-schema.rb +13 -0
  3. data/lib/json-schema/attributes/additionalitems.rb +23 -0
  4. data/lib/json-schema/attributes/additionalproperties.rb +39 -0
  5. data/lib/json-schema/attributes/dependencies.rb +30 -0
  6. data/lib/json-schema/attributes/disallow.rb +11 -0
  7. data/lib/json-schema/attributes/divisibleby.rb +16 -0
  8. data/lib/json-schema/attributes/enum.rb +24 -0
  9. data/lib/json-schema/attributes/extends.rb +14 -0
  10. data/lib/json-schema/attributes/format.rb +113 -0
  11. data/lib/json-schema/attributes/items.rb +25 -0
  12. data/lib/json-schema/attributes/maxdecimal.rb +15 -0
  13. data/lib/json-schema/attributes/maximum.rb +15 -0
  14. data/lib/json-schema/attributes/maximum_inclusive.rb +15 -0
  15. data/lib/json-schema/attributes/maxitems.rb +12 -0
  16. data/lib/json-schema/attributes/maxlength.rb +14 -0
  17. data/lib/json-schema/attributes/minimum.rb +15 -0
  18. data/lib/json-schema/attributes/minimum_inclusive.rb +15 -0
  19. data/lib/json-schema/attributes/minitems.rb +12 -0
  20. data/lib/json-schema/attributes/minlength.rb +14 -0
  21. data/lib/json-schema/attributes/pattern.rb +15 -0
  22. data/lib/json-schema/attributes/patternproperties.rb +23 -0
  23. data/lib/json-schema/attributes/properties.rb +23 -0
  24. data/lib/json-schema/attributes/properties_optional.rb +23 -0
  25. data/lib/json-schema/attributes/ref.rb +55 -0
  26. data/lib/json-schema/attributes/type.rb +71 -0
  27. data/lib/json-schema/attributes/uniqueitems.rb +16 -0
  28. data/lib/json-schema/schema.rb +50 -0
  29. data/lib/json-schema/uri/file.rb +32 -0
  30. data/lib/json-schema/uri/uuid.rb +285 -0
  31. data/lib/json-schema/validator.rb +425 -0
  32. data/lib/json-schema/validators/draft1.rb +32 -0
  33. data/lib/json-schema/validators/draft2.rb +33 -0
  34. data/lib/json-schema/validators/draft3.rb +38 -0
  35. data/resources/draft-01.json +155 -0
  36. data/resources/draft-02.json +166 -0
  37. data/resources/draft-03.json +174 -0
  38. data/test/data/bad_data_1.json +3 -0
  39. data/test/data/good_data_1.json +3 -0
  40. data/test/schemas/good_schema_1.json +10 -0
  41. data/test/schemas/good_schema_2.json +10 -0
  42. data/test/test_extended_schema.rb +68 -0
  43. data/test/test_files.rb +35 -0
  44. data/test/test_full_validation.rb +38 -0
  45. data/test/test_jsonschema_draft1.rb +703 -0
  46. data/test/test_jsonschema_draft2.rb +775 -0
  47. data/test/test_jsonschema_draft3.rb +972 -0
  48. data/test/test_schema_validation.rb +43 -0
  49. metadata +137 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ "a" : "poop"
3
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "a" : 5
3
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema" : "http://json-schema.org/draft-03/schema#",
3
+ "type" : "object",
4
+ "properties" : {
5
+ "a" : {
6
+ "type" : "integer",
7
+ "required" : true
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema" : "http://json-schema.org/draft-03/schema#",
3
+ "type" : "object",
4
+ "properties" : {
5
+ "b" : {
6
+ "required" : true,
7
+ "$ref" : "good_schema_1.json"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,68 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class BitwiseAndAttribute < JSON::Schema::Attribute
5
+ def self.validate(current_schema, data, fragments, validator, options = {})
6
+ if data.is_a?(Integer) && data & current_schema.schema['bitwise-and'].to_i == 0
7
+ message = "The property '#{build_fragment(fragments)}' did not evaluate to true when bitwise-AND'd with #{current_schema.schema['bitwise-or']}"
8
+ raise JSON::Schema::ValidationError.new(message, fragments, current_schema)
9
+ end
10
+ end
11
+ end
12
+
13
+ class ExtendedSchema < JSON::Schema::Validator
14
+ def initialize
15
+ super
16
+ extend_schema_definition("http://json-schema.org/draft-03/schema#")
17
+ @attributes["bitwise-and"] = BitwiseAndAttribute
18
+ @uri = URI.parse("http://test.com/test.json")
19
+ end
20
+
21
+ JSON::Validator.register_validator(self.new)
22
+ end
23
+
24
+ class JSONSchemaTestExtendedSchema < Test::Unit::TestCase
25
+ def test_schema_from_file
26
+ schema = {
27
+ "$schema" => "http://json-schema.org/draft-03/schema#",
28
+ "properties" => {
29
+ "a" => {
30
+ "bitwise-and" => 1
31
+ },
32
+ "b" => {
33
+ "type" => "string"
34
+ }
35
+ }
36
+ }
37
+
38
+ data = {"a" => 0, "b" => "taco"}
39
+ assert(JSON::Validator.validate(schema,data))
40
+ data = {"a" => 1, "b" => "taco"}
41
+ assert(JSON::Validator.validate(schema,data))
42
+ data = {"a" => 1, "b" => 5}
43
+ assert(!JSON::Validator.validate(schema,data))
44
+
45
+ schema = {
46
+ "$schema" => "http://test.com/test.json",
47
+ "properties" => {
48
+ "a" => {
49
+ "bitwise-and" => 1
50
+ },
51
+ "b" => {
52
+ "type" => "string"
53
+ }
54
+ }
55
+ }
56
+
57
+ data = {
58
+ "a" => 0
59
+ }
60
+
61
+ data = {"a" => 1, "b" => "taco"}
62
+ assert(JSON::Validator.validate(schema,data))
63
+ data = {"a" => 0, "b" => "taco"}
64
+ assert(!JSON::Validator.validate(schema,data))
65
+ data = {"a" => 1, "b" => 5}
66
+ assert(!JSON::Validator.validate(schema,data))
67
+ end
68
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONSchemaTest < Test::Unit::TestCase
5
+
6
+ #
7
+ # These tests are ONLY run if there is an appropriate JSON backend parser available
8
+ #
9
+
10
+ def test_schema_from_file
11
+ data = {"a" => 5}
12
+ assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
13
+ data = {"a" => "bad"}
14
+ assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
15
+ end
16
+
17
+ def test_data_from_file
18
+ schema = {"type" => "object", "properties" => {"a" => {"type" => "integer"}}}
19
+ assert(JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/good_data_1.json")))
20
+ assert(!JSON::Validator.validate(schema,File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
21
+ end
22
+
23
+ def test_both_from_file
24
+ assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),File.join(File.dirname(__FILE__),"data/good_data_1.json")))
25
+ assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),File.join(File.dirname(__FILE__),"data/bad_data_1.json")))
26
+ end
27
+
28
+ def test_file_ref
29
+ data = {"b" => {"a" => 5}}
30
+ assert(JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_2.json"),data))
31
+
32
+ data = {"b" => {"a" => "boo"}}
33
+ assert(!JSON::Validator.validate(File.join(File.dirname(__FILE__),"schemas/good_schema_1.json"),data))
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONFullValidation < Test::Unit::TestCase
5
+
6
+ def test_full_validation
7
+ data = {"b" => {"a" => 5}}
8
+ schema = {
9
+ "$schema" => "http://json-schema.org/draft-03/schema#",
10
+ "type" => "object",
11
+ "properties" => {
12
+ "b" => {
13
+ "required" => true
14
+ }
15
+ }
16
+ }
17
+
18
+ errors = JSON::Validator.fully_validate(schema,data)
19
+ assert(errors.empty?)
20
+
21
+ data = {"c" => 5}
22
+ schema = {
23
+ "$schema" => "http://json-schema.org/draft-03/schema#",
24
+ "type" => "object",
25
+ "properties" => {
26
+ "b" => {
27
+ "required" => true
28
+ },
29
+ "c" => {
30
+ "type" => "string"
31
+ }
32
+ }
33
+ }
34
+
35
+ errors = JSON::Validator.fully_validate(schema,data)
36
+ assert(errors.length == 2)
37
+ end
38
+ end
@@ -0,0 +1,703 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/json-schema'
3
+
4
+ class JSONSchemaDraft1Test < Test::Unit::TestCase
5
+ def test_types
6
+ # Set up the default datatype
7
+ schema = {
8
+ "properties" => {
9
+ "a" => {}
10
+ }
11
+ }
12
+ data = {
13
+ "a" => nil
14
+ }
15
+
16
+ # Test integers
17
+ schema["properties"]["a"]["type"] = "integer"
18
+ data["a"] = 5
19
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
20
+
21
+ data["a"] = 5.2
22
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
23
+
24
+ data['a'] = 'string'
25
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
26
+
27
+ data['a'] = true
28
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
29
+
30
+
31
+ # Test numbers
32
+ schema["properties"]["a"]["type"] = "number"
33
+ data["a"] = 5
34
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
35
+
36
+ data["a"] = 5.2
37
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
38
+
39
+ data['a'] = 'string'
40
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
41
+
42
+ data['a'] = true
43
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
44
+
45
+
46
+ # Test strings
47
+ schema["properties"]["a"]["type"] = "string"
48
+ data["a"] = 5
49
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
50
+
51
+ data["a"] = 5.2
52
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
53
+
54
+ data['a'] = 'string'
55
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
56
+
57
+ data['a'] = true
58
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
59
+
60
+
61
+ # Test booleans
62
+ schema["properties"]["a"]["type"] = "boolean"
63
+ data["a"] = 5
64
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
65
+
66
+ data["a"] = 5.2
67
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
68
+
69
+ data['a'] = 'string'
70
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
71
+
72
+ data['a'] = true
73
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
74
+
75
+ data['a'] = false
76
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
77
+
78
+
79
+ # Test object
80
+ schema["properties"]["a"]["type"] = "object"
81
+ data["a"] = {}
82
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
83
+
84
+ data["a"] = 5.2
85
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
86
+
87
+ data['a'] = 'string'
88
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
89
+
90
+ data['a'] = true
91
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
92
+
93
+
94
+ # Test array
95
+ schema["properties"]["a"]["type"] = "array"
96
+ data["a"] = []
97
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
98
+
99
+ data["a"] = 5.2
100
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
101
+
102
+ data['a'] = 'string'
103
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
104
+
105
+ data['a'] = true
106
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
107
+
108
+
109
+ # Test null
110
+ schema["properties"]["a"]["type"] = "null"
111
+ data["a"] = nil
112
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
113
+
114
+ data["a"] = 5.2
115
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
116
+
117
+ data['a'] = 'string'
118
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
119
+
120
+ data['a'] = true
121
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
122
+
123
+
124
+ # Test any
125
+ schema["properties"]["a"]["type"] = "any"
126
+ data["a"] = 5
127
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
128
+
129
+ data["a"] = 5.2
130
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
131
+
132
+ data['a'] = 'string'
133
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
134
+
135
+ data['a'] = true
136
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
137
+
138
+
139
+ # Test a union type
140
+ schema["properties"]["a"]["type"] = ["integer","string"]
141
+ data["a"] = 5
142
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
143
+
144
+ data["a"] = 'boo'
145
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
146
+
147
+ data["a"] = false
148
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
149
+
150
+ # Test a union type with schemas
151
+ schema["properties"]["a"]["type"] = [{ "type" => "string" }, {"type" => "object", "properties" => {"b" => {"type" => "integer"}}}]
152
+
153
+ data["a"] = "test"
154
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
155
+
156
+ data["a"] = 5
157
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
158
+
159
+ data["a"] = {"b" => 5}
160
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
161
+
162
+ data["a"] = {"b" => "taco"}
163
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
164
+ end
165
+
166
+
167
+
168
+ def test_optional
169
+ # Set up the default datatype
170
+ schema = {
171
+ "properties" => {
172
+ "a" => {"type" => "string"}
173
+ }
174
+ }
175
+ data = {}
176
+
177
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
178
+ data['a'] = "Hello"
179
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
180
+
181
+ schema = {
182
+ "properties" => {
183
+ "a" => {"type" => "integer", "optional" => "true"}
184
+ }
185
+ }
186
+
187
+ data = {}
188
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
189
+
190
+ end
191
+
192
+
193
+
194
+ def test_minimum
195
+ # Set up the default datatype
196
+ schema = {
197
+ "properties" => {
198
+ "a" => {"minimum" => 5}
199
+ }
200
+ }
201
+
202
+ data = {
203
+ "a" => nil
204
+ }
205
+
206
+
207
+ # Test an integer
208
+ data["a"] = 5
209
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
210
+
211
+ data["a"] = 4
212
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
213
+
214
+ # Test a float
215
+ data["a"] = 5.0
216
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
217
+
218
+ data["a"] = 4.9
219
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
220
+
221
+ # Test a non-number
222
+ data["a"] = "a string"
223
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
224
+
225
+ # Test exclusiveMinimum
226
+ schema["properties"]["a"]["minimumCanEqual"] = false
227
+
228
+ data["a"] = 6
229
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
230
+
231
+ data["a"] = 5
232
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
233
+
234
+ # Test with float
235
+ data["a"] = 5.00000001
236
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
237
+
238
+ data["a"] = 5.0
239
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
240
+ end
241
+
242
+
243
+
244
+ def test_maximum
245
+ # Set up the default datatype
246
+ schema = {
247
+ "properties" => {
248
+ "a" => {"maximum" => 5}
249
+ }
250
+ }
251
+
252
+ data = {
253
+ "a" => nil
254
+ }
255
+
256
+
257
+ # Test an integer
258
+ data["a"] = 5
259
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
260
+
261
+ data["a"] = 6
262
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
263
+
264
+ # Test a float
265
+ data["a"] = 5.0
266
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
267
+
268
+ data["a"] = 5.1
269
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
270
+
271
+ # Test a non-number
272
+ data["a"] = "a string"
273
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
274
+
275
+ # Test exclusiveMinimum
276
+ schema["properties"]["a"]["maximumCanEqual"] = false
277
+
278
+ data["a"] = 4
279
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
280
+
281
+ data["a"] = 5
282
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
283
+
284
+ # Test with float
285
+ data["a"] = 4.9999999
286
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
287
+
288
+ data["a"] = 5.0
289
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
290
+ end
291
+
292
+
293
+ def test_min_items
294
+ # Set up the default datatype
295
+ schema = {
296
+ "properties" => {
297
+ "a" => {"minItems" => 1}
298
+ }
299
+ }
300
+
301
+ data = {
302
+ "a" => nil
303
+ }
304
+
305
+ # Test with an array
306
+ data["a"] = ["boo"]
307
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
308
+
309
+ data["a"] = []
310
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
311
+
312
+ # Test with a non-array
313
+ data["a"] = "boo"
314
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
315
+ end
316
+
317
+
318
+
319
+ def test_max_items
320
+ # Set up the default datatype
321
+ schema = {
322
+ "properties" => {
323
+ "a" => {"maxItems" => 1}
324
+ }
325
+ }
326
+
327
+ data = {
328
+ "a" => nil
329
+ }
330
+
331
+ # Test with an array
332
+ data["a"] = ["boo"]
333
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
334
+
335
+ data["a"] = ["boo","taco"]
336
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
337
+
338
+ # Test with a non-array
339
+ data["a"] = "boo"
340
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
341
+ end
342
+
343
+
344
+ def test_pattern
345
+ # Set up the default datatype
346
+ schema = {
347
+ "properties" => {
348
+ "a" => {"pattern" => "\\d+ taco"}
349
+ }
350
+ }
351
+
352
+ data = {
353
+ "a" => nil
354
+ }
355
+
356
+ # Test strings
357
+ data["a"] = "156 taco bell"
358
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
359
+
360
+ # Test a non-string
361
+ data["a"] = 5
362
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
363
+
364
+ data["a"] = "taco"
365
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
366
+ end
367
+
368
+
369
+ def test_min_length
370
+ # Set up the default datatype
371
+ schema = {
372
+ "properties" => {
373
+ "a" => {"minLength" => 1}
374
+ }
375
+ }
376
+
377
+ data = {
378
+ "a" => nil
379
+ }
380
+
381
+ # Try out strings
382
+ data["a"] = "t"
383
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
384
+
385
+ data["a"] = ""
386
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
387
+
388
+ # Try out non-string
389
+ data["a"] = 5
390
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
391
+ end
392
+
393
+
394
+ def test_max_length
395
+ # Set up the default datatype
396
+ schema = {
397
+ "properties" => {
398
+ "a" => {"maxLength" => 1}
399
+ }
400
+ }
401
+
402
+ data = {
403
+ "a" => nil
404
+ }
405
+
406
+ # Try out strings
407
+ data["a"] = "t"
408
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
409
+
410
+ data["a"] = "tt"
411
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
412
+
413
+ # Try out non-string
414
+ data["a"] = 5
415
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
416
+ end
417
+
418
+
419
+ def test_enum
420
+ # Set up the default datatype
421
+ schema = {
422
+ "properties" => {
423
+ "a" => {"enum" => [1,'boo',[1,2,3],{"a" => "b"}], "optional" => true}
424
+ }
425
+ }
426
+
427
+ data = {
428
+ "a" => nil
429
+ }
430
+
431
+ # Make sure all of the above are valid...
432
+ data["a"] = 1
433
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
434
+
435
+ data["a"] = 'boo'
436
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
437
+
438
+ data["a"] = [1,2,3]
439
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
440
+
441
+ data["a"] = {"a" => "b"}
442
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
443
+
444
+ # Test something that doesn't exist
445
+ data["a"] = 'taco'
446
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
447
+
448
+ # Try it without the key
449
+ data = {}
450
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
451
+ end
452
+
453
+
454
+ def test_max_decimal
455
+ # Set up the default datatype
456
+ schema = {
457
+ "properties" => {
458
+ "a" => {"maxDecimal" => 2}
459
+ }
460
+ }
461
+
462
+ data = {
463
+ "a" => nil
464
+ }
465
+
466
+ data["a"] = 3.35
467
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
468
+
469
+ data["a"] = 3.455
470
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
471
+
472
+
473
+ schema["properties"]["a"]["maxDecimal"] = 0
474
+
475
+ data["a"] = 4.0
476
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
477
+
478
+ data["a"] = 'boo'
479
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
480
+
481
+ data["a"] = 5
482
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
483
+ end
484
+
485
+
486
+
487
+ def test_disallow
488
+ # Set up the default datatype
489
+ schema = {
490
+ "properties" => {
491
+ "a" => {"disallow" => "integer"}
492
+ }
493
+ }
494
+
495
+ data = {
496
+ "a" => nil
497
+ }
498
+
499
+
500
+ data["a"] = 'string'
501
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
502
+
503
+ data["a"] = 5
504
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
505
+
506
+
507
+ schema["properties"]["a"]["disallow"] = ["integer","string"]
508
+ data["a"] = 'string'
509
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
510
+
511
+ data["a"] = 5
512
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
513
+
514
+ data["a"] = false
515
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
516
+
517
+ end
518
+
519
+
520
+
521
+ def test_additional_properties
522
+ # Test no additional properties allowed
523
+ schema = {
524
+ "properties" => {
525
+ "a" => { "type" => "integer" }
526
+ },
527
+ "additionalProperties" => false
528
+ }
529
+
530
+ data = {
531
+ "a" => 10
532
+ }
533
+
534
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
535
+ data["b"] = 5
536
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
537
+
538
+ # Test additional properties match a schema
539
+ schema["additionalProperties"] = { "type" => "string" }
540
+ data["b"] = "taco"
541
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
542
+ data["b"] = 5
543
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
544
+ end
545
+
546
+
547
+ def test_items
548
+ schema = {
549
+ "items" => { "type" => "integer" }
550
+ }
551
+
552
+ data = [1,2,4]
553
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
554
+ data = [1,2,"string"]
555
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
556
+
557
+ schema = {
558
+ "items" => [
559
+ {"type" => "integer"},
560
+ {"type" => "string"}
561
+ ]
562
+ }
563
+
564
+ data = [1,"string"]
565
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
566
+ data = [1,"string",3]
567
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
568
+ data = ["string",1]
569
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
570
+
571
+ end
572
+
573
+
574
+ def test_format_ipv4
575
+ schema = {
576
+ "type" => "object",
577
+ "properties" => { "a" => {"type" => "string", "format" => "ip-address"}}
578
+ }
579
+
580
+ data = {"a" => "1.1.1.1"}
581
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
582
+ data = {"a" => "1.1.1"}
583
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
584
+ data = {"a" => "1.1.1.300"}
585
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
586
+ data = {"a" => 5}
587
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
588
+ data = {"a" => "1.1.1"}
589
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
590
+ data = {"a" => "1.1.1.1b"}
591
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
592
+ data = {"a" => "b1.1.1.1"}
593
+ end
594
+
595
+
596
+ def test_format_ipv6
597
+ schema = {
598
+ "type" => "object",
599
+ "properties" => { "a" => {"type" => "string", "format" => "ipv6"}}
600
+ }
601
+
602
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff"}
603
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
604
+ data = {"a" => "1111:0:8888:0:0:0:eeee:ffff"}
605
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
606
+ data = {"a" => "1111:2222:8888::eeee:ffff"}
607
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
608
+ data = {"a" => "1111:2222:8888:99999:aaaa:cccc:eeee:ffff"}
609
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
610
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:gggg"}
611
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
612
+ data = {"a" => "1111:2222::9999::cccc:eeee:ffff"}
613
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
614
+ data = {"a" => "1111:2222:8888:9999:aaaa:cccc:eeee:ffff:bbbb"}
615
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
616
+ end
617
+
618
+ def test_format_time
619
+ schema = {
620
+ "type" => "object",
621
+ "properties" => { "a" => {"type" => "string", "format" => "time"}}
622
+ }
623
+
624
+ data = {"a" => "12:00:00"}
625
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
626
+ data = {"a" => "12:00"}
627
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
628
+ data = {"a" => "12:00:60"}
629
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
630
+ data = {"a" => "12:60:00"}
631
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
632
+ data = {"a" => "24:00:00"}
633
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
634
+ data = {"a" => "0:00:00"}
635
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
636
+ data = {"a" => "-12:00:00"}
637
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
638
+ data = {"a" => "12:00:00b"}
639
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
640
+ end
641
+
642
+
643
+ def test_format_date
644
+ schema = {
645
+ "type" => "object",
646
+ "properties" => { "a" => {"type" => "string", "format" => "date"}}
647
+ }
648
+
649
+ data = {"a" => "2010-01-01"}
650
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
651
+ data = {"a" => "2010-01-32"}
652
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
653
+ data = {"a" => "n2010-01-01"}
654
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
655
+ data = {"a" => "2010-1-01"}
656
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
657
+ data = {"a" => "2010-01-1"}
658
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
659
+ data = {"a" => "2010-01-01n"}
660
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
661
+ end
662
+
663
+ def test_format_datetime
664
+ schema = {
665
+ "type" => "object",
666
+ "properties" => { "a" => {"type" => "string", "format" => "date-time"}}
667
+ }
668
+
669
+ data = {"a" => "2010-01-01T12:00:00Z"}
670
+ assert(JSON::Validator.validate(schema,data,:version => :draft1))
671
+ data = {"a" => "2010-01-32T12:00:00Z"}
672
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
673
+ data = {"a" => "2010-13-01T12:00:00Z"}
674
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
675
+ data = {"a" => "2010-01-01T24:00:00Z"}
676
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
677
+ data = {"a" => "2010-01-01T12:60:00Z"}
678
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
679
+ data = {"a" => "2010-01-01T12:00:60Z"}
680
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
681
+ data = {"a" => "2010-01-01T12:00:00"}
682
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
683
+ data = {"a" => "2010-01-01T12:00:00z"}
684
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
685
+ data = {"a" => "2010-01-0112:00:00Z"}
686
+ assert(!JSON::Validator.validate(schema,data,:version => :draft1))
687
+ end
688
+
689
+
690
+ def test_format_union
691
+ data1 = {"a" => "boo"}
692
+ data2 = {"a" => nil}
693
+
694
+ schema = {
695
+ "type" => "object",
696
+ "properties" => { "a" => {"type" => ["string","null"], "format" => "ip-address"}}
697
+ }
698
+ assert(!JSON::Validator.validate(schema,data1,:version => :draft1))
699
+ assert(JSON::Validator.validate(schema,data2,:version => :draft1))
700
+ end
701
+
702
+ end
703
+