dm-validations 0.9.9 → 0.9.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. data/History.txt +15 -0
  2. data/Manifest.txt +21 -2
  3. data/lib/dm-validations.rb +14 -14
  4. data/lib/dm-validations/absent_field_validator.rb +3 -4
  5. data/lib/dm-validations/acceptance_validator.rb +6 -10
  6. data/lib/dm-validations/confirmation_validator.rb +5 -5
  7. data/lib/dm-validations/contextual_validators.rb +1 -1
  8. data/lib/dm-validations/custom_validator.rb +1 -1
  9. data/lib/dm-validations/format_validator.rb +6 -5
  10. data/lib/dm-validations/generic_validator.rb +7 -10
  11. data/lib/dm-validations/length_validator.rb +7 -7
  12. data/lib/dm-validations/method_validator.rb +2 -2
  13. data/lib/dm-validations/numeric_validator.rb +4 -4
  14. data/lib/dm-validations/primitive_validator.rb +4 -4
  15. data/lib/dm-validations/required_field_validator.rb +5 -5
  16. data/lib/dm-validations/uniqueness_validator.rb +2 -2
  17. data/lib/dm-validations/validation_errors.rb +34 -2
  18. data/lib/dm-validations/version.rb +1 -1
  19. data/lib/dm-validations/within_validator.rb +15 -13
  20. data/spec/integration/absent_field_validator_spec.rb +4 -2
  21. data/spec/integration/acceptance_validator_spec.rb +3 -3
  22. data/spec/integration/auto_validate_spec.rb +16 -9
  23. data/spec/integration/block_validator_spec.rb +2 -8
  24. data/spec/integration/confirmation_validator_spec.rb +11 -8
  25. data/spec/integration/contextual_validators_spec.rb +2 -1
  26. data/spec/integration/format_validator_spec.rb +1 -1
  27. data/spec/integration/length_validator/error_message_spec.rb +23 -0
  28. data/spec/integration/length_validator/maximum_spec.rb +31 -0
  29. data/spec/integration/length_validator/minimum_spec.rb +31 -0
  30. data/spec/integration/length_validator/range_spec.rb +95 -0
  31. data/spec/integration/length_validator/spec_helper.rb +12 -0
  32. data/spec/integration/length_validator/valid_objects_spec.rb +13 -0
  33. data/spec/integration/method_validator_spec.rb +3 -3
  34. data/spec/integration/numeric_validator/float_type_spec.rb +102 -0
  35. data/spec/integration/numeric_validator/integer_only_true_spec.rb +92 -0
  36. data/spec/integration/numeric_validator/integer_type_spec.rb +100 -0
  37. data/spec/integration/numeric_validator/spec_helper.rb +77 -0
  38. data/spec/integration/numeric_validator_spec.rb +19 -6
  39. data/spec/integration/primitive_validator_spec.rb +2 -1
  40. data/spec/integration/required_field_validator/association_spec.rb +98 -0
  41. data/spec/integration/required_field_validator/boolean_type_value_spec.rb +149 -0
  42. data/spec/integration/required_field_validator/date_type_value_spec.rb +126 -0
  43. data/spec/integration/required_field_validator/datetime_type_value_spec.rb +126 -0
  44. data/spec/integration/required_field_validator/float_type_value_spec.rb +130 -0
  45. data/spec/integration/required_field_validator/integer_type_value_spec.rb +98 -0
  46. data/spec/integration/required_field_validator/plain_old_ruby_object_spec.rb +36 -0
  47. data/spec/integration/required_field_validator/shared_examples.rb +24 -0
  48. data/spec/integration/required_field_validator/spec_helper.rb +68 -0
  49. data/spec/integration/required_field_validator/string_type_value_spec.rb +164 -0
  50. data/spec/integration/required_field_validator/text_type_value_spec.rb +46 -0
  51. data/spec/integration/uniqueness_validator_spec.rb +10 -8
  52. data/spec/integration/validation_spec.rb +25 -25
  53. data/spec/integration/within_validator_spec.rb +36 -11
  54. data/tasks/spec.rb +1 -1
  55. metadata +24 -5
  56. data/spec/integration/length_validator_spec.rb +0 -115
  57. data/spec/integration/required_field_validator_spec.rb +0 -93
@@ -0,0 +1,164 @@
1
+ require 'pathname'
2
+ __dir__ = Pathname(__FILE__).dirname.expand_path
3
+
4
+ require __dir__.parent.parent + 'spec_helper'
5
+ require __dir__ + 'spec_helper'
6
+
7
+ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
8
+ # keep in mind any ScmOperation has a default value for brand property
9
+ # so it is used
10
+ describe GitOperation do
11
+ before :each do
12
+ @operation = GitOperation.new(:network_connection => true,
13
+ :clean_working_copy => true,
14
+ :message => "I did it! I did it!! Hell yeah!!!")
15
+ end
16
+
17
+ describe "without explicitly specified committer name" do
18
+ before :each do
19
+ # no specific actions for this case! yay!
20
+ end
21
+
22
+ it "is valid for committing (because default value jumps in)" do
23
+ @operation.should be_valid_for_committing
24
+ @operation.should be_valid(:committing)
25
+ end
26
+
27
+ it "is not valid in default context" do
28
+ # context here is :default
29
+ @operation.should_not be_valid
30
+ end
31
+
32
+ it "has default value set" do
33
+ # this is more of a sanity check since
34
+ # this sort of functionality clearly needs to be
35
+ # tested in
36
+ @operation.committer_name.should == "Just another Ruby hacker"
37
+ end
38
+ end # describe "without explicitly specified committer name"
39
+
40
+ describe "WITH explicitly specified committer name" do
41
+ before :each do
42
+ @operation.committer_name = "Core Team Guy"
43
+ end
44
+
45
+ it "is valid for committing" do
46
+ @operation.should be_valid_for_committing
47
+ @operation.should be_valid(:committing)
48
+ end
49
+
50
+ it "is not valid in default context" do
51
+ @operation.should_not be_valid
52
+ @operation.should_not be_valid(:default)
53
+ end
54
+
55
+ it "has value set" do
56
+ # this is more of a sanity check since
57
+ # this sort of functionality clearly needs to be
58
+ # tested in
59
+ @operation.committer_name.should == "Core Team Guy"
60
+ end
61
+ end # describe "with explicitly specified committer name"
62
+
63
+
64
+
65
+ describe "without explicitly specified author name" do
66
+ before :each do
67
+ # no specific actions for this case! yay!
68
+ end
69
+
70
+ it "is valid for committing (because default value jumps in)" do
71
+ @operation.should be_valid_for_committing
72
+ @operation.should be_valid(:committing)
73
+ end
74
+
75
+ it "is not valid in default context" do
76
+ # context here is :default
77
+ @operation.should_not be_valid
78
+ @operation.should_not be_valid(:default)
79
+ end
80
+
81
+ it "has default value set" do
82
+ @operation.author_name.should == "Just another Ruby hacker"
83
+ end
84
+ end # describe "without explicitly specified author name"
85
+
86
+ describe "WITH explicitly specified author name" do
87
+ before :each do
88
+ @operation.author_name = "Random contributor"
89
+ end
90
+
91
+ it "is valid for committing" do
92
+ @operation.should be_valid_for_committing
93
+ end
94
+
95
+ it "is not valid in default context" do
96
+ # context here is :default
97
+ @operation.should_not be_valid
98
+ end
99
+
100
+ it "has value set" do
101
+ @operation.author_name.should == "Random contributor"
102
+ end
103
+ end # describe "with explicitly specified author name"
104
+
105
+ describe "with empty committer name" do
106
+ before(:each) do
107
+ @operation.committer_name = ""
108
+ end
109
+
110
+ it "is NOT valid for committing" do
111
+ # empty string is not considered present for
112
+ # a String value
113
+ @operation.should_not be_valid_for_committing
114
+
115
+ # sanity check since this empty vs blank vs nil
116
+ # thing is a shaky ground
117
+ @operation.committer_name = "l33t k0dr"
118
+ @operation.should be_valid_for_committing
119
+ end
120
+
121
+ it "IS valid for pushing" do
122
+ @operation.should be_valid_for_pushing
123
+ end
124
+
125
+ it "IS valid for pulling" do
126
+ @operation.should be_valid_for_pulling
127
+ end
128
+
129
+ it "is not valid in default context" do
130
+ @operation.should_not be_valid
131
+ end
132
+ end # describe "with empty committer field"
133
+
134
+
135
+ describe "with empty author name" do
136
+ before(:each) do
137
+ @operation.author_name = ""
138
+ end
139
+
140
+ it "is NOT valid for committing" do
141
+ # empty string is not considered present for
142
+ # a String value
143
+ @operation.should_not be_valid_for_committing
144
+
145
+ # sanity check since this empty vs blank vs nil
146
+ # thing is a shaky ground
147
+ @operation.author_name = "l33t k0dr"
148
+ @operation.should be_valid_for_committing
149
+ end
150
+
151
+ it "IS valid for pushing" do
152
+ @operation.should be_valid_for_pushing
153
+ end
154
+
155
+ it "IS valid for pulling" do
156
+ @operation.should be_valid_for_pulling
157
+ end
158
+
159
+ it "is not valid in default context" do
160
+ @operation.should_not be_valid
161
+ end
162
+ end # describe "with empty author field"
163
+ end # describe GitOperation
164
+ end # if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
@@ -0,0 +1,46 @@
1
+ require 'pathname'
2
+ __dir__ = Pathname(__FILE__).dirname.expand_path
3
+
4
+ require __dir__.parent.parent + 'spec_helper'
5
+ require __dir__ + 'spec_helper'
6
+
7
+ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
8
+ # keep in mind any ScmOperation has a default value for brand property
9
+ # so it is used
10
+ describe GitOperation do
11
+ before :each do
12
+ @operation = GitOperation.new(:network_connection => true,
13
+ :clean_working_copy => true,
14
+ :message => "I did it! I did it!! Hell yeah!!!")
15
+ end
16
+
17
+ describe "with empty message" do
18
+ before(:each) do
19
+ @operation.message = ""
20
+ end
21
+
22
+ it "is NOT valid for committing" do
23
+ # empty string is not considered present for
24
+ # a text value
25
+ @operation.should_not be_valid_for_committing
26
+
27
+ # sanity check since this empty vs blank vs nil
28
+ # thing is a shaky ground
29
+ @operation.message = "RUBY ON RAILS CAN SCALE NOW!!! w00t!!!"
30
+ @operation.should be_valid_for_committing
31
+ end
32
+
33
+ it "IS valid for pushing" do
34
+ @operation.should be_valid_for_pushing
35
+ end
36
+
37
+ it "IS valid for pulling" do
38
+ @operation.should be_valid_for_pulling
39
+ end
40
+
41
+ it "is not valid in default context" do
42
+ @operation.should_not be_valid
43
+ end
44
+ end # describe "with empty message"
45
+ end # describe GitOperation
46
+ end # if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
@@ -5,7 +5,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
5
5
  describe DataMapper::Validate::UniquenessValidator do
6
6
 
7
7
  before do
8
- class Organisation
8
+ class ::Organisation
9
9
  include DataMapper::Resource
10
10
  property :id, Serial
11
11
  property :name, String
@@ -14,7 +14,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
14
14
  validates_is_unique :domain, :allow_nil => true
15
15
  end
16
16
 
17
- class User
17
+ class ::User
18
18
  include DataMapper::Resource
19
19
  property :id, Serial
20
20
  property :organisation_id, Integer
@@ -33,7 +33,7 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
33
33
  Organisation.new(:id=>1, :name=>'Org One', :domain=>'taken').save
34
34
  Organisation.new(:id=>2, :name=>'Org Two', :domain=>'two').save
35
35
 
36
- User.new(:id=>1,:organisation_id=>1,:user_name=>'guy').save
36
+ User.new(:id=>1, :organisation_id=>1, :user_name=>'guy').save
37
37
  end
38
38
  end
39
39
 
@@ -42,11 +42,11 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
42
42
  o = Organisation.get!(1)
43
43
  o.should be_valid
44
44
 
45
- o = Organisation.new(:id=>20,:name=>"Org Twenty", :domain=>nil)
45
+ o = Organisation.new(:id=>20, :name=>"Org Twenty", :domain=>nil)
46
46
  o.should be_valid
47
47
  o.save
48
48
 
49
- o = Organisation.new(:id=>30,:name=>"Org Thirty", :domain=>nil)
49
+ o = Organisation.new(:id=>30, :name=>"Org Thirty", :domain=>nil)
50
50
  o.should be_valid
51
51
  end
52
52
  end
@@ -56,17 +56,17 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
56
56
  o = Organisation.get!(1)
57
57
  o.should be_valid
58
58
 
59
- o = Organisation.new(:id=>2,:name=>"Org Two", :domain=>"taken")
59
+ o = Organisation.new(:id=>2, :name=>"Org Two", :domain=>"taken")
60
60
  o.should_not be_valid
61
61
  o.errors.on(:domain).should include('Domain is already taken')
62
62
 
63
- o = Organisation.new(:id=>2,:name=>"Org Two", :domain=>"not_taken")
63
+ o = Organisation.new(:id=>2, :name=>"Org Two", :domain=>"not_taken")
64
64
  o.should be_valid
65
65
  end
66
66
  end
67
67
 
68
68
  it 'should validate uniqueness on a string key' do
69
- class Department
69
+ class ::Department
70
70
  include DataMapper::Resource
71
71
  property :name, String, :key => true
72
72
 
@@ -83,7 +83,9 @@ if HAS_SQLITE3 || HAS_MYSQL || HAS_POSTGRES
83
83
  repository do
84
84
  u = User.new(:id => 2, :organisation_id=>1, :user_name => 'guy')
85
85
  u.should_not be_valid_for_testing_property
86
+ u.errors.on(:user_name).should include('User name is already taken')
86
87
  u.should_not be_valid_for_testing_association
88
+ u.errors.on(:user_name).should include('User name is already taken')
87
89
 
88
90
 
89
91
  u = User.new(:id => 2, :organisation_id => 2, :user_name => 'guy')
@@ -3,7 +3,7 @@ require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
3
3
 
4
4
  describe DataMapper::Validate do
5
5
  before :all do
6
- class Yacht
6
+ class ::Yacht
7
7
  include DataMapper::Resource
8
8
  property :id, Integer, :serial => true
9
9
  property :name, String, :auto_validation => false
@@ -15,7 +15,7 @@ describe DataMapper::Validate do
15
15
  describe '#validations' do
16
16
  it 'should support more different validations of a different type' do
17
17
  number_of_validators_before = Yacht.validators.contexts[:default].length
18
- class Yacht
18
+ class ::Yacht
19
19
  validates_is_unique :name
20
20
  end
21
21
  number_of_validators_after = Yacht.validators.contexts[:default].length
@@ -59,7 +59,7 @@ describe DataMapper::Validate do
59
59
 
60
60
  describe 'with context specified' do
61
61
  before :all do
62
- class Yacht
62
+ class ::Yacht
63
63
  validates_length :name, :min => 2, :context => [ :strict_name ]
64
64
  end
65
65
  end
@@ -143,7 +143,7 @@ describe DataMapper::Validate do
143
143
  end
144
144
 
145
145
  it "should allow multiple user defined contexts for a validator" do
146
- class Yacht
146
+ class ::Yacht
147
147
  property :port, String, :auto_validation => false
148
148
  validates_present :port, :context => [:at_sea, :in_harbor]
149
149
  end
@@ -154,7 +154,7 @@ describe DataMapper::Validate do
154
154
  end
155
155
 
156
156
  it "should alias :on and :when for :context" do
157
- class Yacht
157
+ class ::Yacht
158
158
  property :owner, String, :auto_validation => false
159
159
  property :bosun, String, :auto_validation => false
160
160
 
@@ -166,7 +166,7 @@ describe DataMapper::Validate do
166
166
  end
167
167
 
168
168
  it "should alias :group for :context (backward compat with Validatable??)" do
169
- class Yacht
169
+ class ::Yacht
170
170
  property :captain, String, :auto_validation => false
171
171
  validates_present :captain, :group => [:captained_vessel]
172
172
  end
@@ -174,7 +174,7 @@ describe DataMapper::Validate do
174
174
  end
175
175
 
176
176
  it "should add a method valid_for_<context_name>? for each context" do
177
- class Yacht
177
+ class ::Yacht
178
178
  property :engine_size, String, :auto_validation => false
179
179
  validates_present :engine_size, :when => :power_boat
180
180
  end
@@ -189,7 +189,7 @@ describe DataMapper::Validate do
189
189
  end
190
190
 
191
191
  it "should add a method all_valid_for_<context_name>? for each context" do
192
- class Yacht
192
+ class ::Yacht
193
193
  property :mast_height, String, :auto_validation => false
194
194
  validates_present :mast_height, :when => :sailing_vessel
195
195
  end
@@ -200,7 +200,7 @@ describe DataMapper::Validate do
200
200
  it "should be able to translate the error message" # needs String::translations
201
201
 
202
202
  it "should be able to get the error message for a given field" do
203
- class Yacht
203
+ class ::Yacht
204
204
  property :wood_type, String, :auto_validation => false
205
205
  validates_present :wood_type, :on => :wooden_boats
206
206
  end
@@ -212,7 +212,7 @@ describe DataMapper::Validate do
212
212
  end
213
213
 
214
214
  it "should be able to specify a custom error message" do
215
- class Yacht
215
+ class ::Yacht
216
216
  property :year_built, String, :auto_validation => false
217
217
  validates_present :year_built, :when => :built, :message => 'Year built is a must enter field'
218
218
  end
@@ -223,7 +223,7 @@ describe DataMapper::Validate do
223
223
  end
224
224
 
225
225
  it "should execute a Proc when provided in an :if clause and run validation if the Proc returns true" do
226
- class Dingy
226
+ class ::Dingy
227
227
  include DataMapper::Resource
228
228
  property :id, Integer, :serial => true
229
229
  property :owner, String, :auto_validation => false
@@ -236,7 +236,7 @@ describe DataMapper::Validate do
236
236
 
237
237
  Dingy.new.valid?.should == true
238
238
 
239
- class Dingy
239
+ class ::Dingy
240
240
  def owned?
241
241
  true
242
242
  end
@@ -246,7 +246,7 @@ describe DataMapper::Validate do
246
246
  end
247
247
 
248
248
  it "should execute a symbol or method name provided in an :if clause and run validation if the method returns true" do
249
- class Dingy
249
+ class ::Dingy
250
250
  validators.clear!
251
251
  validates_present :owner, :if => :owned?
252
252
 
@@ -257,7 +257,7 @@ describe DataMapper::Validate do
257
257
 
258
258
  Dingy.new.valid?.should == true
259
259
 
260
- class Dingy
260
+ class ::Dingy
261
261
  def owned?
262
262
  true
263
263
  end
@@ -267,7 +267,7 @@ describe DataMapper::Validate do
267
267
  end
268
268
 
269
269
  it "should execute a Proc when provided in an :unless clause and not run validation if the Proc returns true" do
270
- class RowBoat
270
+ class ::RowBoat
271
271
  include DataMapper::Resource
272
272
  property :id, Integer, :serial => true
273
273
  validates_present :salesman, :unless => Proc.new{|resource| resource.sold?}
@@ -279,7 +279,7 @@ describe DataMapper::Validate do
279
279
 
280
280
  RowBoat.new.valid?.should_not == true
281
281
 
282
- class RowBoat
282
+ class ::RowBoat
283
283
  def sold?
284
284
  true
285
285
  end
@@ -289,7 +289,7 @@ describe DataMapper::Validate do
289
289
  end
290
290
 
291
291
  it "should execute a symbol or method name provided in an :unless clause and not run validation if the method returns true" do
292
- class Dingy
292
+ class ::Dingy
293
293
  validators.clear!
294
294
  validates_present :salesman, :unless => :sold?
295
295
 
@@ -300,7 +300,7 @@ describe DataMapper::Validate do
300
300
 
301
301
  Dingy.new.valid?.should_not == true #not sold and no salesman
302
302
 
303
- class Dingy
303
+ class ::Dingy
304
304
  def sold?
305
305
  true
306
306
  end
@@ -310,7 +310,7 @@ describe DataMapper::Validate do
310
310
  end
311
311
 
312
312
  it "should perform automatic recursive validation #all_valid? checking all instance variables (and ivar.each items if valid)" do
313
- class Invoice
313
+ class ::Invoice
314
314
  include DataMapper::Resource
315
315
  property :id, Integer, :serial => true
316
316
  property :customer, String, :auto_validation => false
@@ -329,7 +329,7 @@ describe DataMapper::Validate do
329
329
  end
330
330
  end
331
331
 
332
- class LineItem
332
+ class ::LineItem
333
333
  include DataMapper::Resource
334
334
  property :id, Integer, :serial => true
335
335
  property :price, String, :auto_validation => false
@@ -340,7 +340,7 @@ describe DataMapper::Validate do
340
340
  end
341
341
  end
342
342
 
343
- class Comment
343
+ class ::Comment
344
344
  include DataMapper::Resource
345
345
  property :id, Integer, :serial => true
346
346
  property :note, String, :auto_validation => false
@@ -370,7 +370,7 @@ describe DataMapper::Validate do
370
370
  end
371
371
 
372
372
  it "should retrieve private instance variables for validation" do
373
- class Raft
373
+ class ::Raft
374
374
  include DataMapper::Resource
375
375
  property :length, Integer, :accessor => :private
376
376
 
@@ -383,7 +383,7 @@ describe DataMapper::Validate do
383
383
  end
384
384
 
385
385
  it "should duplicate validations to STI models" do
386
- class Company
386
+ class ::Company
387
387
  include DataMapper::Resource
388
388
 
389
389
  validates_present :title, :message => "Company name is a required field"
@@ -393,10 +393,10 @@ describe DataMapper::Validate do
393
393
  property :type, Discriminator
394
394
  end
395
395
 
396
- class ServiceCompany < Company
396
+ class ::ServiceCompany < Company
397
397
  end
398
398
 
399
- class ProductCompany < Company
399
+ class ::ProductCompany < Company
400
400
  end
401
401
  company = ServiceCompany.new
402
402
  company.should_not be_valid