gitlab/ee/spec/support/shared_examples/models/concerns/repository_replicator_strategy_shared_examples.rb
Douglas Barbosa Alexandre f3a0725f2a Fix no repo error message for group-level wikis
The replicator.class.git_access_class.error_message(:no_repo) returns
the wrong error message for group wiki repositories. The helper method
handle the error message for each datatype.

Changelog: fixed
EE: true
2021-11-10 19:35:46 +00:00

151 lines
4.1 KiB
Ruby

# frozen_string_literal: true
# Include these shared examples in specs of Replicators that include
# BlobReplicatorStrategy.
#
# Required let variables:
#
# - model_record: A valid, unpersisted instance of the model class. Or a valid,
# persisted instance of the model class in a not-yet loaded let
# variable (so we can trigger creation).
#
RSpec.shared_examples 'a repository replicator' do
include EE::GeoHelpers
let_it_be(:primary) { create(:geo_node, :primary) }
let_it_be(:secondary) { create(:geo_node) }
subject(:replicator) { model_record.replicator }
before do
stub_current_geo_node(primary)
end
it_behaves_like 'a replicator'
# This could be included in each model's spec, but including it here is DRYer.
include_examples 'a replicable model' do
let(:replicator_class) { described_class }
end
describe '#handle_after_update' do
it 'creates a Geo::Event' do
expect do
replicator.handle_after_update
end.to change { ::Geo::Event.count }.by(1)
expect(::Geo::Event.last.attributes).to include(
"replicable_name" => replicator.replicable_name, "event_name" => "updated", "payload" => { "model_record_id" => replicator.model_record.id })
end
context 'when replication feature flag is disabled' do
before do
stub_feature_flags(replicator.replication_enabled_feature_key => false)
end
it 'does not publish' do
expect(replicator).not_to receive(:publish)
replicator.handle_after_update
end
end
end
describe '#handle_after_destroy' do
it 'creates a Geo::Event' do
expect do
replicator.handle_after_destroy
end.to change { ::Geo::Event.count }.by(1)
expect(::Geo::Event.last.attributes).to include(
"replicable_name" => replicator.replicable_name, "event_name" => "deleted")
expect(::Geo::Event.last.payload).to include({ "model_record_id" => replicator.model_record.id })
end
context 'when replication feature flag is disabled' do
before do
stub_feature_flags("geo_#{replicator.replicable_name}_replication": false)
end
it 'does not publish' do
expect(replicator).not_to receive(:publish)
replicator.handle_after_destroy
end
end
end
describe 'updated event consumption' do
before do
model_record.save!
end
context 'in replicables_for_current_secondary list' do
it 'runs Geo::FrameworkRepositorySyncService service' do
allow(replicator).to receive(:in_replicables_for_current_secondary?).and_return(true)
sync_service = double
expect(sync_service).to receive(:execute)
expect(::Geo::FrameworkRepositorySyncService)
.to receive(:new).with(replicator)
.and_return(sync_service)
replicator.consume(:updated)
end
end
context 'not in replicables_for_current_secondary list' do
it 'does not run Geo::FrameworkRepositorySyncService service' do
allow(replicator).to receive(:in_replicables_for_current_secondary?).and_return(false)
expect(::Geo::FrameworkRepositorySyncService)
.not_to receive(:new)
replicator.consume(:updated)
end
end
end
describe 'deleted event consumption' do
it 'runs Geo::RepositoryRegistryRemovalService service' do
model_record.save!
sync_service = double
expect(sync_service).to receive(:execute)
expect(Geo::RepositoryRegistryRemovalService)
.to receive(:new).with(replicator, {})
.and_return(sync_service)
replicator.consume(:deleted)
end
end
describe '.git_access_class' do
it 'is implemented' do
expect(replicator.class.git_access_class).to be < Gitlab::GitAccess
end
end
describe '.no_repo_message' do
it 'is implemented' do
expect(replicator.class.no_repo_message).to be_a(String)
end
end
describe '#model' do
let(:invoke_model) { replicator.class.model }
it 'is implemented' do
expect do
invoke_model
end.not_to raise_error
end
it 'is a Class' do
expect(invoke_model).to be_a(Class)
end
end
end