changed format of string used in multi param for invalid or partial values

This commit is contained in:
Adam Meehan 2010-01-12 22:05:14 +11:00
parent f1a0016bf7
commit 82c0e1bcd3
5 changed files with 150 additions and 56 deletions

View File

@ -10,10 +10,14 @@ module ValidatesTimeliness
# attribute value before type cast to be used as in the select helpers.
# This means that an invalid date or time will be redisplayed rather than the
# type cast value which would be nil if invalid.
#
# Its a minor user experience improvement to be able to see original value
# entered to aid correction.
#
module InstanceTag
def self.included(base)
selector_method = Rails::VERSION::STRING < '2.2' ? :date_or_time_select : :datetime_selector
selector_method = Rails::VERSION::STRING.to_f < 2.2 ? :date_or_time_select : :datetime_selector
base.class_eval do
alias_method :datetime_selector_without_timeliness, selector_method
alias_method selector_method, :datetime_selector_with_timeliness
@ -37,9 +41,11 @@ module ValidatesTimeliness
return value_without_timeliness(object)
end
time_array = ValidatesTimeliness::Formats.parse(raw_value, :datetime)
date, time = raw_value.split(' ')
date_array = date.split('-')
time_array = time.split(':')
TimelinessDateTime.new(*time_array[0..5])
TimelinessDateTime.new(*(date_array + time_array).map {|v| v.blank? ? nil : v.to_i})
end
end

View File

@ -22,12 +22,12 @@ module ValidatesTimeliness
end
def extract_date_from_multiparameter_attributes(values)
year = ValidatesTimeliness::Formats.unambiguous_year(values[0].rjust(2, "0"))
[year, *values.slice(1, 2).map { |s| s.rjust(2, "0") }].join("-")
year = values[0].blank? ? nil : ValidatesTimeliness::Formats.unambiguous_year(values[0].rjust(2, "0"))
[year, *values.slice(1, 2).map { |s| s.blank? ? nil : s.rjust(2, "0") }].join("-")
end
def extract_time_from_multiparameter_attributes(values)
values[3..5].map { |s| s.rjust(2, "0") }.join(":")
values[3..5].map { |s| s.blank? ? nil : s.rjust(2, "0") }.join(":")
end
end
@ -39,7 +39,6 @@ module ValidatesTimeliness
end
# Assign dates and times as formatted strings to force the use of the plugin parser
# and store a before_type_cast value for attribute
def execute_callstack_for_multiparameter_attributes_with_timeliness(callstack)
errors = []
callstack.each do |name, values|
@ -47,7 +46,7 @@ module ValidatesTimeliness
if column && [:date, :time, :datetime].include?(column.type)
begin
callstack.delete(name)
if values.empty?
if values.empty? || values.all?(&:nil?)
send("#{name}=", nil)
else
value = ValidatesTimeliness::ActiveRecord.time_array_to_string(values, column.type)

View File

@ -1,7 +1,5 @@
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
ValidatesTimeliness.enable_datetime_select_extension!
describe 'ValidatesTimeliness::ActionView::InstanceTag' do
include ActionView::Helpers::DateHelper
include ActionController::Assertions::SelectorAssertions
@ -39,4 +37,27 @@ describe 'ValidatesTimeliness::ActionView::InstanceTag' do
output = datetime_select(:person, :birth_date_and_time, :include_blank => true, :include_seconds => true)
output.should have_tag('select', 6)
end
it "should display datetime_select with no values selected for missing parts" do
@person.birth_date_and_time = '2000-- ::'
output = datetime_select(:person, :birth_date_and_time, :include_blank => true, :include_seconds => true)
output.should have_tag('select[id=person_birth_date_and_time_1i]') do
with_tag('option[selected=selected]')
end
output.should have_tag('select[id=person_birth_date_and_time_2i]') do
without_tag('option[selected=selected]')
end
output.should have_tag('select[id=person_birth_date_and_time_3i]') do
without_tag('option[selected=selected]')
end
output.should have_tag('select[id=person_birth_date_and_time_4i]') do
without_tag('option[selected=selected]')
end
output.should have_tag('select[id=person_birth_date_and_time_5i]') do
without_tag('option[selected=selected]')
end
output.should have_tag('select[id=person_birth_date_and_time_6i]') do
without_tag('option[selected=selected]')
end
end
end

View File

@ -21,6 +21,8 @@ describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
end
describe "execute_callstack_for_multiparameter_attributes" do
describe "for valid values" do
before do
@callstack = {
'birth_date_and_time' => [2000,2,1,9,10,11],
@ -45,6 +47,70 @@ describe ValidatesTimeliness::ActiveRecord::MultiparameterAttributes do
end
end
describe "for invalid values" do
before do
@callstack = {
'birth_date_and_time' => [2000,13,1,9,10,11],
'birth_date' => [2000,2,41,9,10,11],
'birth_time' => [2000,2,1,25,10,11]
}
end
it "should store invalid datetime string for datetime column" do
obj.should_receive(:birth_date_and_time=).once.with("2000-13-01 09:10:11")
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
end
it "should store invalid date string for a date column" do
obj.should_receive(:birth_date=).once.with("2000-02-41")
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
end
it "should store invalid time string for a time column" do
obj.should_receive(:birth_time=).once.with("25:10:11")
obj.send(:execute_callstack_for_multiparameter_attributes, @callstack)
end
end
describe "for missing values" do
it "should store nil if all datetime values nil" do
obj.should_receive(:birth_date_and_time=).once.with(nil)
callstack = { 'birth_date_and_time' => [nil,nil,nil,nil,nil,nil] }
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
end
it "should store nil year as empty value in string" do
obj.should_receive(:birth_date_and_time=).once.with("-02-01 09:10:11")
callstack = { 'birth_date_and_time' => [nil,2,1,9,10,11] }
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
end
it "should store nil month as empty value in string" do
obj.should_receive(:birth_date_and_time=).once.with("2000--01 09:10:11")
callstack = { 'birth_date_and_time' => [2000,nil,1,9,10,11] }
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
end
it "should store nil day as empty value in string" do
obj.should_receive(:birth_date_and_time=).once.with("2000-02- 09:10:11")
callstack = { 'birth_date_and_time' => [2000,2,nil,9,10,11] }
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
end
it "should store nil hour as empty value in string" do
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 :10:11")
callstack = { 'birth_date_and_time' => [2000,2,1,nil,10,11] }
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
end
it "should store nil minute as empty value in string" do
obj.should_receive(:birth_date_and_time=).once.with("2000-02-01 09:10:")
callstack = { 'birth_date_and_time' => [2000,2,1,9,10,nil] }
obj.send(:execute_callstack_for_multiparameter_attributes, callstack)
end
end
end
def time_array_to_string(*args)
ValidatesTimeliness::ActiveRecord.time_array_to_string(*args)
end

View File

@ -47,6 +47,8 @@ end
require 'validates_timeliness'
require 'validates_timeliness/matcher'
ValidatesTimeliness.enable_datetime_select_extension!
ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection({:adapter => 'sqlite3', :database => ':memory:'})