diff options
author | Eugene Kenny <elkenny@gmail.com> | 2018-05-10 00:24:04 +0100 |
---|---|---|
committer | Eugene Kenny <elkenny@gmail.com> | 2018-05-10 00:24:04 +0100 |
commit | 2f29380c18d7754cefffbc09bebaa2007fb99929 (patch) | |
tree | c99673f97154f4b5b8b667f7fae11b21b4ecb3a7 /activerecord/test | |
parent | f507085fa2a7625324e6f4e3ecef9b27dabefb4f (diff) | |
download | rails-2f29380c18d7754cefffbc09bebaa2007fb99929.tar.gz rails-2f29380c18d7754cefffbc09bebaa2007fb99929.tar.bz2 rails-2f29380c18d7754cefffbc09bebaa2007fb99929.zip |
Don't clear transaction state after manual rollback
If an `ActiveRecord::Rollback` error was raised by a persistence method
(e.g. in an `after_save` callback), this logic would potentially discard
the original state of the record from before the transaction, preventing
it from being restored later when the transaction was rolled back.
Diffstat (limited to 'activerecord/test')
-rw-r--r-- | activerecord/test/cases/transactions_test.rb | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/activerecord/test/cases/transactions_test.rb b/activerecord/test/cases/transactions_test.rb index 3fd38b4b60..931e01845a 100644 --- a/activerecord/test/cases/transactions_test.rb +++ b/activerecord/test/cases/transactions_test.rb @@ -292,6 +292,18 @@ class TransactionTest < ActiveRecord::TestCase assert_nil new_topic.id, "The topic should not have an ID" end + def test_callback_rollback_in_create_with_rollback_exception + topic = Class.new(Topic) { + def after_create_for_transaction + raise ActiveRecord::Rollback + end + } + + new_topic = topic.create(title: "A new topic") + assert !new_topic.persisted?, "The topic should not be persisted" + assert_nil new_topic.id, "The topic should not have an ID" + end + def test_nested_explicit_transactions Topic.transaction do Topic.transaction do |