diff --git a/lib/validates_timeliness/attribute_methods.rb b/lib/validates_timeliness/attribute_methods.rb index 34c96475..2b4993d5 100644 --- a/lib/validates_timeliness/attribute_methods.rb +++ b/lib/validates_timeliness/attribute_methods.rb @@ -82,7 +82,7 @@ def undefine_timeliness_attribute_methods end def _timeliness_raw_value_for(attr_name) - @timeliness_cache && @timeliness_cache[attr_name.to_s] + @timeliness_cache && @timeliness_cache[attr_name] end def _clear_timeliness_cache diff --git a/lib/validates_timeliness/validator.rb b/lib/validates_timeliness/validator.rb index 516dbdc9..9999b735 100644 --- a/lib/validates_timeliness/validator.rb +++ b/lib/validates_timeliness/validator.rb @@ -77,7 +77,7 @@ def format_error_value(value) def attribute_raw_value(record, attr_name) record.respond_to?(:_timeliness_raw_value_for) && - record._timeliness_raw_value_for(attr_name) + record._timeliness_raw_value_for(attr_name.to_s) end def timezone_aware?(record, attr_name) diff --git a/spec/validates_timeliness/orm/active_record_spec.rb b/spec/validates_timeliness/orm/active_record_spec.rb index 1ee257cd..492b8ec7 100644 --- a/spec/validates_timeliness/orm/active_record_spec.rb +++ b/spec/validates_timeliness/orm/active_record_spec.rb @@ -14,6 +14,30 @@ Employee.new.should respond_to(:validates_time) Employee.new.should respond_to(:validates_datetime) end + + it "should validate a valid value string" do + r = Employee.new + r.birth_date = '2012-01-01' + + r.valid? + r.errors[:birth_date].should be_empty + end + + it "should validate a invalid value string" do + r = Employee.new + r.birth_date = 'not a date' + + r.valid? + r.errors[:birth_date].should_not be_empty + end + + it "should validate a nil value" do + r = Employee.new + r.birth_date = nil + + r.valid? + r.errors[:birth_date].should be_empty + end end it 'should determine type for attribute' do @@ -23,13 +47,26 @@ context "attribute write method" do class EmployeeWithCache < ActiveRecord::Base set_table_name 'employees' - validates_datetime :birth_datetime + validates_date :birth_date, :allow_blank => true + validates_datetime :birth_datetime, :allow_blank => true end - it 'should cache attribute raw value' do - r = EmployeeWithCache.new - r.birth_datetime = date_string = '2010-01-01' - r._timeliness_raw_value_for('birth_datetime').should == date_string + context 'value cache' do + context 'for datetime column' do + it 'should store raw value' do + r = EmployeeWithCache.new + r.birth_datetime = date_string = '2010-01-01' + r._timeliness_raw_value_for('birth_datetime').should == date_string + end + end + + context 'for date column' do + it 'should store raw value' do + r = EmployeeWithCache.new + r.birth_date = date_string = '2010-01-01' + r._timeliness_raw_value_for('birth_date').should == date_string + end + end end context "with plugin parser" do @@ -37,8 +74,8 @@ class EmployeeWithCache < ActiveRecord::Base class EmployeeWithParser < ActiveRecord::Base set_table_name 'employees' - validates_date :birth_date - validates_datetime :birth_datetime + validates_date :birth_date, :allow_blank => true + validates_datetime :birth_datetime, :allow_blank => true end it 'should parse a string value' do @@ -47,7 +84,13 @@ class EmployeeWithParser < ActiveRecord::Base r.birth_date = '2010-01-01' end - context "for a date column", :active_record => '3.0' do + it 'should parse a invalid string value as nil' do + Timeliness::Parser.should_receive(:parse) + r = EmployeeWithParser.new + r.birth_date = 'not a date' + end + + context "for a date column" do it 'should store a date value after parsing string' do r = EmployeeWithParser.new r.birth_date = '2010-01-01' @@ -77,10 +120,11 @@ class EmployeeWithParser < ActiveRecord::Base end end - context "cached value" do - it 'should be cleared on reload' do + context "reload" do + it 'should clear cache value' do r = Employee.create! r.birth_date = '2010-01-01' + r.reload r._timeliness_raw_value_for('birth_date').should be_nil diff --git a/spec/validates_timeliness/orm/mongoid_spec.rb b/spec/validates_timeliness/orm/mongoid_spec.rb index aaccd30f..63a36fce 100644 --- a/spec/validates_timeliness/orm/mongoid_spec.rb +++ b/spec/validates_timeliness/orm/mongoid_spec.rb @@ -38,6 +38,30 @@ class Article Article.new.should respond_to(:validates_time) Article.new.should respond_to(:validates_datetime) end + + it "should validate a valid value string" do + r = Article.new + r.publish_date = '2012-01-01' + + r.valid? + r.errors[:publish_date].should be_empty + end + + it "should validate a invalid value string" do + r = Article.new + r.publish_date = 'not a date' + + r.valid? + r.errors[:publish_date].should_not be_empty + end + + it "should validate a nil value" do + r = Article.new + r.publish_date = nil + + r.valid? + r.errors[:publish_date].should be_empty + end end it 'should determine type for attribute' do @@ -48,7 +72,7 @@ class Article it 'should cache attribute raw value' do r = Article.new r.publish_datetime = date_string = '2010-01-01' - r._timeliness_raw_value_for(:publish_datetime).should == date_string + r._timeliness_raw_value_for('publish_datetime').should == date_string end context "with plugin parser" do @@ -95,7 +119,7 @@ class Article r = Article.create! r.publish_date = '2010-01-01' r.reload - r._timeliness_raw_value_for(:publish_date).should be_nil + r._timeliness_raw_value_for('publish_date').should be_nil end end