diff options
author | Rémy Coutable <remy@rymai.me> | 2019-02-25 13:51:58 +0300 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2019-02-25 13:51:58 +0300 |
commit | 7981c0292b07a0138b096fa082341fcb13e9ce2b (patch) | |
tree | 6b2d16f4df9844f80eb76cdb8a7bf042215b526d /spec/requests | |
parent | 9202bbd129537a698b986e6295d0c783b5a84815 (diff) | |
parent | 64ed7069c709949c0839aebe62d58191f75fa050 (diff) |
Merge branch '49449-add-an-api-endpoint-for-bulk-updating-issues-and-mrs' into 'master'
API endpoint for bulk updating issues and MRs
Closes #49449
See merge request gitlab-org/gitlab-ce!25201
Diffstat (limited to 'spec/requests')
-rw-r--r-- | spec/requests/api/issuable_bulk_update_spec.rb | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/spec/requests/api/issuable_bulk_update_spec.rb b/spec/requests/api/issuable_bulk_update_spec.rb new file mode 100644 index 00000000000..6463f3f5d35 --- /dev/null +++ b/spec/requests/api/issuable_bulk_update_spec.rb @@ -0,0 +1,154 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe API::IssuableBulkUpdate do + set(:project) { create(:project) } + set(:user) { project.creator } + + shared_examples "PUT /projects/:id/:issuable/bulk_update" do |issuable| + def bulk_update(issuable, issuables, params, update_user = user) + put api("/projects/#{project.id}/#{issuable.pluralize}/bulk_update", update_user), + params: { issuable_ids: Array(issuables).map(&:id) }.merge(params) + end + + context 'with not enough permissions' do + it 'returns 403 for guest users' do + guest = create(:user) + project.add_guest(guest) + + bulk_update(issuable, issuables, { state_event: 'close' }, guest) + + expect(response).to have_gitlab_http_status(403) + end + end + + context 'when modifying the state' do + it "closes #{issuable}" do + bulk_update(issuable, issuables, { state_event: 'close' }) + + expect(response).to have_gitlab_http_status(200) + expect(json_response['message']).to eq("#{issuables.count} #{issuable.pluralize(issuables.count)} updated") + expect(project.public_send(issuable.pluralize).opened).to be_empty + expect(project.public_send(issuable.pluralize).closed).not_to be_empty + end + + it "opens #{issuable}" do + closed_issuables = create_list("closed_#{issuable}".to_sym, 2) + + bulk_update(issuable, closed_issuables, { state_event: 'reopen' }) + + expect(response).to have_gitlab_http_status(200) + expect(project.public_send(issuable.pluralize).closed).to be_empty + end + end + + context 'when modifying the milestone' do + let(:milestone) { create(:milestone, project: project) } + + it "adds a milestone #{issuable}" do + bulk_update(issuable, issuables, { milestone_id: milestone.id }) + + expect(response).to have_gitlab_http_status(200) + issuables.each do |issuable| + expect(issuable.reload.milestone).to eq(milestone) + end + end + + it 'removes a milestone' do + issuables.first.milestone = milestone + milestone_issuable = issuables.first + + bulk_update(issuable, [milestone_issuable], { milestone_id: 0 }) + + expect(response).to have_gitlab_http_status(200) + expect(milestone_issuable.reload.milestone).to eq(nil) + end + end + + context 'when modifying the subscription state' do + it "subscribes to #{issuable}" do + bulk_update(issuable, issuables, { subscription_event: 'subscribe' }) + + expect(response).to have_gitlab_http_status(200) + expect(issuables).to all(be_subscribed(user, project)) + end + + it 'unsubscribes from issues' do + issuables.each do |issuable| + issuable.subscriptions.create(user: user, project: project, subscribed: true) + end + + bulk_update(issuable, issuables, { subscription_event: 'unsubscribe' }) + + expect(response).to have_gitlab_http_status(200) + issuables.each do |issuable| + expect(issuable).not_to be_subscribed(user, project) + end + end + end + + context 'when modifying the assignee' do + it 'adds assignee to issues' do + params = issuable == 'issue' ? { assignee_ids: [user.id] } : { assignee_id: user.id } + + bulk_update(issuable, issuables, params) + + expect(response).to have_gitlab_http_status(200) + issuables.each do |issuable| + expect(issuable.reload.assignees).to eq([user]) + end + end + + it 'removes assignee' do + assigned_issuable = issuables.first + + if issuable == 'issue' + params = { assignee_ids: 0 } + assigned_issuable.assignees << user + else + params = { assignee_id: 0 } + assigned_issuable.update_attribute(:assignee, user) + end + + bulk_update(issuable, [assigned_issuable], params) + expect(assigned_issuable.reload.assignees).to eq([]) + end + end + + context 'when modifying labels' do + let(:bug) { create(:label, project: project) } + let(:regression) { create(:label, project: project) } + let(:feature) { create(:label, project: project) } + + it 'adds new labels' do + bulk_update(issuable, issuables, { add_label_ids: [bug.id, regression.id, feature.id] }) + + issuables.each do |issusable| + expect(issusable.reload.label_ids).to contain_exactly(bug.id, regression.id, feature.id) + end + end + + it 'removes labels' do + labled_issuable = issuables.first + labled_issuable.labels << bug + labled_issuable.labels << regression + labled_issuable.labels << feature + + bulk_update(issuable, [labled_issuable], { remove_label_ids: [bug.id, regression.id] }) + + expect(labled_issuable.reload.label_ids).to contain_exactly(feature.id) + end + end + end + + it_behaves_like 'PUT /projects/:id/:issuable/bulk_update', 'issue' do + let(:issuables) { create_list(:issue, 2, project: project) } + end + + it_behaves_like 'PUT /projects/:id/:issuable/bulk_update', 'merge_request' do + let(:merge_request_1) { create(:merge_request, source_project: project) } + let(:merge_request_2) { create(:merge_request, :simple, source_project: project) } + let(:issuables) { [merge_request_1, merge_request_2] } + end +end |