diff options
Diffstat (limited to 'spec/services/projects/after_rename_service_spec.rb')
-rw-r--r-- | spec/services/projects/after_rename_service_spec.rb | 207 |
1 files changed, 56 insertions, 151 deletions
diff --git a/spec/services/projects/after_rename_service_spec.rb b/spec/services/projects/after_rename_service_spec.rb index 411ff5662d4..4b2569f6b2d 100644 --- a/spec/services/projects/after_rename_service_spec.rb +++ b/spec/services/projects/after_rename_service_spec.rb @@ -21,183 +21,88 @@ RSpec.describe Projects::AfterRenameService, feature_category: :groups_and_proje end describe '#execute' do - context 'using legacy storage' do - let(:project) { create(:project, :repository, :wiki_repo, :legacy_storage) } - let(:project_storage) { project.send(:storage) } - let(:gitlab_shell) { Gitlab::Shell.new } - - before do - # Project#gitlab_shell returns a new instance of Gitlab::Shell on every - # call. This makes testing a bit easier. - allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) - - stub_application_setting(hashed_storage_enabled: false) - end - - it 'renames a repository' do - stub_container_registry_config(enabled: false) - - expect_any_instance_of(SystemHooksService) - .to receive(:execute_hooks_for) - .with(project, :rename) - - expect_any_instance_of(Gitlab::UploadsTransfer) - .to receive(:rename_project) - .with(path_before_rename, path_after_rename, project.namespace.full_path) - - expect(repo_before_rename).to exist - expect(wiki_repo_before_rename).to exist - - service_execute - - expect(repo_before_rename).not_to exist - expect(wiki_repo_before_rename).not_to exist - expect(repo_after_rename).to exist - expect(wiki_repo_after_rename).to exist - end - - context 'container registry with images' do - let(:container_repository) { create(:container_repository) } - - before do - stub_container_registry_config(enabled: true) - stub_container_registry_tags(repository: :any, tags: ['tag']) - project.container_repositories << container_repository - end - - it 'raises a RenameFailedError' do - expect { service_execute }.to raise_error(described_class::RenameFailedError) - end - end - - context 'attachments' do - before do - expect(project_storage).to receive(:rename_repo) { true } - end - - it 'moves uploads folder to new location' do - expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project) - - service_execute - end - end - - it 'updates project full path in gitaly' do - service_execute - - expect(project.repository.full_path).to eq(project.full_path) - end - - it 'updates storage location' do - allow(project_storage).to receive(:rename_repo).and_return(true) - - service_execute + let(:project) { create(:project, :repository, skip_disk_validation: true) } + let(:gitlab_shell) { Gitlab::Shell.new } + let(:hash) { Digest::SHA2.hexdigest(project.id.to_s) } + let(:hashed_prefix) { File.join('@hashed', hash[0..1], hash[2..3]) } + let(:hashed_path) { File.join(hashed_prefix, hash) } + + before do + # Project#gitlab_shell returns a new instance of Gitlab::Shell on every + # call. This makes testing a bit easier. + allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) + + stub_application_setting(hashed_storage_enabled: true) + end - expect(project.project_repository).to have_attributes( - disk_path: project.disk_path, - shard_name: project.repository_storage - ) - end + it 'renames a repository' do + stub_container_registry_config(enabled: false) - context 'with hashed storage upgrade when renaming enabled' do - it 'calls HashedStorage::MigrationService with correct options' do - stub_application_setting(hashed_storage_enabled: true) + expect_any_instance_of(SystemHooksService) + .to receive(:execute_hooks_for) + .with(project, :rename) - expect_next_instance_of(::Projects::HashedStorage::MigrationService) do |service| - expect(service).to receive(:execute).and_return(true) - end + expect(project).to receive(:expire_caches_before_rename) - service_execute - end - end + service_execute end - context 'using hashed storage' do - let(:project) { create(:project, :repository, skip_disk_validation: true) } - let(:gitlab_shell) { Gitlab::Shell.new } - let(:hash) { Digest::SHA2.hexdigest(project.id.to_s) } - let(:hashed_prefix) { File.join('@hashed', hash[0..1], hash[2..3]) } - let(:hashed_path) { File.join(hashed_prefix, hash) } + context 'container registry with images' do + let(:container_repository) { create(:container_repository) } before do - # Project#gitlab_shell returns a new instance of Gitlab::Shell on every - # call. This makes testing a bit easier. - allow(project).to receive(:gitlab_shell).and_return(gitlab_shell) - - stub_application_setting(hashed_storage_enabled: true) + stub_container_registry_config(enabled: true) + stub_container_registry_tags(repository: :any, tags: ['tag']) + project.container_repositories << container_repository end - it 'renames a repository' do - stub_container_registry_config(enabled: false) - - expect(gitlab_shell).not_to receive(:mv_repository) - - expect_any_instance_of(SystemHooksService) - .to receive(:execute_hooks_for) - .with(project, :rename) - - expect(project).to receive(:expire_caches_before_rename) - - service_execute + it 'raises a RenameFailedError' do + expect { service_execute } + .to raise_error(described_class::RenameFailedError) end + end - context 'container registry with images' do - let(:container_repository) { create(:container_repository) } + context 'attachments' do + let(:uploader) { create(:upload, :issuable_upload, :with_file, model: project) } + let(:file_uploader) { build(:file_uploader, project: project) } + let(:legacy_storage_path) { File.join(file_uploader.root, legacy_storage.disk_path) } + let(:hashed_storage_path) { File.join(file_uploader.root, hashed_storage.disk_path) } - before do - stub_container_registry_config(enabled: true) - stub_container_registry_tags(repository: :any, tags: ['tag']) - project.container_repositories << container_repository - end + it 'keeps uploads folder location unchanged' do + expect_any_instance_of(Gitlab::UploadsTransfer).not_to receive(:rename_project) - it 'raises a RenameFailedError' do - expect { service_execute } - .to raise_error(described_class::RenameFailedError) - end + service_execute end - context 'attachments' do - let(:uploader) { create(:upload, :issuable_upload, :with_file, model: project) } - let(:file_uploader) { build(:file_uploader, project: project) } - let(:legacy_storage_path) { File.join(file_uploader.root, legacy_storage.disk_path) } - let(:hashed_storage_path) { File.join(file_uploader.root, hashed_storage.disk_path) } + context 'when not rolled out' do + let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) } - it 'keeps uploads folder location unchanged' do - expect_any_instance_of(Gitlab::UploadsTransfer).not_to receive(:rename_project) + it 'moves attachments folder to hashed storage' do + expect(File.directory?(legacy_storage_path)).to be_truthy + expect(File.directory?(hashed_storage_path)).to be_falsey service_execute - end - - context 'when not rolled out' do - let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) } - - it 'moves attachments folder to hashed storage' do - expect(File.directory?(legacy_storage_path)).to be_truthy - expect(File.directory?(hashed_storage_path)).to be_falsey + expect(project.reload.hashed_storage?(:attachments)).to be_truthy - service_execute - expect(project.reload.hashed_storage?(:attachments)).to be_truthy - - expect(File.directory?(legacy_storage_path)).to be_falsey - expect(File.directory?(hashed_storage_path)).to be_truthy - end + expect(File.directory?(legacy_storage_path)).to be_falsey + expect(File.directory?(hashed_storage_path)).to be_truthy end end + end - it 'updates project full path in gitaly' do - service_execute + it 'updates project full path in gitaly' do + service_execute - expect(project.repository.full_path).to eq(project.full_path) - end + expect(project.repository.full_path).to eq(project.full_path) + end - it 'updates storage location' do - service_execute + it 'updates storage location' do + service_execute - expect(project.project_repository).to have_attributes( - disk_path: project.disk_path, - shard_name: project.repository_storage - ) - end + expect(project.project_repository).to have_attributes( + disk_path: project.disk_path, + shard_name: project.repository_storage + ) end context 'EventStore' do |