99 lines
3.3 KiB
Ruby
99 lines
3.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Gitlab::Checks::MatchingMergeRequest do
|
|
describe '#match?' do
|
|
let_it_be(:newrev) { '012345678' }
|
|
let_it_be(:target_branch) { 'feature' }
|
|
let_it_be(:project) { create(:project, :repository) }
|
|
let_it_be(:locked_merge_request) do
|
|
create(:merge_request,
|
|
:locked,
|
|
source_project: project,
|
|
target_project: project,
|
|
target_branch: target_branch,
|
|
in_progress_merge_commit_sha: newrev)
|
|
end
|
|
|
|
subject { described_class.new(newrev, target_branch, project) }
|
|
|
|
let(:total_counter) { subject.send(:total_counter) }
|
|
let(:stale_counter) { subject.send(:stale_counter) }
|
|
|
|
it 'matches a merge request' do
|
|
expect(subject.match?).to be true
|
|
end
|
|
|
|
it 'does not match any merge request' do
|
|
matcher = described_class.new(newrev, 'test', project)
|
|
|
|
expect(matcher.match?).to be false
|
|
end
|
|
|
|
context 'with load balancing disabled', :request_store, :redis do
|
|
before do
|
|
expect(::Gitlab::Database::LoadBalancing).to receive(:enable?).at_least(:once).and_return(false)
|
|
expect(::Gitlab::Database::LoadBalancing::Sticking).not_to receive(:unstick_or_continue_sticking)
|
|
expect(::Gitlab::Database::LoadBalancing::Sticking).not_to receive(:select_valid_replicas)
|
|
end
|
|
|
|
it 'does not attempt to stick to primary' do
|
|
expect(subject.match?).to be true
|
|
end
|
|
|
|
it 'increments no counters' do
|
|
expect { subject.match? }
|
|
.to change { total_counter.get }.by(0)
|
|
.and change { stale_counter.get }.by(0)
|
|
end
|
|
end
|
|
|
|
context 'with load balancing enabled', :db_load_balancing do
|
|
let(:session) { ::Gitlab::Database::LoadBalancing::Session.current }
|
|
let(:all_caught_up) { true }
|
|
|
|
before do
|
|
allow(::Gitlab::Database::LoadBalancing::Sticking).to receive(:all_caught_up?).and_return(all_caught_up)
|
|
|
|
expect(::Gitlab::Database::LoadBalancing::Sticking).to receive(:select_valid_host).with(:project, project.id).and_call_original
|
|
allow(::Gitlab::Database::LoadBalancing::Sticking).to receive(:select_caught_up_replicas).with(:project, project.id).and_return(all_caught_up)
|
|
end
|
|
|
|
shared_examples 'secondary that has caught up to a primary' do
|
|
it 'continues to use the secondary' do
|
|
expect(session.use_primary?).to be false
|
|
expect(subject.match?).to be true
|
|
end
|
|
|
|
it 'only increments total counter' do
|
|
expect { subject.match? }
|
|
.to change { total_counter.get }.by(1)
|
|
.and change { stale_counter.get }.by(0)
|
|
end
|
|
end
|
|
|
|
shared_examples 'secondary that is lagging primary' do
|
|
it 'sticks to the primary' do
|
|
expect(subject.match?).to be true
|
|
expect(session.use_primary?).to be true
|
|
end
|
|
|
|
it 'increments both total and stale counters' do
|
|
expect { subject.match? }
|
|
.to change { total_counter.get }.by(1)
|
|
.and change { stale_counter.get }.by(1)
|
|
end
|
|
end
|
|
|
|
it_behaves_like 'secondary that has caught up to a primary'
|
|
|
|
context 'on secondary behind primary' do
|
|
let(:all_caught_up) { false }
|
|
|
|
it_behaves_like 'secondary that is lagging primary'
|
|
end
|
|
end
|
|
end
|
|
end
|