1# frozen_string_literal: true 2 3require 'spec_helper' 4 5RSpec.describe ObjectStorage::BackgroundMoveWorker do 6 let(:local) { ObjectStorage::Store::LOCAL } 7 let(:remote) { ObjectStorage::Store::REMOTE } 8 9 def perform 10 described_class.perform_async(uploader_class.name, subject_class, file_field, subject_id) 11 end 12 13 context 'for LFS' do 14 let!(:lfs_object) { create(:lfs_object, :with_file, file_store: local) } 15 let(:uploader_class) { LfsObjectUploader } 16 let(:subject_class) { LfsObject } 17 let(:file_field) { :file } 18 let(:subject_id) { lfs_object.id } 19 20 context 'when object storage is enabled' do 21 before do 22 stub_lfs_object_storage(background_upload: true) 23 end 24 25 it 'uploads object to storage', :sidekiq_might_not_need_inline do 26 expect { perform }.to change { lfs_object.reload.file_store }.from(local).to(remote) 27 end 28 29 context 'when background upload is disabled' do 30 before do 31 allow(Gitlab.config.lfs.object_store).to receive(:background_upload) { false } 32 end 33 34 it 'is skipped' do 35 expect { perform }.not_to change { lfs_object.reload.file_store } 36 end 37 end 38 end 39 40 context 'when object storage is disabled' do 41 before do 42 stub_lfs_object_storage(enabled: false) 43 end 44 45 it "doesn't migrate files" do 46 perform 47 48 expect(lfs_object.reload.file_store).to eq(local) 49 end 50 end 51 end 52 53 context 'for job artifacts' do 54 let(:artifact) { create(:ci_job_artifact, :archive) } 55 let(:uploader_class) { JobArtifactUploader } 56 let(:subject_class) { Ci::JobArtifact } 57 let(:file_field) { :file } 58 let(:subject_id) { artifact.id } 59 60 context 'when local storage is used' do 61 let(:store) { local } 62 63 context 'and remote storage is defined' do 64 before do 65 stub_artifacts_object_storage(background_upload: true) 66 end 67 68 it "migrates file to remote storage", :sidekiq_might_not_need_inline do 69 perform 70 71 expect(artifact.reload.file_store).to eq(remote) 72 end 73 end 74 end 75 end 76 77 context 'for uploads' do 78 let!(:project) { create(:project, :with_avatar) } 79 let(:uploader_class) { AvatarUploader } 80 let(:file_field) { :avatar } 81 82 context 'when local storage is used' do 83 let(:store) { local } 84 85 context 'and remote storage is defined' do 86 before do 87 stub_uploads_object_storage(uploader_class, background_upload: true) 88 end 89 90 describe 'supports using the model' do 91 let(:subject_class) { project.class } 92 let(:subject_id) { project.id } 93 94 it "migrates file to remote storage", :sidekiq_might_not_need_inline do 95 perform 96 project.reload 97 BatchLoader::Executor.clear_current 98 99 expect(project.avatar).not_to be_file_storage 100 end 101 end 102 103 describe 'supports using the Upload' do 104 let(:subject_class) { Upload } 105 let(:subject_id) { project.avatar.upload.id } 106 107 it "migrates file to remote storage", :sidekiq_might_not_need_inline do 108 perform 109 110 expect(project.reload.avatar).not_to be_file_storage 111 end 112 end 113 end 114 end 115 end 116end 117