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.
- data/CHANGELOG +12 -4
- data/LICENSE +1 -1
- data/README.rdoc +138 -280
- data/Rakefile +30 -16
- data/lib/generators/validates_timeliness/install_generator.rb +17 -0
- data/lib/generators/validates_timeliness/templates/en.yml +16 -0
- data/lib/generators/validates_timeliness/templates/validates_timeliness.rb +22 -0
- data/lib/validates_timeliness.rb +46 -52
- data/lib/validates_timeliness/attribute_methods.rb +51 -0
- data/lib/validates_timeliness/conversion.rb +69 -0
- data/lib/validates_timeliness/extensions.rb +14 -0
- data/lib/validates_timeliness/extensions/date_time_select.rb +45 -0
- data/lib/validates_timeliness/extensions/multiparameter_handler.rb +31 -0
- data/lib/validates_timeliness/helper_methods.rb +41 -0
- data/lib/validates_timeliness/orms/active_record.rb +14 -0
- data/lib/validates_timeliness/parser.rb +389 -17
- data/lib/validates_timeliness/validator.rb +37 -200
- data/lib/validates_timeliness/version.rb +1 -1
- data/spec/model_helpers.rb +27 -0
- data/spec/spec_helper.rb +74 -43
- data/spec/test_model.rb +56 -0
- data/spec/validates_timeliness/attribute_methods_spec.rb +36 -0
- data/spec/validates_timeliness/conversion_spec.rb +204 -0
- data/spec/validates_timeliness/extensions/date_time_select_spec.rb +178 -0
- data/spec/validates_timeliness/extensions/multiparameter_handler_spec.rb +21 -0
- data/spec/validates_timeliness/helper_methods_spec.rb +36 -0
- data/spec/{formats_spec.rb → validates_timeliness/parser_spec.rb} +105 -71
- data/spec/validates_timeliness/validator/after_spec.rb +59 -0
- data/spec/validates_timeliness/validator/before_spec.rb +59 -0
- data/spec/validates_timeliness/validator/is_at_spec.rb +63 -0
- data/spec/validates_timeliness/validator/on_or_after_spec.rb +59 -0
- data/spec/validates_timeliness/validator/on_or_before_spec.rb +59 -0
- data/spec/validates_timeliness/validator_spec.rb +172 -0
- data/validates_timeliness.gemspec +30 -0
- metadata +42 -40
- data/TODO +0 -8
- data/lib/validates_timeliness/action_view/instance_tag.rb +0 -52
- data/lib/validates_timeliness/active_record/attribute_methods.rb +0 -77
- data/lib/validates_timeliness/active_record/multiparameter_attributes.rb +0 -69
- data/lib/validates_timeliness/formats.rb +0 -368
- data/lib/validates_timeliness/locale/en.new.yml +0 -18
- data/lib/validates_timeliness/locale/en.old.yml +0 -18
- data/lib/validates_timeliness/matcher.rb +0 -1
- data/lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb +0 -162
- data/lib/validates_timeliness/validation_methods.rb +0 -46
- data/spec/action_view/instance_tag_spec.rb +0 -194
- data/spec/active_record/attribute_methods_spec.rb +0 -157
- data/spec/active_record/multiparameter_attributes_spec.rb +0 -118
- data/spec/ginger_scenarios.rb +0 -19
- data/spec/parser_spec.rb +0 -65
- data/spec/resources/application.rb +0 -2
- data/spec/resources/person.rb +0 -3
- data/spec/resources/schema.rb +0 -10
- data/spec/resources/sqlite_patch.rb +0 -19
- data/spec/spec/rails/matchers/validate_timeliness_spec.rb +0 -245
- data/spec/time_travel/MIT-LICENSE +0 -20
- data/spec/time_travel/time_extensions.rb +0 -33
- data/spec/time_travel/time_travel.rb +0 -12
- 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
|
data/spec/validator_spec.rb
DELETED
@@ -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
|