aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
authorSean Griffin <sean@thoughtbot.com>2014-11-30 18:24:53 -0700
committerSean Griffin <sean@thoughtbot.com>2014-12-01 05:31:44 -0700
commit704c658531ae202715cba29d6b2ba64651f220fd (patch)
tree23d985b99313d0b41df014b8e29ea82f0f9a5799 /activerecord/test
parent8226bad7101fd35e774ca6d233c605c4cee2abd8 (diff)
downloadrails-704c658531ae202715cba29d6b2ba64651f220fd.tar.gz
rails-704c658531ae202715cba29d6b2ba64651f220fd.tar.bz2
rails-704c658531ae202715cba29d6b2ba64651f220fd.zip
Ensure numericality validations work with mutation
The detection of in-place changes caused a weird unexpected issue with numericality validations. That validator (out of necessity) works on the `_before_type_cast` version of the attribute, since on an `:integer` type column, a non-numeric string would type cast to 0. However, strings are mutable, and we changed strings to ensure that the post type cast version of the attribute was a different instance than the before type cast version (so the mutation detection can work properly). Even though strings are the only mutable type for which a numericality validation makes sense, special casing strings would feel like a strange change to make here. Instead, we can make the assumption that for all mutable types, we should work on the post-type-cast version of the attribute, since all cases which would return 0 for non-numeric strings are immutable. Fixes #17852
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/cases/validations_test.rb13
1 files changed, 13 insertions, 0 deletions
diff --git a/activerecord/test/cases/validations_test.rb b/activerecord/test/cases/validations_test.rb
index db8159eff8..959c58aa85 100644
--- a/activerecord/test/cases/validations_test.rb
+++ b/activerecord/test/cases/validations_test.rb
@@ -149,4 +149,17 @@ class ValidationsTest < ActiveRecord::TestCase
assert_equal 1, Company.validators_on(:name).size
end
+ def test_numericality_validation_with_mutation
+ Topic.class_eval do
+ attribute :wibble, ActiveRecord::Type::String.new
+ validates_numericality_of :wibble, only_integer: true
+ end
+
+ topic = Topic.new(wibble: '123-4567')
+ topic.wibble.gsub!('-', '')
+
+ assert topic.valid?
+ ensure
+ Topic.reset_column_information
+ end
end