Commit 3f6f40b3 authored by Mayra Cabrera's avatar Mayra Cabrera

Merge branch '25830-fix-label-creation-bug-for-bitbucket-import' into 'master'

Fix label creation within Bitbucket import if labels already exist

Closes #58623

See merge request gitlab-org/gitlab-ce!27987
parents a2128edf b145d9b8
---
title: Use FindOrCreateService to create labels and check for existing ones
merge_request: 27987
author: Matt Duren
type: fixed
...@@ -135,7 +135,7 @@ module Gitlab ...@@ -135,7 +135,7 @@ module Gitlab
def create_labels def create_labels
LABELS.each do |label_params| LABELS.each do |label_params|
label = ::Labels::CreateService.new(label_params).execute(project: project) label = ::Labels::FindOrCreateService.new(nil, project, label_params).execute(skip_authorization: true)
if label.valid? if label.valid?
@labels[label_params[:title]] = label @labels[label_params[:title]] = label
else else
......
...@@ -222,6 +222,46 @@ describe Gitlab::BitbucketImport::Importer do ...@@ -222,6 +222,46 @@ describe Gitlab::BitbucketImport::Importer do
body: {}.to_json) body: {}.to_json)
end end
context 'creating labels on project' do
before do
allow(importer).to receive(:import_wiki)
end
it 'creates labels as expected' do
expect { importer.execute }.to change { Label.count }.from(0).to(Gitlab::BitbucketImport::Importer::LABELS.size)
end
it 'does not fail if label is already existing' do
label = Gitlab::BitbucketImport::Importer::LABELS.first
::Labels::CreateService.new(label).execute(project: project)
expect { importer.execute }.not_to raise_error
end
it 'does not create new labels' do
Gitlab::BitbucketImport::Importer::LABELS.each do |label|
create(:label, project: project, title: label[:title])
end
expect { importer.execute }.not_to change { Label.count }
end
it 'does not update existing ones' do
label_title = Gitlab::BitbucketImport::Importer::LABELS.first[:title]
existing_label = create(:label, project: project, title: label_title)
# Reload label from database so we avoid timestamp comparison issues related to time precision when comparing
# attributes later.
existing_label.reload
Timecop.freeze(Time.now + 1.minute) do
importer.execute
label_after_import = project.labels.find(existing_label.id)
expect(label_after_import.attributes).to eq(existing_label.attributes)
end
end
end
it 'maps statuses to open or closed' do it 'maps statuses to open or closed' do
allow(importer).to receive(:import_wiki) allow(importer).to receive(:import_wiki)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment