Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/issues')
-rw-r--r--spec/services/issues/close_service_spec.rb85
-rw-r--r--spec/services/issues/create_service_spec.rb24
-rw-r--r--spec/services/issues/update_service_spec.rb90
-rw-r--r--spec/services/issues/zoom_link_service_spec.rb10
4 files changed, 124 insertions, 85 deletions
diff --git a/spec/services/issues/close_service_spec.rb b/spec/services/issues/close_service_spec.rb
index 8950bdd465f..0b315422be8 100644
--- a/spec/services/issues/close_service_spec.rb
+++ b/spec/services/issues/close_service_spec.rb
@@ -3,50 +3,22 @@
require 'spec_helper'
RSpec.describe Issues::CloseService do
- subject(:close_issue) { described_class.new(project: project, current_user: user).close_issue(issue) }
-
- let_it_be(:project, refind: true) { create(:project, :repository) }
- let_it_be(:label1) { create(:label, project: project) }
- let_it_be(:label2) { create(:label, project: project, remove_on_close: true) }
- let_it_be(:author) { create(:user) }
- let_it_be(:user) { create(:user, email: "user@example.com") }
- let_it_be(:user2) { create(:user, email: "user2@example.com") }
- let_it_be(:guest) { create(:user) }
- let_it_be(:closing_merge_request) { create(:merge_request, source_project: project) }
-
+ let(:project) { create(:project, :repository) }
+ let(:user) { create(:user, email: "user@example.com") }
+ let(:user2) { create(:user, email: "user2@example.com") }
+ let(:guest) { create(:user) }
+ let(:issue) { create(:issue, title: "My issue", project: project, assignees: [user2], author: create(:user)) }
let(:external_issue) { ExternalIssue.new('JIRA-123', project) }
- let!(:issue) { create(:issue, title: "My issue", project: project, assignees: [user2], author: author) }
+ let(:closing_merge_request) { create(:merge_request, source_project: project) }
+ let(:closing_commit) { create(:commit, project: project) }
+ let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
- before_all do
+ before do
project.add_maintainer(user)
project.add_developer(user2)
project.add_guest(guest)
end
- shared_examples 'removes labels marked for removal from issue when closed' do
- before do
- issue.update!(label_ids: [label1.id, label2.id])
- end
-
- it 'removes labels marked for removal' do
- expect do
- close_issue
- end.to change { issue.reload.label_ids }.from(containing_exactly(label1.id, label2.id)).to(containing_exactly(label1.id))
- end
-
- it 'creates system notes for the removed labels' do
- expect do
- close_issue
- end.to change(ResourceLabelEvent, :count).by(1)
-
- expect(ResourceLabelEvent.last.slice(:action, :issue_id, :label_id)).to eq(
- 'action' => 'remove',
- 'issue_id' => issue.id,
- 'label_id' => label2.id
- )
- end
- end
-
describe '#execute' do
let(:service) { described_class.new(project: project, current_user: user) }
@@ -131,7 +103,7 @@ RSpec.describe Issues::CloseService do
end
context 'with an active external issue tracker not supporting close_issue' do
- let!(:external_issue_tracker) { create(:bugzilla_service, project: project) }
+ let!(:external_issue_tracker) { create(:bugzilla_integration, project: project) }
it 'does not close the issue on the external issue tracker' do
project.reload
@@ -149,8 +121,6 @@ RSpec.describe Issues::CloseService do
end
end
- it_behaves_like 'removes labels marked for removal from issue when closed'
-
it 'mentions closure via a merge request' do
close_issue
@@ -214,18 +184,10 @@ RSpec.describe Issues::CloseService do
end
context "closed by a commit", :sidekiq_might_not_need_inline do
- subject(:close_issue) do
+ it 'mentions closure via a commit' do
perform_enqueued_jobs do
described_class.new(project: project, current_user: user).close_issue(issue, closed_via: closing_commit)
end
- end
-
- let(:closing_commit) { create(:commit, project: project) }
-
- it_behaves_like 'removes labels marked for removal from issue when closed'
-
- it 'mentions closure via a commit' do
- close_issue
email = ActionMailer::Base.deliveries.last
@@ -237,8 +199,9 @@ RSpec.describe Issues::CloseService do
context 'when user cannot read the commit' do
it 'does not mention the commit id' do
project.project_feature.update_attribute(:repository_access_level, ProjectFeature::DISABLED)
-
- close_issue
+ perform_enqueued_jobs do
+ described_class.new(project: project, current_user: user).close_issue(issue, closed_via: closing_commit)
+ end
email = ActionMailer::Base.deliveries.last
body_text = email.body.parts.map(&:body).join(" ")
@@ -259,14 +222,12 @@ RSpec.describe Issues::CloseService do
it 'verifies the number of queries' do
recorded = ActiveRecord::QueryRecorder.new { close_issue }
- expected_queries = 32
+ expected_queries = 24
expect(recorded.count).to be <= expected_queries
expect(recorded.cached_count).to eq(0)
end
- it_behaves_like 'removes labels marked for removal from issue when closed'
-
it 'closes the issue' do
close_issue
@@ -296,8 +257,6 @@ RSpec.describe Issues::CloseService do
end
it 'marks todos as done' do
- todo = create(:todo, :assigned, user: user, project: project, target: issue, author: user2)
-
close_issue
expect(todo.reload).to be_done
@@ -362,32 +321,26 @@ RSpec.describe Issues::CloseService do
end
context 'when issue is not confidential' do
- it_behaves_like 'removes labels marked for removal from issue when closed'
-
it 'executes issue hooks' do
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :issue_hooks)
expect(project).to receive(:execute_services).with(an_instance_of(Hash), :issue_hooks)
- close_issue
+ described_class.new(project: project, current_user: user).close_issue(issue)
end
end
context 'when issue is confidential' do
- let(:issue) { create(:issue, :confidential, project: project) }
-
- it_behaves_like 'removes labels marked for removal from issue when closed'
-
it 'executes confidential issue hooks' do
+ issue = create(:issue, :confidential, project: project)
+
expect(project).to receive(:execute_hooks).with(an_instance_of(Hash), :confidential_issue_hooks)
expect(project).to receive(:execute_services).with(an_instance_of(Hash), :confidential_issue_hooks)
- close_issue
+ described_class.new(project: project, current_user: user).close_issue(issue)
end
end
context 'internal issues disabled' do
- let!(:todo) { create(:todo, :assigned, user: user, project: project, target: issue, author: user2) }
-
before do
project.issues_enabled = false
project.save!
diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb
index 9c84242d8ae..94810d6134a 100644
--- a/spec/services/issues/create_service_spec.rb
+++ b/spec/services/issues/create_service_spec.rb
@@ -18,8 +18,8 @@ RSpec.describe Issues::CreateService do
let_it_be(:labels) { create_pair(:label, project: project) }
before_all do
- project.add_maintainer(user)
- project.add_maintainer(assignee)
+ project.add_guest(user)
+ project.add_guest(assignee)
end
let(:opts) do
@@ -78,8 +78,8 @@ RSpec.describe Issues::CreateService do
opts.merge!(title: '')
end
- it 'does not create an incident label prematurely' do
- expect { subject }.not_to change(Label, :count)
+ it 'does not apply an incident label prematurely' do
+ expect { subject }.to not_change(LabelLink, :count).and not_change(Issue, :count)
end
end
end
@@ -88,15 +88,11 @@ RSpec.describe Issues::CreateService do
expect { issue }.to change { project.open_issues_count }.from(0).to(1)
end
- context 'when current user cannot admin issues in the project' do
- let_it_be(:guest) { create(:user) }
-
- before_all do
- project.add_guest(guest)
- end
+ context 'when current user cannot set issue metadata in the project' do
+ let_it_be(:non_member) { create(:user) }
- it 'filters out params that cannot be set without the :admin_issue permission' do
- issue = described_class.new(project: project, current_user: guest, params: opts).execute
+ it 'filters out params that cannot be set without the :set_issue_metadata permission' do
+ issue = described_class.new(project: project, current_user: non_member, params: opts).execute
expect(issue).to be_persisted
expect(issue.title).to eq('Awesome issue')
@@ -107,8 +103,8 @@ RSpec.describe Issues::CreateService do
expect(issue.due_date).to be_nil
end
- it 'creates confidential issues' do
- issue = described_class.new(project: project, current_user: guest, params: { confidential: true }).execute
+ it 'can create confidential issues' do
+ issue = described_class.new(project: project, current_user: non_member, params: { confidential: true }).execute
expect(issue.confidential).to be_truthy
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index 8c97dd95ced..b95d94e3784 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -158,6 +158,90 @@ RSpec.describe Issues::UpdateService, :mailer do
end
end
+ context 'changing issue_type' do
+ let!(:label_1) { create(:label, project: project, title: 'incident') }
+ let!(:label_2) { create(:label, project: project, title: 'missed-sla') }
+
+ before do
+ stub_licensed_features(quality_management: true)
+ end
+
+ context 'from issue to incident' do
+ it 'adds a `incident` label if one does not exist' do
+ expect { update_issue(issue_type: 'incident') }.to change(issue.labels, :count).by(1)
+ expect(issue.labels.pluck(:title)).to eq(['incident'])
+ end
+
+ context 'for an issue with multiple labels' do
+ let(:issue) { create(:incident, project: project, labels: [label_1]) }
+
+ before do
+ update_issue(issue_type: 'incident')
+ end
+
+ it 'does not add an `incident` label if one already exist' do
+ expect(issue.labels).to eq([label_1])
+ end
+ end
+
+ context 'filtering the incident label' do
+ let(:params) { { add_label_ids: [] } }
+
+ before do
+ update_issue(issue_type: 'incident')
+ end
+
+ it 'creates and add a incident label id to add_label_ids' do
+ expect(issue.label_ids).to contain_exactly(label_1.id)
+ end
+ end
+ end
+
+ context 'from incident to issue' do
+ let(:issue) { create(:incident, project: project) }
+
+ context 'for an incident with multiple labels' do
+ let(:issue) { create(:incident, project: project, labels: [label_1, label_2]) }
+
+ before do
+ update_issue(issue_type: 'issue')
+ end
+
+ it 'removes an `incident` label if one exists on the incident' do
+ expect(issue.labels).to eq([label_2])
+ end
+ end
+
+ context 'filtering the incident label' do
+ let(:issue) { create(:incident, project: project, labels: [label_1, label_2]) }
+ let(:params) { { label_ids: [label_1.id, label_2.id], remove_label_ids: [] } }
+
+ before do
+ update_issue(issue_type: 'issue')
+ end
+
+ it 'adds an incident label id to remove_label_ids for it to be removed' do
+ expect(issue.label_ids).to contain_exactly(label_2.id)
+ end
+ end
+ end
+
+ context 'from issue to restricted issue types' do
+ context 'without sufficient permissions' do
+ let(:user) { create(:user) }
+
+ before do
+ project.add_guest(user)
+ end
+
+ it 'does nothing to the labels' do
+ expect { update_issue(issue_type: 'issue') }.not_to change(issue.labels, :count)
+ expect(issue.reload.labels).to eq([])
+ end
+ end
+ end
+ end
+
it 'updates open issue counter for assignees when issue is reassigned' do
update_issue(assignee_ids: [user2.id])
@@ -225,7 +309,7 @@ RSpec.describe Issues::UpdateService, :mailer do
opts[:move_between_ids] = [issue1.id, issue2.id]
- expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, project.id)
+ expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, nil, project.root_namespace.id)
update_issue(opts)
expect(issue.relative_position).to be_between(issue1.relative_position, issue2.relative_position)
@@ -239,7 +323,7 @@ RSpec.describe Issues::UpdateService, :mailer do
opts[:move_between_ids] = [issue1.id, issue2.id]
- expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, project.id)
+ expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, nil, project.root_namespace.id)
update_issue(opts)
expect(issue.relative_position).to be_between(issue1.relative_position, issue2.relative_position)
@@ -253,7 +337,7 @@ RSpec.describe Issues::UpdateService, :mailer do
opts[:move_between_ids] = [issue1.id, issue2.id]
- expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, project.id)
+ expect(IssueRebalancingWorker).to receive(:perform_async).with(nil, nil, project.root_namespace.id)
update_issue(opts)
expect(issue.relative_position).to be_between(issue1.relative_position, issue2.relative_position)
diff --git a/spec/services/issues/zoom_link_service_spec.rb b/spec/services/issues/zoom_link_service_spec.rb
index 19db892fcae..d662d9fa978 100644
--- a/spec/services/issues/zoom_link_service_spec.rb
+++ b/spec/services/issues/zoom_link_service_spec.rb
@@ -53,7 +53,10 @@ RSpec.describe Issues::ZoomLinkService do
category: 'IncidentManagement::ZoomIntegration',
action: 'add_zoom_meeting',
label: 'Issue ID',
- value: issue.id
+ value: issue.id,
+ user: user,
+ project: project,
+ namespace: project.namespace
)
end
@@ -192,7 +195,10 @@ RSpec.describe Issues::ZoomLinkService do
category: 'IncidentManagement::ZoomIntegration',
action: 'remove_zoom_meeting',
label: 'Issue ID',
- value: issue.id
+ value: issue.id,
+ user: user,
+ project: project,
+ namespace: project.namespace
)
end
end