whyvalidationssuckin96 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 (88) hide show
  1. data/.document +5 -0
  2. data/.gitignore +22 -0
  3. data/LICENSE +20 -0
  4. data/README.md +121 -0
  5. data/Rakefile +45 -0
  6. data/VERSION +1 -0
  7. data/doc/ActiveRecord/RecordInvalid.html +258 -0
  8. data/doc/ActiveRecord.html +93 -0
  9. data/doc/FalseClass.html +87 -0
  10. data/doc/NilClass.html +87 -0
  11. data/doc/Numeric.html +87 -0
  12. data/doc/Object.html +79 -0
  13. data/doc/String.html +87 -0
  14. data/doc/TrueClass.html +87 -0
  15. data/doc/WhyValidationsSuckIn96/ActiveRecord/InstanceMethods.html +156 -0
  16. data/doc/WhyValidationsSuckIn96/ActiveRecord.html +192 -0
  17. data/doc/WhyValidationsSuckIn96/AttributeBasedValidation.html +464 -0
  18. data/doc/WhyValidationsSuckIn96/SkippableValidation.html +194 -0
  19. data/doc/WhyValidationsSuckIn96/ValidatesAcceptance.html +254 -0
  20. data/doc/WhyValidationsSuckIn96/ValidatesAssociated.html +250 -0
  21. data/doc/WhyValidationsSuckIn96/ValidatesConfirmation.html +251 -0
  22. data/doc/WhyValidationsSuckIn96/ValidatesExclusion.html +388 -0
  23. data/doc/WhyValidationsSuckIn96/ValidatesFormat.html +387 -0
  24. data/doc/WhyValidationsSuckIn96/ValidatesInclusion.html +388 -0
  25. data/doc/WhyValidationsSuckIn96/ValidatesLength.html +469 -0
  26. data/doc/WhyValidationsSuckIn96/ValidatesNumericality.html +267 -0
  27. data/doc/WhyValidationsSuckIn96/ValidatesPresence.html +244 -0
  28. data/doc/WhyValidationsSuckIn96/ValidatesUniqueness.html +289 -0
  29. data/doc/WhyValidationsSuckIn96/Validation.html +934 -0
  30. data/doc/WhyValidationsSuckIn96/ValidationBuilder.html +391 -0
  31. data/doc/WhyValidationsSuckIn96/ValidationSupport/ClassMethods.html +249 -0
  32. data/doc/WhyValidationsSuckIn96/ValidationSupport/InstanceMethods.html +484 -0
  33. data/doc/WhyValidationsSuckIn96/ValidationSupport.html +168 -0
  34. data/doc/WhyValidationsSuckIn96.html +97 -0
  35. data/doc/_index.html +346 -0
  36. data/doc/class_list.html +293 -0
  37. data/doc/css/common.css +1 -0
  38. data/doc/css/full_list.css +23 -0
  39. data/doc/css/style.css +263 -0
  40. data/doc/file.README.html +173 -0
  41. data/doc/file_list.html +29 -0
  42. data/doc/index.html +173 -0
  43. data/doc/js/app.js +91 -0
  44. data/doc/js/full_list.js +39 -0
  45. data/doc/js/jquery.js +19 -0
  46. data/doc/method_list.html +462 -0
  47. data/doc/top-level-namespace.html +81 -0
  48. data/lib/whyvalidationssuckin96/attribute_based_validation.rb +46 -0
  49. data/lib/whyvalidationssuckin96/constants.rb +3 -0
  50. data/lib/whyvalidationssuckin96/ext/blank.rb +47 -0
  51. data/lib/whyvalidationssuckin96/macros/validates_acceptance.rb +36 -0
  52. data/lib/whyvalidationssuckin96/macros/validates_associated.rb +33 -0
  53. data/lib/whyvalidationssuckin96/macros/validates_confirmation.rb +40 -0
  54. data/lib/whyvalidationssuckin96/macros/validates_exclusion.rb +38 -0
  55. data/lib/whyvalidationssuckin96/macros/validates_format.rb +38 -0
  56. data/lib/whyvalidationssuckin96/macros/validates_inclusion.rb +38 -0
  57. data/lib/whyvalidationssuckin96/macros/validates_length.rb +98 -0
  58. data/lib/whyvalidationssuckin96/macros/validates_numericality.rb +56 -0
  59. data/lib/whyvalidationssuckin96/macros/validates_presence.rb +30 -0
  60. data/lib/whyvalidationssuckin96/macros.rb +9 -0
  61. data/lib/whyvalidationssuckin96/rails/active_record.rb +94 -0
  62. data/lib/whyvalidationssuckin96/rails/macros/validates_uniqueness.rb +87 -0
  63. data/lib/whyvalidationssuckin96/rails/macros.rb +1 -0
  64. data/lib/whyvalidationssuckin96/skippable_validation.rb +59 -0
  65. data/lib/whyvalidationssuckin96/validation.rb +88 -0
  66. data/lib/whyvalidationssuckin96/validation_builder.rb +56 -0
  67. data/lib/whyvalidationssuckin96/validation_support.rb +74 -0
  68. data/lib/whyvalidationssuckin96.rb +4 -0
  69. data/test/attribute_based_validation_test.rb +58 -0
  70. data/test/macros/validates_acceptance_test.rb +64 -0
  71. data/test/macros/validates_associated_test.rb +60 -0
  72. data/test/macros/validates_confirmation_test.rb +63 -0
  73. data/test/macros/validates_exclusion_test.rb +37 -0
  74. data/test/macros/validates_format_test.rb +43 -0
  75. data/test/macros/validates_inclusion_test.rb +37 -0
  76. data/test/macros/validates_length_test.rb +179 -0
  77. data/test/macros/validates_numericality_test.rb +129 -0
  78. data/test/macros/validates_presence_test.rb +31 -0
  79. data/test/rails/active_record_test.rb +187 -0
  80. data/test/rails/active_record_test_helper.rb +90 -0
  81. data/test/rails/macros/validates_uniqueness_test.rb +153 -0
  82. data/test/skippable_validation_test.rb +102 -0
  83. data/test/teststrap.rb +4 -0
  84. data/test/validation_builder_test.rb +62 -0
  85. data/test/validation_support_test.rb +209 -0
  86. data/test/validation_test.rb +101 -0
  87. data/whyvalidationssuckin96.gemspec +153 -0
  88. metadata +189 -0
@@ -0,0 +1,63 @@
1
+ require 'teststrap'
2
+
3
+ context "validates confirmation" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_confirmation_of')
8
+
9
+ context "with some default options" do
10
+ setup do
11
+ WhyValidationsSuckIn96::ValidatesConfirmation.new(Object.new, :attribute => :password)
12
+ end
13
+
14
+ should "have a message accessor with a default message" do
15
+ topic.message
16
+ end.equals("does not match the confirmation")
17
+ end # with some default options
18
+
19
+ context "validating an object" do
20
+
21
+ context "without a confirmation field" do
22
+ validatable = Class.new do
23
+ def password
24
+ "foo"
25
+ end
26
+ end.new
27
+
28
+ setup do
29
+ WhyValidationsSuckIn96::ValidatesConfirmation.new(validatable, :attribute => :password)
30
+ end
31
+
32
+ should "raise if a confirmation field isn't available" do
33
+ topic.validates?
34
+ end.raises(NoMethodError)
35
+
36
+ end # without a confirmation field
37
+
38
+ context "with a confirmation field" do
39
+ validatable = OpenStruct.new(:password => "foo")
40
+
41
+ setup do
42
+ WhyValidationsSuckIn96::ValidatesConfirmation.new(validatable, :attribute => :password)
43
+ end
44
+
45
+ should "fail if field does not match the confirmation" do
46
+ validatable.password = "foo"
47
+ validatable.password_confirmation = "bleh"
48
+ topic.validates?
49
+ end.equals(false)
50
+
51
+ should "pass if the field matches the confirmation" do
52
+ validatable.password = validatable.password_confirmation = "foo"
53
+ topic.validates?
54
+ end
55
+
56
+ should "skip the validation if the confirmation is nil" do
57
+ validatable.password_confirmation = nil
58
+ topic.validates?
59
+ topic.has_run?
60
+ end.equals(false)
61
+ end # with a confirmation field
62
+ end # validating an object
63
+ end # validates confirmation
@@ -0,0 +1,37 @@
1
+ require 'teststrap'
2
+
3
+ context "validates exclusion" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_exclusion_of')
8
+
9
+ should "raise if an :in option is not given" do
10
+ WhyValidationsSuckIn96::ValidatesExclusion.new(Object.new, :attribute => :colour)
11
+ end.raises(ArgumentError, "Collection to check for exclusion against should be specified with :in")
12
+
13
+ context "with some default options" do
14
+ setup do
15
+ WhyValidationsSuckIn96::ValidatesExclusion.new(Object.new, :attribute => :colour, :in => %w[1 2 3])
16
+ end
17
+
18
+ should "have a message accessor with a default message" do
19
+ topic.message
20
+ end.equals("is in the excluded collection")
21
+ end # with some default options
22
+
23
+ context "validating an object" do
24
+
25
+ should "fail if the attribute is in the excluded set" do
26
+ validation = WhyValidationsSuckIn96::ValidatesExclusion.new(OpenStruct.new(:colour => "red"), :attribute => :colour,
27
+ :in => %w[red blue])
28
+ validation.validates?
29
+ end.equals(false)
30
+
31
+ should "pass if the attribute is out of the excluded set" do
32
+ validation = WhyValidationsSuckIn96::ValidatesExclusion.new(OpenStruct.new(:colour => "red"), :attribute => :colour,
33
+ :in => %w[green blue])
34
+ validation.validates?
35
+ end
36
+ end # validating an object
37
+ end # validates exclusion
@@ -0,0 +1,43 @@
1
+ require 'teststrap'
2
+
3
+ context "validates format" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_format_of')
8
+
9
+ should "raise if a :with option is not given" do
10
+ WhyValidationsSuckIn96::ValidatesFormat.new(Object.new, :attribute => :colour)
11
+ end.raises(ArgumentError, "Regular expression to check against must be given as :with")
12
+
13
+ context "with some default options" do
14
+ setup do
15
+ WhyValidationsSuckIn96::ValidatesFormat.new(Object.new, :attribute => :colour, :with => /\d{3}/)
16
+ end
17
+
18
+ should "have a message accessor with a default message" do
19
+ topic.message
20
+ end.equals("does not match the given format")
21
+ end # with some default options
22
+
23
+ context "validating an object" do
24
+
25
+ should "fail if given attribute does not match the regular expression" do
26
+ validation = WhyValidationsSuckIn96::ValidatesFormat.new(OpenStruct.new(:number => "1"), :attribute => :number,
27
+ :with => /\d{3}/)
28
+ validation.validates?
29
+ end.equals(false)
30
+
31
+ should "pass if given attribute matches the regular expression" do
32
+ validation = WhyValidationsSuckIn96::ValidatesFormat.new(OpenStruct.new(:number => "111"), :attribute => :number,
33
+ :with => /\d{3}/)
34
+ validation.validates?
35
+ end
36
+
37
+ should "to_s the attribute when checking validity" do
38
+ validation = WhyValidationsSuckIn96::ValidatesFormat.new(OpenStruct.new(:number => 333), :attribute => :number,
39
+ :with => /\d{3}/)
40
+ validation.validates?
41
+ end
42
+ end # validating an object
43
+ end # validates format
@@ -0,0 +1,37 @@
1
+ require 'teststrap'
2
+
3
+ context "validates inclusion" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_inclusion_of')
8
+
9
+ should "raise if an :in option is not given" do
10
+ WhyValidationsSuckIn96::ValidatesInclusion.new(Object.new, :attribute => :colour)
11
+ end.raises(ArgumentError, "Collection to check for inclusion against should be specified with :in")
12
+
13
+ context "with some default options" do
14
+ setup do
15
+ WhyValidationsSuckIn96::ValidatesInclusion.new(Object.new, :attribute => :colour, :in => %w[1 2 3])
16
+ end
17
+
18
+ should "have a message accessor with a default message" do
19
+ topic.message
20
+ end.equals("is not in the acceptable collection")
21
+ end # with some default options
22
+
23
+ context "validating an object" do
24
+
25
+ should "fail if the attribute is not in the given set" do
26
+ validation = WhyValidationsSuckIn96::ValidatesInclusion.new(OpenStruct.new(:colour => "red"), :attribute => :colour,
27
+ :in => %w[blue green])
28
+ validation.validates?
29
+ end.equals(false)
30
+
31
+ should "pass if the attribute is in the given set" do
32
+ validation = WhyValidationsSuckIn96::ValidatesInclusion.new(OpenStruct.new(:colour => "red"), :attribute => :colour,
33
+ :in => %w[red green blue])
34
+ validation.validates?
35
+ end
36
+ end # validating an object
37
+ end # validates inclusion
@@ -0,0 +1,179 @@
1
+ require 'teststrap'
2
+
3
+ context "validates length" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_length_of')
8
+
9
+ should "raise if an no options are given" do
10
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text)
11
+ end.raises(ArgumentError, "Length options must be given as :minimum, :maximum, :is, or :in")
12
+
13
+ should "have a message accessor with a default message" do
14
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :is => 3).message
15
+ end.equals("does not meet the given length restrictions")
16
+
17
+ context "when specifying the :is option" do
18
+ should "not raise if solely :is is given" do
19
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :is => 3)
20
+ end
21
+
22
+ should "raise if :minimum is given" do
23
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :is => 3, :minimum => 4)
24
+ end.raises(ArgumentError, "Option :is can not be mixed with :minimum")
25
+
26
+ should "raise if :maximum is given" do
27
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :is => 3, :maximum => 2)
28
+ end.raises(ArgumentError, "Option :is can not be mixed with :maximum")
29
+
30
+ should "raise if :in is given" do
31
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :is => 3, :in => 5..10)
32
+ end.raises(ArgumentError, "Option :in can not be mixed with :is")
33
+
34
+ should "fail if the attribute length isn't exactly the given value" do
35
+ validation = WhyValidationsSuckIn96::ValidatesLength.new(OpenStruct.new(:text => "testing"), :attribute => :text, :is => 4)
36
+ validation.validates?
37
+ end.equals(false)
38
+
39
+ should "pass if the attribute length is exactly the given value" do
40
+ validation = WhyValidationsSuckIn96::ValidatesLength.new(OpenStruct.new(:text => "test"), :attribute => :text, :is => 4)
41
+ validation.validates?
42
+ end
43
+ end # when specifying the :is option
44
+
45
+ context "when specifying the :in option" do
46
+
47
+ should "not raise if solely :in is given" do
48
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :in => 1..10)
49
+ end
50
+
51
+ should "raise if :minimum is given" do
52
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :in => 1..10, :minimum => 4)
53
+ end.raises(ArgumentError, "Option :in can not be mixed with :minimum")
54
+
55
+ should "raise if :maximum is given" do
56
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :in => 1..10, :maximum => 4)
57
+ end.raises(ArgumentError, "Option :in can not be mixed with :maximum")
58
+
59
+ should "raise if :is is given" do
60
+ WhyValidationsSuckIn96::ValidatesLength.new(Object.new, :attribute => :text, :in => 1..10, :is => 3)
61
+ end.raises(ArgumentError, "Option :in can not be mixed with :is")
62
+
63
+ context "using a two dot range" do
64
+ validatable = OpenStruct.new(:text => "test")
65
+
66
+ setup do
67
+ WhyValidationsSuckIn96::ValidatesLength.new(validatable, :attribute => :text, :in => 2..10)
68
+ end
69
+
70
+ should "fail if the value is less than the beginning of the range" do
71
+ validatable.text = "a"
72
+ topic.validates?
73
+ end.equals(false)
74
+
75
+ should "fail if the value is more than the end of the range" do
76
+ validatable.text = "a" * 12
77
+ topic.validates?
78
+ end.equals(false)
79
+
80
+ should "pass if the value is exactly at the end of the range" do
81
+ validatable.text = "a" * 10
82
+ topic.validates?
83
+ end
84
+
85
+ should "pass if the value falls inside the range" do
86
+ validatable.text = "test"
87
+ topic.validates?
88
+ end
89
+ end # using a two dot range
90
+
91
+ context "using a three dot range" do
92
+ validatable = OpenStruct.new(:text => "test")
93
+
94
+ setup do
95
+ WhyValidationsSuckIn96::ValidatesLength.new(validatable, :attribute => :text, :in => 2...10)
96
+ end
97
+
98
+ should "fail if the value is less than the beginning of the range" do
99
+ validatable.text = "a"
100
+ topic.validates?
101
+ end.equals(false)
102
+
103
+ should "fail if the value is more than the end of the range" do
104
+ validatable.text = "a" * 12
105
+ topic.validates?
106
+ end.equals(false)
107
+
108
+ should "fail if the value is exactly at the end of the range" do
109
+ validatable.text = "a" * 10
110
+ topic.validates?
111
+ end.equals(false)
112
+
113
+ should "pass if the value falls inside the range" do
114
+ validatable.text = "test"
115
+ topic.validates?
116
+ end
117
+ end # using a three dot range
118
+
119
+ end # when specifying the :in option
120
+
121
+ context "when specifying the :minimum option" do
122
+ validatable = OpenStruct.new(:text => "test")
123
+
124
+ setup do
125
+ WhyValidationsSuckIn96::ValidatesLength.new(validatable, :attribute => :text, :minimum => 4)
126
+ end
127
+
128
+ should "pass if the attribute length is above the minimum value" do
129
+ validatable.text = "a" * 5
130
+ topic.validates?
131
+ end
132
+
133
+ should "pass if the attribute length is equal to the minimum value" do
134
+ validatable.text = "a" * 4
135
+ topic.validates?
136
+ end
137
+
138
+ should "fail if the attribute length is less than the minimum value" do
139
+ validatable.text = "a" * 2
140
+ topic.validates?
141
+ end.equals(false)
142
+ end # when specifying the :minimum option
143
+
144
+ context "when specifying the :maximum option" do
145
+ validatable = OpenStruct.new(:text => "test")
146
+
147
+ setup do
148
+ WhyValidationsSuckIn96::ValidatesLength.new(validatable, :attribute => :text, :maximum => 10)
149
+ end
150
+
151
+ should "pass if the attribute length is below the maximum value" do
152
+ validatable.text = "a" * 9
153
+ topic.validates?
154
+ end
155
+
156
+ should "pass if the attribute length is equal to the maximum value" do
157
+ validatable.text = "a" * 10
158
+ topic.validates?
159
+ end
160
+
161
+ should "fail if the attribute length is more than the maximum value" do
162
+ validatable.text = "a" * 15
163
+ topic.validates?
164
+ end.equals(false)
165
+ end # when specifying the :maximum option
166
+
167
+ context "when specifying the :minimum and :maximum options" do
168
+ validatable = OpenStruct.new(:text => "test")
169
+
170
+ setup do
171
+ WhyValidationsSuckIn96::ValidatesLength.new(validatable, :attribute => :text, :minimum => 3, :maximum => 10)
172
+ end
173
+
174
+ should "pass if the attribute length falls into the min/max range" do
175
+ validatable.text = "a" * 5
176
+ topic.validates?
177
+ end
178
+ end # when specifying the :minimum and :maximum options
179
+ end # validates length
@@ -0,0 +1,129 @@
1
+ require 'teststrap'
2
+
3
+ context "validates numericality" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_numericality_of')
8
+
9
+ context "with some default options" do
10
+ setup do
11
+ WhyValidationsSuckIn96::ValidatesNumericality.new(Object.new, :attribute => :number)
12
+ end
13
+
14
+ should "have a message accessor with a default message" do
15
+ topic.message
16
+ end.equals("is not a numerical value")
17
+ end # with some default options
18
+
19
+ context "validating an object" do
20
+
21
+ context "with the default option of :only_integer being false" do
22
+ validatable = OpenStruct.new(:number => 123)
23
+
24
+ setup do
25
+ WhyValidationsSuckIn96::ValidatesNumericality.new(validatable, :attribute => :number)
26
+ end
27
+
28
+ should "pass for an actual integer" do
29
+ validatable.number = 30000
30
+ topic.validates?
31
+ end
32
+
33
+ should "pass for a regular old integer string" do
34
+ validatable.number = "123"
35
+ topic.validates?
36
+ end
37
+
38
+ should "pass for a valid integer with spaces" do
39
+ validatable.number = "123 456"
40
+ topic.validates?
41
+ end
42
+
43
+ should "pass for a valid integer with commas" do
44
+ validatable.number = "123,456"
45
+ topic.validates?
46
+ end
47
+
48
+ should "pass for a valid integer with a positive sign" do
49
+ validatable.number = "+1234"
50
+ topic.validates?
51
+ end
52
+
53
+ should "pass for a valid integer with a negative sign" do
54
+ validatable.number "-1234"
55
+ topic.validates?
56
+ end
57
+
58
+ should "fail for an integer with letters" do
59
+ validatable.number = "a1234"
60
+ topic.validates?
61
+ end.equals(false)
62
+
63
+ should "fail for an integer with other punctuation" do
64
+ validatable.number = "!1234"
65
+ topic.validates?
66
+ end.equals(false)
67
+
68
+ should "pass for an actual float" do
69
+ validatable.number = 123.45
70
+ topic.validates?
71
+ end
72
+
73
+ should "pass for a regular old float" do
74
+ validatable.number = "123.456"
75
+ topic.validates?
76
+ end
77
+
78
+ should "pass for a valid float with spaces" do
79
+ validatable.number = "123 456.10"
80
+ topic.validates?
81
+ end
82
+
83
+ should "pass for a valid float with commas" do
84
+ validatable.number = "123,456.10"
85
+ topic.validates?
86
+ end
87
+
88
+ should "pass for a valid float with a positive sign" do
89
+ validatable.number = "+123456.10"
90
+ topic.validates?
91
+ end
92
+
93
+ should "pass for a valid float with a negative sign" do
94
+ validatable.number = "-123456.10"
95
+ topic.validates?
96
+ end
97
+
98
+ should "fail for a float with letters other than the exponent" do
99
+ validatable.number = "123z456.10"
100
+ topic.validates?
101
+ end.equals(false)
102
+
103
+ should "fail for a float with other punctuation" do
104
+ validatable.number = "$123456.10"
105
+ topic.validates?
106
+ end.equals(false)
107
+
108
+ end # with the default option of :only_integer being false
109
+
110
+ context "with the :only_integer option being true" do
111
+ validatable = OpenStruct.new(:number => 123)
112
+
113
+ setup do
114
+ WhyValidationsSuckIn96::ValidatesNumericality.new(validatable, :attribute => :number, :only_integer => true)
115
+ end
116
+
117
+ should "not allow float values" do
118
+ validatable.number = 123.456
119
+ topic.validates?
120
+ end.equals(false)
121
+
122
+ should "allow integer values" do
123
+ validatable.number = 123
124
+ topic.validates?
125
+ end
126
+
127
+ end # with the :only_integer option being true
128
+ end # validating an object
129
+ end # validates numericality
@@ -0,0 +1,31 @@
1
+ require 'teststrap'
2
+
3
+ context "validates presence" do
4
+
5
+ should "add a validation macro" do
6
+ WhyValidationsSuckIn96::ValidationBuilder.instance_methods
7
+ end.includes('validates_presence_of')
8
+
9
+ context "validating an object" do
10
+ validatable = OpenStruct.new(:message => "foo")
11
+
12
+ setup do
13
+ WhyValidationsSuckIn96::ValidatesPresence.new(validatable, :attribute => :message)
14
+ end
15
+
16
+ should "have a message accessor with a default message" do
17
+ topic.message
18
+ end.equals("is not present")
19
+
20
+ should "fail if the attribute is blank" do
21
+ validatable.message = ""
22
+ topic.validates?
23
+ end.equals(false)
24
+
25
+ should "pass if the attribute is non blank" do
26
+ validatable.message = "blah"
27
+ topic.validates?
28
+ end
29
+
30
+ end # validating an object
31
+ end # validates presence