aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
authorYuya Tanaka <yuya.presto@gmail.com>2018-08-22 20:00:19 +0900
committerYuya Tanaka <yuya.presto@gmail.com>2018-08-28 16:32:23 +0900
commit34f075fe5666dcf924606f8af2537b83b7b5139f (patch)
tree30c11dda125da7385954802dfa2093a0ff7e04fd /activerecord/test
parent1353610ff2ab4d16d022d5c31d5b4e5d908e05a8 (diff)
downloadrails-34f075fe5666dcf924606f8af2537b83b7b5139f.tar.gz
rails-34f075fe5666dcf924606f8af2537b83b7b5139f.tar.bz2
rails-34f075fe5666dcf924606f8af2537b83b7b5139f.zip
Mutation tracker should be cleared before continuing around callbacks
`changes_applied` should be called before continuing around callback chain. Otherwise the mutation tracker returns old value for methods like `changed`? or `id_in_database` in around callbacks. Also methods depend on `id_in_database`, like `update_column`, are not working in `around_create` callbacks. ``` class Foo < ActiveRecord::Base around_create :around_create_callback def around_create_callback ... yield p id_in_database # => nil update_column(:generated_column, generate_value) # silently fails end ... end ```
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/cases/dirty_test.rb20
1 files changed, 20 insertions, 0 deletions
diff --git a/activerecord/test/cases/dirty_test.rb b/activerecord/test/cases/dirty_test.rb
index 83cc2aa319..1f0e770a93 100644
--- a/activerecord/test/cases/dirty_test.rb
+++ b/activerecord/test/cases/dirty_test.rb
@@ -879,6 +879,26 @@ class DirtyTest < ActiveRecord::TestCase
raise "changed? should be false" if changed?
raise "has_changes_to_save? should be false" if has_changes_to_save?
raise "saved_changes? should be true" unless saved_changes?
+ raise "id_in_database should not be nil" if id_in_database.nil?
+ end
+ end
+
+ person = klass.create!(first_name: "Sean")
+ assert_not_predicate person, :changed?
+ end
+
+ test "changed? in around callbacks after yield returns false" do
+ klass = Class.new(ActiveRecord::Base) do
+ self.table_name = "people"
+
+ around_create :check_around
+
+ def check_around
+ yield
+ raise "changed? should be false" if changed?
+ raise "has_changes_to_save? should be false" if has_changes_to_save?
+ raise "saved_changes? should be true" unless saved_changes?
+ raise "id_in_database should not be nil" if id_in_database.nil?
end
end