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/requests/api/issues/issues_spec.rb')
-rw-r--r--spec/requests/api/issues/issues_spec.rb65
1 files changed, 65 insertions, 0 deletions
diff --git a/spec/requests/api/issues/issues_spec.rb b/spec/requests/api/issues/issues_spec.rb
index 1419d39981a..480baff6eed 100644
--- a/spec/requests/api/issues/issues_spec.rb
+++ b/spec/requests/api/issues/issues_spec.rb
@@ -575,6 +575,26 @@ RSpec.describe API::Issues do
end
end
+ context 'with issues closed as duplicates' do
+ let_it_be(:dup_issue_1) { create(:issue, :closed_as_duplicate, project: project) }
+
+ it 'avoids N+1 queries' do
+ get api('/issues', user) # warm up
+
+ control = ActiveRecord::QueryRecorder.new do
+ get api('/issues', user)
+ end
+
+ create(:issue, :closed_as_duplicate, project: project)
+
+ expect do
+ get api('/issues', user)
+ end.not_to exceed_query_limit(control)
+ # 2 pre-existed issues + 2 duplicated incidents (2 closed, 2 new)
+ expect(json_response.count).to eq(6)
+ end
+ end
+
context 'filter by labels or label_name param' do
context 'N+1' do
let(:label_b) { create(:label, title: 'foo', project: project) }
@@ -1101,6 +1121,51 @@ RSpec.describe API::Issues do
expect(json_response['references']['relative']).to eq("##{issue.iid}")
expect(json_response['references']['full']).to eq("#{project.parent.path}/#{project.path}##{issue.iid}")
end
+
+ context 'when issue is closed as duplicate' do
+ let(:new_issue) { create(:issue) }
+ let!(:issue_closed_as_dup) { create(:issue, project: project, duplicated_to: new_issue) }
+
+ before do
+ project.add_developer(user)
+ end
+
+ context 'user does not have permission to view new issue' do
+ it 'does not return the issue as closed_as_duplicate_of' do
+ get api("/projects/#{project.id}/issues/#{issue_closed_as_dup.iid}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.dig('_links', 'closed_as_duplicate_of')).to eq(nil)
+ end
+ end
+
+ context 'when user has access to new issue' do
+ before do
+ new_issue.project.add_guest(user)
+ end
+
+ it 'returns the issue as closed_as_duplicate_of' do
+ get api("/projects/#{project.id}/issues/#{issue_closed_as_dup.iid}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expected_url = expose_url(api_v4_project_issue_path(id: new_issue.project_id, issue_iid: new_issue.iid))
+ expect(json_response.dig('_links', 'closed_as_duplicate_of')).to eq(expected_url)
+ end
+
+ context 'feature flag is disabled' do
+ before do
+ stub_feature_flags(closed_as_duplicate_of_issues_api: false)
+ end
+
+ it 'does not return the issue as closed_as_duplicate_of' do
+ get api("/projects/#{project.id}/issues/#{issue_closed_as_dup.iid}", user)
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response.dig('_links', 'closed_as_duplicate_of')).to eq(nil)
+ end
+ end
+ end
+ end
end
describe "POST /projects/:id/issues" do