seomoz-json-schema 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+