You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When we add another database to a cleaner by specifying a symbol (connection name) with the :transaction strategy, it does not open a transaction.
Look at the reproduction below. Even though the cleaner is configured to clean :db => :bar with the transaction strategy, the transaction is not opened*.
(*In fact, a transaction is opened on ActiveRecord::Base.connection instead.)
Reproduction
#!/usr/bin/env rubyrequire"bundler/inline"gemfile(true)dosource'https://rubygems.org'gem'rails','~> 7.0.0'gem'sqlite3'gem'rspec'gem'database_cleaner-active_record',git: "https://github.com/DatabaseCleaner/database_cleaner-active_record.git",ref: "aafa5b2"endrequire"yaml"ActiveRecord::Base.configurations=YAML.load(<<~YAML) foo: adapter: sqlite3 database: ":memory:" bar: adapter: sqlite3 database: ":memory:"YAMLRSpec.describedobeforedoActiveRecord::Base.establish_connection:fooclassBar < ActiveRecord::Baseestablish_connection:barendendit"should open a transaction on Bar"docleaner=DatabaseCleaner::Cleaners.newcleaner[:active_record,:db=>:bar].strategy=:transactioncleaner.cleaningdo# expected: true# got: falseexpect(Bar.connection.transaction_open?).toeq(true)endendit"should not open a transaction on ActiveRecord::Base where we removed it from cleaner"docleaner=DatabaseCleaner::Cleaners.newcleaner[:active_record].strategy=nilcleaner[:active_record,:db=>:bar].strategy=:transactioncleaner.cleaningdo# expected: false# got: trueexpect(ActiveRecord::Base.connection.transaction_open?).toeq(false)endendend
The text was updated successfully, but these errors were encountered:
In the reproduction above, try replacing all the :db => :bar with :db => Bar. The test passes.
Looking into the database_cleaner/active_record/base.rb, it is managing to obtain the ActiveRecord class from a given connection name.
It makes the code have too much responsibility and very complex. That is, it is reading ActiveRecord::Base.configurations, reading config/database.yml, and searching through connection pools and ActiveRecord classes.
This complexity can easily bring bugs such as #10, #18 and #97.
Though it is a breaking change... if we make the cleaner only accept an ActiveRecord class object as a value for :db option, doesn't database_cleaner/active_record/base.rb become far simpler and reduce the possibility of bugs so much?
(I will post my suggestion next to this report.)
Summary
When we add another database to a cleaner by specifying a symbol (connection name) with the
:transaction
strategy, it does not open a transaction.Look at the reproduction below. Even though the cleaner is configured to clean
:db => :bar
with the transaction strategy, the transaction is not opened*.(*In fact, a transaction is opened on
ActiveRecord::Base.connection
instead.)Reproduction
The text was updated successfully, but these errors were encountered: