diff --git a/lib/database_cleaner/active_record/transaction.rb b/lib/database_cleaner/active_record/transaction.rb index 10528cc..b4e9fd5 100644 --- a/lib/database_cleaner/active_record/transaction.rb +++ b/lib/database_cleaner/active_record/transaction.rb @@ -14,6 +14,8 @@ module DatabaseCleaner::ActiveRecord def clean + return unless connection_klass.connection.open_transactions > 0 + connection_klass.connection.rollback_db_transaction if connection_klass.connection.respond_to?(:decrement_open_transactions) diff --git a/spec/database_cleaner/active_record/transaction_spec.rb b/spec/database_cleaner/active_record/transaction_spec.rb index a354274..73ea217 100644 --- a/spec/database_cleaner/active_record/transaction_spec.rb +++ b/spec/database_cleaner/active_record/transaction_spec.rb @@ -38,12 +38,17 @@ module DatabaseCleaner describe "#clean" do it "should start a transaction" do + connection.should_receive(:open_transactions).and_return(1) + connection.stub!(:decrement_open_transactions) connection.should_receive(:rollback_db_transaction) Transaction.new.clean end + it "should decrement open transactions if possible" do + connection.should_receive(:open_transactions).and_return(1) + connection.stub!(:respond_to?).with(:decrement_open_transactions).and_return(true) connection.stub!(:rollback_db_transaction) @@ -51,7 +56,14 @@ module DatabaseCleaner Transaction.new.clean end + it "should not try to decrement or rollback if open_transactions is 0 for whatever reason" do + connection.should_receive(:open_transactions).and_return(0) + + Transaction.new.clean + end + it "should decrement connection via ActiveRecord::Base if connection won't" do + connection.should_receive(:open_transactions).and_return(1) connection.stub!(:respond_to?).with(:decrement_open_transactions).and_return(false) connection.stub!(:rollback_db_transaction)