summaryrefslogtreecommitdiff
path: root/spec/services/projects/update_service_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/projects/update_service_spec.rb')
-rw-r--r--spec/services/projects/update_service_spec.rb78
1 files changed, 58 insertions, 20 deletions
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index ce9765a36ba..8a17884f641 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -254,7 +254,7 @@ describe Projects::UpdateService do
it 'logs an error and creates a metric when wiki can not be created' do
project.project_feature.update(wiki_access_level: ProjectFeature::DISABLED)
- expect_any_instance_of(ProjectWiki).to receive(:wiki).and_raise(ProjectWiki::CouldNotCreateWikiError)
+ expect_any_instance_of(ProjectWiki).to receive(:wiki).and_raise(Wiki::CouldNotCreateWikiError)
expect_any_instance_of(described_class).to receive(:log_error).with("Could not create wiki for #{project.full_name}")
counter = double(:counter)
@@ -552,6 +552,63 @@ describe Projects::UpdateService do
end
end
end
+
+ describe 'when changing repository_storage' do
+ let(:repository_read_only) { false }
+ let(:project) { create(:project, :repository, repository_read_only: repository_read_only) }
+ let(:opts) { { repository_storage: 'test_second_storage' } }
+
+ before do
+ stub_storage_settings('test_second_storage' => { 'path' => 'tmp/tests/extra_storage' })
+ end
+
+ shared_examples 'the transfer was not scheduled' do
+ it 'does not schedule the transfer' do
+ expect do
+ update_project(project, user, opts)
+ end.not_to change(project.repository_storage_moves, :count)
+ end
+ end
+
+ context 'authenticated as admin' do
+ let(:user) { create(:admin) }
+
+ it 'schedules the transfer of the repository to the new storage and locks the project' do
+ update_project(project, admin, opts)
+
+ expect(project).to be_repository_read_only
+ expect(project.repository_storage_moves.last).to have_attributes(
+ state: ::ProjectRepositoryStorageMove.state_machines[:state].states[:scheduled].value,
+ source_storage_name: 'default',
+ destination_storage_name: 'test_second_storage'
+ )
+ end
+
+ context 'the repository is read-only' do
+ let(:repository_read_only) { true }
+
+ it_behaves_like 'the transfer was not scheduled'
+ end
+
+ context 'the storage has not changed' do
+ let(:opts) { { repository_storage: 'default' } }
+
+ it_behaves_like 'the transfer was not scheduled'
+ end
+
+ context 'the storage does not exist' do
+ let(:opts) { { repository_storage: 'nonexistent' } }
+
+ it_behaves_like 'the transfer was not scheduled'
+ end
+ end
+
+ context 'authenticated as user' do
+ let(:user) { create(:user) }
+
+ it_behaves_like 'the transfer was not scheduled'
+ end
+ end
end
describe '#run_auto_devops_pipeline?' do
@@ -611,25 +668,6 @@ describe Projects::UpdateService do
end
end
- describe 'repository_storage' do
- let(:admin) { create(:admin) }
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
- let(:opts) { { repository_storage: 'test_second_storage' } }
-
- it 'calls the change repository storage method if the storage changed' do
- expect(project).to receive(:change_repository_storage).with('test_second_storage')
-
- update_project(project, admin, opts).inspect
- end
-
- it "doesn't call the change repository storage for non-admin users" do
- expect(project).not_to receive(:change_repository_storage)
-
- update_project(project, user, opts).inspect
- end
- end
-
def update_project(project, user, opts)
described_class.new(project, user, opts).execute
end