end
# Returns an unsaved copy of the issue
- def copy(attributes=nil)
- copy = self.class.new.copy_from(self)
+ def copy(attributes=nil, copy_options={})
+ copy = self.class.new.copy_from(self, copy_options)
copy.attributes = attributes if attributes
copy
end
# Returns an array of statuses that user is able to apply
def new_statuses_allowed_to(user=User.current, include_default=false)
- initial_status = nil
- if new_record?
- initial_status = IssueStatus.default
- elsif status_id_was
- initial_status = IssueStatus.find_by_id(status_id_was)
+ if new_record? && @copied_from
+ [IssueStatus.default, @copied_from.status].compact.uniq.sort
+ else
+ initial_status = nil
+ if new_record?
+ initial_status = IssueStatus.default
+ elsif status_id_was
+ initial_status = IssueStatus.find_by_id(status_id_was)
+ end
+ initial_status ||= status
+
+ statuses = initial_status.find_new_statuses_allowed_to(
+ user.admin ? Role.all : user.roles_for_project(project),
+ tracker,
+ author == user,
+ assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
+ )
+ statuses << initial_status unless statuses.empty?
+ statuses << IssueStatus.default if include_default
+ statuses = statuses.compact.uniq.sort
+ blocked? ? statuses.reject {|s| s.is_closed?} : statuses
end
- initial_status ||= status
-
- statuses = initial_status.find_new_statuses_allowed_to(
- user.admin ? Role.all : user.roles_for_project(project),
- tracker,
- author == user,
- assigned_to_id_changed? ? assigned_to_id_was == user.id : assigned_to_id == user.id
- )
- statuses << initial_status unless statuses.empty?
- statuses << IssueStatus.default if include_default
- statuses = statuses.compact.uniq.sort
- blocked? ? statuses.reject {|s| s.is_closed?} : statuses
end
def assigned_to_was
assert_equal 'Failed to save 1 issue(s) on 2 selected: #2.', flash[:error]
end
+ def test_get_bulk_copy
+ @request.session[:user_id] = 2
+ get :bulk_edit, :ids => [1, 2, 3], :copy => '1'
+ assert_response :success
+ assert_template 'bulk_edit'
+
+ issues = assigns(:issues)
+ assert_not_nil issues
+ assert_equal [1, 2, 3], issues.map(&:id).sort
+
+ assert_select 'input[name=copy_attachments]'
+ end
+
def test_bulk_copy_to_another_project
@request.session[:user_id] = 2
assert_difference 'Issue.count', 2 do
end
end
assert_redirected_to '/projects/ecookbook/issues'
+
+ copies = Issue.all(:order => 'id DESC', :limit => issues.size)
+ copies.each do |copy|
+ assert_equal 2, copy.project_id
+ end
end
def test_bulk_copy_should_allow_not_changing_the_issue_attributes
@request.session[:user_id] = 2
- issue_before_move = Issue.find(1)
- assert_difference 'Issue.count', 1 do
- assert_no_difference 'Project.find(1).issues.count' do
- post :bulk_update, :ids => [1], :copy => '1',
- :issue => {
- :project_id => '2', :tracker_id => '', :assigned_to_id => '',
- :status_id => '', :start_date => '', :due_date => ''
- }
- end
+ issues = [
+ Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1, :priority_id => 2, :subject => 'issue 1', :author_id => 1, :assigned_to_id => nil),
+ Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2, :priority_id => 1, :subject => 'issue 2', :author_id => 2, :assigned_to_id => 3)
+ ]
+
+ assert_difference 'Issue.count', issues.size do
+ post :bulk_update, :ids => issues.map(&:id), :copy => '1',
+ :issue => {
+ :project_id => '', :tracker_id => '', :assigned_to_id => '',
+ :status_id => '', :start_date => '', :due_date => ''
+ }
+ end
+
+ copies = Issue.all(:order => 'id DESC', :limit => issues.size)
+ issues.each do |orig|
+ copy = copies.detect {|c| c.subject == orig.subject}
+ assert_not_nil copy
+ assert_equal orig.project_id, copy.project_id
+ assert_equal orig.tracker_id, copy.tracker_id
+ assert_equal orig.status_id, copy.status_id
+ assert_equal orig.assigned_to_id, copy.assigned_to_id
+ assert_equal orig.priority_id, copy.priority_id
end
- issue_after_move = Issue.first(:order => 'id desc', :conditions => {:project_id => 2})
- assert_equal issue_before_move.tracker_id, issue_after_move.tracker_id
- assert_equal issue_before_move.status_id, issue_after_move.status_id
- assert_equal issue_before_move.assigned_to_id, issue_after_move.assigned_to_id
end
- def test_bulk_copy_should_allow_changing_the_issue_attributes
+ def test_bulk_copy_should_allow_changing_the_issue_attributes
# Fixes random test failure with Mysql
# where Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2})
# doesn't return the expected results
post :bulk_update, :ids => [1, 2], :copy => '1',
:issue => {
:project_id => '2', :tracker_id => '', :assigned_to_id => '4',
- :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31'
+ :status_id => '1', :start_date => '2009-12-01', :due_date => '2009-12-31'
}
end
end
copied_issues.each do |issue|
assert_equal 2, issue.project_id, "Project is incorrect"
assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect"
- assert_equal 3, issue.status_id, "Status is incorrect"
+ assert_equal 1, issue.status_id, "Status is incorrect"
assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect"
assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect"
end
assert_equal 'Copying one issue', journal.notes
end
+ def test_bulk_copy_should_allow_not_copying_the_attachments
+ attachment_count = Issue.find(3).attachments.size
+ assert attachment_count > 0
+ @request.session[:user_id] = 2
+
+ assert_difference 'Issue.count', 1 do
+ assert_no_difference 'Attachment.count' do
+ post :bulk_update, :ids => [3], :copy => '1',
+ :issue => {
+ :project_id => ''
+ }
+ end
+ end
+ end
+
+ def test_bulk_copy_should_allow_copying_the_attachments
+ attachment_count = Issue.find(3).attachments.size
+ assert attachment_count > 0
+ @request.session[:user_id] = 2
+
+ assert_difference 'Issue.count', 1 do
+ assert_difference 'Attachment.count', attachment_count do
+ post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1',
+ :issue => {
+ :project_id => ''
+ }
+ end
+ end
+ end
+
def test_bulk_copy_to_another_project_should_follow_when_needed
@request.session[:user_id] = 2
post :bulk_update, :ids => [1], :copy => '1', :issue => {:project_id => 2}, :follow => '1'