validates_timeliness 2.2.2 → 2.3.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.
- data/CHANGELOG +12 -3
- data/README.rdoc +54 -45
- data/Rakefile +5 -9
- data/TODO +3 -0
- data/lib/validates_timeliness.rb +6 -6
- data/lib/validates_timeliness/action_view/instance_tag.rb +27 -23
- data/lib/validates_timeliness/active_record/attribute_methods.rb +5 -3
- data/lib/validates_timeliness/active_record/multiparameter_attributes.rb +7 -8
- data/lib/validates_timeliness/formats.rb +55 -56
- data/lib/validates_timeliness/locale/en.yml +1 -1
- data/lib/validates_timeliness/spec/rails/matchers/validate_timeliness.rb +38 -39
- data/lib/validates_timeliness/validator.rb +31 -34
- data/lib/validates_timeliness/version.rb +1 -1
- data/spec/action_view/instance_tag_spec.rb +177 -25
- data/spec/active_record/attribute_methods_spec.rb +18 -16
- data/spec/active_record/multiparameter_attributes_spec.rb +90 -24
- data/spec/formats_spec.rb +67 -55
- data/spec/ginger_scenarios.rb +3 -3
- data/spec/spec/rails/matchers/validate_timeliness_spec.rb +52 -52
- data/spec/spec_helper.rb +3 -1
- data/spec/validator_spec.rb +88 -25
- metadata +19 -19
@@ -9,44 +9,110 @@ describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
|
|
9
9
|
time_string = time_array_to_string([2000,2,1,9,10,11], :datetime)
|
10
10
|
time_string.should == "2000-02-01 09:10:11"
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
it "should convert array for date type into date string" do
|
14
14
|
time_string = time_array_to_string([2000,2,1], :date)
|
15
15
|
time_string.should == "2000-02-01"
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "should convert array for time type into time string" do
|
19
19
|
time_string = time_array_to_string([2000,1,1,9,10,11], :time)
|
20
20
|
time_string.should == "09:10:11"
|
21
21
|
end
|
22
|
-
|
23
|
-
describe "execute_callstack_for_multiparameter_attributes" do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
|
23
|
+
describe "execute_callstack_for_multiparameter_attributes" do
|
24
|
+
|
25
|
+
describe "for valid values" do
|
26
|
+
before do
|
27
|
+
@callstack = {
|
28
|
+
'birth_date_and_time' => [2000,2,1,9,10,11],
|
29
|
+
'birth_date' => [2000,2,1,9,10,11],
|
30
|
+
'birth_time' => [2000,2,1,9,10,11]
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should store datetime string for datetime column" do
|
35
|
+
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:11")
|
36
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should store date string for a date column" do
|
40
|
+
obj.should_receive(:birth_date=).once.with("2000-02-01")
|
41
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should store time string for a time column" do
|
45
|
+
obj.should_receive(:birth_time=).once.with("09:10:11")
|
46
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
47
|
+
end
|
30
48
|
end
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
49
|
+
|
50
|
+
describe "for invalid values" do
|
51
|
+
before do
|
52
|
+
@callstack = {
|
53
|
+
'birth_date_and_time' => [2000,13,1,9,10,11],
|
54
|
+
'birth_date' => [2000,2,41,9,10,11],
|
55
|
+
'birth_time' => [2000,2,1,25,10,11]
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should store invalid datetime string for datetime column" do
|
60
|
+
obj.should_receive(:birth_date_and_time=).once.with("2000-13-01 09:10:11")
|
61
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should store invalid date string for a date column" do
|
65
|
+
obj.should_receive(:birth_date=).once.with("2000-02-41")
|
66
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should store invalid time string for a time column" do
|
70
|
+
obj.should_receive(:birth_time=).once.with("25:10:11")
|
71
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
|
72
|
+
end
|
40
73
|
end
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
74
|
+
|
75
|
+
describe "for missing values" do
|
76
|
+
it "should store nil if all datetime values nil" do
|
77
|
+
obj.should_receive(:birth_date_and_time=).once.with(nil)
|
78
|
+
callstack = { 'birth_date_and_time' => [nil,nil,nil,nil,nil,nil] }
|
79
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should store nil year as empty value in string" do
|
83
|
+
obj.should_receive(:birth_date_and_time=).once.with("-02-01 09:10:11")
|
84
|
+
callstack = { 'birth_date_and_time' => [nil,2,1,9,10,11] }
|
85
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should store nil month as empty value in string" do
|
89
|
+
obj.should_receive(:birth_date_and_time=).once.with("2000--01 09:10:11")
|
90
|
+
callstack = { 'birth_date_and_time' => [2000,nil,1,9,10,11] }
|
91
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should store nil day as empty value in string" do
|
95
|
+
obj.should_receive(:birth_date_and_time=).once.with("2000-02- 09:10:11")
|
96
|
+
callstack = { 'birth_date_and_time' => [2000,2,nil,9,10,11] }
|
97
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should store nil hour as empty value in string" do
|
101
|
+
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 :10:11")
|
102
|
+
callstack = { 'birth_date_and_time' => [2000,2,1,nil,10,11] }
|
103
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should store nil minute as empty value in string" do
|
107
|
+
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:")
|
108
|
+
callstack = { 'birth_date_and_time' => [2000,2,1,9,10,nil] }
|
109
|
+
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
|
110
|
+
end
|
45
111
|
end
|
46
112
|
end
|
47
113
|
|
48
114
|
def time_array_to_string(*args)
|
49
115
|
ValidatesTimeliness::ActiveRecord.time_array_to_string(*args)
|
50
116
|
end
|
51
|
-
|
117
|
+
|
52
118
|
end
|
data/spec/formats_spec.rb
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe ValidatesTimeliness::Formats do
|
4
|
-
|
4
|
+
|
5
5
|
describe "format proc generator" do
|
6
6
|
it "should generate proc which outputs date array with values in correct order" do
|
7
7
|
generate_proc('yyyy-mm-dd').call('2000', '1', '2').should == [2000,1,2,0,0,0,0]
|
8
|
-
|
9
|
-
|
8
|
+
end
|
9
|
+
|
10
10
|
it "should generate proc which outputs date array from format with different order" do
|
11
11
|
generate_proc('dd/mm/yyyy').call('2', '1', '2000').should == [2000,1,2,0,0,0,0]
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "should generate proc which outputs time array" do
|
15
15
|
generate_proc('hh:nn:ss').call('01', '02', '03').should == [0,0,0,1,2,3,0]
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
it "should generate proc which outputs time array with meridian 'pm' adjusted hour" do
|
19
19
|
generate_proc('hh:nn:ss ampm').call('01', '02', '03', 'pm').should == [0,0,0,13,2,3,0]
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it "should generate proc which outputs time array with meridian 'am' unadjusted hour" do
|
23
23
|
generate_proc('hh:nn:ss ampm').call('01', '02', '03', 'am').should == [0,0,0,1,2,3,0]
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
it "should generate proc which outputs time array with microseconds" do
|
27
27
|
generate_proc('hh:nn:ss.u').call('01', '02', '03', '99').should == [0,0,0,1,2,3,990000]
|
28
28
|
end
|
@@ -31,11 +31,11 @@ describe ValidatesTimeliness::Formats do
|
|
31
31
|
generate_proc('yyyy-mm-dd hh:nn:ss.u zo').call('2001', '02', '03', '04', '05', '06', '99', '+10:00').should == [2001,2,3,4,5,6,990000,36000]
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
describe "
|
36
|
-
|
34
|
+
|
35
|
+
describe "validate regexps" do
|
36
|
+
|
37
37
|
describe "for time formats" do
|
38
|
-
format_tests = {
|
38
|
+
format_tests = {
|
39
39
|
'hh:nn:ss' => {:pass => ['12:12:12', '01:01:01'], :fail => ['1:12:12', '12:1:12', '12:12:1', '12-12-12']},
|
40
40
|
'hh-nn-ss' => {:pass => ['12-12-12', '01-01-01'], :fail => ['1-12-12', '12-1-12', '12-12-1', '12:12:12']},
|
41
41
|
'h:nn' => {:pass => ['12:12', '1:01'], :fail => ['12:2', '12-12']},
|
@@ -54,9 +54,9 @@ describe ValidatesTimeliness::Formats do
|
|
54
54
|
values[:pass].each {|value| value.should match(regexp)}
|
55
55
|
values[:fail].each {|value| value.should_not match(regexp)}
|
56
56
|
end
|
57
|
-
end
|
57
|
+
end
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
describe "for date formats" do
|
61
61
|
format_tests = {
|
62
62
|
'yyyy/mm/dd' => {:pass => ['2000/02/01'], :fail => ['2000\02\01', '2000/2/1', '00/02/01']},
|
@@ -68,50 +68,50 @@ describe ValidatesTimeliness::Formats do
|
|
68
68
|
'd\m\yy' => {:pass => ['1\2\01', '1\02\00', '01\02\2000'], :fail => ['1\2\0', '1/2/01']},
|
69
69
|
'd-m-yy' => {:pass => ['1-2-01', '1-02-00', '01-02-2000'], :fail => ['1-2-0', '1/2/01']},
|
70
70
|
'd.m.yy' => {:pass => ['1.2.01', '1.02.00', '01.02.2000'], :fail => ['1.2.0', '1/2/01']},
|
71
|
-
'd mmm yy' => {:pass => ['1 Feb 00', '1 Feb 2000', '1 February 00', '01 February 2000'],
|
71
|
+
'd mmm yy' => {:pass => ['1 Feb 00', '1 Feb 2000', '1 February 00', '01 February 2000'],
|
72
72
|
:fail => ['1 Fe 00', 'Feb 1 2000', '1 Feb 0']}
|
73
|
-
}
|
74
|
-
format_tests.each do |format, values|
|
73
|
+
}
|
74
|
+
format_tests.each do |format, values|
|
75
75
|
it "should correctly validate dates in format '#{format}'" do
|
76
76
|
regexp = generate_regexp(format)
|
77
77
|
values[:pass].each {|value| value.should match(regexp)}
|
78
78
|
values[:fail].each {|value| value.should_not match(regexp)}
|
79
79
|
end
|
80
|
-
end
|
80
|
+
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
describe "for datetime formats" do
|
84
84
|
format_tests = {
|
85
85
|
'ddd mmm d hh:nn:ss zo yyyy' => {:pass => ['Sat Jul 19 12:00:00 +1000 2008'], :fail => []},
|
86
86
|
'yyyy-mm-ddThh:nn:ss(?:Z|zo)' => {:pass => ['2008-07-19T12:00:00+10:00', '2008-07-19T12:00:00Z'], :fail => ['2008-07-19T12:00:00Z+10:00']},
|
87
|
-
}
|
88
|
-
format_tests.each do |format, values|
|
87
|
+
}
|
88
|
+
format_tests.each do |format, values|
|
89
89
|
it "should correctly validate datetimes in format '#{format}'" do
|
90
90
|
regexp = generate_regexp(format)
|
91
91
|
values[:pass].each {|value| value.should match(regexp)}
|
92
92
|
values[:fail].each {|value| value.should_not match(regexp)}
|
93
93
|
end
|
94
|
-
end
|
94
|
+
end
|
95
95
|
end
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
describe "parse" do
|
99
|
-
|
99
|
+
|
100
100
|
it "should return time array from date string" do
|
101
101
|
time_array = formats.parse('12:13:14', :time, :strict => true)
|
102
102
|
time_array.should == [2000,1,1,12,13,14,0]
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
it "should return date array from time string" do
|
106
106
|
time_array = formats.parse('2000-02-01', :date, :strict => true)
|
107
107
|
time_array.should == [2000,2,1,0,0,0,0]
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
it "should return datetime array from string value" do
|
111
111
|
time_array = formats.parse('2000-02-01 12:13:14', :datetime, :strict => true)
|
112
112
|
time_array.should == [2000,2,1,12,13,14,0]
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
it "should parse date string when type is datetime" do
|
116
116
|
time_array = formats.parse('2000-02-01', :datetime, :strict => false)
|
117
117
|
time_array.should == [2000,2,1,0,0,0,0]
|
@@ -126,18 +126,18 @@ describe ValidatesTimeliness::Formats do
|
|
126
126
|
time_array = formats.parse('01-02-2000 12:13', :date, :strict => false)
|
127
127
|
time_array.should == [2000,2,1,0,0,0,0]
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
it "should ignore date when extracting time and strict is false" do
|
131
131
|
time_array = formats.parse('2000-02-01 12:13', :time, :strict => false)
|
132
132
|
time_array.should == [2000,1,1,12,13,0,0]
|
133
133
|
end
|
134
134
|
|
135
|
-
it "should return zone offset when :include_offset
|
135
|
+
it "should return zone offset when :include_offset option is true" do
|
136
136
|
time_array = formats.parse('2000-02-01T12:13:14-10:30', :datetime, :include_offset => true)
|
137
137
|
time_array.should == [2000,2,1,12,13,14,0,-37800]
|
138
138
|
end
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
describe "parse with format option" do
|
142
142
|
it "should return values if string matches specified format" do
|
143
143
|
time_array = formats.parse('2000-02-01 12:13:14', :datetime, :format => 'yyyy-mm-dd hh:nn:ss')
|
@@ -188,45 +188,57 @@ describe ValidatesTimeliness::Formats do
|
|
188
188
|
end
|
189
189
|
end
|
190
190
|
|
191
|
+
describe "parse ISO8601 datetime" do
|
192
|
+
it "should return array without zone offset when no offset in string" do
|
193
|
+
time_array = formats.parse('2000-02-01T12:13:14Z', :datetime, :strict => true)
|
194
|
+
time_array.should == [2000,2,1,12,13,14,0]
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should return array with zone offset when offset in string" do
|
198
|
+
time_array = formats.parse('2000-02-01T12:13:14+10:00', :datetime, :strict => true)
|
199
|
+
time_array.should == [2000,2,1,12,13,14,0,36000]
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
191
203
|
describe "removing formats" do
|
192
|
-
it "should remove format from format array" do
|
204
|
+
it "should remove format from format array" do
|
193
205
|
formats.remove_formats(:time, 'h.nn_ampm')
|
194
206
|
formats.time_formats.should_not include("h o'clock")
|
195
207
|
end
|
196
|
-
|
197
|
-
it "should not match time after its format is removed" do
|
208
|
+
|
209
|
+
it "should not match time after its format is removed" do
|
198
210
|
validate('2.12am', :time).should be_true
|
199
211
|
formats.remove_formats(:time, 'h.nn_ampm')
|
200
212
|
validate('2.12am', :time).should be_false
|
201
213
|
end
|
202
|
-
|
214
|
+
|
203
215
|
it "should raise error if format does not exist" do
|
204
216
|
lambda { formats.remove_formats(:time, "ss:hh:nn") }.should raise_error()
|
205
217
|
end
|
206
|
-
|
218
|
+
|
207
219
|
after do
|
208
220
|
formats.time_formats << 'h.nn_ampm'
|
209
221
|
formats.compile_format_expressions
|
210
222
|
end
|
211
223
|
end
|
212
|
-
|
213
|
-
describe "adding formats" do
|
224
|
+
|
225
|
+
describe "adding formats" do
|
214
226
|
before do
|
215
227
|
formats.compile_format_expressions
|
216
228
|
end
|
217
|
-
|
229
|
+
|
218
230
|
it "should add format to format array" do
|
219
231
|
formats.add_formats(:time, "h o'clock")
|
220
232
|
formats.time_formats.should include("h o'clock")
|
221
233
|
end
|
222
|
-
|
223
|
-
it "should match new format after its added" do
|
234
|
+
|
235
|
+
it "should match new format after its added" do
|
224
236
|
validate("12 o'clock", :time).should be_false
|
225
237
|
formats.add_formats(:time, "h o'clock")
|
226
238
|
validate("12 o'clock", :time).should be_true
|
227
239
|
end
|
228
|
-
|
229
|
-
it "should add format before specified format and be higher precedence" do
|
240
|
+
|
241
|
+
it "should add format before specified format and be higher precedence" do
|
230
242
|
formats.add_formats(:time, "ss:hh:nn", :before => 'hh:nn:ss')
|
231
243
|
validate("59:23:58", :time).should be_true
|
232
244
|
time_array = formats.parse('59:23:58', :time)
|
@@ -236,18 +248,18 @@ describe ValidatesTimeliness::Formats do
|
|
236
248
|
it "should raise error if format exists" do
|
237
249
|
lambda { formats.add_formats(:time, "hh:nn:ss") }.should raise_error()
|
238
250
|
end
|
239
|
-
|
251
|
+
|
240
252
|
it "should raise error if format exists" do
|
241
253
|
lambda { formats.add_formats(:time, "ss:hh:nn", :before => 'nn:hh:ss') }.should raise_error()
|
242
254
|
end
|
243
|
-
|
255
|
+
|
244
256
|
after do
|
245
257
|
formats.time_formats.delete("h o'clock")
|
246
258
|
formats.time_formats.delete("ss:hh:nn")
|
247
259
|
# reload class instead
|
248
260
|
end
|
249
261
|
end
|
250
|
-
|
262
|
+
|
251
263
|
describe "removing US formats" do
|
252
264
|
it "should validate a date as European format when US formats removed" do
|
253
265
|
time_array = formats.parse('01/02/2000', :date)
|
@@ -256,13 +268,13 @@ describe ValidatesTimeliness::Formats do
|
|
256
268
|
time_array = formats.parse('01/02/2000', :date)
|
257
269
|
time_array.should == [2000, 2, 1,0,0,0,0]
|
258
270
|
end
|
259
|
-
|
271
|
+
|
260
272
|
after do
|
261
|
-
# reload class
|
273
|
+
# reload class
|
262
274
|
end
|
263
275
|
end
|
264
|
-
|
265
|
-
|
276
|
+
|
277
|
+
|
266
278
|
def formats
|
267
279
|
ValidatesTimeliness::Formats
|
268
280
|
end
|
@@ -274,20 +286,20 @@ describe ValidatesTimeliness::Formats do
|
|
274
286
|
end
|
275
287
|
valid
|
276
288
|
end
|
277
|
-
|
289
|
+
|
278
290
|
def generate_regexp(format)
|
279
291
|
# wrap in line start and end anchors to emulate extract values method
|
280
|
-
/\A#{formats.send(:
|
292
|
+
/\A#{formats.send(:generate_format_expression, format)[0]}\Z/
|
281
293
|
end
|
282
|
-
|
294
|
+
|
283
295
|
def generate_regexp_str(format)
|
284
|
-
formats.send(:
|
296
|
+
formats.send(:generate_format_expression, format)[0].inspect
|
285
297
|
end
|
286
|
-
|
298
|
+
|
287
299
|
def generate_proc(format)
|
288
|
-
formats.send(:
|
300
|
+
formats.send(:generate_format_expression, format)[1]
|
289
301
|
end
|
290
|
-
|
302
|
+
|
291
303
|
def delete_format(type, format)
|
292
304
|
formats.send("#{type}_formats").delete(format)
|
293
305
|
end
|
data/spec/ginger_scenarios.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# For use with the ginger gem to test plugin against multiple versions of Rails.
|
2
2
|
#
|
3
3
|
# To use ginger:
|
4
|
-
#
|
5
|
-
#
|
4
|
+
#
|
5
|
+
# gem install ginger
|
6
6
|
#
|
7
7
|
# Then run
|
8
8
|
#
|
9
9
|
# ginger spec
|
10
10
|
#
|
11
11
|
Ginger.configure do |config|
|
12
|
-
rails_versions = ['2.0.2', '2.1.2', '2.2.2', '2.3.3', '2.3.4']
|
12
|
+
rails_versions = ['2.0.2', '2.1.2', '2.2.2', '2.3.3', '2.3.4', '2.3.5']
|
13
13
|
|
14
14
|
rails_versions.each do |v|
|
15
15
|
g = Ginger::Scenario.new("Rails #{v}")
|
@@ -5,24 +5,24 @@ class NoValidation < Person
|
|
5
5
|
end
|
6
6
|
|
7
7
|
class WithValidation < Person
|
8
|
-
validates_date :birth_date,
|
9
|
-
:
|
8
|
+
validates_date :birth_date,
|
9
|
+
:is_at => '2000-01-01',
|
10
10
|
:before => '2000-01-10',
|
11
11
|
:after => '2000-01-01',
|
12
12
|
:on_or_before => '2000-01-09',
|
13
13
|
:on_or_after => '2000-01-02',
|
14
14
|
:between => ['2000-01-01', '2000-01-03']
|
15
15
|
|
16
|
-
validates_time :birth_time,
|
17
|
-
:
|
16
|
+
validates_time :birth_time,
|
17
|
+
:is_at => '09:00',
|
18
18
|
:before => '23:00',
|
19
19
|
:after => '09:00',
|
20
20
|
:on_or_before => '22:00',
|
21
21
|
:on_or_after => '10:00',
|
22
22
|
:between => ['09:00', '17:00']
|
23
23
|
|
24
|
-
validates_datetime :birth_date_and_time,
|
25
|
-
:
|
24
|
+
validates_datetime :birth_date_and_time,
|
25
|
+
:is_at => '2000-01-01 09:00',
|
26
26
|
:before => '2000-01-10 23:00',
|
27
27
|
:after => '2000-01-01 09:00',
|
28
28
|
:on_or_before => '2000-01-09 23:00',
|
@@ -46,44 +46,44 @@ end
|
|
46
46
|
|
47
47
|
describe "ValidateTimeliness matcher" do
|
48
48
|
attr_accessor :no_validation, :with_validation
|
49
|
-
|
49
|
+
|
50
50
|
@@attribute_for_type = { :date => :birth_date, :time => :birth_time, :datetime => :birth_date_and_time }
|
51
|
-
|
51
|
+
|
52
52
|
before do
|
53
53
|
@no_validation = NoValidation.new
|
54
54
|
@with_validation = WithValidation.new
|
55
55
|
end
|
56
56
|
|
57
57
|
[:date, :time, :datetime].each do |type|
|
58
|
-
|
58
|
+
|
59
59
|
it "should report that #{type} is validated" do
|
60
60
|
with_validation.should self.send("validate_#{type}", attribute_for_type(type))
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
it "should report that #{type} is not validated" do
|
64
64
|
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type))
|
65
|
-
end
|
65
|
+
end
|
66
66
|
end
|
67
|
-
|
68
|
-
describe "with
|
67
|
+
|
68
|
+
describe "with is_at option" do
|
69
69
|
test_values = {
|
70
70
|
:date => ['2000-01-01', '2000-01-02'],
|
71
71
|
:time => ['09:00', '09:01'],
|
72
72
|
:datetime => ['2000-01-01 09:00', '2000-01-01 09:01']
|
73
73
|
}
|
74
|
-
|
74
|
+
|
75
75
|
[:date, :time, :datetime].each do |type|
|
76
76
|
|
77
77
|
it "should report that #{type} is validated" do
|
78
|
-
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :
|
78
|
+
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :is_at => test_values[type][0])
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
it "should report that #{type} is not validated when option value is incorrect" do
|
82
|
-
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :
|
82
|
+
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :is_at => test_values[type][1])
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
it "should report that #{type} is not validated with option" do
|
86
|
-
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :
|
86
|
+
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :is_at => test_values[type][0])
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
@@ -92,111 +92,111 @@ describe "ValidateTimeliness matcher" do
|
|
92
92
|
test_values = {
|
93
93
|
:date => ['2000-01-10', '2000-01-11'],
|
94
94
|
:time => ['23:00', '22:59'],
|
95
|
-
:datetime => ['2000-01-10 23:00', '2000-01-10 22:59']
|
95
|
+
:datetime => ['2000-01-10 23:00', '2000-01-10 22:59']
|
96
96
|
}
|
97
|
-
|
97
|
+
|
98
98
|
[:date, :time, :datetime].each do |type|
|
99
99
|
|
100
100
|
it "should report that #{type} is validated" do
|
101
101
|
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :before => test_values[type][0])
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
it "should report that #{type} is not validated when option value is incorrect" do
|
105
105
|
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :before => test_values[type][1])
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
it "should report that #{type} is not validated with option" do
|
109
109
|
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :before => test_values[type][0])
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
describe "with after option" do
|
115
115
|
test_values = {
|
116
116
|
:date => ['2000-01-01', '2000-01-02'],
|
117
117
|
:time => ['09:00', '09:01'],
|
118
|
-
:datetime => ['2000-01-01 09:00', '2000-01-01 09:01']
|
118
|
+
:datetime => ['2000-01-01 09:00', '2000-01-01 09:01']
|
119
119
|
}
|
120
|
-
|
120
|
+
|
121
121
|
[:date, :time, :datetime].each do |type|
|
122
122
|
|
123
123
|
it "should report that #{type} is validated" do
|
124
124
|
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :after => test_values[type][0])
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
it "should report that #{type} is not validated when option value is incorrect" do
|
128
128
|
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :after => test_values[type][1])
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
it "should report that #{type} is not validated with option" do
|
132
132
|
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :after => test_values[type][0])
|
133
133
|
end
|
134
134
|
end
|
135
135
|
end
|
136
|
-
|
136
|
+
|
137
137
|
describe "with on_or_before option" do
|
138
138
|
test_values = {
|
139
139
|
:date => ['2000-01-09', '2000-01-08'],
|
140
140
|
:time => ['22:00', '21:59'],
|
141
|
-
:datetime => ['2000-01-09 23:00', '2000-01-09 22:59']
|
141
|
+
:datetime => ['2000-01-09 23:00', '2000-01-09 22:59']
|
142
142
|
}
|
143
|
-
|
143
|
+
|
144
144
|
[:date, :time, :datetime].each do |type|
|
145
145
|
|
146
146
|
it "should report that #{type} is validated" do
|
147
147
|
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :on_or_before => test_values[type][0])
|
148
148
|
end
|
149
|
-
|
149
|
+
|
150
150
|
it "should report that #{type} is not validated when option value is incorrect" do
|
151
151
|
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_before => test_values[type][1])
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
it "should report that #{type} is not validated with option" do
|
155
155
|
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_before => test_values[type][0])
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
159
|
-
|
159
|
+
|
160
160
|
describe "with on_or_after option" do
|
161
161
|
test_values = {
|
162
162
|
:date => ['2000-01-02', '2000-01-03'],
|
163
163
|
:time => ['10:00', '10:01'],
|
164
|
-
:datetime => ['2000-01-02 09:00', '2000-01-02 09:01']
|
164
|
+
:datetime => ['2000-01-02 09:00', '2000-01-02 09:01']
|
165
165
|
}
|
166
|
-
|
166
|
+
|
167
167
|
[:date, :time, :datetime].each do |type|
|
168
168
|
|
169
169
|
it "should report that #{type} is validated" do
|
170
170
|
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :on_or_after => test_values[type][0])
|
171
171
|
end
|
172
|
-
|
172
|
+
|
173
173
|
it "should report that #{type} is not validated when option value is incorrect" do
|
174
174
|
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_after => test_values[type][1])
|
175
175
|
end
|
176
|
-
|
176
|
+
|
177
177
|
it "should report that #{type} is not validated with option" do
|
178
178
|
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :on_or_after => test_values[type][0])
|
179
179
|
end
|
180
180
|
end
|
181
181
|
end
|
182
|
-
|
182
|
+
|
183
183
|
describe "between option" do
|
184
184
|
test_values = {
|
185
185
|
:date => [ ['2000-01-01', '2000-01-03'], ['2000-01-01', '2000-01-04'] ],
|
186
|
-
:time => [ ['09:00', '17:00'], ['09:00', '17:01'] ],
|
187
|
-
:datetime => [ ['2000-01-01 09:00', '2000-01-01 17:00'], ['2000-01-01 09:00', '2000-01-01 17:01'] ]
|
186
|
+
:time => [ ['09:00', '17:00'], ['09:00', '17:01'] ],
|
187
|
+
:datetime => [ ['2000-01-01 09:00', '2000-01-01 17:00'], ['2000-01-01 09:00', '2000-01-01 17:01'] ]
|
188
188
|
}
|
189
|
-
|
189
|
+
|
190
190
|
[:date, :time, :datetime].each do |type|
|
191
191
|
|
192
192
|
it "should report that #{type} is validated" do
|
193
193
|
with_validation.should self.send("validate_#{type}", attribute_for_type(type), :between => test_values[type][0])
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
it "should report that #{type} is not validated when option value is incorrect" do
|
197
197
|
with_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :between => test_values[type][1])
|
198
198
|
end
|
199
|
-
|
199
|
+
|
200
200
|
it "should report that #{type} is not validated with option" do
|
201
201
|
no_validation.should_not self.send("validate_#{type}", attribute_for_type(type), :between => test_values[type][0])
|
202
202
|
end
|
@@ -208,35 +208,35 @@ describe "ValidateTimeliness matcher" do
|
|
208
208
|
before do
|
209
209
|
@person = CustomMessages.new
|
210
210
|
end
|
211
|
-
|
211
|
+
|
212
212
|
it "should match error message for invalid" do
|
213
213
|
@person.should validate_date(:birth_date, :invalid_date_message => 'is not really a date')
|
214
214
|
end
|
215
|
-
|
215
|
+
|
216
216
|
it "should match error message for before option" do
|
217
|
-
@person.should validate_date(:birth_date, :before => '2000-01-10',
|
217
|
+
@person.should validate_date(:birth_date, :before => '2000-01-10',
|
218
218
|
:invalid_date_message => 'is not really a date',
|
219
219
|
:before_message => 'is too late')
|
220
220
|
end
|
221
|
-
|
221
|
+
|
222
222
|
it "should match error message for after option" do
|
223
|
-
@person.should validate_date(:birth_date, :after => '2000-01-01',
|
223
|
+
@person.should validate_date(:birth_date, :after => '2000-01-01',
|
224
224
|
:invalid_date_message => 'is not really a date',
|
225
225
|
:after_message => 'is too early')
|
226
|
-
end
|
226
|
+
end
|
227
227
|
|
228
228
|
it "should match error message for on_or_before option" do
|
229
229
|
@person.should validate_date(:birth_date, :on_or_before => '2000-01-09',
|
230
230
|
:invalid_date_message => 'is not really a date',
|
231
231
|
:on_or_before_message => 'is just too late')
|
232
232
|
end
|
233
|
-
|
233
|
+
|
234
234
|
it "should match error message for on_or_after option" do
|
235
235
|
@person.should validate_date(:birth_date, :on_or_after => '2000-01-02',
|
236
236
|
:invalid_date_message => 'is not really a date',
|
237
237
|
:on_or_after_message => 'is just too early')
|
238
238
|
end
|
239
|
-
|
239
|
+
|
240
240
|
end
|
241
241
|
|
242
242
|
def attribute_for_type(type)
|