Add service to create project labels
This commit is contained in:
parent
49ec98d1b2
commit
6c189dcc8e
2 changed files with 84 additions and 0 deletions
33
app/services/labels/create_service.rb
Normal file
33
app/services/labels/create_service.rb
Normal file
|
@ -0,0 +1,33 @@
|
|||
module Labels
|
||||
class CreateService
|
||||
def initialize(current_user, project, params = {})
|
||||
@current_user = current_user
|
||||
@group = project.group
|
||||
@project = project
|
||||
@params = params.dup
|
||||
end
|
||||
|
||||
def execute
|
||||
find_or_create_label
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :current_user, :group, :project, :params
|
||||
|
||||
def available_labels
|
||||
@available_labels ||= LabelsFinder.new(current_user, project_id: project.id).execute
|
||||
end
|
||||
|
||||
def find_or_create_label
|
||||
new_label = available_labels.find_by(title: title)
|
||||
new_label ||= project.labels.create(params)
|
||||
|
||||
new_label
|
||||
end
|
||||
|
||||
def title
|
||||
params[:title] || params[:name]
|
||||
end
|
||||
end
|
||||
end
|
51
spec/services/labels/create_service_spec.rb
Normal file
51
spec/services/labels/create_service_spec.rb
Normal file
|
@ -0,0 +1,51 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Labels::CreateService, services: true do
|
||||
describe '#execute' do
|
||||
let(:user) { create(:user) }
|
||||
let(:group) { create(:group) }
|
||||
let(:project) { create(:project, namespace: group) }
|
||||
|
||||
let(:params) do
|
||||
{
|
||||
title: 'Security',
|
||||
description: 'Security related stuff.',
|
||||
color: '#FF0000'
|
||||
}
|
||||
end
|
||||
|
||||
subject(:service) { described_class.new(user, project, params) }
|
||||
|
||||
before do
|
||||
project.team << [user, :developer]
|
||||
end
|
||||
|
||||
context 'when label does not exist at group level' do
|
||||
it 'creates a new label at project level' do
|
||||
expect { service.execute }.to change(project.labels, :count).by(1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when label exists at group level' do
|
||||
it 'returns the group label' do
|
||||
group_label = create(:group_label, group: group, title: 'Security')
|
||||
|
||||
expect(service.execute).to eq group_label
|
||||
end
|
||||
end
|
||||
|
||||
context 'when label does not exist at group level' do
|
||||
it 'creates a new label at project leve' do
|
||||
expect { service.execute }.to change(project.labels, :count).by(1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when label exists at project level' do
|
||||
it 'returns the project label' do
|
||||
project_label = create(:label, project: project, title: 'Security')
|
||||
|
||||
expect(service.execute).to eq project_label
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue