Commit 8cfc6a4de8e01a9dd7603fd8b3dce0d19da2f81a
Exists in
master
and in
4 other branches
Merge pull request #3956 from AlexDenisov/issues_bulk_update
Issues bulk update
Showing
2 changed files
with
121 additions
and
8 deletions
Show diff stats
app/contexts/issues/bulk_update_context.rb
| @@ -8,6 +8,16 @@ module Issues | @@ -8,6 +8,16 @@ module Issues | ||
| 8 | assignee_id = update_data[:assignee_id] | 8 | assignee_id = update_data[:assignee_id] |
| 9 | status = update_data[:status] | 9 | status = update_data[:status] |
| 10 | 10 | ||
| 11 | + new_state = nil | ||
| 12 | + | ||
| 13 | + if status.present? | ||
| 14 | + if status == 'closed' | ||
| 15 | + new_state = :close | ||
| 16 | + else | ||
| 17 | + new_state = :reopen | ||
| 18 | + end | ||
| 19 | + end | ||
| 20 | + | ||
| 11 | opts = {} | 21 | opts = {} |
| 12 | opts[:milestone_id] = milestone_id if milestone_id.present? | 22 | opts[:milestone_id] = milestone_id if milestone_id.present? |
| 13 | opts[:assignee_id] = assignee_id if assignee_id.present? | 23 | opts[:assignee_id] = assignee_id if assignee_id.present? |
| @@ -17,14 +27,7 @@ module Issues | @@ -17,14 +27,7 @@ module Issues | ||
| 17 | 27 | ||
| 18 | issues.each do |issue| | 28 | issues.each do |issue| |
| 19 | issue.update_attributes(opts) | 29 | issue.update_attributes(opts) |
| 20 | - | ||
| 21 | - if status.present? | ||
| 22 | - if status == 'closed' | ||
| 23 | - issue.close | ||
| 24 | - else | ||
| 25 | - issue.reopen | ||
| 26 | - end | ||
| 27 | - end | 30 | + issue.send new_state if new_state |
| 28 | end | 31 | end |
| 29 | 32 | ||
| 30 | { | 33 | { |
| @@ -0,0 +1,110 @@ | @@ -0,0 +1,110 @@ | ||
| 1 | +require 'spec_helper' | ||
| 2 | + | ||
| 3 | +describe Issues::BulkUpdateContext do | ||
| 4 | + | ||
| 5 | + let(:issue) { | ||
| 6 | + create(:issue, project: @project) | ||
| 7 | + } | ||
| 8 | + | ||
| 9 | + before do | ||
| 10 | + @user = create :user | ||
| 11 | + opts = { | ||
| 12 | + name: "GitLab" | ||
| 13 | + } | ||
| 14 | + @project = Projects::CreateContext.new(@user, opts).execute | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + describe :close_issue do | ||
| 18 | + | ||
| 19 | + before do | ||
| 20 | + @issues = 5.times.collect do | ||
| 21 | + create(:issue, project: @project) | ||
| 22 | + end | ||
| 23 | + @params = { | ||
| 24 | + update: { | ||
| 25 | + status: 'closed', | ||
| 26 | + issues_ids: @issues.map(&:id) | ||
| 27 | + } | ||
| 28 | + } | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | + it { | ||
| 32 | + result = Issues::BulkUpdateContext.new(@project, @user, @params).execute | ||
| 33 | + result[:success].should be_true | ||
| 34 | + result[:count].should == @issues.count | ||
| 35 | + | ||
| 36 | + @project.issues.opened.should be_empty | ||
| 37 | + @project.issues.closed.should_not be_empty | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + describe :reopen_issues do | ||
| 43 | + | ||
| 44 | + before do | ||
| 45 | + @issues = 5.times.collect do | ||
| 46 | + create(:closed_issue, project: @project) | ||
| 47 | + end | ||
| 48 | + @params = { | ||
| 49 | + update: { | ||
| 50 | + status: 'reopen', | ||
| 51 | + issues_ids: @issues.map(&:id) | ||
| 52 | + } | ||
| 53 | + } | ||
| 54 | + end | ||
| 55 | + | ||
| 56 | + it { | ||
| 57 | + result = Issues::BulkUpdateContext.new(@project, @user, @params).execute | ||
| 58 | + result[:success].should be_true | ||
| 59 | + result[:count].should == @issues.count | ||
| 60 | + | ||
| 61 | + @project.issues.closed.should be_empty | ||
| 62 | + @project.issues.opened.should_not be_empty | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + end | ||
| 66 | + | ||
| 67 | + describe :update_assignee do | ||
| 68 | + | ||
| 69 | + before do | ||
| 70 | + @new_assignee = create :user | ||
| 71 | + @params = { | ||
| 72 | + update: { | ||
| 73 | + issues_ids: [issue.id], | ||
| 74 | + assignee_id: @new_assignee.id | ||
| 75 | + } | ||
| 76 | + } | ||
| 77 | + end | ||
| 78 | + | ||
| 79 | + it { | ||
| 80 | + result = Issues::BulkUpdateContext.new(@project, @user, @params).execute | ||
| 81 | + result[:success].should be_true | ||
| 82 | + result[:count].should == 1 | ||
| 83 | + | ||
| 84 | + @project.issues.first.assignee.should == @new_assignee | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + end | ||
| 88 | + | ||
| 89 | + describe :update_milestone do | ||
| 90 | + | ||
| 91 | + before do | ||
| 92 | + @milestone = create :milestone | ||
| 93 | + @params = { | ||
| 94 | + update: { | ||
| 95 | + issues_ids: [issue.id], | ||
| 96 | + milestone_id: @milestone.id | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + end | ||
| 100 | + | ||
| 101 | + it { | ||
| 102 | + result = Issues::BulkUpdateContext.new(@project, @user, @params).execute | ||
| 103 | + result[:success].should be_true | ||
| 104 | + result[:count].should == 1 | ||
| 105 | + | ||
| 106 | + @project.issues.first.milestone.should == @milestone | ||
| 107 | + } | ||
| 108 | + end | ||
| 109 | + | ||
| 110 | +end |