Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/database/consistency_fix_service_spec.rb')
-rw-r--r--spec/services/database/consistency_fix_service_spec.rb153
1 files changed, 153 insertions, 0 deletions
diff --git a/spec/services/database/consistency_fix_service_spec.rb b/spec/services/database/consistency_fix_service_spec.rb
new file mode 100644
index 00000000000..9a0fac2191c
--- /dev/null
+++ b/spec/services/database/consistency_fix_service_spec.rb
@@ -0,0 +1,153 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Database::ConsistencyFixService do
+ describe '#execute' do
+ context 'fixing namespaces inconsistencies' do
+ subject(:consistency_fix_service) do
+ described_class.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ sync_event_class: Namespaces::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :namespace_id
+ )
+ end
+
+ let(:table) { 'public.namespaces' }
+ let!(:namespace) { create(:namespace) }
+ let!(:namespace_mirror) { Ci::NamespaceMirror.find_by(namespace_id: namespace.id) }
+
+ context 'when both objects exist' do
+ it 'creates a Namespaces::SyncEvent to modify the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [namespace.id])
+ end.to change {
+ Namespaces::SyncEvent.where(namespace_id: namespace.id).count
+ }.by(1)
+ end
+
+ it 'enqueues the worker to process the Namespaces::SyncEvents' do
+ expect(::Namespaces::ProcessSyncEventsWorker).to receive(:perform_async)
+ consistency_fix_service.execute(ids: [namespace.id])
+ end
+ end
+
+ context 'when the source object has been deleted, but not the target' do
+ before do
+ namespace.delete
+ end
+
+ it 'deletes the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [namespace.id])
+ end.to change { Ci::NamespaceMirror.where(namespace_id: namespace.id).count }.by(-1)
+ end
+ end
+ end
+
+ context 'fixing projects inconsistencies' do
+ subject(:consistency_fix_service) do
+ described_class.new(
+ source_model: Project,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ )
+ end
+
+ let(:table) { 'public.projects' }
+ let!(:project) { create(:project) }
+ let!(:project_mirror) { Ci::ProjectMirror.find_by(project_id: project.id) }
+
+ context 'when both objects exist' do
+ it 'creates a Projects::SyncEvent to modify the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [project.id])
+ end.to change {
+ Projects::SyncEvent.where(project_id: project.id).count
+ }.by(1)
+ end
+
+ it 'enqueues the worker to process the Projects::SyncEvents' do
+ expect(::Projects::ProcessSyncEventsWorker).to receive(:perform_async)
+ consistency_fix_service.execute(ids: [project.id])
+ end
+ end
+
+ context 'when the source object has been deleted, but not the target' do
+ before do
+ project.delete
+ end
+
+ it 'deletes the target object' do
+ expect do
+ consistency_fix_service.execute(ids: [project.id])
+ end.to change { Ci::ProjectMirror.where(project_id: project.id).count }.by(-1)
+ end
+ end
+ end
+ end
+
+ describe '#create_sync_event_for' do
+ context 'when the source model is Namespace' do
+ let(:namespace) { create(:namespace) }
+
+ let(:service) do
+ described_class.new(
+ source_model: Namespace,
+ target_model: Ci::NamespaceMirror,
+ sync_event_class: Namespaces::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :namespace_id
+ )
+ end
+
+ it 'creates a Namespaces::SyncEvent object' do
+ expect do
+ service.send(:create_sync_event_for, namespace.id)
+ end.to change { Namespaces::SyncEvent.where(namespace_id: namespace.id).count }.by(1)
+ end
+ end
+
+ context 'when the source model is Project' do
+ let(:project) { create(:project) }
+
+ let(:service) do
+ described_class.new(
+ source_model: Project,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ )
+ end
+
+ it 'creates a Projects::SyncEvent object' do
+ expect do
+ service.send(:create_sync_event_for, project.id)
+ end.to change { Projects::SyncEvent.where(project_id: project.id).count }.by(1)
+ end
+ end
+ end
+
+ context 'when the source model is User' do
+ let(:service) do
+ described_class.new(
+ source_model: User,
+ target_model: Ci::ProjectMirror,
+ sync_event_class: Projects::SyncEvent,
+ source_sort_key: :id,
+ target_sort_key: :project_id
+ )
+ end
+
+ it 'raises an error' do
+ expect do
+ service.send(:create_sync_event_for, 1)
+ end.to raise_error("Unknown Source Model User")
+ end
+ end
+end