easy_json_matcher 0.2.2 → 0.3.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_content_validator.rb +22 -0
- data/lib/easy_json_matcher/array_generator.rb +41 -0
- data/lib/easy_json_matcher/array_validator.rb +11 -76
- data/lib/easy_json_matcher/attribute_generator.rb +37 -0
- data/lib/easy_json_matcher/attribute_type_methods.rb +29 -0
- data/lib/easy_json_matcher/coercion_error.rb +10 -0
- data/lib/easy_json_matcher/content_wrapper.rb +2 -4
- data/lib/easy_json_matcher/{validation_error.rb → easy_json_matcher_error.rb} +2 -1
- data/lib/easy_json_matcher/json_coercer.rb +34 -0
- data/lib/easy_json_matcher/node.rb +10 -114
- data/lib/easy_json_matcher/node_generator.rb +58 -0
- data/lib/easy_json_matcher/schema_generator.rb +47 -71
- data/lib/easy_json_matcher/schema_library.rb +8 -11
- data/lib/easy_json_matcher/unknown_validation_step_error.rb +10 -0
- data/lib/easy_json_matcher/validation_chain_factory.rb +48 -0
- data/lib/easy_json_matcher/validation_rules.rb +59 -0
- data/lib/easy_json_matcher/validation_step.rb +36 -0
- data/lib/easy_json_matcher/validator.rb +12 -87
- data/lib/easy_json_matcher/validator_set.rb +31 -0
- data/lib/easy_json_matcher/version.rb +1 -1
- data/lib/easy_json_matcher.rb +6 -2
- data/lib/easy_json_matcher.rb~ +5 -0
- data/test/array_content_validator_test.rb +17 -0
- data/test/custom_validations_test.rb +17 -17
- data/test/global_validation_options_test.rb +39 -44
- data/test/json_coercer_test.rb +25 -0
- data/test/managing_schemas_test.rb +53 -52
- data/test/node_test.rb +28 -0
- data/test/primitives_boolean_test.rb +27 -0
- data/test/primitives_date_test.rb +28 -0
- data/test/primitives_number_test.rb +27 -0
- data/test/primitives_object_test.rb +27 -0
- data/test/primitives_string_test.rb +27 -0
- data/test/primtives_value_test.rb +23 -0
- data/test/required_validation_test.rb +7 -7
- data/test/schema_generator_test.rb +23 -0
- data/test/strict_mode_test.rb +25 -54
- data/test/test_helper.rb +8 -6
- data/test/validating_arrays_test.rb +40 -132
- data/test/validation_chain_factory_test.rb +45 -0
- data/test/validation_chain_test_helper.rb +13 -0
- data/test/validation_step_array_test.rb +27 -0
- data/test/validation_step_boolean_test.rb +19 -0
- data/test/validation_step_date_test.rb +20 -0
- data/test/validation_step_not_required_test.rb +35 -0
- data/test/validation_step_number_test.rb +23 -0
- data/test/validation_step_object_test.rb +20 -0
- data/test/validation_step_required_test.rb +19 -0
- data/test/validation_step_string_test.rb +20 -0
- data/test/validation_step_test.rb +55 -0
- data/test/validation_step_value_test.rb +15 -0
- data/test/validator_set_test.rb +49 -0
- data/test/validator_test.rb +44 -0
- metadata +64 -26
- data/lib/easy_json_matcher/boolean_validator.rb +0 -14
- data/lib/easy_json_matcher/date_validator.rb +0 -44
- data/lib/easy_json_matcher/node.rb~ +0 -121
- data/lib/easy_json_matcher/number_validator.rb +0 -22
- data/lib/easy_json_matcher/object_validator.rb +0 -12
- data/lib/easy_json_matcher/schema_generator.rb~ +0 -104
- data/lib/easy_json_matcher/string_validator.rb +0 -16
- data/lib/easy_json_matcher/validator.rb~ +0 -99
- data/lib/easy_json_matcher/validator_factory.rb +0 -76
- data/lib/easy_json_matcher/value_validator.rb +0 -10
- data/lib/easy_json_matcher/version.rb~ +0 -3
- data/test/custom_validations_test.rb~ +0 -25
- data/test/easy_json_matcher_test.rb +0 -262
- data/test/easy_json_matcher_test.rb~ +0 -262
- data/test/error_messages_test.rb +0 -148
- data/test/reset_test.rb +0 -32
- data/test/reset_test.rb~ +0 -32
data/test/node_test.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "easy_json_matcher/validation_chain_factory"
|
3
|
+
|
4
|
+
module EasyJSONMatcher
|
5
|
+
|
6
|
+
describe Node do
|
7
|
+
|
8
|
+
describe "#add_validator" do
|
9
|
+
|
10
|
+
it "should respond to #check" do
|
11
|
+
Node.new(validators: nil).must_respond_to :check
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should send call to its own validator" do
|
15
|
+
test_value = { a: 1, b: 2, c: 3 }
|
16
|
+
validators = (:a..:c).each_with_object({}) do |n, h|
|
17
|
+
h[n] = ValidationChainFactory.get_chain(steps: [:string])
|
18
|
+
end
|
19
|
+
node = Node.new(opts: [:required], validators: validators)
|
20
|
+
expected = [{a: ["1 is not a String"],
|
21
|
+
b: ["2 is not a String"],
|
22
|
+
c: ["3 is not a String"]
|
23
|
+
}]
|
24
|
+
node.check(value: test_value).must_be :==, expected
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# This test suite covers the basic concept of validating that a value is a
|
5
|
+
# certain type
|
6
|
+
|
7
|
+
module EasyJSONMatcher
|
8
|
+
|
9
|
+
describe "Basic Type Validations" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@test_schema = SchemaGenerator.new { |g|
|
13
|
+
g.has_boolean key: :boolean
|
14
|
+
}.generate_schema
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should validate booleans" do
|
18
|
+
candidate = { boolean: true}.to_json
|
19
|
+
@test_schema.validate(candidate: candidate).must_be :empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return errors for non-booleans" do
|
23
|
+
candidate = { boolean: 1 }.to_json
|
24
|
+
@test_schema.validate(candidate: candidate).wont_be :empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
require 'test_helper'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
# This test suite covers the basic concept of validating that a value is a
|
6
|
+
# certain type
|
7
|
+
|
8
|
+
module EasyJSONMatcher
|
9
|
+
|
10
|
+
describe "Date primitive" do
|
11
|
+
|
12
|
+
before do
|
13
|
+
@test_schema = SchemaGenerator.new { |g|
|
14
|
+
g.has_date key: :date
|
15
|
+
}.generate_schema
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should validate dates" do
|
19
|
+
candidate = { date: "2015-04-01"}.to_json
|
20
|
+
@test_schema.validate(candidate: candidate).must_be :empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return errors for non-dates" do
|
24
|
+
candidate = { date: "hello" }.to_json
|
25
|
+
@test_schema.validate(candidate: candidate).wont_be :empty?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# This test suite covers the basic concept of validating that a value is a
|
5
|
+
# certain type
|
6
|
+
|
7
|
+
module EasyJSONMatcher
|
8
|
+
|
9
|
+
describe "Number Validations" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@test_schema = SchemaGenerator.new { |g|
|
13
|
+
g.has_number key: :number
|
14
|
+
}.generate_schema
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should validate Strings" do
|
18
|
+
candidate = { number: 1 }.to_json
|
19
|
+
@test_schema.validate(candidate: candidate).must_be :empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return errors for non-strings" do
|
23
|
+
candidate = { number: "hello" }.to_json
|
24
|
+
@test_schema.validate(candidate: candidate).wont_be :empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# This test suite covers the basic concept of validating that a value is a
|
5
|
+
# certain type
|
6
|
+
|
7
|
+
module EasyJSONMatcher
|
8
|
+
|
9
|
+
describe "Object primitive test" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@test_schema = SchemaGenerator.new { |g|
|
13
|
+
g.has_object key: :object
|
14
|
+
}.generate_schema
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should validate booleans" do
|
18
|
+
candidate = { object: { a: 1}}.to_json
|
19
|
+
@test_schema.validate(candidate: candidate).must_be :empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return errors for non-booleans" do
|
23
|
+
candidate = { object: 1 }.to_json
|
24
|
+
@test_schema.validate(candidate: candidate).wont_be :empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# This test suite covers the basic concept of validating that a value is a
|
5
|
+
# certain type
|
6
|
+
|
7
|
+
module EasyJSONMatcher
|
8
|
+
|
9
|
+
describe "Basic Type Validations" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@test_schema = SchemaGenerator.new { |g|
|
13
|
+
g.has_string key: :string
|
14
|
+
}.generate_schema
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should validate Strings" do
|
18
|
+
candidate = { string: "hello" }.to_json
|
19
|
+
@test_schema.validate(candidate: candidate).must_be :empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return errors for non-strings" do
|
23
|
+
candidate = { string: 1 }.to_json
|
24
|
+
@test_schema.validate(candidate: candidate).wont_be :empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# This test suite covers the basic concept of validating that a value is a
|
5
|
+
# certain type
|
6
|
+
|
7
|
+
module EasyJSONMatcher
|
8
|
+
|
9
|
+
describe "Value primitive test" do
|
10
|
+
|
11
|
+
before do
|
12
|
+
@test_schema = SchemaGenerator.new { |g|
|
13
|
+
g.has_boolean key: :value
|
14
|
+
}.generate_schema
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should validate any explicitly set value" do
|
18
|
+
candidate = { value: nil}.to_json
|
19
|
+
@test_schema.validate(candidate: candidate).must_be :empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -4,8 +4,8 @@ class RequireValidationTest < ActiveSupport::TestCase
|
|
4
4
|
|
5
5
|
test "As a user I want to insist that a value is present" do
|
6
6
|
astronaut_schema = EasyJSONMatcher::SchemaGenerator.new { |s|
|
7
|
-
s.has_attribute key: :has_oxygen, opts:
|
8
|
-
s.has_attribute key: :name, opts:
|
7
|
+
s.has_attribute key: :has_oxygen, opts: [:boolean, :required]
|
8
|
+
s.has_attribute key: :name, opts: [:string]
|
9
9
|
}.generate_schema
|
10
10
|
|
11
11
|
valid_astronaut = {
|
@@ -13,25 +13,25 @@ class RequireValidationTest < ActiveSupport::TestCase
|
|
13
13
|
name: 'Buzz Aldrin'
|
14
14
|
}.to_json
|
15
15
|
|
16
|
-
assert(astronaut_schema.valid?(valid_astronaut), "#{valid_astronaut} should be a valid object")
|
16
|
+
assert(astronaut_schema.valid?(candidate: valid_astronaut), "#{valid_astronaut} should be a valid object")
|
17
17
|
|
18
18
|
invalid_astronaut = {
|
19
19
|
name: 'Neil Armstrong'
|
20
20
|
}.to_json
|
21
21
|
|
22
|
-
assert_not(astronaut_schema.valid?(invalid_astronaut), "#{invalid_astronaut} should not be a valid object")
|
22
|
+
assert_not(astronaut_schema.valid?(candidate: invalid_astronaut), "#{invalid_astronaut} should not be a valid object")
|
23
23
|
end
|
24
24
|
|
25
25
|
test "As a user I want validations to pass if the value is not present and I have not required it to be there" do
|
26
26
|
astronaut_schema = EasyJSONMatcher::SchemaGenerator.new { |s|
|
27
|
-
s.has_attribute key: :has_oxygen, opts:
|
28
|
-
s.has_attribute key: :name, opts:
|
27
|
+
s.has_attribute key: :has_oxygen, opts: [:boolean]
|
28
|
+
s.has_attribute key: :name, opts: [:string]
|
29
29
|
}.generate_schema
|
30
30
|
|
31
31
|
valid_astronaut = {
|
32
32
|
name: 'Buzz Aldrin'
|
33
33
|
}.to_json
|
34
34
|
|
35
|
-
assert(astronaut_schema.valid?(valid_astronaut), "#{valid_astronaut} should be valid since :has_oxygen is not required")
|
35
|
+
assert(astronaut_schema.valid?(candidate: valid_astronaut), "#{valid_astronaut} should be valid since :has_oxygen is not required")
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module EasyJSONMatcher
|
4
|
+
|
5
|
+
describe SchemaGenerator do
|
6
|
+
|
7
|
+
describe "SchemaGenerator#generate_schema" do
|
8
|
+
|
9
|
+
it "should return a validator" do
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "Global Options" do
|
14
|
+
|
15
|
+
it "should accept a global options parameter" do
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should filter out Schema options before passing them onto the NodeGenerator" do
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
data/test/strict_mode_test.rb
CHANGED
@@ -1,63 +1,34 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
|
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
|
3
|
+
module EasyJSONMatcher
|
24
4
|
|
25
|
-
|
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
|
5
|
+
describe "Strict Mode" do
|
34
6
|
|
35
|
-
|
7
|
+
subject {
|
8
|
+
SchemaGenerator.new(global_opts: [ :strict ]) { |s|
|
9
|
+
s.has_attribute key: :a, opts: []
|
10
|
+
s.has_attribute key: :b, opts: []
|
11
|
+
}.generate_schema
|
12
|
+
}
|
36
13
|
|
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
14
|
|
46
|
-
|
47
|
-
|
15
|
+
it "should validate candidates with the correct keys" do
|
16
|
+
candidate = {
|
17
|
+
a: "a",
|
18
|
+
b: "b"
|
19
|
+
}.to_json
|
20
|
+
|
21
|
+
subject.validate(candidate: candidate).must_be :empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should not validate candidates with extra keys" do
|
25
|
+
candidate = {
|
26
|
+
a: "a",
|
27
|
+
b: "b",
|
28
|
+
c: "c"
|
29
|
+
}.to_json
|
48
30
|
|
49
|
-
|
50
|
-
|
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])
|
31
|
+
subject.validate(candidate: candidate).wont_be :empty?
|
32
|
+
end
|
62
33
|
end
|
63
34
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require "pretty_backtrace/enable"
|
2
|
+
require "minitest"
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "active_support"
|
5
|
+
require "mocha/mini_test"
|
6
|
+
require "easy_json_matcher"
|
7
|
+
require "pp"
|
8
|
+
require "byebug"
|
7
9
|
|
8
10
|
# Filter out Minitest backtrace while allowing backtrace from other libraries
|
9
11
|
# to be shown.
|
@@ -1,139 +1,47 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
2
|
+
require "easy_json_matcher/array_validator"
|
3
|
+
|
4
|
+
module EasyJSONMatcher
|
5
|
+
|
6
|
+
describe ArrayValidator do
|
7
|
+
|
8
|
+
before do
|
9
|
+
SchemaGenerator.new {|s|
|
10
|
+
s.has_attribute key: :name, opts: [:string, :required]
|
11
|
+
s.has_attribute key: :spouse, opts: [:string, :required]
|
12
|
+
}.register as: :greek_hero
|
13
|
+
end
|
14
|
+
|
15
|
+
subject{
|
16
|
+
test_schema = SchemaGenerator.new {|s|
|
17
|
+
s.contains_array(key: :data) do |a|
|
18
|
+
a.elements_should be: [:greek_hero]
|
19
|
+
end
|
20
|
+
}.generate_schema
|
21
|
+
}
|
22
|
+
|
23
|
+
it "should validate each value in the array" do
|
24
|
+
validator = SchemaGenerator.new { |s|
|
25
|
+
s.contains_array(key: :array) do |a|
|
26
|
+
a.elements_should be: [:number]
|
27
|
+
end
|
28
|
+
}.generate_schema
|
29
|
+
candidate = { array: [1,2,3,4,"oops"] }.to_json
|
30
|
+
validator.validate(candidate: candidate).wont_be :empty?
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should validate schemas" do
|
34
|
+
invalid_json = {
|
35
|
+
data: [{
|
20
36
|
name: 'More Greek Heroes',
|
21
37
|
items: ['Hector', 'Ajax', 'Hippolyta', 'Penthesila']
|
22
38
|
},
|
23
|
-
|
24
|
-
|
25
|
-
|
39
|
+
{
|
40
|
+
name: 'Roman Heroes',
|
41
|
+
items: ['Romulus', 'Remus', 'Aeneus']
|
26
42
|
}]
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
invalid_json = {
|
32
|
-
data: [1,2,3,4,5]
|
33
|
-
}.to_json
|
34
|
-
|
35
|
-
assert_not(test_schema.valid?(invalid_json), "#{invalid_json} should not have validated as it does not contain a :heroes schema")
|
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
|
-
|
43
|
+
}.to_json
|
44
|
+
subject.validate(candidate: invalid_json).wont_be :empty?
|
45
|
+
end
|
138
46
|
end
|
139
47
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "easy_json_matcher/validation_chain_factory"
|
3
|
+
require "easy_json_matcher/unknown_validation_step_error"
|
4
|
+
|
5
|
+
module EasyJSONMatcher
|
6
|
+
|
7
|
+
describe ValidationChainFactory do
|
8
|
+
|
9
|
+
STD_TYPES = [:object, :string, :number, :date, :boolean, :value, :required, :not_required]
|
10
|
+
|
11
|
+
describe "#get_step_for" do
|
12
|
+
|
13
|
+
it "should return a validation step for all available value types" do
|
14
|
+
STD_TYPES.each do |type|
|
15
|
+
ValidationChainFactory.get_step_for(validating: type).wont_be :==, nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should return a custom validator if :validating responds to call" do
|
20
|
+
can_be_called = ->(value, errors) { }
|
21
|
+
ValidationChainFactory.get_step_for(validating: can_be_called).
|
22
|
+
wont_be :==, nil
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should otherwise raise an error" do
|
26
|
+
cannot_use = String.new
|
27
|
+
-> { ValidationChainFactory.get_step_for(validating: cannot_use) }.
|
28
|
+
must_raise UnknownValidationStepError
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#get_chain" do
|
33
|
+
|
34
|
+
it "should move :required validation to the start of the chain" do
|
35
|
+
chain = ValidationChainFactory.get_chain(steps: [:string, :required])
|
36
|
+
chain.check(value: nil)[0].must_match /no value found/
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should put :not_required at the start if :required is not specified" do
|
40
|
+
chain = ValidationChainFactory.get_chain(steps: [:string])
|
41
|
+
chain.check(value: nil).must_be :empty?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "easy_json_matcher/validation_chain_factory"
|
2
|
+
|
3
|
+
module ValidationChainTestHelper
|
4
|
+
|
5
|
+
def get_instance(type:)
|
6
|
+
EasyJSONMatcher::ValidationChainFactory.get_step_for validating: type
|
7
|
+
end
|
8
|
+
|
9
|
+
def assert_chain_verifies(type:, test_value:, outcome:)
|
10
|
+
v_step = get_instance(type: type)
|
11
|
+
expect(v_step.check(value: test_value).empty?).must_be :==, outcome
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "easy_json_matcher/array_validator"
|
3
|
+
|
4
|
+
module EasyJSONMatcher
|
5
|
+
|
6
|
+
describe ArrayValidator do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@subject = ArrayValidator.new verify_content_as: [:string]
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "Validating Array Types" do
|
13
|
+
|
14
|
+
it "should return valid for empty arrays" do
|
15
|
+
@subject.check(value: []).must_be :empty?
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should return errors for any other object" do
|
19
|
+
@subject.check(value: 1).wont_be :empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should check all the content is of a particular type" do
|
23
|
+
@subject.check(value: [1,2,3]).wont_be :empty?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "validation_chain_test_helper"
|
3
|
+
|
4
|
+
include ValidationChainTestHelper
|
5
|
+
|
6
|
+
describe "Boolean Validation Step" do
|
7
|
+
|
8
|
+
describe "should be able to return an instance that validates booleans" do
|
9
|
+
|
10
|
+
it "should not return any errors for a boolean" do
|
11
|
+
[true,false].each { |b| assert_chain_verifies(type: :boolean, test_value: b, outcome: true)}
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return an error for an invalid boolean" do
|
15
|
+
no_bool = 0
|
16
|
+
assert_chain_verifies(type: :boolean, test_value: no_bool, outcome: false)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "validation_chain_test_helper"
|
3
|
+
|
4
|
+
include ValidationChainTestHelper
|
5
|
+
|
6
|
+
describe "Date Validation Step" do
|
7
|
+
|
8
|
+
describe "should be able to return a instance that validates dates" do
|
9
|
+
|
10
|
+
it "should not return any errors for a valid ISO8601 date" do
|
11
|
+
date = "2020-03-01"
|
12
|
+
assert_chain_verifies(type: :date, test_value: date, outcome: true)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return an error for an invalid date" do
|
16
|
+
no_date = 1
|
17
|
+
assert_chain_verifies(type: :date, test_value: no_date, outcome: false)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|