From 12a2b893b241de93f079248fae0430caba1d6682 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre Date: Fri, 16 Sep 2016 08:46:03 -0300 Subject: Replicate global labels when creating a new group --- app/services/groups/create_service.rb | 3 ++ app/services/labels/replicate_service.rb | 12 ++++++-- spec/services/groups/create_service_spec.rb | 33 +++++++++++++++------- spec/services/labels/replicate_service_spec.rb | 38 ++++++++++++++++++++------ spec/services/projects/create_service_spec.rb | 6 ++++ 5 files changed, 71 insertions(+), 21 deletions(-) diff --git a/app/services/groups/create_service.rb b/app/services/groups/create_service.rb index 2bccd584dde..f36615f3343 100644 --- a/app/services/groups/create_service.rb +++ b/app/services/groups/create_service.rb @@ -15,6 +15,9 @@ module Groups @group.name ||= @group.path.dup @group.save @group.add_owner(current_user) + + Labels::ReplicateService.new(@group, current_user).execute + @group end end diff --git a/app/services/labels/replicate_service.rb b/app/services/labels/replicate_service.rb index 344e5495a2c..92efc8c3e24 100644 --- a/app/services/labels/replicate_service.rb +++ b/app/services/labels/replicate_service.rb @@ -1,8 +1,8 @@ module Labels class ReplicateService < Labels::BaseService def execute - global_labels.each { |label| replicate_label(label, :global_label) } - group_labels.each { |label| replicate_label(label, :group_label) } + replicate_global_labels + replicate_group_labels unless subject.is_a?(Group) end private @@ -15,6 +15,14 @@ module Labels subject.group.present? ? subject.group.labels : [] end + def replicate_global_labels + global_labels.each { |label| replicate_label(label, :global_label) } + end + + def replicate_group_labels + group_labels.each { |label| replicate_label(label, :group_label) } + end + def replicate_label(label, label_type) subject.labels.find_or_create_by!(title: label.title) do |replicated| replicated.color = label.color diff --git a/spec/services/groups/create_service_spec.rb b/spec/services/groups/create_service_spec.rb index 71a0b8e2a12..9f57da8b3f3 100644 --- a/spec/services/groups/create_service_spec.rb +++ b/spec/services/groups/create_service_spec.rb @@ -1,20 +1,33 @@ require 'spec_helper' describe Groups::CreateService, services: true do - let!(:user) { create(:user) } - let!(:group_params) { { path: "group_path", visibility_level: Gitlab::VisibilityLevel::PUBLIC } } + let(:user) { create(:user) } - describe "execute" do - let!(:service) { described_class.new(user, group_params ) } - subject { service.execute } + let(:params) do + { path: 'group_path', visibility_level: Gitlab::VisibilityLevel::PUBLIC } + end + + describe '#execute' do + subject(:service) { described_class.new(user, params) } + + it 'create groups without restricted visibility level' do + group = service.execute + + expect(group).to be_persisted + end + + it 'cannot create group with restricted visibility level' do + allow_any_instance_of(ApplicationSetting).to receive(:restricted_visibility_levels).and_return([Gitlab::VisibilityLevel::PUBLIC]) - context "create groups without restricted visibility level" do - it { is_expected.to be_persisted } + group = service.execute + + expect(group).not_to be_persisted end - context "cannot create group with restricted visibility level" do - before { allow_any_instance_of(ApplicationSetting).to receive(:restricted_visibility_levels).and_return([Gitlab::VisibilityLevel::PUBLIC]) } - it { is_expected.not_to be_persisted } + it 'delegates the label replication to Labels::ReplicateService' do + expect_any_instance_of(Labels::ReplicateService).to receive(:execute).once + + service.execute end end end diff --git a/spec/services/labels/replicate_service_spec.rb b/spec/services/labels/replicate_service_spec.rb index 189a3bd0885..b1c44e1e26f 100644 --- a/spec/services/labels/replicate_service_spec.rb +++ b/spec/services/labels/replicate_service_spec.rb @@ -2,21 +2,41 @@ require 'spec_helper' describe Labels::ReplicateService, services: true do describe '#execute' do - let(:group) { create(:group) } - let(:project) { create(:empty_project, group: group) } + context 'when subject is a group' do + let(:group) { create(:group) } - subject(:service) { described_class.new(project, double) } + subject(:service) { described_class.new(group, double) } - it 'replicates global labels' do - create_list(:global_label, 2) + it 'replicates global labels' do + create_list(:global_label, 2) - expect { service.execute }.to change(project.labels, :count).by(2) + expect { service.execute }.to change(group.labels, :count).by(2) + end + + it 'does not replicate group labels' do + create_list(:group_label, 2, subject: group) + + expect { service.execute }.not_to change(group.labels, :count) + end end - it 'replicates group labels' do - create_list(:group_label, 2, subject: group) + context 'when subject is a project' do + let(:group) { create(:group) } + let(:project) { create(:empty_project, group: group) } + + subject(:service) { described_class.new(project, double) } + + it 'replicates global labels' do + create_list(:global_label, 2) + + expect { service.execute }.to change(project.labels, :count).by(2) + end + + it 'replicates group labels' do + create_list(:group_label, 2, subject: group) - expect { service.execute }.to change(project.labels, :count).by(2) + expect { service.execute }.to change(project.labels, :count).by(2) + end end end end diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 03eaec7d337..f7c4f7fa4e9 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -135,6 +135,12 @@ describe Projects::CreateService, services: true do expect(project.namespace).to eq(@user.namespace) end end + + it 'delegates the label replication to Labels::ReplicateService' do + expect_any_instance_of(Labels::ReplicateService).to receive(:execute).once + + create_project(@user, @opts) + end end def create_project(user, opts) -- cgit v1.2.3