DEV: remove fragile spec
The failover spec is very fragile and tests specific implementation vs actual behavior We rely on a different script during the build process to test failover operates correctly
This commit is contained in:
parent
fa572d3a7a
commit
f8c18ac888
|
@ -1,171 +0,0 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe ActiveRecord::ConnectionHandling do
|
||||
let(:replica_host) { "1.1.1.1" }
|
||||
let(:replica_port) { 6432 }
|
||||
|
||||
let(:config) do
|
||||
ActiveRecord::Base.connection_config.merge(
|
||||
adapter: "postgresql_fallback",
|
||||
replica_host: replica_host,
|
||||
replica_port: replica_port
|
||||
)
|
||||
end
|
||||
|
||||
let(:multisite_db) { "database_2" }
|
||||
|
||||
let(:multisite_config) do
|
||||
{
|
||||
host: 'localhost1',
|
||||
port: 5432,
|
||||
replica_host: replica_host,
|
||||
replica_port: replica_port
|
||||
}
|
||||
end
|
||||
|
||||
let(:postgresql_fallback_handler) { PostgreSQLFallbackHandler.instance }
|
||||
|
||||
before do
|
||||
@threads = Thread.list
|
||||
postgresql_fallback_handler.initialized = true
|
||||
end
|
||||
|
||||
after do
|
||||
Sidekiq.unpause!
|
||||
(Thread.list - @threads).each(&:kill)
|
||||
postgresql_fallback_handler.setup!
|
||||
|
||||
ActiveRecord::Base.unstub(:postgresql_connection)
|
||||
ActiveRecord::Base.clear_all_connections!
|
||||
ActiveRecord::Base.establish_connection
|
||||
|
||||
Discourse.redis.flushall
|
||||
end
|
||||
|
||||
describe "#postgresql_fallback_connection" do
|
||||
it 'should return a PostgreSQL adapter' do
|
||||
connection = ActiveRecord::Base.postgresql_fallback_connection(config)
|
||||
|
||||
expect(connection)
|
||||
.to be_an_instance_of(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
||||
end
|
||||
|
||||
context 'when master server is down' do
|
||||
let(:replica_connection) { mock('replica_connection') }
|
||||
|
||||
it 'should failover to a replica server' do
|
||||
RailsMultisite::ConnectionManagement
|
||||
.stubs(:all_dbs)
|
||||
.returns(['default', multisite_db])
|
||||
|
||||
postgresql_fallback_handler.expects(:verify_master).at_least(3)
|
||||
|
||||
[config, multisite_config].each do |configuration|
|
||||
ActiveRecord::Base.expects(:postgresql_connection)
|
||||
.with(configuration)
|
||||
.raises(PG::ConnectionBad)
|
||||
|
||||
ActiveRecord::Base.expects(:verify_replica).with(replica_connection)
|
||||
|
||||
ActiveRecord::Base.expects(:postgresql_connection).with(
|
||||
configuration.dup.merge(host: replica_host, port: replica_port)
|
||||
).returns(replica_connection)
|
||||
end
|
||||
|
||||
expect(postgresql_fallback_handler.master_down?).to eq(nil)
|
||||
|
||||
message = MessageBus.track_publish(PostgreSQLFallbackHandler::DATABASE_DOWN_CHANNEL) do
|
||||
expect { ActiveRecord::Base.postgresql_fallback_connection(config) }
|
||||
.to raise_error(PG::ConnectionBad)
|
||||
end.first
|
||||
|
||||
expect(message.data[:db]).to eq('default')
|
||||
expect(message.data[:pid]).to eq(Process.pid)
|
||||
|
||||
expect { ActiveRecord::Base.postgresql_fallback_connection(config) }
|
||||
.to change { Discourse.readonly_mode? }.from(false).to(true)
|
||||
|
||||
expect(postgresql_fallback_handler.master_down?).to eq(true)
|
||||
expect(Sidekiq.paused?).to eq(true)
|
||||
|
||||
with_multisite_db(multisite_db) do
|
||||
begin
|
||||
expect(postgresql_fallback_handler.master_down?).to eq(nil)
|
||||
|
||||
message = MessageBus.track_publish(PostgreSQLFallbackHandler::DATABASE_DOWN_CHANNEL) do
|
||||
expect { ActiveRecord::Base.postgresql_fallback_connection(multisite_config) }
|
||||
.to raise_error(PG::ConnectionBad)
|
||||
end.first
|
||||
|
||||
expect(message.data[:db]).to eq(multisite_db)
|
||||
|
||||
expect do
|
||||
ActiveRecord::Base.postgresql_fallback_connection(multisite_config)
|
||||
end.to change { Discourse.readonly_mode? }.from(false).to(true)
|
||||
|
||||
expect(postgresql_fallback_handler.master_down?).to eq(true)
|
||||
ensure
|
||||
postgresql_fallback_handler.master_up(multisite_db)
|
||||
expect(postgresql_fallback_handler.master_down?).to eq(nil)
|
||||
end
|
||||
end
|
||||
|
||||
ActiveRecord::Base.unstub(:postgresql_connection)
|
||||
|
||||
postgresql_fallback_handler.initiate_fallback_to_master
|
||||
|
||||
expect(Discourse.readonly_mode?).to eq(false)
|
||||
expect(Sidekiq.paused?).to eq(false)
|
||||
expect(ActiveRecord::Base.connection_pool.connections.count).to eq(0)
|
||||
expect(postgresql_fallback_handler.master_down?).to eq(nil)
|
||||
|
||||
expect(ActiveRecord::Base.connection)
|
||||
.to be_an_instance_of(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when both master and replica server is down' do
|
||||
it 'should raise the right error' do
|
||||
ActiveRecord::Base.expects(:postgresql_connection)
|
||||
.with(config)
|
||||
.raises(PG::ConnectionBad)
|
||||
.once
|
||||
|
||||
ActiveRecord::Base.expects(:postgresql_connection)
|
||||
.with(
|
||||
config.dup.merge(host: replica_host, port: replica_port)
|
||||
)
|
||||
.raises(PG::ConnectionBad)
|
||||
.once
|
||||
|
||||
postgresql_fallback_handler.expects(:verify_master).twice
|
||||
|
||||
2.times do
|
||||
expect { ActiveRecord::Base.postgresql_fallback_connection(config) }
|
||||
.to raise_error(PG::ConnectionBad)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '.verify_replica' do
|
||||
describe 'when database is not in recovery' do
|
||||
it 'should raise the right error' do
|
||||
expect do
|
||||
ActiveRecord::Base.send(:verify_replica, ActiveRecord::Base.connection)
|
||||
end.to raise_error(RuntimeError, "Replica database server is not in recovery mode.")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def with_multisite_db(dbname)
|
||||
begin
|
||||
RailsMultisite::ConnectionManagement.expects(:current_db).returns(dbname).at_least_once
|
||||
yield
|
||||
ensure
|
||||
RailsMultisite::ConnectionManagement.unstub(:current_db)
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue