poro_validator 0.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.
- checksums.yaml +7 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +11 -0
- data/LICENSE.txt +21 -0
- data/README.md +382 -0
- data/Rakefile +139 -0
- data/lib/poro_validator.rb +54 -0
- data/lib/poro_validator/configuration.rb +63 -0
- data/lib/poro_validator/error_store.rb +52 -0
- data/lib/poro_validator/errors.rb +56 -0
- data/lib/poro_validator/exceptions.rb +14 -0
- data/lib/poro_validator/validator.rb +82 -0
- data/lib/poro_validator/validator/base_class.rb +55 -0
- data/lib/poro_validator/validator/conditions.rb +71 -0
- data/lib/poro_validator/validator/context.rb +19 -0
- data/lib/poro_validator/validator/factory.rb +32 -0
- data/lib/poro_validator/validator/validation.rb +50 -0
- data/lib/poro_validator/validator/validations.rb +55 -0
- data/lib/poro_validator/validators/base_class.rb +53 -0
- data/lib/poro_validator/validators/exclusion_validator.rb +26 -0
- data/lib/poro_validator/validators/float_validator.rb +17 -0
- data/lib/poro_validator/validators/format_validator.rb +16 -0
- data/lib/poro_validator/validators/inclusion_validator.rb +26 -0
- data/lib/poro_validator/validators/integer_validator.rb +17 -0
- data/lib/poro_validator/validators/length_validator.rb +41 -0
- data/lib/poro_validator/validators/numeric_validator.rb +48 -0
- data/lib/poro_validator/validators/presence_validator.rb +23 -0
- data/lib/poro_validator/validators/range_array_validator.rb +19 -0
- data/lib/poro_validator/validators/with_validator.rb +21 -0
- data/lib/poro_validator/version.rb +3 -0
- data/poro_validator.gemspec +97 -0
- data/spec/features/composable_validations_spec.rb +26 -0
- data/spec/features/inheritable_spec.rb +29 -0
- data/spec/features/nested_validations_spec.rb +136 -0
- data/spec/lib/poro_validator/configuration_spec.rb +37 -0
- data/spec/lib/poro_validator/error_store_spec.rb +125 -0
- data/spec/lib/poro_validator/errors_spec.rb +79 -0
- data/spec/lib/poro_validator/validator/base_class_spec.rb +62 -0
- data/spec/lib/poro_validator/validator/conditions_spec.rb +112 -0
- data/spec/lib/poro_validator/validator/factory_spec.rb +23 -0
- data/spec/lib/poro_validator/validator/validation_spec.rb +69 -0
- data/spec/lib/poro_validator/validator/validations_spec.rb +34 -0
- data/spec/lib/poro_validator/validator_spec.rb +55 -0
- data/spec/lib/poro_validator/validators/base_class_spec.rb +11 -0
- data/spec/lib/poro_validator/validators/exclusion_validator_spec.rb +81 -0
- data/spec/lib/poro_validator/validators/float_validator_spec.rb +43 -0
- data/spec/lib/poro_validator/validators/format_validator_spec.rb +48 -0
- data/spec/lib/poro_validator/validators/inclusion_validator_spec.rb +81 -0
- data/spec/lib/poro_validator/validators/integer_validator_spec.rb +43 -0
- data/spec/lib/poro_validator/validators/length_validator_spec.rb +64 -0
- data/spec/lib/poro_validator/validators/numeric_validator_spec.rb +68 -0
- data/spec/lib/poro_validator/validators/presence_validator_spec.rb +52 -0
- data/spec/lib/poro_validator/validators/with_validator_spec.rb +90 -0
- data/spec/poro_validator_spec.rb +25 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/spec_helpers/concerns.rb +46 -0
- data/spec/support/spec_helpers/validator_test_macros.rb +99 -0
- metadata +199 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::ExclusionValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :amount, exclusion: 5..10
|
12
|
+
validates :tier, exclusion: [1,2,3,4,5]
|
13
|
+
validates :rate, exclusion: 5..10, if: proc { false }
|
14
|
+
end.new
|
15
|
+
end
|
16
|
+
|
17
|
+
expect_validator_to_be_invalid do
|
18
|
+
let(:entity) do
|
19
|
+
OpenStruct.new(
|
20
|
+
amount: 6,
|
21
|
+
tier: 5,
|
22
|
+
rate: 5
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:expected_errors) do
|
27
|
+
{
|
28
|
+
"amount" => ["is not outside the range of 5..10"],
|
29
|
+
"tier" => ["is not outside the range of [1, 2, 3, 4, 5]"]
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
skip_attr_unmet_condition do
|
34
|
+
let(:attr) { :rate }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "validator option is not valid" do
|
38
|
+
context "in option is nil" do
|
39
|
+
subject(:validator) do
|
40
|
+
Class.new do
|
41
|
+
include PoroValidator.validator
|
42
|
+
|
43
|
+
validates :amount, exclusion: "hello"
|
44
|
+
end.new
|
45
|
+
end
|
46
|
+
|
47
|
+
it "raises a ::PoroValidator::InvalidValidator" do
|
48
|
+
expect { subject.valid?(entity) }.to raise_error(
|
49
|
+
::PoroValidator::InvalidValidator
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "not a range or array" do
|
55
|
+
subject(:validator) do
|
56
|
+
Class.new do
|
57
|
+
include PoroValidator.validator
|
58
|
+
|
59
|
+
validates :amount, exclusion: { in: "hello" }
|
60
|
+
end.new
|
61
|
+
end
|
62
|
+
|
63
|
+
it "raises a ::PoroValidator::InvalidValidator" do
|
64
|
+
expect { subject.valid?(entity) }.to raise_error(
|
65
|
+
::PoroValidator::InvalidValidator
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
expect_validator_to_be_valid do
|
73
|
+
let(:entity) do
|
74
|
+
OpenStruct.new(
|
75
|
+
amount: 4,
|
76
|
+
tier: 6
|
77
|
+
)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::FloatValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :amount, float: true
|
12
|
+
validates :rate, float: true, if: proc { false }
|
13
|
+
end.new
|
14
|
+
end
|
15
|
+
|
16
|
+
expect_validator_to_be_invalid do
|
17
|
+
let(:entity) do
|
18
|
+
OpenStruct.new(
|
19
|
+
amount: 'aaa',
|
20
|
+
rate: 'aaa'
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:expected_errors) do
|
25
|
+
{
|
26
|
+
"amount" => ["is not a float"]
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
skip_attr_unmet_condition do
|
31
|
+
let(:attr) { :rate }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
expect_validator_to_be_valid do
|
36
|
+
let(:entity) do
|
37
|
+
OpenStruct.new(
|
38
|
+
amount: 5
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::FormatValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :first_name, format: /[a-z]/
|
12
|
+
validates :last_name, format: /[a-z]/, if: proc { true }
|
13
|
+
validates :dob, format: /[0-9]/, if: proc { false }
|
14
|
+
end.new
|
15
|
+
end
|
16
|
+
|
17
|
+
expect_validator_to_be_invalid do
|
18
|
+
let(:entity) do
|
19
|
+
OpenStruct.new(
|
20
|
+
first_name: "0000",
|
21
|
+
last_name: "1111",
|
22
|
+
dob: "aaaa"
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:expected_errors) do
|
27
|
+
{
|
28
|
+
"first_name" => ["does not match the pattern: /[a-z]/"],
|
29
|
+
"last_name" => ["does not match the pattern: /[a-z]/"]
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
skip_attr_unmet_condition do
|
34
|
+
let(:attr) { :dob }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
expect_validator_to_be_valid do
|
39
|
+
let(:entity) do
|
40
|
+
OpenStruct.new(
|
41
|
+
first_name: "manbearpig",
|
42
|
+
last_name: "gore",
|
43
|
+
dob: "01/01/1977"
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::InclusionValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :amount, inclusion: 1..10
|
12
|
+
validates :tier, inclusion: [1,2,3,4,5]
|
13
|
+
validates :rate, inclusion: 1..10, if: proc { false }
|
14
|
+
end.new
|
15
|
+
end
|
16
|
+
|
17
|
+
expect_validator_to_be_invalid do
|
18
|
+
let(:entity) do
|
19
|
+
OpenStruct.new(
|
20
|
+
amount: 11,
|
21
|
+
tier: 6,
|
22
|
+
rate: 11
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:expected_errors) do
|
27
|
+
{
|
28
|
+
"amount" => ["is not within the range of 1..10"],
|
29
|
+
"tier" => ["is not within the range of [1, 2, 3, 4, 5]"]
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
skip_attr_unmet_condition do
|
34
|
+
let(:attr) { :rate }
|
35
|
+
end
|
36
|
+
|
37
|
+
context "validator option is not valid" do
|
38
|
+
context "in option is nil" do
|
39
|
+
subject(:validator) do
|
40
|
+
Class.new do
|
41
|
+
include PoroValidator.validator
|
42
|
+
|
43
|
+
validates :amount, inclusion: "hello"
|
44
|
+
end.new
|
45
|
+
end
|
46
|
+
|
47
|
+
it "raises a ::PoroValidator::InvalidValidator" do
|
48
|
+
expect { subject.valid?(entity) }.to raise_error(
|
49
|
+
::PoroValidator::InvalidValidator
|
50
|
+
)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "not a range or array" do
|
55
|
+
subject(:validator) do
|
56
|
+
Class.new do
|
57
|
+
include PoroValidator.validator
|
58
|
+
|
59
|
+
validates :amount, inclusion: { in: "hello" }
|
60
|
+
end.new
|
61
|
+
end
|
62
|
+
|
63
|
+
it "raises a ::PoroValidator::InvalidValidator" do
|
64
|
+
expect { subject.valid?(entity) }.to raise_error(
|
65
|
+
::PoroValidator::InvalidValidator
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
expect_validator_to_be_valid do
|
73
|
+
let(:entity) do
|
74
|
+
OpenStruct.new(
|
75
|
+
amount: 5,
|
76
|
+
tier: 3
|
77
|
+
)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::IntegerValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :amount, integer: true
|
12
|
+
validates :rate, integer: true, if: proc { false }
|
13
|
+
end.new
|
14
|
+
end
|
15
|
+
|
16
|
+
expect_validator_to_be_invalid do
|
17
|
+
let(:entity) do
|
18
|
+
OpenStruct.new(
|
19
|
+
amount: "aaa",
|
20
|
+
rate: "aaa"
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:expected_errors) do
|
25
|
+
{
|
26
|
+
"amount" => ["is not an integer"]
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
skip_attr_unmet_condition do
|
31
|
+
let(:attr) { :rate }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
expect_validator_to_be_valid do
|
36
|
+
let(:entity) do
|
37
|
+
OpenStruct.new(
|
38
|
+
amount: 5
|
39
|
+
)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::LengthValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
def gen_random_char(range)
|
7
|
+
(0..range).map { ('a'..'z').to_a[rand(26)] }.first(range).join
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "#validate" do
|
11
|
+
subject(:validator) do
|
12
|
+
Class.new do
|
13
|
+
include PoroValidator.validator
|
14
|
+
|
15
|
+
validates :title, length: 1..10
|
16
|
+
validates :subject, length: { extremum: 1 }
|
17
|
+
validates :comment, length: { min: 10, max: 20 }
|
18
|
+
validates :info, length: { min: 10 }
|
19
|
+
validates :status, length: { max: 10 }
|
20
|
+
validates :detail, length: 1..10, if: proc { false }
|
21
|
+
end.new
|
22
|
+
end
|
23
|
+
|
24
|
+
expect_validator_to_be_invalid do
|
25
|
+
let(:entity) do
|
26
|
+
OpenStruct.new(
|
27
|
+
title: gen_random_char(rand(11..15)),
|
28
|
+
subject: gen_random_char(rand(2..10)),
|
29
|
+
comment: gen_random_char(rand(21..25)),
|
30
|
+
info: gen_random_char(rand(1..9)),
|
31
|
+
status: gen_random_char(rand(11..15)),
|
32
|
+
detail: gen_random_char(rand(11..15))
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:expected_errors) do
|
37
|
+
{
|
38
|
+
"title" => ["does not match the length options: {:in=>1..10}"],
|
39
|
+
"subject" => ["does not match the length options: {:extremum=>1}"],
|
40
|
+
"comment" => ["does not match the length options: {:max=>20}"],
|
41
|
+
"info" => ["does not match the length options: {:min=>10}"],
|
42
|
+
"status" => ["does not match the length options: {:max=>10}"],
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
skip_attr_unmet_condition do
|
47
|
+
let(:attr) { :detail }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
expect_validator_to_be_valid do
|
52
|
+
let(:entity) do
|
53
|
+
OpenStruct.new(
|
54
|
+
title: gen_random_char(rand(1..10)),
|
55
|
+
subject: gen_random_char(rand(1..1)),
|
56
|
+
comment: gen_random_char(rand(11..20)),
|
57
|
+
info: gen_random_char(rand(10..15)),
|
58
|
+
status: gen_random_char(rand(1..10)),
|
59
|
+
detail: gen_random_char(rand(11..15))
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::NumericValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :section, numeric: 1..10
|
12
|
+
validates :amount, numeric: 1..10
|
13
|
+
validates :cap, numeric: { extremum: 5 }
|
14
|
+
validates :bonus, numeric: { min: 10, max: 20 }
|
15
|
+
validates :price, numeric: { min: 10 }
|
16
|
+
validates :interest, numeric: { max: 20 }
|
17
|
+
validates :rate, numeric: 1..10, if: proc { false }
|
18
|
+
end.new
|
19
|
+
end
|
20
|
+
|
21
|
+
expect_validator_to_be_invalid do
|
22
|
+
let(:entity) do
|
23
|
+
OpenStruct.new(
|
24
|
+
section: 'aa',
|
25
|
+
amount: 11,
|
26
|
+
cap: 6,
|
27
|
+
bonus: 21,
|
28
|
+
price: 9,
|
29
|
+
interest: 21,
|
30
|
+
rate: 11
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:expected_errors) do
|
35
|
+
{
|
36
|
+
"section" => ["is not an integer"],
|
37
|
+
"amount" => ["does not match the numeric options: {:in=>1..10}"],
|
38
|
+
"cap" => ["does not match the numeric options: {:extremum=>5}"],
|
39
|
+
"bonus" => ["does not match the numeric options: {:max=>20}"],
|
40
|
+
"price" => ["does not match the numeric options: {:min=>10}"],
|
41
|
+
"interest" => ["does not match the numeric options: {:max=>20}"],
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
skip_attr_unmet_condition do
|
46
|
+
let(:attr) { :rate }
|
47
|
+
|
48
|
+
it "expects the attribute is not valid" do
|
49
|
+
expect(entity.public_send(attr).between?(1, 10)).to be_falsey
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
expect_validator_to_be_valid do
|
55
|
+
let(:entity) do
|
56
|
+
OpenStruct.new(
|
57
|
+
section: 1,
|
58
|
+
amount: 10,
|
59
|
+
cap: 5,
|
60
|
+
bonus: 11,
|
61
|
+
price: 11,
|
62
|
+
interest: 19,
|
63
|
+
rate: 11
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe PoroValidator::Validators::PresenceValidator do
|
4
|
+
include SpecHelpers::ValidatorTestMacros
|
5
|
+
|
6
|
+
describe "#validate" do
|
7
|
+
subject(:validator) do
|
8
|
+
Class.new do
|
9
|
+
include PoroValidator.validator
|
10
|
+
|
11
|
+
validates :first_name, presence: true
|
12
|
+
validates :last_name, presence: true, if: proc { true }
|
13
|
+
validates :nickname, presence: { allow_blank: true }
|
14
|
+
validates :dob, presence: true, if: proc { false }
|
15
|
+
end.new
|
16
|
+
end
|
17
|
+
|
18
|
+
expect_validator_to_be_invalid do
|
19
|
+
let(:entity) do
|
20
|
+
OpenStruct.new(
|
21
|
+
first_name: nil,
|
22
|
+
last_name: nil,
|
23
|
+
nickname: nil,
|
24
|
+
dob: nil
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:expected_errors) do
|
29
|
+
{
|
30
|
+
"first_name" => ["is not present"],
|
31
|
+
"last_name" => ["is not present"],
|
32
|
+
"nickname" => ["is not present"]
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
skip_attr_unmet_condition do
|
37
|
+
let(:attr) { :dob }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
expect_validator_to_be_valid do
|
42
|
+
let(:entity) do
|
43
|
+
OpenStruct.new(
|
44
|
+
first_name: "manbearpig",
|
45
|
+
last_name: "gore",
|
46
|
+
nickname: "",
|
47
|
+
dob: "01/01/1977"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|