From 951eb7ea94c2c2e3b4776291cdb41ab4e6d8943b Mon Sep 17 00:00:00 2001 From: Kaoru Shirai <475350+kaorukobo@users.noreply.github.com> Date: Tue, 20 Feb 2024 14:52:54 +0900 Subject: [PATCH] Avoid accidental replacement of main DB model connections --- lib/database_cleaner/active_record/base.rb | 7 +++++-- spec/database_cleaner/active_record/base_spec.rb | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/database_cleaner/active_record/base.rb b/lib/database_cleaner/active_record/base.rb index ed61045f..51a3e341 100644 --- a/lib/database_cleaner/active_record/base.rb +++ b/lib/database_cleaner/active_record/base.rb @@ -84,8 +84,11 @@ def lookup_from_connection_pool end def establish_connection - ::ActiveRecord::Base.establish_connection(connection_hash) - ::ActiveRecord::Base + # creates a temporary ActiveRecord class that is unique to connection_hash + ActiveRecord.module_eval("class Temp#{connection_hash.hash.abs} < ::ActiveRecord::Base; self; end") + .tap { |ar_class| + ar_class.establish_connection(connection_hash) + } end def database_for(model) diff --git a/spec/database_cleaner/active_record/base_spec.rb b/spec/database_cleaner/active_record/base_spec.rb index 652ca9cd..73efdee8 100644 --- a/spec/database_cleaner/active_record/base_spec.rb +++ b/spec/database_cleaner/active_record/base_spec.rb @@ -166,7 +166,8 @@ module ActiveRecord it "establishes a connection with it" do expect(::ActiveRecord::Base).to receive(:establish_connection).with(hash) - expect(strategy.connection_class).to eq ::ActiveRecord::Base + expect(strategy.connection_class).to be < ::ActiveRecord::Base + expect(strategy.connection_class.name).to match /^DatabaseCleaner::ActiveRecord::Temp\d+$/ end end