diff options
Diffstat (limited to 'spec/lib/gitlab/database/each_database_spec.rb')
-rw-r--r-- | spec/lib/gitlab/database/each_database_spec.rb | 100 |
1 files changed, 76 insertions, 24 deletions
diff --git a/spec/lib/gitlab/database/each_database_spec.rb b/spec/lib/gitlab/database/each_database_spec.rb index 9327fc4ff78..d526b3bc1ac 100644 --- a/spec/lib/gitlab/database/each_database_spec.rb +++ b/spec/lib/gitlab/database/each_database_spec.rb @@ -4,45 +4,97 @@ require 'spec_helper' RSpec.describe Gitlab::Database::EachDatabase do describe '.each_database_connection' do - let(:expected_connections) do - Gitlab::Database.database_base_models.map { |name, model| [model.connection, name] } + before do + allow(Gitlab::Database).to receive(:database_base_models) + .and_return({ main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access) end - it 'yields each connection after connecting SharedModel' do - expected_connections.each do |connection, _| - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(connection).and_yield - end + it 'yields each connection after connecting SharedModel', :add_ci_connection do + expect(Gitlab::Database::SharedModel).to receive(:using_connection) + .with(ActiveRecord::Base.connection).ordered.and_yield - yielded_connections = [] + expect(Gitlab::Database::SharedModel).to receive(:using_connection) + .with(Ci::ApplicationRecord.connection).ordered.and_yield - described_class.each_database_connection do |connection, name| - yielded_connections << [connection, name] - end - - expect(yielded_connections).to match_array(expected_connections) + expect { |b| described_class.each_database_connection(&b) } + .to yield_successive_args( + [ActiveRecord::Base.connection, 'main'], + [Ci::ApplicationRecord.connection, 'ci'] + ) end end describe '.each_model_connection' do - let(:model1) { double(connection: double, table_name: 'table1') } - let(:model2) { double(connection: double, table_name: 'table2') } + context 'when the model inherits from SharedModel', :add_ci_connection do + let(:model1) { Class.new(Gitlab::Database::SharedModel) } + let(:model2) { Class.new(Gitlab::Database::SharedModel) } - before do - allow(model1.connection).to receive_message_chain('pool.db_config.name').and_return('name1') - allow(model2.connection).to receive_message_chain('pool.db_config.name').and_return('name2') + before do + allow(Gitlab::Database).to receive(:database_base_models) + .and_return({ main: ActiveRecord::Base, ci: Ci::ApplicationRecord }.with_indifferent_access) + end + + it 'yields each model with SharedModel connected to each database connection' do + expect_yielded_models([model1, model2], [ + { model: model1, connection: ActiveRecord::Base.connection, name: 'main' }, + { model: model1, connection: Ci::ApplicationRecord.connection, name: 'ci' }, + { model: model2, connection: ActiveRecord::Base.connection, name: 'main' }, + { model: model2, connection: Ci::ApplicationRecord.connection, name: 'ci' } + ]) + end + + context 'when the model limits connection names' do + before do + model1.limit_connection_names = %i[main] + model2.limit_connection_names = %i[ci] + end + + it 'only yields the model with SharedModel connected to the limited connections' do + expect_yielded_models([model1, model2], [ + { model: model1, connection: ActiveRecord::Base.connection, name: 'main' }, + { model: model2, connection: Ci::ApplicationRecord.connection, name: 'ci' } + ]) + end + end + end + + context 'when the model does not inherit from SharedModel' do + let(:main_model) { Class.new(ActiveRecord::Base) } + let(:ci_model) { Class.new(Ci::ApplicationRecord) } + + let(:main_connection) { double(:connection) } + let(:ci_connection) { double(:connection) } + + before do + allow(main_model).to receive(:connection).and_return(main_connection) + allow(ci_model).to receive(:connection).and_return(ci_connection) + + allow(main_connection).to receive_message_chain('pool.db_config.name').and_return('main') + allow(ci_connection).to receive_message_chain('pool.db_config.name').and_return('ci') + end + + it 'yields each model after connecting SharedModel' do + expect_yielded_models([main_model, ci_model], [ + { model: main_model, connection: main_connection, name: 'main' }, + { model: ci_model, connection: ci_connection, name: 'ci' } + ]) + end end - it 'yields each model after connecting SharedModel' do - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(model1.connection).and_yield - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(model2.connection).and_yield + def expect_yielded_models(models_to_iterate, expected_values) + times_yielded = 0 + + described_class.each_model_connection(models_to_iterate) do |model, name| + expected = expected_values[times_yielded] - yielded_models = [] + expect(model).to be(expected[:model]) + expect(model.connection).to be(expected[:connection]) + expect(name).to eq(expected[:name]) - described_class.each_model_connection([model1, model2]) do |model, name| - yielded_models << [model, name] + times_yielded += 1 end - expect(yielded_models).to match_array([[model1, 'name1'], [model2, 'name2']]) + expect(times_yielded).to eq(expected_values.size) end end end |