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/geo/wiki_sync_service_spec.rb')
-rw-r--r--spec/services/geo/wiki_sync_service_spec.rb102
1 files changed, 102 insertions, 0 deletions
diff --git a/spec/services/geo/wiki_sync_service_spec.rb b/spec/services/geo/wiki_sync_service_spec.rb
new file mode 100644
index 00000000000..f01cbb2393d
--- /dev/null
+++ b/spec/services/geo/wiki_sync_service_spec.rb
@@ -0,0 +1,102 @@
+require 'spec_helper'
+
+RSpec.describe Geo::WikiSyncService, services: true do
+ let!(:primary) { create(:geo_node, :primary, host: 'primary-geo-node') }
+ let(:lease) { double(try_obtain: true) }
+
+ subject { described_class.new(project) }
+
+ before do
+ allow(Gitlab::ExclusiveLease).to receive(:new)
+ .with(subject.lease_key, anything)
+ .and_return(lease)
+
+ allow_any_instance_of(Repository).to receive(:fetch_geo_mirror)
+ .and_return(true)
+ end
+
+ describe '#execute' do
+ let(:project) { create(:project_empty_repo) }
+ let(:repository) { project.wiki.repository }
+ let(:url_to_repo) { "#{primary.clone_url_prefix}#{project.path_with_namespace}.wiki.git" }
+
+ it 'fetches wiki repository' do
+ expect(repository).to receive(:fetch_geo_mirror).with(url_to_repo).once
+
+ subject.execute
+ end
+
+ it 'releases lease' do
+ expect(Gitlab::ExclusiveLease).to receive(:cancel).once.with(
+ subject.__send__(:lease_key), anything).and_call_original
+
+ subject.execute
+ end
+
+ it 'does not fetch wiki repository if cannot obtain a lease' do
+ allow(lease).to receive(:try_obtain) { false }
+
+ expect(repository).not_to receive(:fetch_geo_mirror)
+
+ subject.execute
+ end
+
+ it 'rescues exception when Gitlab::Shell::Error is raised' do
+ allow(repository).to receive(:fetch_geo_mirror).with(url_to_repo) { raise Gitlab::Shell::Error }
+
+ expect { subject.execute }.not_to raise_error
+ end
+
+ it 'rescues exception when Gitlab::Git::Repository::NoRepository is raised' do
+ allow(repository).to receive(:fetch_geo_mirror).with(url_to_repo) { raise Gitlab::Git::Repository::NoRepository }
+
+ expect { subject.execute }.not_to raise_error
+ end
+
+ context 'tracking database' do
+ it 'creates a new registry if does not exists' do
+ expect { subject.execute }.to change(Geo::ProjectRegistry, :count).by(1)
+ end
+
+ it 'does not create a new registry if one exists' do
+ create(:geo_project_registry, project: project)
+
+ expect { subject.execute }.not_to change(Geo::ProjectRegistry, :count)
+ end
+
+ context 'when repository sync succeed' do
+ let(:registry) { Geo::ProjectRegistry.find_by(project_id: project.id) }
+
+ before do
+ subject.execute
+ end
+
+ it 'sets last_wiki_synced_at' do
+ expect(registry.last_wiki_synced_at).not_to be_nil
+ end
+
+ it 'sets last_wiki_successful_sync_at' do
+ expect(registry.last_wiki_successful_sync_at).not_to be_nil
+ end
+ end
+
+ context 'when wiki sync fail' do
+ let(:registry) { Geo::ProjectRegistry.find_by(project_id: project.id) }
+
+ before do
+ allow(repository).to receive(:fetch_geo_mirror).with(url_to_repo) { raise Gitlab::Shell::Error }
+
+ subject.execute
+ end
+
+ it 'sets last_wiki_synced_at' do
+ expect(registry.last_wiki_synced_at).not_to be_nil
+ end
+
+ it 'resets last_wiki_successful_sync_at' do
+ expect(registry.last_wiki_successful_sync_at).to be_nil
+ end
+ end
+ end
+ end
+end