From d4ebba275e413059c873a1218da73471bcf5e115 Mon Sep 17 00:00:00 2001 From: Santiago Bartesaghi Date: Wed, 13 May 2020 00:40:27 -0300 Subject: [PATCH] Fix #39205 ReadOnlyError when on writing connection --- .../lib/active_record/test_fixtures.rb | 2 +- activerecord/test/cases/fixtures_test.rb | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/test_fixtures.rb b/activerecord/lib/active_record/test_fixtures.rb index 9b21dfaf65..950b0fbd79 100644 --- a/activerecord/lib/active_record/test_fixtures.rb +++ b/activerecord/lib/active_record/test_fixtures.rb @@ -190,7 +190,7 @@ def enlist_fixture_connections # need to share a connection pool so that the reading connection # can see data in the open transaction on the writing connection. def setup_shared_connection_pool - writing_handler = ActiveRecord::Base.connection_handler + writing_handler = ActiveRecord::Base.connection_handlers[ActiveRecord::Base.writing_role] ActiveRecord::Base.connection_handlers.values.each do |handler| if handler != writing_handler diff --git a/activerecord/test/cases/fixtures_test.rb b/activerecord/test/cases/fixtures_test.rb index 106389b154..13f42c1166 100644 --- a/activerecord/test/cases/fixtures_test.rb +++ b/activerecord/test/cases/fixtures_test.rb @@ -1418,3 +1418,52 @@ def with_temporary_connection_pool end end end + +class UsesWritingConnectionForFixtures < ActiveRecord::TestCase + include ActiveRecord::TestFixtures + self.use_transactional_tests = true + + fixtures :dogs + + def setup + @old_handler = ActiveRecord::Base.connection_handler + @old_handlers = ActiveRecord::Base.connection_handlers + @prev_configs, ActiveRecord::Base.configurations = ActiveRecord::Base.configurations, config + db_config = ActiveRecord::DatabaseConfigurations::HashConfig.new(ENV["RAILS_ENV"], "readonly", readonly_config) + + handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new + handler.establish_connection(db_config) + ActiveRecord::Base.connection_handlers = {} + ActiveRecord::Base.connection_handler = handler + ActiveRecord::Base.connects_to(database: { writing: :default, reading: :readonly }) + end + + def teardown + ActiveRecord::Base.configurations = @prev_configs + ActiveRecord::Base.connection_handler = @old_handler + ActiveRecord::Base.connection_handlers = @old_handlers + end + + def test_uses_writing_connection_for_fixtures + ActiveRecord::Base.connected_to(role: :reading) do + Dog.first + + assert_nothing_raised do + ActiveRecord::Base.connected_to(role: :writing) { Dog.create! alias: "Doggo" } + end + end + end + + private + def config + { "default" => default_config, "readonly" => readonly_config } + end + + def default_config + { "adapter" => "sqlite3", "database" => "test/fixtures/fixture_database.sqlite3" } + end + + def readonly_config + default_config.merge("replica" => true) + end +end -- GitLab