easy_json_matcher 0.0.2.pre.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/lib/easy_json_matcher/array_validator.rb +46 -15
- data/lib/easy_json_matcher/boolean_validator.rb +5 -0
- data/lib/easy_json_matcher/content_wrapper.rb +7 -9
- data/lib/easy_json_matcher/date_validator.rb +12 -3
- data/lib/easy_json_matcher/exceptions.rb +0 -1
- data/lib/easy_json_matcher/node.rb +75 -18
- data/lib/easy_json_matcher/number_validator.rb +6 -1
- data/lib/easy_json_matcher/object_validator.rb +5 -1
- data/lib/easy_json_matcher/schema_generator.rb +59 -30
- data/lib/easy_json_matcher/schema_library.rb +8 -3
- data/lib/easy_json_matcher/string_validator.rb +9 -3
- data/lib/easy_json_matcher/validator.rb +64 -6
- data/lib/easy_json_matcher/validator_factory.rb +2 -2
- data/lib/easy_json_matcher/value_validator.rb +2 -0
- data/lib/easy_json_matcher/version.rb +1 -1
- data/test/dummy/log/test.log +23957 -10665
- data/test/easy_json_matcher_test.rb +89 -50
- data/test/error_messages_test.rb +148 -0
- data/test/global_validation_options_test.rb +48 -0
- data/test/managing_schemas_test.rb +11 -11
- data/test/required_validation_test.rb +2 -2
- data/test/reset_test.rb +26 -0
- data/test/strict_mode_test.rb +63 -0
- data/test/validating_arrays_test.rb +106 -35
- metadata +43 -34
@@ -6,7 +6,7 @@ class RequireValidationTest < ActiveSupport::TestCase
|
|
6
6
|
astronaut_schema = EasyJSONMatcher::SchemaGenerator.new { |s|
|
7
7
|
s.has_attribute key: :has_oxygen, opts: {type: :boolean, required: true}
|
8
8
|
s.has_attribute key: :name, opts: {type: :string}
|
9
|
-
}.
|
9
|
+
}.generate_schema
|
10
10
|
|
11
11
|
valid_astronaut = {
|
12
12
|
has_oxygen: true,
|
@@ -26,7 +26,7 @@ class RequireValidationTest < ActiveSupport::TestCase
|
|
26
26
|
astronaut_schema = EasyJSONMatcher::SchemaGenerator.new { |s|
|
27
27
|
s.has_attribute key: :has_oxygen, opts: {type: :boolean}
|
28
28
|
s.has_attribute key: :name, opts: {type: :string}
|
29
|
-
}.
|
29
|
+
}.generate_schema
|
30
30
|
|
31
31
|
valid_astronaut = {
|
32
32
|
name: 'Buzz Aldrin'
|
data/test/reset_test.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
class ResetTest < ActiveSupport::TestCase
|
3
|
+
|
4
|
+
test 'As a user, I want to be able to reuse a validator' do
|
5
|
+
# In other words, after a valid? has been called, the error messages need to be cleared
|
6
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new(global_opts: { strict: true }) { |sc|
|
7
|
+
sc.has_boolean key: :bool, opts: { required: true }
|
8
|
+
sc.contains_node key: :node do |n|
|
9
|
+
n.has_value key: :val
|
10
|
+
end
|
11
|
+
}.generate_schema
|
12
|
+
|
13
|
+
invalid_json = {
|
14
|
+
|
15
|
+
}.to_json
|
16
|
+
|
17
|
+
assert_not(test_schema.valid?(invalid_json))
|
18
|
+
assert_not(test_schema.get_errors[:bool][0].nil?)
|
19
|
+
|
20
|
+
test_schema.reset!
|
21
|
+
|
22
|
+
errors = test_schema.get_errors
|
23
|
+
assert errors[:node][:val].empty?
|
24
|
+
assert errors[:bool].empty?
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class StrictModeTest < ActiveSupport::TestCase
|
4
|
+
|
5
|
+
test "As a user I want my schema to only validate objects iff the set of keys
|
6
|
+
in the candidate minus the set of keys specified in the schema equals the
|
7
|
+
empty set" do
|
8
|
+
|
9
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new(global_opts: {strict: true}) {|s|
|
10
|
+
s.has_string key: :first
|
11
|
+
s.has_string key: :second
|
12
|
+
s.has_string key: :third
|
13
|
+
}.generate_schema
|
14
|
+
|
15
|
+
too_many_planets = {
|
16
|
+
first: 'Zeus',
|
17
|
+
second: 'Poseidon',
|
18
|
+
third: 'Hera',
|
19
|
+
fourth: 'Demeter'
|
20
|
+
}.to_json
|
21
|
+
|
22
|
+
assert_not(test_schema.valid?(too_many_planets), "#{too_many_planets} should not be valid as it has the unspecified :fourth key")
|
23
|
+
end
|
24
|
+
|
25
|
+
setup do
|
26
|
+
@test_schema = EasyJSONMatcher::SchemaGenerator.new(global_opts: {strict: true}) {|s|
|
27
|
+
s.has_string key: :name
|
28
|
+
s.contains_node key: :about do |n|
|
29
|
+
n.has_string key: :religion
|
30
|
+
n.has_string key: :domain
|
31
|
+
end
|
32
|
+
}.generate_schema
|
33
|
+
end
|
34
|
+
|
35
|
+
test "As a user, if I have specified strict at the top level, I expect it to apply to nested nodes" do
|
36
|
+
|
37
|
+
poseidon = {
|
38
|
+
name: 'Poseidon',
|
39
|
+
about: {
|
40
|
+
religion: 'Olympian Gods',
|
41
|
+
domain: 'The Sea',
|
42
|
+
hobbies: ['Battleships Champion', 'Horse Tamer', 'Seismology']
|
43
|
+
}
|
44
|
+
}.to_json
|
45
|
+
|
46
|
+
assert_not(@test_schema.valid?(poseidon), "#{poseidon} should not be valid as hobbies wasn't expected in the schema, and he didn't have any")
|
47
|
+
end
|
48
|
+
|
49
|
+
test "As a user, if the strict validation fails, I want to be told why" do
|
50
|
+
zeus = {
|
51
|
+
name: 'Zeus',
|
52
|
+
about: {
|
53
|
+
religion: 'Olympian Gods',
|
54
|
+
domain: 'Firmament',
|
55
|
+
spouse: 'Hera',
|
56
|
+
address: 'Mount Olympus'
|
57
|
+
}
|
58
|
+
}.to_json
|
59
|
+
|
60
|
+
assert_not(@test_schema.valid? zeus)
|
61
|
+
assert_match(/\[:spouse, :address\] found in addition to expected keys/, @test_schema.get_errors[:about][:node_errors_][0])
|
62
|
+
end
|
63
|
+
end
|
@@ -2,53 +2,22 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class ValidatingArraysTest < ActiveSupport::TestCase
|
4
4
|
|
5
|
-
setup do
|
6
|
-
@test_schema = EasyJSONMatcher::SchemaGenerator.new { |s|
|
7
|
-
s.has_attribute(key: :name, opts: {type: :string})
|
8
|
-
s.contains_array(key: :items, opts: {required: true}) do |array|
|
9
|
-
array.should_only_contain(type: :string, opts: {required: true})
|
10
|
-
end
|
11
|
-
}.generate_node
|
12
|
-
end
|
13
|
-
|
14
|
-
test "As a user I want to validate that my arrays contain values of the correct type" do
|
15
|
-
valid_json = {
|
16
|
-
name: 'Greek Heroes',
|
17
|
-
items: ['Heracles', 'Perseus', 'Theseus', 'Achilles']
|
18
|
-
}.to_json
|
19
|
-
|
20
|
-
assert(@test_schema.valid?(valid_json), "#{valid_json} should have been valid")
|
21
|
-
|
22
|
-
invalid_no_items = {
|
23
|
-
name: 'Strictly Come Dancing Heroes'
|
24
|
-
}.to_json
|
25
|
-
|
26
|
-
assert_not(@test_schema.valid?(invalid_no_items), "#{invalid_no_items} should not have been valid as it has no array called items")
|
27
|
-
|
28
|
-
invalid_wrong_items = {
|
29
|
-
name: 'Prime Heroes',
|
30
|
-
items: [1,3,5,7,9,8191]
|
31
|
-
}.to_json
|
32
|
-
|
33
|
-
assert_not(@test_schema.valid?(invalid_wrong_items), "#{invalid_wrong_items} should not have been validated since the array contains the wrong type")
|
34
|
-
end
|
35
|
-
|
36
5
|
test "As a user I want to validate that my arrays can contain objects of a specific schema" do
|
37
6
|
EasyJSONMatcher::SchemaGenerator.new {|s|
|
38
7
|
|
39
8
|
s.has_attribute key: :name, opts: {type: :string, required: true}
|
40
9
|
s.has_attribute key: :spouse, opts: {type: :string}
|
41
|
-
}.register
|
10
|
+
}.register as: :greek_hero
|
42
11
|
|
43
12
|
test_schema = EasyJSONMatcher::SchemaGenerator.new {|s|
|
44
13
|
s.contains_array(key: :data, opts: {required: true}) do |a|
|
45
14
|
a.should_only_contain(type: :schema, opts: {name: :greek_hero})
|
46
15
|
end
|
47
|
-
}.
|
16
|
+
}.generate_schema
|
48
17
|
|
49
18
|
valid_json = {
|
50
19
|
data: [{
|
51
|
-
name: 'Greek Heroes',
|
20
|
+
name: 'More Greek Heroes',
|
52
21
|
items: ['Hector', 'Ajax', 'Hippolyta', 'Penthesila']
|
53
22
|
},
|
54
23
|
{
|
@@ -61,8 +30,110 @@ class ValidatingArraysTest < ActiveSupport::TestCase
|
|
61
30
|
|
62
31
|
invalid_json = {
|
63
32
|
data: [1,2,3,4,5]
|
64
|
-
}
|
33
|
+
}.to_json
|
65
34
|
|
66
35
|
assert_not(test_schema.valid?(invalid_json), "#{invalid_json} should not have validated as it does not contain a :heroes schema")
|
67
36
|
end
|
37
|
+
|
38
|
+
test "As a user I want to validate that my arrays only contain strings" do
|
39
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new {|s|
|
40
|
+
s.has_string key: :name, opts: {required: true}
|
41
|
+
s.contains_array key: :data, opts: {required: true} do |a|
|
42
|
+
a.should_only_contain_strings
|
43
|
+
end
|
44
|
+
}.generate_schema
|
45
|
+
|
46
|
+
valid_json = {
|
47
|
+
name: 'German Heroes',
|
48
|
+
data: ['Brunhilda', 'Siegfried', 'Faust']
|
49
|
+
}.to_json
|
50
|
+
|
51
|
+
assert(test_schema.valid?(valid_json), "#{valid_json} should have been valid as it only contained strings")
|
52
|
+
|
53
|
+
invalid_json = {
|
54
|
+
name: 'Fibonacci sequence',
|
55
|
+
data: [0,1,1,2,3,5,8,13,24]
|
56
|
+
}.to_json
|
57
|
+
|
58
|
+
assert_not(test_schema.valid?(invalid_json), "#{invalid_json} should not have been valid as it did not contain strings")
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
test 'As a user I want to validate that my arrays only contain numbers' do
|
63
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new {|s|
|
64
|
+
s.has_string key: :name, opts: {required: true}
|
65
|
+
s.contains_array key: :data, opts: {required: true} do |a|
|
66
|
+
a.should_only_contain_numbers
|
67
|
+
end
|
68
|
+
}.generate_schema
|
69
|
+
|
70
|
+
valid_json = {
|
71
|
+
name: 'Square Numbers',
|
72
|
+
data: [1,4,9,16,25,36,49,64]
|
73
|
+
}.to_json
|
74
|
+
|
75
|
+
assert(test_schema.valid?(valid_json), "#{valid_json} should have been valid as it contained only numbers")
|
76
|
+
|
77
|
+
invalid_json = {
|
78
|
+
name: 'Notable Scots',
|
79
|
+
data: ['Alexander Fleming', 'Adam Smith', 'John Logie Baird', 'St. Andrew', 'St. Columba', 1, 2, 3, 4, 5]
|
80
|
+
}.to_json
|
81
|
+
assert_not(test_schema.valid?(invalid_json), "#{invalid_json} should not have been valid as it did not only contain numbers")
|
82
|
+
end
|
83
|
+
|
84
|
+
test 'As a user I want to validate that my arrays only contain booleans' do
|
85
|
+
|
86
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new {|s|
|
87
|
+
s.has_string key: :name, opts: {required: true}
|
88
|
+
s.contains_array key: :data, opts: {required: true} do |a|
|
89
|
+
a.should_only_contain_booleans
|
90
|
+
end
|
91
|
+
}.generate_schema
|
92
|
+
|
93
|
+
valid_json = {
|
94
|
+
name: 'Predicates',
|
95
|
+
data: [true, true, false, true, false, false]
|
96
|
+
}.to_json
|
97
|
+
|
98
|
+
assert(test_schema.valid?(valid_json), "#{valid_json} should have been valid as it contains only booleans")
|
99
|
+
|
100
|
+
invalid_json = {
|
101
|
+
name: 'Notable English',
|
102
|
+
data: ['St. George', 'Winston Churchill', 'Admiral Nelson', true, true, false, false]
|
103
|
+
}.to_json
|
104
|
+
|
105
|
+
assert_not(test_schema.valid?(invalid_json), "#{invalid_json} should have been invalid as it contains strings")
|
106
|
+
end
|
107
|
+
|
108
|
+
test 'As a user I want to validate that my arrays contain only objects' do
|
109
|
+
|
110
|
+
test_schema = EasyJSONMatcher::SchemaGenerator.new { |s|
|
111
|
+
s.has_string key: :name, opts: {required: true}
|
112
|
+
s.contains_array key: :data, opts: {required: true} do |a|
|
113
|
+
a.should_only_contain_objects
|
114
|
+
end
|
115
|
+
}.generate_schema
|
116
|
+
|
117
|
+
valid_json = {
|
118
|
+
name: 'Hand of Cards',
|
119
|
+
data: [
|
120
|
+
{suite: 'Spades', value: 'Ace'},
|
121
|
+
{suite: 'Hearts', value: 'Queen'},
|
122
|
+
{suite: 'Clubs', value: 'Jack'},
|
123
|
+
{suite: 'Diamonds', value: '3'}]
|
124
|
+
}.to_json
|
125
|
+
|
126
|
+
assert(test_schema.valid?(valid_json), "#{valid_json} should have been valid as it only contains objects")
|
127
|
+
|
128
|
+
invalid_json = {
|
129
|
+
name: 'Norse Gods',
|
130
|
+
data: [{'Thor': 'Thunder'}, 'Odin', 'Loki', 'Freya']
|
131
|
+
}.to_json
|
132
|
+
|
133
|
+
assert_not(test_schema.valid?(invalid_json), "#{invalid_json} should not have been valid as it does not only contain objects")
|
134
|
+
end
|
135
|
+
|
136
|
+
test 'as a user I want to validate that my arrays contain only dates' do
|
137
|
+
|
138
|
+
end
|
68
139
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_json_matcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- WJD Hamilton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -38,7 +38,8 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description:
|
41
|
+
description: Test your JSON output in Ruby, with a DSL that makes reasoning about
|
42
|
+
your JSON very straightforward. See the Homepage for docs.
|
42
43
|
email:
|
43
44
|
- wjdhamilton@hotmail.co.uk
|
44
45
|
executables: []
|
@@ -102,9 +103,13 @@ files:
|
|
102
103
|
- test/dummy/public/500.html
|
103
104
|
- test/dummy/public/favicon.ico
|
104
105
|
- test/easy_json_matcher_test.rb
|
106
|
+
- test/error_messages_test.rb
|
107
|
+
- test/global_validation_options_test.rb
|
105
108
|
- test/json_api_home.txt
|
106
109
|
- test/managing_schemas_test.rb
|
107
110
|
- test/required_validation_test.rb
|
111
|
+
- test/reset_test.rb
|
112
|
+
- test/strict_mode_test.rb
|
108
113
|
- test/test_helper.rb
|
109
114
|
- test/validating_arrays_test.rb
|
110
115
|
homepage: https://github.com/wjdhamilton/easy-json-matcher
|
@@ -122,55 +127,59 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
127
|
version: '0'
|
123
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
129
|
requirements:
|
125
|
-
- - "
|
130
|
+
- - ">="
|
126
131
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
132
|
+
version: '0'
|
128
133
|
requirements: []
|
129
134
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.
|
135
|
+
rubygems_version: 2.5.1
|
131
136
|
signing_key:
|
132
137
|
specification_version: 4
|
133
138
|
summary: Easily test your JSON output with templates and Schemas
|
134
139
|
test_files:
|
135
|
-
- test/
|
136
|
-
- test/
|
137
|
-
- test/
|
138
|
-
- test/
|
139
|
-
- test/
|
140
|
-
- test/test_helper.rb
|
141
|
-
- test/dummy/config.ru
|
142
|
-
- test/dummy/bin/rails
|
140
|
+
- test/dummy/app/assets/javascripts/application.js
|
141
|
+
- test/dummy/app/assets/stylesheets/application.css
|
142
|
+
- test/dummy/app/controllers/application_controller.rb
|
143
|
+
- test/dummy/app/helpers/application_helper.rb
|
144
|
+
- test/dummy/app/views/layouts/application.html.erb
|
143
145
|
- test/dummy/bin/bundle
|
144
|
-
- test/dummy/bin/
|
146
|
+
- test/dummy/bin/rails
|
145
147
|
- test/dummy/bin/rake
|
146
|
-
- test/dummy/
|
147
|
-
- test/dummy/config/
|
148
|
+
- test/dummy/bin/setup
|
149
|
+
- test/dummy/config/application.rb
|
150
|
+
- test/dummy/config/boot.rb
|
151
|
+
- test/dummy/config/database.yml
|
152
|
+
- test/dummy/config/environment.rb
|
153
|
+
- test/dummy/config/environments/development.rb
|
154
|
+
- test/dummy/config/environments/production.rb
|
155
|
+
- test/dummy/config/environments/test.rb
|
148
156
|
- test/dummy/config/initializers/assets.rb
|
149
|
-
- test/dummy/config/initializers/cookies_serializer.rb
|
150
157
|
- test/dummy/config/initializers/backtrace_silencers.rb
|
158
|
+
- test/dummy/config/initializers/cookies_serializer.rb
|
159
|
+
- test/dummy/config/initializers/filter_parameter_logging.rb
|
160
|
+
- test/dummy/config/initializers/inflections.rb
|
151
161
|
- test/dummy/config/initializers/mime_types.rb
|
152
162
|
- test/dummy/config/initializers/session_store.rb
|
153
|
-
- test/dummy/config/initializers/
|
154
|
-
- test/dummy/config/secrets.yml
|
155
|
-
- test/dummy/config/database.yml
|
156
|
-
- test/dummy/config/application.rb
|
157
|
-
- test/dummy/config/environments/test.rb
|
158
|
-
- test/dummy/config/environments/development.rb
|
159
|
-
- test/dummy/config/environments/production.rb
|
163
|
+
- test/dummy/config/initializers/wrap_parameters.rb
|
160
164
|
- test/dummy/config/locales/en.yml
|
161
|
-
- test/dummy/config/environment.rb
|
162
|
-
- test/dummy/config/boot.rb
|
163
165
|
- test/dummy/config/routes.rb
|
166
|
+
- test/dummy/config/secrets.yml
|
167
|
+
- test/dummy/config.ru
|
164
168
|
- test/dummy/db/test.sqlite3
|
165
|
-
- test/dummy/
|
166
|
-
- test/dummy/app/assets/stylesheets/application.css
|
167
|
-
- test/dummy/app/views/layouts/application.html.erb
|
168
|
-
- test/dummy/app/helpers/application_helper.rb
|
169
|
-
- test/dummy/app/controllers/application_controller.rb
|
170
|
-
- test/dummy/Rakefile
|
169
|
+
- test/dummy/log/test.log
|
171
170
|
- test/dummy/public/404.html
|
172
171
|
- test/dummy/public/422.html
|
173
172
|
- test/dummy/public/500.html
|
174
173
|
- test/dummy/public/favicon.ico
|
174
|
+
- test/dummy/Rakefile
|
175
175
|
- test/dummy/README.rdoc
|
176
|
-
- test/
|
176
|
+
- test/easy_json_matcher_test.rb
|
177
|
+
- test/error_messages_test.rb
|
178
|
+
- test/global_validation_options_test.rb
|
179
|
+
- test/json_api_home.txt
|
180
|
+
- test/managing_schemas_test.rb
|
181
|
+
- test/required_validation_test.rb
|
182
|
+
- test/reset_test.rb
|
183
|
+
- test/strict_mode_test.rb
|
184
|
+
- test/test_helper.rb
|
185
|
+
- test/validating_arrays_test.rb
|