diff --git a/app/models/project.rb b/app/models/project.rb index 05e14c578b5c33d65493350ea9387438bb6b0ea6..c7ca322853f388f4d507a07dfd6ba09871af9cff 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1789,7 +1789,7 @@ def remove_exports return unless export_file_exists? import_export_upload.remove_export_file! - import_export_upload.save + import_export_upload.save unless import_export_upload.destroyed? end def export_file_exists? diff --git a/changelogs/unreleased/sh-fix-project-deletion-with-export.yml b/changelogs/unreleased/sh-fix-project-deletion-with-export.yml new file mode 100644 index 0000000000000000000000000000000000000000..b9437f8ad6ad195467a8a0275ea7236cad56c19f --- /dev/null +++ b/changelogs/unreleased/sh-fix-project-deletion-with-export.yml @@ -0,0 +1,5 @@ +--- +title: Fix project deletion when there is a export available +merge_request: 22276 +author: +type: fixed diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb index beff499f2be226bfed46f9ca4e4549e9207a7437..1d31d26f418bb746bd7b7fba968027190acf3363 100644 --- a/spec/services/projects/destroy_service_spec.rb +++ b/spec/services/projects/destroy_service_spec.rb @@ -65,10 +65,12 @@ context 'Sidekiq inline' do before do - # Run sidekiq immediatly to check that renamed repository will be removed + # Run sidekiq immediately to check that renamed repository will be removed perform_enqueued_jobs { destroy_project(project, user, {}) } end + it_behaves_like 'deleting the project' + context 'when has remote mirrors' do let!(:project) do create(:project, :repository, namespace: user.namespace).tap do |project| @@ -82,13 +84,28 @@ end end - it_behaves_like 'deleting the project' - it 'invalidates personal_project_count cache' do expect(user).to receive(:invalidate_personal_projects_count) destroy_project(project, user) end + + context 'when project has exports' do + let!(:project_with_export) do + create(:project, :repository, namespace: user.namespace).tap do |project| + create(:import_export_upload, + project: project, + export_file: fixture_file_upload('spec/fixtures/project_export.tar.gz')) + end + end + let!(:async) { true } + + it 'destroys project and export' do + expect { destroy_project(project_with_export, user) }.to change(ImportExportUpload, :count).by(-1) + + expect(Project.all).not_to include(project_with_export) + end + end end context 'Sidekiq fake' do