veto 0.1.3 → 1.0.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -94
  3. data/lib/veto/blocks/block.rb +25 -0
  4. data/lib/veto/blocks/checker.rb +28 -0
  5. data/lib/veto/blocks/conditional_block.rb +26 -0
  6. data/lib/veto/blocks/validate_block.rb +18 -0
  7. data/lib/veto/blocks/validates_block.rb +51 -0
  8. data/lib/veto/blocks/with_options_block.rb +7 -0
  9. data/lib/veto/check_context_object.rb +10 -0
  10. data/lib/veto/checks/attribute_check.rb +19 -0
  11. data/lib/veto/checks/check.rb +7 -0
  12. data/lib/veto/checks/check_factory.rb +18 -0
  13. data/lib/veto/{validators/exact_length_validator.rb → checks/exact_length_check.rb} +5 -4
  14. data/lib/veto/{validators/format_validator.rb → checks/format_check.rb} +5 -4
  15. data/lib/veto/{validators/greater_than_validator.rb → checks/greater_than_check.rb} +2 -4
  16. data/lib/veto/{validators/greater_than_or_equal_to_validator.rb → checks/greater_than_or_equal_to_check.rb} +2 -4
  17. data/lib/veto/{validators/inclusion_validator.rb → checks/inclusion_check.rb} +2 -4
  18. data/lib/veto/{validators/integer_validator.rb → checks/integer_check.rb} +2 -4
  19. data/lib/veto/{validators/length_range_validator.rb → checks/length_range_check.rb} +2 -4
  20. data/lib/veto/{validators/less_than_validator.rb → checks/less_than_check.rb} +2 -4
  21. data/lib/veto/{validators/less_than_or_equal_to_validator.rb → checks/less_than_or_equal_to_check.rb} +2 -4
  22. data/lib/veto/{validators/max_length_validator.rb → checks/max_length_check.rb} +2 -4
  23. data/lib/veto/checks/method_check.rb +17 -0
  24. data/lib/veto/{validators/min_length_validator.rb → checks/min_length_check.rb} +2 -4
  25. data/lib/veto/{validators/not_null_validator.rb → checks/not_null_check.rb} +2 -4
  26. data/lib/veto/{validators/numeric_validator.rb → checks/numeric_check.rb} +2 -4
  27. data/lib/veto/{validators/presence_validator.rb → checks/presence_check.rb} +2 -4
  28. data/lib/veto/conditions/condition.rb +7 -0
  29. data/lib/veto/conditions/condition_factory.rb +18 -0
  30. data/lib/veto/conditions/conditions.rb +21 -0
  31. data/lib/veto/conditions/context_method_condition.rb +11 -0
  32. data/lib/veto/conditions/entity_eval_condition.rb +11 -0
  33. data/lib/veto/conditions/if_conditions.rb +8 -0
  34. data/lib/veto/conditions/if_unless_conditions.rb +21 -0
  35. data/lib/veto/conditions/passing_condition.rb +7 -0
  36. data/lib/veto/conditions/primative_condition.rb +11 -0
  37. data/lib/veto/conditions/proc_condition.rb +11 -0
  38. data/lib/veto/conditions/unless_conditions.rb +8 -0
  39. data/lib/veto/configuration.rb +38 -37
  40. data/lib/veto/errors.rb +27 -27
  41. data/lib/veto/exceptions.rb +13 -3
  42. data/lib/veto/model.rb +33 -35
  43. data/lib/veto/validator.rb +68 -169
  44. data/lib/veto/version.rb +1 -1
  45. data/lib/veto.rb +90 -49
  46. data/spec/blocks/block_spec.rb +31 -0
  47. data/spec/blocks/check_block_spec.rb +46 -0
  48. data/spec/blocks/conditional_block_spec.rb +36 -0
  49. data/spec/blocks/validate_block_spec.rb +18 -0
  50. data/spec/blocks/validates_block_spec.rb +22 -0
  51. data/spec/checks/exact_length_check_spec.rb +37 -0
  52. data/spec/checks/format_validator_spec.rb +37 -0
  53. data/spec/checks/greater_than_check_spec.rb +48 -0
  54. data/spec/checks/greater_than_or_equal_to_check_spec.rb +48 -0
  55. data/spec/checks/inclusion_check_spec.rb +37 -0
  56. data/spec/checks/integer_check_spec.rb +37 -0
  57. data/spec/checks/length_range_check_spec.rb +37 -0
  58. data/spec/checks/less_than_check_spec.rb +48 -0
  59. data/spec/checks/less_than_or_equal_to_check_spec.rb +48 -0
  60. data/spec/checks/max_length_check_spec.rb +48 -0
  61. data/spec/checks/method_check_spec.rb +13 -0
  62. data/spec/checks/min_length_check_spec.rb +48 -0
  63. data/spec/checks/not_null_check_spec.rb +37 -0
  64. data/spec/checks/numeric_check_spec.rb +37 -0
  65. data/spec/checks/presence_check_spec.rb +48 -0
  66. data/spec/conditions/condition_factory_spec.rb +31 -0
  67. data/spec/conditions/conditions_spec.rb +25 -0
  68. data/spec/conditions/context_method_condition_spec.rb +25 -0
  69. data/spec/conditions/entity_eval_condition_spec.rb +21 -0
  70. data/spec/conditions/if_conditions_spec.rb +65 -0
  71. data/spec/conditions/if_unless_conditions_spec.rb +33 -0
  72. data/spec/conditions/primative_condition_spec.rb +22 -0
  73. data/spec/conditions/proc_condition_spec.rb +25 -0
  74. data/spec/conditions/unless_conditions_spec.rb +65 -0
  75. data/spec/configuration/message_spec.rb +18 -23
  76. data/spec/spec_helper.rb +2 -1
  77. data/spec/validator_spec.rb +224 -115
  78. metadata +96 -61
  79. data/lib/veto/attribute_validator_factory.rb +0 -36
  80. data/lib/veto/builder.rb +0 -65
  81. data/lib/veto/conditions.rb +0 -23
  82. data/lib/veto/conditions_evaluator.rb +0 -30
  83. data/lib/veto/validators/abstract_validator.rb +0 -15
  84. data/lib/veto/validators/attribute_validator.rb +0 -22
  85. data/lib/veto/validators/custom_method_validator.rb +0 -19
  86. data/spec/attribute_validator_factory_spec.rb +0 -72
  87. data/spec/builder_spec.rb +0 -38
  88. data/spec/conditions_evaluator_spec.rb +0 -90
  89. data/spec/conditions_spec.rb +0 -16
  90. data/spec/configuration_spec.rb +0 -6
  91. data/spec/errors_spec.rb +0 -22
  92. data/spec/model_spec.rb +0 -67
  93. data/spec/system/validator_spec.rb +0 -530
  94. data/spec/validators/exact_length_validator_spec.rb +0 -37
  95. data/spec/validators/format_validator_spec.rb +0 -32
  96. data/spec/validators/inclusion_validator_spec.rb +0 -45
  97. data/spec/validators/integer_validator_spec.rb +0 -42
  98. data/spec/validators/length_range_validator_spec.rb +0 -55
  99. data/spec/validators/max_length_validator_spec.rb +0 -32
  100. data/spec/validators/min_length_validator_spec.rb +0 -32
  101. data/spec/validators/not_null_validator_spec.rb +0 -27
  102. data/spec/validators/numeric_validator_spec.rb +0 -42
  103. data/spec/validators/presence_validator_spec.rb +0 -47
  104. data/spec/veto_spec.rb +0 -24
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::Block do
4
+ it 'can have children assigned' do
5
+ block = new_block
6
+ child = stub
7
+ block << child
8
+ block.children.must_equal([child])
9
+ end
10
+
11
+ it 'can :call each child' do
12
+ block = new_block
13
+
14
+ child1 = stub
15
+ child2 = stub
16
+
17
+ block << child1
18
+ block << child2
19
+
20
+ args = stub
21
+
22
+ child1.expects(:call).with(args).once
23
+ child2.expects(:call).with(args).once
24
+
25
+ block.call(args)
26
+ end
27
+
28
+ def new_block
29
+ Veto::Block.new
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::ValidatesBlock::CheckBlock do
4
+ it 'gets attribute_name' do
5
+ block = new_block(:presence, :first_name, true)
6
+ block.attribute_name.must_equal(:first_name)
7
+ end
8
+
9
+ it 'gets type' do
10
+ block = new_block(:presence, :first_name, true)
11
+ block.type.must_equal(:presence)
12
+ end
13
+
14
+ it 'converts true value to hash' do
15
+ block = new_block(:presence, :first_name, true)
16
+ block.options.must_equal({})
17
+ end
18
+
19
+ it 'converts range value to hash' do
20
+ block = new_block(:presence, :first_name, 1..9)
21
+ block.options.must_equal(:in => 1..9)
22
+ end
23
+
24
+ it 'converts array value to hash' do
25
+ block = new_block(:presence, :first_name, ['cat', 'dog'])
26
+ block.options.must_equal(:in => ['cat', 'dog'])
27
+ end
28
+
29
+ it 'converts other value to hash' do
30
+ block = new_block(:presence, :first_name, 23)
31
+ block.options.must_equal(:with => 23)
32
+ end
33
+
34
+ it 'can build structure and assign check child' do
35
+ block = build_block(:presence, :first_name, true)
36
+ block.children.map{|c| c.class.name}.must_equal(["Veto::PresenceCheck"])
37
+ end
38
+
39
+ def new_block(*args)
40
+ Veto::ValidatesBlock::CheckBlock.new(*args)
41
+ end
42
+
43
+ def build_block(*args)
44
+ Veto::ValidatesBlock::CheckBlock.build(*args)
45
+ end
46
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::ConditionalBlock do
4
+ it 'exposes options with conditions removed' do
5
+ block = new_block(:if => 'blah', :opt1 => 'blahblah')
6
+ block.options.must_equal(:opt1 => 'blahblah')
7
+ end
8
+
9
+ context 'when conditions pass' do
10
+ it 'will :call children' do
11
+ block = new_block(:if => true, :opt1 => 'blahblah')
12
+ child = stub
13
+
14
+ block << child
15
+
16
+ child.expects(:call).once
17
+ block.call
18
+ end
19
+ end
20
+
21
+ context 'when conditions fail' do
22
+ it 'will not :call children' do
23
+ block = new_block(:if => false, :opt1 => 'blahblah')
24
+ child = stub
25
+
26
+ block << child
27
+
28
+ child.expects(:call).never
29
+ block.call
30
+ end
31
+ end
32
+
33
+ def new_block(*args)
34
+ Veto::ConditionalBlock.new(*args)
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::ValidateBlock do
4
+ it 'can build itself and assign check child' do
5
+ block = Veto::ValidateBlock.build(:good_method?, :if => true)
6
+ block.children.size.must_equal(1)
7
+ block.children[0].must_be_instance_of(Veto::MethodCheck)
8
+ end
9
+
10
+ it 'has method_name' do
11
+ block = new_block(:good_method?)
12
+ block.method_name.must_equal(:good_method?)
13
+ end
14
+
15
+ def new_block(*args)
16
+ Veto::ValidateBlock.new(*args)
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::ValidatesBlock do
4
+ it 'gets attribute_name' do
5
+ block = new_block(:first_name, :presence => true, :if => true)
6
+ block.attribute_name.must_equal(:first_name)
7
+ end
8
+
9
+ it 'can build nested check structure' do
10
+ block = build_block(:first_name, :presence => true, :format => /[a-z]/, :if => true)
11
+ block.children.size.must_equal(2)
12
+ block.children[0].must_be_instance_of(Veto::ValidatesBlock::CheckBlock)
13
+ end
14
+
15
+ def new_block(*args)
16
+ Veto::ValidatesBlock.new(*args)
17
+ end
18
+
19
+ def build_block(*args)
20
+ Veto::ValidatesBlock.build(*args)
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::ExactLengthCheck do
4
+ context 'when value is exact length' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'abcde')
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 5)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is not exact length' do
16
+ it 'assigns errors' do
17
+ entity = stub(:name => 'abcde')
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 4)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(['is not 4 characters'])
23
+ end
24
+ end
25
+
26
+ def new_cto(entity, errors)
27
+ stub(:entity => entity, :errors => errors)
28
+ end
29
+
30
+ def new_check(*args)
31
+ Veto::ExactLengthCheck.new(*args)
32
+ end
33
+
34
+ def new_errors
35
+ Veto::Errors.new
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::FormatCheck do
4
+ context 'when value matches format' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'abcde')
7
+ errors = new_errors
8
+ check = new_check(:name, :with => /^[a-z]+$/)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value does not match format' do
16
+ it 'assigns errors' do
17
+ entity = stub(:name => 'abcde1')
18
+ errors = new_errors
19
+ check = new_check(:name, :with => /^[a-z]+$/)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["is not valid"])
23
+ end
24
+ end
25
+
26
+ def new_cto(entity, errors)
27
+ stub(:entity => entity, :errors => errors)
28
+ end
29
+
30
+ def new_check(*args)
31
+ Veto::FormatCheck.new(*args)
32
+ end
33
+
34
+ def new_errors
35
+ Veto::Errors.new
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::GreaterThanCheck do
4
+ context 'when value is greater than' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 24)
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 23)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is equal' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 23)
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 23)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["must be greater than 23"])
23
+ end
24
+ end
25
+
26
+ context 'when value is less than' do
27
+ it 'assigns no errors' do
28
+ entity = stub(:name => 22)
29
+ errors = new_errors
30
+ check = new_check(:name, :with => 23)
31
+
32
+ check.call(new_cto(entity, errors))
33
+ errors[:name].must_equal(["must be greater than 23"])
34
+ end
35
+ end
36
+
37
+ def new_cto(entity, errors)
38
+ stub(:entity => entity, :errors => errors)
39
+ end
40
+
41
+ def new_check(*args)
42
+ Veto::GreaterThanCheck.new(*args)
43
+ end
44
+
45
+ def new_errors
46
+ Veto::Errors.new
47
+ end
48
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::GreaterThanOrEqualToCheck do
4
+ context 'when value is equal' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 23)
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 23)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is greater than' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 24)
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 23)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_be_nil
23
+ end
24
+ end
25
+
26
+ context 'when value is less than' do
27
+ it 'assigns no errors' do
28
+ entity = stub(:name => 22)
29
+ errors = new_errors
30
+ check = new_check(:name, :with => 23)
31
+
32
+ check.call(new_cto(entity, errors))
33
+ errors[:name].must_equal(["must be greater than or equal to 23"])
34
+ end
35
+ end
36
+
37
+ def new_cto(entity, errors)
38
+ stub(:entity => entity, :errors => errors)
39
+ end
40
+
41
+ def new_check(*args)
42
+ Veto::GreaterThanOrEqualToCheck.new(*args)
43
+ end
44
+
45
+ def new_errors
46
+ Veto::Errors.new
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::InclusionCheck do
4
+ context 'when value is included' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'cat')
7
+ errors = new_errors
8
+ check = new_check(:name, :in => %w(cat dog mouse))
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is not included' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 'cat')
18
+ errors = new_errors
19
+ check = new_check(:name, :in => %w(dog mouse))
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["is not in set: [\"dog\", \"mouse\"]"])
23
+ end
24
+ end
25
+
26
+ def new_cto(entity, errors)
27
+ stub(:entity => entity, :errors => errors)
28
+ end
29
+
30
+ def new_check(*args)
31
+ Veto::InclusionCheck.new(*args)
32
+ end
33
+
34
+ def new_errors
35
+ Veto::Errors.new
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::IntegerCheck do
4
+ context 'when value is an integer' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 23)
7
+ errors = new_errors
8
+ check = new_check(:name)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is not an integer' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 'abc')
18
+ errors = new_errors
19
+ check = new_check(:name)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["is not a number"])
23
+ end
24
+ end
25
+
26
+ def new_cto(entity, errors)
27
+ stub(:entity => entity, :errors => errors)
28
+ end
29
+
30
+ def new_check(*args)
31
+ Veto::IntegerCheck.new(*args)
32
+ end
33
+
34
+ def new_errors
35
+ Veto::Errors.new
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::LengthRangeCheck do
4
+ context 'when value in length range' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'abcdef')
7
+ errors = new_errors
8
+ check = new_check(:name, :in => 1..10)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value not in length range' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 'abcdef')
18
+ errors = new_errors
19
+ check = new_check(:name, :in => 99..199)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["is too short or too long"])
23
+ end
24
+ end
25
+
26
+ def new_cto(entity, errors)
27
+ stub(:entity => entity, :errors => errors)
28
+ end
29
+
30
+ def new_check(*args)
31
+ Veto::LengthRangeCheck.new(*args)
32
+ end
33
+
34
+ def new_errors
35
+ Veto::Errors.new
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::LessThanCheck do
4
+ context 'when value is less than' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 22)
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 23)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is equal' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 23)
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 23)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["must be less than 23"])
23
+ end
24
+ end
25
+
26
+ context 'when value is greater than' do
27
+ it 'assigns no errors' do
28
+ entity = stub(:name => 24)
29
+ errors = new_errors
30
+ check = new_check(:name, :with => 23)
31
+
32
+ check.call(new_cto(entity, errors))
33
+ errors[:name].must_equal(["must be less than 23"])
34
+ end
35
+ end
36
+
37
+ def new_cto(entity, errors)
38
+ stub(:entity => entity, :errors => errors)
39
+ end
40
+
41
+ def new_check(*args)
42
+ Veto::LessThanCheck.new(*args)
43
+ end
44
+
45
+ def new_errors
46
+ Veto::Errors.new
47
+ end
48
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::LessThanOrEqualToCheck do
4
+ context 'when value is equal' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 23)
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 23)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is less than' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 22)
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 23)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_be_nil
23
+ end
24
+ end
25
+
26
+ context 'when value is greater than' do
27
+ it 'assigns no errors' do
28
+ entity = stub(:name => 24)
29
+ errors = new_errors
30
+ check = new_check(:name, :with => 23)
31
+
32
+ check.call(new_cto(entity, errors))
33
+ errors[:name].must_equal(["must be less than or equal to 23"])
34
+ end
35
+ end
36
+
37
+ def new_cto(entity, errors)
38
+ stub(:entity => entity, :errors => errors)
39
+ end
40
+
41
+ def new_check(*args)
42
+ Veto::LessThanOrEqualToCheck.new(*args)
43
+ end
44
+
45
+ def new_errors
46
+ Veto::Errors.new
47
+ end
48
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::MaxLengthCheck do
4
+ context 'when value is less than max length' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'abcdefgh')
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 99)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value equals max length' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 'abcde')
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 5)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_be_nil
23
+ end
24
+ end
25
+
26
+ context 'when value is greater than max length' do
27
+ it 'assigns no errors' do
28
+ entity = stub(:name => 'abcdefgh')
29
+ errors = new_errors
30
+ check = new_check(:name, :with => 5)
31
+
32
+ check.call(new_cto(entity, errors))
33
+ errors[:name].must_equal(["is longer than 5 characters"])
34
+ end
35
+ end
36
+
37
+ def new_cto(entity, errors)
38
+ stub(:entity => entity, :errors => errors)
39
+ end
40
+
41
+ def new_check(*args)
42
+ Veto::MaxLengthCheck.new(*args)
43
+ end
44
+
45
+ def new_errors
46
+ Veto::Errors.new
47
+ end
48
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::MethodCheck do
4
+ it 'delegates to method call on context' do
5
+ check = Veto::MethodCheck.new(:name)
6
+ entity = stub
7
+ context = stub(:name => true)
8
+ cco = stub(:entity => entity, :context => context)
9
+
10
+ context.expects(:name).with(entity).once
11
+ check.call(cco)
12
+ end
13
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::MinLengthCheck do
4
+ context 'when value is greater than min length' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'abcdefgh')
7
+ errors = new_errors
8
+ check = new_check(:name, :with => 5)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value equals min length' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => 'abcde')
18
+ errors = new_errors
19
+ check = new_check(:name, :with => 5)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_be_nil
23
+ end
24
+ end
25
+
26
+ context 'when value is less than min length' do
27
+ it 'assigns no errors' do
28
+ entity = stub(:name => 'abcdefgh')
29
+ errors = new_errors
30
+ check = new_check(:name, :with => 99)
31
+
32
+ check.call(new_cto(entity, errors))
33
+ errors[:name].must_equal(["is shorter than 99 characters"])
34
+ end
35
+ end
36
+
37
+ def new_cto(entity, errors)
38
+ stub(:entity => entity, :errors => errors)
39
+ end
40
+
41
+ def new_check(*args)
42
+ Veto::MinLengthCheck.new(*args)
43
+ end
44
+
45
+ def new_errors
46
+ Veto::Errors.new
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Veto::NotNullCheck do
4
+ context 'when value is not null' do
5
+ it 'assigns no errors' do
6
+ entity = stub(:name => 'abcde')
7
+ errors = new_errors
8
+ check = new_check(:name)
9
+
10
+ check.call(new_cto(entity, errors))
11
+ errors[:name].must_be_nil
12
+ end
13
+ end
14
+
15
+ context 'when value is null' do
16
+ it 'assigns no errors' do
17
+ entity = stub(:name => nil)
18
+ errors = new_errors
19
+ check = new_check(:name)
20
+
21
+ check.call(new_cto(entity, errors))
22
+ errors[:name].must_equal(["is not present"])
23
+ end
24
+ end
25
+
26
+ def new_cto(entity, errors)
27
+ stub(:entity => entity, :errors => errors)
28
+ end
29
+
30
+ def new_check(*args)
31
+ Veto::NotNullCheck.new(*args)
32
+ end
33
+
34
+ def new_errors
35
+ Veto::Errors.new
36
+ end
37
+ end