summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-05-16 05:12:40 -0700
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-05-16 05:12:40 -0700
commit8cfc6a4de8e01a9dd7603fd8b3dce0d19da2f81a (patch)
treeac79b9732e0c2f73db0ceea4e967e104e03e6b66
parentd7c655347249183363d85ad5872d3cf86e2e1003 (diff)
parent6e8cb844499dfcc77bd92f3daf0f7890400ec072 (diff)
downloadgitlab-ce-8cfc6a4de8e01a9dd7603fd8b3dce0d19da2f81a.tar.gz
Merge pull request #3956 from AlexDenisov/issues_bulk_update
Issues bulk update
-rw-r--r--app/contexts/issues/bulk_update_context.rb19
-rw-r--r--spec/contexts/issues/bulk_update_context_spec.rb110
2 files changed, 121 insertions, 8 deletions
diff --git a/app/contexts/issues/bulk_update_context.rb b/app/contexts/issues/bulk_update_context.rb
index e92264a8bb1..73a3c353523 100644
--- a/app/contexts/issues/bulk_update_context.rb
+++ b/app/contexts/issues/bulk_update_context.rb
@@ -8,6 +8,16 @@ module Issues
assignee_id = update_data[:assignee_id]
status = update_data[:status]
+ new_state = nil
+
+ if status.present?
+ if status == 'closed'
+ new_state = :close
+ else
+ new_state = :reopen
+ end
+ end
+
opts = {}
opts[:milestone_id] = milestone_id if milestone_id.present?
opts[:assignee_id] = assignee_id if assignee_id.present?
@@ -17,14 +27,7 @@ module Issues
issues.each do |issue|
issue.update_attributes(opts)
-
- if status.present?
- if status == 'closed'
- issue.close
- else
- issue.reopen
- end
- end
+ issue.send new_state if new_state
end
{
diff --git a/spec/contexts/issues/bulk_update_context_spec.rb b/spec/contexts/issues/bulk_update_context_spec.rb
new file mode 100644
index 00000000000..0966ee35745
--- /dev/null
+++ b/spec/contexts/issues/bulk_update_context_spec.rb
@@ -0,0 +1,110 @@
+require 'spec_helper'
+
+describe Issues::BulkUpdateContext do
+
+ let(:issue) {
+ create(:issue, project: @project)
+ }
+
+ before do
+ @user = create :user
+ opts = {
+ name: "GitLab"
+ }
+ @project = Projects::CreateContext.new(@user, opts).execute
+ end
+
+ describe :close_issue do
+
+ before do
+ @issues = 5.times.collect do
+ create(:issue, project: @project)
+ end
+ @params = {
+ update: {
+ status: 'closed',
+ issues_ids: @issues.map(&:id)
+ }
+ }
+ end
+
+ it {
+ result = Issues::BulkUpdateContext.new(@project, @user, @params).execute
+ result[:success].should be_true
+ result[:count].should == @issues.count
+
+ @project.issues.opened.should be_empty
+ @project.issues.closed.should_not be_empty
+ }
+
+ end
+
+ describe :reopen_issues do
+
+ before do
+ @issues = 5.times.collect do
+ create(:closed_issue, project: @project)
+ end
+ @params = {
+ update: {
+ status: 'reopen',
+ issues_ids: @issues.map(&:id)
+ }
+ }
+ end
+
+ it {
+ result = Issues::BulkUpdateContext.new(@project, @user, @params).execute
+ result[:success].should be_true
+ result[:count].should == @issues.count
+
+ @project.issues.closed.should be_empty
+ @project.issues.opened.should_not be_empty
+ }
+
+ end
+
+ describe :update_assignee do
+
+ before do
+ @new_assignee = create :user
+ @params = {
+ update: {
+ issues_ids: [issue.id],
+ assignee_id: @new_assignee.id
+ }
+ }
+ end
+
+ it {
+ result = Issues::BulkUpdateContext.new(@project, @user, @params).execute
+ result[:success].should be_true
+ result[:count].should == 1
+
+ @project.issues.first.assignee.should == @new_assignee
+ }
+
+ end
+
+ describe :update_milestone do
+
+ before do
+ @milestone = create :milestone
+ @params = {
+ update: {
+ issues_ids: [issue.id],
+ milestone_id: @milestone.id
+ }
+ }
+ end
+
+ it {
+ result = Issues::BulkUpdateContext.new(@project, @user, @params).execute
+ result[:success].should be_true
+ result[:count].should == 1
+
+ @project.issues.first.milestone.should == @milestone
+ }
+ end
+
+end