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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/CODE_OF_CONDUCT.md +13 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +382 -0
  6. data/Rakefile +139 -0
  7. data/lib/poro_validator.rb +54 -0
  8. data/lib/poro_validator/configuration.rb +63 -0
  9. data/lib/poro_validator/error_store.rb +52 -0
  10. data/lib/poro_validator/errors.rb +56 -0
  11. data/lib/poro_validator/exceptions.rb +14 -0
  12. data/lib/poro_validator/validator.rb +82 -0
  13. data/lib/poro_validator/validator/base_class.rb +55 -0
  14. data/lib/poro_validator/validator/conditions.rb +71 -0
  15. data/lib/poro_validator/validator/context.rb +19 -0
  16. data/lib/poro_validator/validator/factory.rb +32 -0
  17. data/lib/poro_validator/validator/validation.rb +50 -0
  18. data/lib/poro_validator/validator/validations.rb +55 -0
  19. data/lib/poro_validator/validators/base_class.rb +53 -0
  20. data/lib/poro_validator/validators/exclusion_validator.rb +26 -0
  21. data/lib/poro_validator/validators/float_validator.rb +17 -0
  22. data/lib/poro_validator/validators/format_validator.rb +16 -0
  23. data/lib/poro_validator/validators/inclusion_validator.rb +26 -0
  24. data/lib/poro_validator/validators/integer_validator.rb +17 -0
  25. data/lib/poro_validator/validators/length_validator.rb +41 -0
  26. data/lib/poro_validator/validators/numeric_validator.rb +48 -0
  27. data/lib/poro_validator/validators/presence_validator.rb +23 -0
  28. data/lib/poro_validator/validators/range_array_validator.rb +19 -0
  29. data/lib/poro_validator/validators/with_validator.rb +21 -0
  30. data/lib/poro_validator/version.rb +3 -0
  31. data/poro_validator.gemspec +97 -0
  32. data/spec/features/composable_validations_spec.rb +26 -0
  33. data/spec/features/inheritable_spec.rb +29 -0
  34. data/spec/features/nested_validations_spec.rb +136 -0
  35. data/spec/lib/poro_validator/configuration_spec.rb +37 -0
  36. data/spec/lib/poro_validator/error_store_spec.rb +125 -0
  37. data/spec/lib/poro_validator/errors_spec.rb +79 -0
  38. data/spec/lib/poro_validator/validator/base_class_spec.rb +62 -0
  39. data/spec/lib/poro_validator/validator/conditions_spec.rb +112 -0
  40. data/spec/lib/poro_validator/validator/factory_spec.rb +23 -0
  41. data/spec/lib/poro_validator/validator/validation_spec.rb +69 -0
  42. data/spec/lib/poro_validator/validator/validations_spec.rb +34 -0
  43. data/spec/lib/poro_validator/validator_spec.rb +55 -0
  44. data/spec/lib/poro_validator/validators/base_class_spec.rb +11 -0
  45. data/spec/lib/poro_validator/validators/exclusion_validator_spec.rb +81 -0
  46. data/spec/lib/poro_validator/validators/float_validator_spec.rb +43 -0
  47. data/spec/lib/poro_validator/validators/format_validator_spec.rb +48 -0
  48. data/spec/lib/poro_validator/validators/inclusion_validator_spec.rb +81 -0
  49. data/spec/lib/poro_validator/validators/integer_validator_spec.rb +43 -0
  50. data/spec/lib/poro_validator/validators/length_validator_spec.rb +64 -0
  51. data/spec/lib/poro_validator/validators/numeric_validator_spec.rb +68 -0
  52. data/spec/lib/poro_validator/validators/presence_validator_spec.rb +52 -0
  53. data/spec/lib/poro_validator/validators/with_validator_spec.rb +90 -0
  54. data/spec/poro_validator_spec.rb +25 -0
  55. data/spec/spec_helper.rb +34 -0
  56. data/spec/support/spec_helpers/concerns.rb +46 -0
  57. data/spec/support/spec_helpers/validator_test_macros.rb +99 -0
  58. 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