validates_timeliness 2.3.2 → 3.0.0.beta

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 (59) hide show
  1. data/CHANGELOG +12 -4
  2. data/LICENSE +1 -1
  3. data/README.rdoc +138 -280
  4. data/Rakefile +30 -16
  5. data/lib/generators/validates_timeliness/install_generator.rb +17 -0
  6. data/lib/generators/validates_timeliness/templates/en.yml +16 -0
  7. data/lib/generators/validates_timeliness/templates/validates_timeliness.rb +22 -0
  8. data/lib/validates_timeliness.rb +46 -52
  9. data/lib/validates_timeliness/attribute_methods.rb +51 -0
  10. data/lib/validates_timeliness/conversion.rb +69 -0
  11. data/lib/validates_timeliness/extensions.rb +14 -0
  12. data/lib/validates_timeliness/extensions/date_time_select.rb +45 -0
  13. data/lib/validates_timeliness/extensions/multiparameter_handler.rb +31 -0
  14. data/lib/validates_timeliness/helper_methods.rb +41 -0
  15. data/lib/validates_timeliness/orms/active_record.rb +14 -0
  16. data/lib/validates_timeliness/parser.rb +389 -17
  17. data/lib/validates_timeliness/validator.rb +37 -200
  18. data/lib/validates_timeliness/version.rb +1 -1
  19. data/spec/model_helpers.rb +27 -0
  20. data/spec/spec_helper.rb +74 -43
  21. data/spec/test_model.rb +56 -0
  22. data/spec/validates_timeliness/attribute_methods_spec.rb +36 -0
  23. data/spec/validates_timeliness/conversion_spec.rb +204 -0
  24. data/spec/validates_timeliness/extensions/date_time_select_spec.rb +178 -0
  25. data/spec/validates_timeliness/extensions/multiparameter_handler_spec.rb +21 -0
  26. data/spec/validates_timeliness/helper_methods_spec.rb +36 -0
  27. data/spec/{formats_spec.rb → validates_timeliness/parser_spec.rb} +105 -71
  28. data/spec/validates_timeliness/validator/after_spec.rb +59 -0
  29. data/spec/validates_timeliness/validator/before_spec.rb +59 -0
  30. data/spec/validates_timeliness/validator/is_at_spec.rb +63 -0
  31. data/spec/validates_timeliness/validator/on_or_after_spec.rb +59 -0
  32. data/spec/validates_timeliness/validator/on_or_before_spec.rb +59 -0
  33. data/spec/validates_timeliness/validator_spec.rb +172 -0
  34. data/validates_timeliness.gemspec +30 -0
  35. metadata +42 -40
  36. data/TODO +0 -8
  37. data/lib/validates_timeliness/action_view/instance_tag.rb +0 -52
  38. data/lib/validates_timeliness/active_record/attribute_methods.rb +0 -77
  39. data/lib/validates_timeliness/active_record/multiparameter_attributes.rb +0 -69
  40. data/lib/validates_timeliness/formats.rb +0 -368
  41. data/lib/validates_timeliness/locale/en.new.yml +0 -18
  42. data/lib/validates_timeliness/locale/en.old.yml +0 -18
  43. data/lib/validates_timeliness/matcher.rb +0 -1
  44. data/lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb +0 -162
  45. data/lib/validates_timeliness/validation_methods.rb +0 -46
  46. data/spec/action_view/instance_tag_spec.rb +0 -194
  47. data/spec/active_record/attribute_methods_spec.rb +0 -157
  48. data/spec/active_record/multiparameter_attributes_spec.rb +0 -118
  49. data/spec/ginger_scenarios.rb +0 -19
  50. data/spec/parser_spec.rb +0 -65
  51. data/spec/resources/application.rb +0 -2
  52. data/spec/resources/person.rb +0 -3
  53. data/spec/resources/schema.rb +0 -10
  54. data/spec/resources/sqlite_patch.rb +0 -19
  55. data/spec/spec/rails/matchers/validate_timeliness_spec.rb +0 -245
  56. data/spec/time_travel/MIT-LICENSE +0 -20
  57. data/spec/time_travel/time_extensions.rb +0 -33
  58. data/spec/time_travel/time_travel.rb +0 -12
  59. data/spec/validator_spec.rb +0 -723
@@ -1,20 +0,0 @@
1
- Copyright (c) 2008 Peter Yandell
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining
4
- a copy of this software and associated documentation files (the
5
- "Software"), to deal in the Software without restriction, including
6
- without limitation the rights to use, copy, modify, merge, publish,
7
- distribute, sublicense, and/or sell copies of the Software, and to
8
- permit persons to whom the Software is furnished to do so, subject to
9
- the following conditions:
10
-
11
- The above copyright notice and this permission notice shall be
12
- included in all copies or substantial portions of the Software.
13
-
14
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,33 +0,0 @@
1
- require 'time'
2
-
3
- module TimeTravel
4
- module TimeExtensions
5
-
6
- def self.included(base)
7
- base.extend(ClassMethods)
8
- base.class_eval do
9
- class << self
10
- alias_method :immutable_now, :now
11
- alias_method :now, :mutable_now
12
- end
13
- end
14
- base.now = nil
15
- end
16
-
17
- module ClassMethods
18
-
19
- @@now = nil
20
-
21
- def now=(time)
22
- time = Time.parse(time) if time.instance_of?(String)
23
- @@now = time
24
- end
25
-
26
- def mutable_now #:nodoc:
27
- @@now || immutable_now
28
- end
29
-
30
- end
31
-
32
- end
33
- end
@@ -1,12 +0,0 @@
1
- require 'time_travel/time_extensions'
2
-
3
- Time.send(:include, TimeTravel::TimeExtensions)
4
-
5
- def at_time(time)
6
- Time.now = time
7
- begin
8
- yield
9
- ensure
10
- Time.now = nil
11
- end
12
- end
@@ -1,723 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe ValidatesTimeliness::Validator do
4
- attr_accessor :person, :validator
5
-
6
- if ValidatesTimeliness::I18N_LATEST
7
- I18N_REGEXP = /\%\{\w*\}/
8
- I18N_INTERPOLATION = '%{%s}'
9
- else
10
- I18N_REGEXP = /\{\{\w*\}\}/
11
- I18N_INTERPOLATION = '{{%s}}'
12
- end
13
-
14
- before :all do
15
- # freezes time using time_travel plugin
16
- Time.now = Time.utc(2000, 1, 1, 0, 0, 0)
17
- end
18
-
19
- after :all do
20
- Time.now = nil
21
- end
22
-
23
- def person
24
- @person ||= Person.new
25
- end
26
-
27
- describe "option keys validation" do
28
- before(:all) do
29
- ActiveSupport::Deprecation.silenced = true
30
- end
31
-
32
- before do
33
- keys = ValidatesTimeliness::Validator::VALID_OPTION_KEYS - [:invalid_date_message, :invalid_time_message, :with_date, :with_time]
34
- @valid_options = keys.inject({}) {|hash, opt| hash[opt] = nil; hash }
35
- end
36
-
37
- it "should raise error if invalid option key passed" do
38
- @valid_options.update(:invalid_key => 'will not open lock')
39
- lambda { Person.validates_datetime(@valid_options) }.should raise_error(ArgumentError)
40
- end
41
-
42
- it "should not raise error if option keys are valid" do
43
- lambda { Person.validates_datetime(@valid_options) }.should_not raise_error(ArgumentError)
44
- end
45
-
46
- it "should display deprecation notice for :equal_to" do
47
- ::ActiveSupport::Deprecation.should_receive(:warn)
48
- Person.validates_datetime :equal_to => Time.now
49
- end
50
-
51
- after(:all) do
52
- ActiveSupport::Deprecation.silenced = false
53
- end
54
- end
55
-
56
- describe "evaluate_option_value" do
57
- it "should return Time object when restriction is Time object" do
58
- evaluate_option_value(Time.now, :datetime).should be_kind_of(Time)
59
- end
60
-
61
- it "should return Time object when restriction is string" do
62
- evaluate_option_value("2007-01-01 12:00", :datetime).should be_kind_of(Time)
63
- end
64
-
65
- it "should return Time object when restriction is method and method returns Time object" do
66
- person.stub!(:datetime_attr).and_return(Time.now)
67
- evaluate_option_value(:datetime_attr, :datetime).should be_kind_of(Time)
68
- end
69
-
70
- it "should return Time object when restriction is method and method returns string" do
71
- person.stub!(:datetime_attr).and_return("2007-01-01 12:00")
72
- evaluate_option_value(:datetime_attr, :datetime).should be_kind_of(Time)
73
- end
74
-
75
- it "should return Time object when restriction is proc which returns Time object" do
76
- evaluate_option_value(lambda { Time.now }, :datetime).should be_kind_of(Time)
77
- end
78
-
79
- it "should return Time object when restriction is proc which returns string" do
80
- evaluate_option_value(lambda {"2007-01-01 12:00"}, :datetime).should be_kind_of(Time)
81
- end
82
-
83
- it "should return array of Time objects when restriction is array of Time objects" do
84
- time1, time2 = Time.now, 1.day.ago
85
- evaluate_option_value([time1, time2], :datetime).should == [time2, time1]
86
- end
87
-
88
- it "should return array of Time objects when restriction is array of strings" do
89
- time1, time2 = "2000-01-02", "2000-01-01"
90
- evaluate_option_value([time1, time2], :datetime).should == [parse(time2, :datetime), parse(time1, :datetime)]
91
- end
92
-
93
- it "should return array of Time objects when restriction is Range of Time objects" do
94
- time1, time2 = Time.now, 1.day.ago
95
- evaluate_option_value(time1..time2, :datetime).should == [time2, time1]
96
- end
97
-
98
- it "should return array of Time objects when restriction is Range of time strings" do
99
- time1, time2 = "2000-01-02", "2000-01-01"
100
- evaluate_option_value(time1..time2, :datetime).should == [parse(time2, :datetime), parse(time1, :datetime)]
101
- end
102
- def evaluate_option_value(restriction, type)
103
- configure_validator(:type => type)
104
- validator.class.send(:evaluate_option_value, restriction, type, person)
105
- end
106
- end
107
-
108
- describe "instance with defaults" do
109
-
110
- describe "for datetime type" do
111
- before do
112
- configure_validator(:type => :datetime)
113
- end
114
-
115
- it "should have invalid error when date component is invalid" do
116
- validate_with(:birth_date_and_time, "2000-01-32 01:02:03")
117
- should_have_error(:birth_date_and_time, :invalid_datetime)
118
- end
119
-
120
- it "should have invalid error when time component is invalid" do
121
- validate_with(:birth_date_and_time, "2000-01-01 25:02:03")
122
- should_have_error(:birth_date_and_time, :invalid_datetime)
123
- end
124
-
125
- it "should have blank error when value is nil" do
126
- validate_with(:birth_date_and_time, nil)
127
- should_have_error(:birth_date_and_time, :blank)
128
- end
129
-
130
- it "should have no errors when value is valid" do
131
- validate_with(:birth_date_and_time, "2000-01-01 12:00:00")
132
- should_have_no_error(:birth_date_and_time, :invalid_datetime)
133
- end
134
- end
135
-
136
- describe "for date type" do
137
- before do
138
- configure_validator(:type => :date)
139
- end
140
-
141
- it "should have invalid error when value is invalid" do
142
- validate_with(:birth_date, "2000-01-32")
143
- should_have_error(:birth_date, :invalid_date)
144
- end
145
-
146
- it "should have blank error when value is nil" do
147
- validate_with(:birth_date, nil)
148
- should_have_error(:birth_date, :blank)
149
- end
150
-
151
- it "should have no error when value is valid" do
152
- validate_with(:birth_date, "2000-01-31")
153
- should_have_no_error(:birth_date, :invalid_date)
154
- end
155
- end
156
-
157
- describe "for time type" do
158
- before do
159
- configure_validator(:type => :time)
160
- end
161
-
162
- it "should have invalid error when value is invalid" do
163
- validate_with(:birth_time, "25:00")
164
- should_have_error(:birth_time, :invalid_time)
165
- end
166
-
167
- it "should have blank error when value is nil" do
168
- validate_with(:birth_time, nil)
169
- should_have_error(:birth_time, :blank)
170
- end
171
-
172
- it "should have no errors when value is valid" do
173
- validate_with(:birth_date_and_time, "12:00")
174
- should_have_no_error(:birth_time, :invalid_time)
175
- end
176
- end
177
-
178
- end
179
-
180
- describe "instance with before and after restrictions" do
181
-
182
- describe "for datetime type" do
183
- before :each do
184
- configure_validator(:before => lambda { Time.now }, :after => lambda { 1.day.ago})
185
- end
186
-
187
- it "should have before error when value is past :before restriction" do
188
- validate_with(:birth_date_and_time, 1.minute.from_now)
189
- should_have_error(:birth_date_and_time, :before)
190
- end
191
-
192
- it "should have before error when value is on boundary of :before restriction" do
193
- validate_with(:birth_date_and_time, Time.now)
194
- should_have_error(:birth_date_and_time, :before)
195
- end
196
-
197
- it "should have after error when value is before :after restriction" do
198
- validate_with(:birth_date_and_time, 2.days.ago)
199
- should_have_error(:birth_date_and_time, :after)
200
- end
201
-
202
- it "should have after error when value is on boundary of :after restriction" do
203
- validate_with(:birth_date_and_time, 1.day.ago)
204
- should_have_error(:birth_date_and_time, :after)
205
- end
206
- end
207
-
208
- describe "for date type" do
209
- before :each do
210
- configure_validator(:before => 1.day.from_now, :after => 1.day.ago, :type => :date)
211
- end
212
-
213
- it "should have error when value is past :before restriction" do
214
- validate_with(:birth_date, 2.days.from_now)
215
- should_have_error(:birth_date, :before)
216
- end
217
-
218
- it "should have error when value is before :after restriction" do
219
- validate_with(:birth_date, 2.days.ago)
220
- should_have_error(:birth_date, :after)
221
- end
222
-
223
- it "should have no error when value is before :before restriction" do
224
- validate_with(:birth_date, Time.now)
225
- should_have_no_error(:birth_date, :before)
226
- end
227
-
228
- it "should have no error when value is after :after restriction" do
229
- validate_with(:birth_date, Time.now)
230
- should_have_no_error(:birth_date, :after)
231
- end
232
- end
233
-
234
- describe "for time type" do
235
- before :each do
236
- configure_validator(:before => "23:00", :after => "06:00", :type => :time)
237
- end
238
-
239
- it "should have error when value is on boundary of :before restriction" do
240
- validate_with(:birth_time, "23:00")
241
- should_have_error(:birth_time, :before)
242
- end
243
-
244
- it "should have error when value is on boundary of :after restriction" do
245
- validate_with(:birth_time, "06:00")
246
- should_have_error(:birth_time, :after)
247
- end
248
-
249
- it "should have error when value is past :before restriction" do
250
- validate_with(:birth_time, "23:01")
251
- should_have_error(:birth_time, :before)
252
- end
253
-
254
- it "should have error when value is before :after restriction" do
255
- validate_with(:birth_time, "05:59")
256
- should_have_error(:birth_time, :after)
257
- end
258
-
259
- it "should not have error when value is before :before restriction" do
260
- validate_with(:birth_time, "22:59")
261
- should_have_no_error(:birth_time, :before)
262
- end
263
-
264
- it "should have error when value is before :after restriction" do
265
- validate_with(:birth_time, "06:01")
266
- should_have_no_error(:birth_time, :before)
267
- end
268
- end
269
- end
270
-
271
- describe "instance with between restriction" do
272
-
273
- describe "for datetime type" do
274
- before do
275
- configure_validator(:between => [1.day.ago.at_midnight, 1.day.from_now.at_midnight])
276
- end
277
-
278
- it "should have error when value is before earlist :between restriction" do
279
- validate_with(:birth_date_and_time, 2.days.ago)
280
- should_have_error(:birth_date_and_time, :between)
281
- end
282
-
283
- it "should have error when value is after latest :between restriction" do
284
- validate_with(:birth_date_and_time, 2.days.from_now)
285
- should_have_error(:birth_date_and_time, :between)
286
- end
287
-
288
- it "should be valid when value is equal to earliest :between restriction" do
289
- validate_with(:birth_date_and_time, 1.day.ago.at_midnight)
290
- should_have_no_error(:birth_date_and_time, :between)
291
- end
292
-
293
- it "should be valid when value is equal to latest :between restriction" do
294
- validate_with(:birth_date_and_time, 1.day.from_now.at_midnight)
295
- should_have_no_error(:birth_date_and_time, :between)
296
- end
297
-
298
- it "should allow a range for between restriction" do
299
- configure_validator(:type => :datetime, :between => (1.day.ago.at_midnight)..(1.day.from_now.at_midnight))
300
- validate_with(:birth_date_and_time, 1.day.from_now.at_midnight)
301
- should_have_no_error(:birth_date_and_time, :between)
302
- end
303
- end
304
-
305
- describe "for date type" do
306
- before do
307
- configure_validator(:type => :date, :between => [1.day.ago.to_date, 1.day.from_now.to_date])
308
- end
309
-
310
- it "should have error when value is before earlist :between restriction" do
311
- validate_with(:birth_date, 2.days.ago.to_date)
312
- should_have_error(:birth_date, :between)
313
- end
314
-
315
- it "should have error when value is after latest :between restriction" do
316
- validate_with(:birth_date, 2.days.from_now.to_date)
317
- should_have_error(:birth_date, :between)
318
- end
319
-
320
- it "should be valid when value is equal to earliest :between restriction" do
321
- validate_with(:birth_date, 1.day.ago.to_date)
322
- should_have_no_error(:birth_date, :between)
323
- end
324
-
325
- it "should be valid when value is equal to latest :between restriction" do
326
- validate_with(:birth_date, 1.day.from_now.to_date)
327
- should_have_no_error(:birth_date, :between)
328
- end
329
-
330
- it "should allow a range for between restriction" do
331
- configure_validator(:type => :date, :between => (1.day.ago.to_date)..(1.day.from_now.to_date))
332
- validate_with(:birth_date, 1.day.from_now.to_date)
333
- should_have_no_error(:birth_date, :between)
334
- end
335
- end
336
-
337
- describe "for time type" do
338
- before do
339
- configure_validator(:type => :time, :between => ["09:00", "17:00"])
340
- end
341
-
342
- it "should have error when value is before earlist :between restriction" do
343
- validate_with(:birth_time, "08:59")
344
- should_have_error(:birth_time, :between)
345
- end
346
-
347
- it "should have error when value is after latest :between restriction" do
348
- validate_with(:birth_time, "17:01")
349
- should_have_error(:birth_time, :between)
350
- end
351
-
352
- it "should be valid when value is equal to earliest :between restriction" do
353
- validate_with(:birth_time, "09:00")
354
- should_have_no_error(:birth_time, :between)
355
- end
356
-
357
- it "should be valid when value is equal to latest :between restriction" do
358
- validate_with(:birth_time, "17:00")
359
- should_have_no_error(:birth_time, :between)
360
- end
361
-
362
- it "should allow a range for between restriction" do
363
- configure_validator(:type => :time, :between => "09:00".."17:00")
364
- validate_with(:birth_time, "17:00")
365
- should_have_no_error(:birth_time, :between)
366
- end
367
- end
368
- end
369
-
370
- describe "instance with :is_at restriction" do
371
-
372
- describe "for datetime type" do
373
- before do
374
- configure_validator(:is_at => Time.now)
375
- end
376
-
377
- it "should have error when value not equal to :is_at restriction" do
378
- validate_with(:birth_date_and_time, Time.now + 1)
379
- should_have_error(:birth_date_and_time, :is_at)
380
- end
381
-
382
- it "should be valid when value is equal to :is_at restriction" do
383
- validate_with(:birth_date_and_time, Time.now)
384
- should_have_no_error(:birth_date_and_time, :is_at)
385
- end
386
- end
387
-
388
- describe "for date type" do
389
- before do
390
- configure_validator(:type => :date, :is_at => Date.today)
391
- end
392
-
393
- it "should have error when value is not equal to :is_at restriction" do
394
- validate_with(:birth_date, Date.today + 1)
395
- should_have_error(:birth_date, :is_at)
396
- end
397
-
398
- it "should be valid when value is equal to :is_at restriction" do
399
- validate_with(:birth_date, Date.today)
400
- should_have_no_error(:birth_date, :is_at)
401
- end
402
- end
403
-
404
- describe "for time type" do
405
- before do
406
- configure_validator(:type => :time, :is_at => "09:00:00")
407
- end
408
-
409
- it "should have error when value is not equal to :is_at restriction" do
410
- validate_with(:birth_time, "09:00:01")
411
- should_have_error(:birth_time, :is_at)
412
- end
413
-
414
- it "should be valid when value is equal to :is_at restriction" do
415
- validate_with(:birth_time, "09:00:00")
416
- should_have_no_error(:birth_time, :is_at)
417
- end
418
- end
419
- end
420
-
421
- describe "instance with :ignore_usec option" do
422
-
423
- it "should ignore usec on time values when evaluated" do
424
- configure_validator(:is_at => Time.utc(2000, 1, 1, 0, 0, 0, 0), :ignore_usec => true)
425
- validate_with(:birth_date_and_time, Time.utc(2000, 1, 1, 0, 0, 0, 500))
426
- should_have_no_error(:birth_date_and_time, :is_at)
427
- end
428
-
429
- end
430
-
431
- describe "instance with :with_time option" do
432
-
433
- it "should validate date attribute as datetime combining value of :with_time against restrictions " do
434
- configure_validator(:type => :date, :with_time => '12:31', :on_or_before => Time.mktime(2000,1,1,12,30))
435
- validate_with(:birth_date, "2000-01-01")
436
- should_have_error(:birth_date, :on_or_before)
437
- end
438
-
439
- it "should skip restriction validation if :with_time value is nil" do
440
- configure_validator(:type => :date, :with_time => nil, :on_or_before => Time.mktime(2000,1,1,12,30))
441
- validate_with(:birth_date, "2000-01-01")
442
- should_have_no_error(:birth_date, :on_or_before)
443
- end
444
-
445
- it "should should ignore usec value on combined value if :ignore_usec option is true" do
446
- configure_validator(:type => :date, :with_time => Time.mktime(2000,1,1,12,30,0,500), :is_at => Time.mktime(2000,1,1,12,30), :ignore_usec => true)
447
- validate_with(:birth_date, "2000-01-01")
448
- should_have_no_error(:birth_date, :is_at)
449
- end
450
- end
451
-
452
- describe "instance with :with_date option" do
453
-
454
- it "should validate time attribute as datetime combining value of :with_date against restrictions " do
455
- configure_validator(:type => :time, :with_date => '2009-01-01', :on_or_before => Time.mktime(2000,1,1,12,30))
456
- validate_with(:birth_time, "12:30")
457
- should_have_error(:birth_time, :on_or_before)
458
- end
459
-
460
- it "should skip restriction validation if :with_date value is nil" do
461
- configure_validator(:type => :time, :with_date => nil, :on_or_before => Time.mktime(2000,1,1,12,30))
462
- validate_with(:birth_time, "12:30")
463
- should_have_no_error(:birth_time, :on_or_before)
464
- end
465
-
466
- it "should should ignore usec value on combined value if :ignore_usec option is true" do
467
- configure_validator(:type => :time, :with_date => Date.new(2000,1,1), :on_or_before => Time.mktime(2000,1,1,12,30), :ignore_usec => true)
468
- validate_with(:birth_time, Time.mktime(2000,1,1,12,30,0,50))
469
- should_have_no_error(:birth_time, :on_or_before)
470
- end
471
- end
472
-
473
- describe "instance with mixed value and restriction types" do
474
-
475
- it "should validate datetime attribute with Date restriction" do
476
- configure_validator(:type => :datetime, :on_or_before => Date.new(2000,1,1))
477
- validate_with(:birth_date_and_time, "2000-01-01 00:00:00")
478
- should_have_no_error(:birth_date_and_time, :on_or_before)
479
- end
480
-
481
- it "should validate date attribute with DateTime restriction value" do
482
- configure_validator(:type => :date, :on_or_before => DateTime.new(2000, 1, 1, 0,0,0))
483
- validate_with(:birth_date, "2000-01-01")
484
- should_have_no_error(:birth_date, :on_or_before)
485
- end
486
-
487
- it "should validate date attribute with Time restriction value" do
488
- configure_validator(:type => :date, :on_or_before => Time.utc(2000, 1, 1, 0,0,0))
489
- validate_with(:birth_date, "2000-01-01")
490
- should_have_no_error(:birth_date, :on_or_before)
491
- end
492
-
493
- it "should validate time attribute with DateTime restriction value" do
494
- configure_validator(:type => :time, :on_or_before => DateTime.new(2000, 1, 1, 12,0,0))
495
- validate_with(:birth_time, "12:00")
496
- should_have_no_error(:birth_time, :on_or_before)
497
- end
498
-
499
- it "should validate time attribute with Time restriction value" do
500
- configure_validator(:type => :time, :on_or_before => Time.utc(2000, 1, 1, 12,0,0))
501
- validate_with(:birth_time, "12:00")
502
- should_have_no_error(:birth_time, :on_or_before)
503
- end
504
- end
505
-
506
- describe "instance with format option" do
507
- it "should validate attribute when value matches format" do
508
- configure_validator(:type => :time, :format => 'hh:nn:ss')
509
- validate_with(:birth_time, "12:00:00")
510
- should_have_no_error(:birth_time, :invalid_time)
511
- end
512
-
513
- it "should not validate attribute when value does not match format" do
514
- configure_validator(:type => :time, :format => 'hh:nn:ss')
515
- validate_with(:birth_time, "12:00")
516
- should_have_error(:birth_time, :invalid_time)
517
- end
518
- end
519
-
520
- if defined?(I18n)
521
-
522
- describe "localized error messages" do
523
- before(:all) do
524
- message = "retfa #{I18N_INTERPOLATION}" % 'restriction'
525
- translations = {
526
- :activerecord => {:errors => {:messages => { :after => message }}},
527
- :validates_timeliness => {:error_value_formats => {}}
528
- }
529
- I18n.backend.store_translations 'zz', translations
530
- I18n.locale = :zz
531
- end
532
-
533
- it "should be used if defined" do
534
- configure_validator(:type => :date, :after => Date.today)
535
- validate_with(:birth_date, 1.day.ago)
536
- person.errors.on(:birth_date).should match(/retfa/)
537
- end
538
-
539
- it "should use I18n translation missing message when not defined" do
540
- configure_validator(:type => :date, :on_or_after => Date.today)
541
- validate_with(:birth_date, 1.day.ago)
542
- person.errors.on(:birth_date).should match(/translation missing/)
543
- end
544
-
545
- after(:all) do
546
- I18n.locale = :en
547
- end
548
-
549
- end
550
-
551
- end
552
-
553
- describe "custom_error_messages" do
554
- it "should return hash of custom error messages from configuration with _message truncated from keys" do
555
- configure_validator(:type => :date, :invalid_date_message => 'thats no date')
556
- validator.send(:custom_error_messages)[:invalid_date].should == 'thats no date'
557
- end
558
-
559
- it "should return empty hash if no custom error messages in configuration" do
560
- configure_validator(:type => :date)
561
- validator.send(:custom_error_messages).should be_empty
562
- end
563
- end
564
-
565
- describe "interpolation_values" do
566
- if defined?(I18n)
567
- it "should return hash of interpolation keys with restriction values" do
568
- before = '1900-01-01'
569
- configure_validator(:type => :date, :before => before)
570
- validator.send(:interpolation_values, :before, before.to_date).should == {:restriction => before}
571
- end
572
- else
573
- it "should return array of interpolation values" do
574
- before = '1900-01-01'
575
- configure_validator(:type => :date, :before => before)
576
- validator.send(:interpolation_values, :before, before.to_date).should == [before]
577
- end
578
- end
579
- end
580
-
581
- describe "restriction errors" do
582
- before :each do
583
- configure_validator(:type => :date, :before => lambda { raise })
584
- end
585
-
586
- it "should be added by default for invalid restriction" do
587
- ValidatesTimeliness::Validator.ignore_restriction_errors = false
588
- validate_with(:birth_date, Date.today)
589
- person.errors.on(:birth_date).should match(/restriction 'before' value was invalid/)
590
- end
591
-
592
- it "should not be added when ignore switch is true and restriction is invalid" do
593
- ValidatesTimeliness::Validator.ignore_restriction_errors = true
594
- person.should be_valid
595
- end
596
-
597
- after :all do
598
- ValidatesTimeliness::Validator.ignore_restriction_errors = false
599
- end
600
- end
601
-
602
- describe "restriction value error message" do
603
-
604
- describe "default formats" do
605
-
606
- it "should format datetime value of restriction" do
607
- configure_validator(:type => :datetime, :after => 1.day.from_now)
608
- validate_with(:birth_date_and_time, Time.now)
609
- person.errors.on(:birth_date_and_time).should match(/after \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\Z/)
610
- end
611
-
612
- it "should format date value of restriction" do
613
- configure_validator(:type => :date, :after => 1.day.from_now)
614
- validate_with(:birth_date, Time.now)
615
- person.errors.on(:birth_date).should match(/after \d{4}-\d{2}-\d{2}\Z/)
616
- end
617
-
618
- it "should format time value of restriction" do
619
- configure_validator(:type => :time, :after => '12:00')
620
- validate_with(:birth_time, '11:59')
621
- person.errors.on(:birth_time).should match(/after \d{2}:\d{2}:\d{2}\Z/)
622
- end
623
-
624
- if defined?(I18n)
625
-
626
- describe "I18n" do
627
- it "should use global default if locale format missing" do
628
- message = "after #{I18N_INTERPOLATION}" % 'restriction'
629
- I18n.backend.store_translations 'zz', :activerecord => {:errors => {:messages => { :after => message }}}
630
- I18n.locale = :zz
631
- configure_validator(:type => :datetime, :after => 1.day.from_now)
632
- validate_with(:birth_date_and_time, Time.now)
633
- person.errors.on(:birth_date_and_time).should match(/after \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\Z/)
634
- end
635
-
636
- after do
637
- I18n.locale = :en
638
- end
639
- end
640
-
641
- end
642
- end
643
-
644
- describe "custom formats" do
645
-
646
- before :all do
647
- custom = {
648
- :time => '%H:%M %p',
649
- :date => '%d-%m-%Y',
650
- :datetime => '%d-%m-%Y %H:%M %p'
651
- }
652
-
653
- if defined?(I18n)
654
- I18n.backend.store_translations 'en', :validates_timeliness => { :error_value_formats => custom }
655
- else
656
- @@formats = ValidatesTimeliness::Validator.error_value_formats
657
- ValidatesTimeliness::Validator.error_value_formats = custom
658
- end
659
- end
660
-
661
- it "should format datetime value of restriction" do
662
- configure_validator(:type => :datetime, :after => 1.day.from_now)
663
- validate_with(:birth_date_and_time, Time.now)
664
- person.errors.on(:birth_date_and_time).should match(/after \d{2}-\d{2}-\d{4} \d{2}:\d{2} (AM|PM)\Z/)
665
- end
666
-
667
- it "should format date value of restriction" do
668
- configure_validator(:type => :date, :after => 1.day.from_now)
669
- validate_with(:birth_date, Time.now)
670
- person.errors.on(:birth_date).should match(/after \d{2}-\d{2}-\d{4}\Z/)
671
- end
672
-
673
- it "should format time value of restriction" do
674
- configure_validator(:type => :time, :after => '12:00')
675
- validate_with(:birth_time, '11:59')
676
- person.errors.on(:birth_time).should match(/after \d{2}:\d{2} (AM|PM)\Z/)
677
- end
678
-
679
- after :all do
680
- if defined?(I18n)
681
- I18n.reload!
682
- else
683
- ValidatesTimeliness::Validator.error_value_formats = @@formats
684
- end
685
- end
686
- end
687
-
688
- end
689
-
690
- def parse(*args)
691
- ValidatesTimeliness::Parser.parse(*args)
692
- end
693
-
694
- def configure_validator(options={})
695
- @validator = ValidatesTimeliness::Validator.new(options)
696
- end
697
-
698
- def validate_with(attr_name, value)
699
- person.send("#{attr_name}=", value)
700
- validator.call(person, attr_name, value)
701
- end
702
-
703
- def should_have_error(attr_name, error)
704
- message = error_messages[error]
705
- person.errors.on(attr_name).should match(/#{message}/)
706
- end
707
-
708
- def should_have_no_error(attr_name, error)
709
- message = error_messages[error]
710
- errors = person.errors.on(attr_name)
711
- if errors
712
- errors.should_not match(/#{message}/)
713
- else
714
- errors.should be_nil
715
- end
716
- end
717
-
718
- def error_messages
719
- return @error_messages if defined?(@error_messages)
720
- messages = defined?(I18n) ? I18n.t('activerecord.errors.messages') : validator.send(:error_messages)
721
- @error_messages = messages.inject({}) {|h, (k, v)| h[k] = v.sub(/ (\%s|#{I18N_REGEXP}).*/, ''); h }
722
- end
723
- end