##// END OF EJS Templates
Added request and controller objects to the hooks by default....
Added request and controller objects to the hooks by default. The request and controller objects are now added to all hook contexts by default. This will also make url_for work better in hooks by setting up the default_url_options :host, :port, and :protocol. Finally a new helper method @render_or@ has been added to ViewListener. This will let a hook easily render a partial without a full method definition. Thanks to Thomas Löber for the original patch. #2542 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2429 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2357:b11a1d852c37
r2368:5b7a5c39a7da
Show More
issue_test.rb
231 lines | 8.9 KiB | text/x-ruby | RubyLexer
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 # redMine - project management software
# Copyright (C) 2006-2007 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require File.dirname(__FILE__) + '/../test_helper'
class IssueTest < Test::Unit::TestCase
Jean-Philippe Lang
Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable)....
r1578 fixtures :projects, :users, :members,
:trackers, :projects_trackers,
:issue_statuses, :issue_categories,
:enumerations,
:issues,
:custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
:time_entries
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574
Jean-Philippe Lang
Estimated time recognizes improved time formats (#1092)....
r1346 def test_create
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'test_create', :description => 'IssueTest#test_create', :estimated_hours => '1:30')
assert issue.save
issue.reload
assert_equal 1.5, issue.estimated_hours
end
Jean-Philippe Lang
Makes issue description a non-required field (#2456)....
r2244 def test_create_minimal
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'test_create')
assert issue.save
assert issue.description.nil?
end
Jean-Philippe Lang
Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable)....
r1578 def test_create_with_required_custom_field
field = IssueCustomField.find_by_name('Database')
field.update_attribute(:is_required, true)
issue = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :subject => 'test_create', :description => 'IssueTest#test_create_with_required_custom_field')
assert issue.available_custom_fields.include?(field)
# No value for the custom field
assert !issue.save
assert_equal 'activerecord_error_invalid', issue.errors.on(:custom_values)
# Blank value
issue.custom_field_values = { field.id => '' }
assert !issue.save
assert_equal 'activerecord_error_invalid', issue.errors.on(:custom_values)
# Invalid value
issue.custom_field_values = { field.id => 'SQLServer' }
assert !issue.save
assert_equal 'activerecord_error_invalid', issue.errors.on(:custom_values)
# Valid value
issue.custom_field_values = { field.id => 'PostgreSQL' }
assert issue.save
issue.reload
assert_equal 'PostgreSQL', issue.custom_value_for(field).value
end
def test_update_issue_with_required_custom_field
field = IssueCustomField.find_by_name('Database')
field.update_attribute(:is_required, true)
issue = Issue.find(1)
assert_nil issue.custom_value_for(field)
assert issue.available_custom_fields.include?(field)
# No change to custom values, issue can be saved
assert issue.save
# Blank value
issue.custom_field_values = { field.id => '' }
assert !issue.save
# Valid value
issue.custom_field_values = { field.id => 'PostgreSQL' }
assert issue.save
issue.reload
assert_equal 'PostgreSQL', issue.custom_value_for(field).value
end
def test_should_not_update_attributes_if_custom_fields_validation_fails
issue = Issue.find(1)
field = IssueCustomField.find_by_name('Database')
assert issue.available_custom_fields.include?(field)
issue.custom_field_values = { field.id => 'Invalid' }
issue.subject = 'Should be not be saved'
assert !issue.save
issue.reload
assert_equal "Can't print recipes", issue.subject
end
def test_should_not_recreate_custom_values_objects_on_update
field = IssueCustomField.find_by_name('Database')
issue = Issue.find(1)
issue.custom_field_values = { field.id => 'PostgreSQL' }
assert issue.save
custom_value = issue.custom_value_for(field)
issue.reload
issue.custom_field_values = { field.id => 'MySQL' }
assert issue.save
issue.reload
assert_equal custom_value.id, issue.custom_value_for(field).id
end
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 def test_category_based_assignment
issue = Issue.create(:project_id => 1, :tracker_id => 1, :author_id => 3, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'Assignment test', :description => 'Assignment test', :category_id => 1)
assert_equal IssueCategory.find(1).assigned_to, issue.assigned_to
end
Jean-Philippe Lang
Automatic closing of duplicate issues....
r657
Jean-Philippe Lang
Added the hability to copy an issue....
r860 def test_copy
issue = Issue.new.copy_from(1)
assert issue.save
issue.reload
orig = Issue.find(1)
assert_equal orig.subject, issue.subject
assert_equal orig.tracker, issue.tracker
assert_equal orig.custom_values.first.value, issue.custom_values.first.value
end
Jean-Philippe Lang
Make the 'duplicates of' relation asymmetric:...
r1474 def test_should_close_duplicates
Jean-Philippe Lang
Automatic closing of duplicate issues....
r657 # Create 3 issues
issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'Duplicates test', :description => 'Duplicates test')
assert issue1.save
issue2 = issue1.clone
assert issue2.save
issue3 = issue1.clone
assert issue3.save
# 2 is a dupe of 1
Jean-Philippe Lang
Make the 'duplicates of' relation asymmetric:...
r1474 IssueRelation.create(:issue_from => issue2, :issue_to => issue1, :relation_type => IssueRelation::TYPE_DUPLICATES)
Jean-Philippe Lang
Automatic closing of duplicate issues....
r657 # And 3 is a dupe of 2
Jean-Philippe Lang
Make the 'duplicates of' relation asymmetric:...
r1474 IssueRelation.create(:issue_from => issue3, :issue_to => issue2, :relation_type => IssueRelation::TYPE_DUPLICATES)
Jean-Philippe Lang
Fixed: ActiveRecord::StaleObjectError exception on closing a set of circular duplicate issues (#1105)....
r1345 # And 3 is a dupe of 1 (circular duplicates)
Jean-Philippe Lang
Make the 'duplicates of' relation asymmetric:...
r1474 IssueRelation.create(:issue_from => issue3, :issue_to => issue1, :relation_type => IssueRelation::TYPE_DUPLICATES)
Jean-Philippe Lang
Automatic closing of duplicate issues....
r657 assert issue1.reload.duplicates.include?(issue2)
# Closing issue 1
issue1.init_journal(User.find(:first), "Closing issue1")
issue1.status = IssueStatus.find :first, :conditions => {:is_closed => true}
assert issue1.save
# 2 and 3 should be also closed
assert issue2.reload.closed?
assert issue3.reload.closed?
end
Jean-Philippe Lang
Fixed: Update of time entry fails when the issue has been moved to an other project....
r896
Jean-Philippe Lang
Make the 'duplicates of' relation asymmetric:...
r1474 def test_should_not_close_duplicated_issue
# Create 3 issues
issue1 = Issue.new(:project_id => 1, :tracker_id => 1, :author_id => 1, :status_id => 1, :priority => Enumeration.get_values('IPRI').first, :subject => 'Duplicates test', :description => 'Duplicates test')
assert issue1.save
issue2 = issue1.clone
assert issue2.save
# 2 is a dupe of 1
IssueRelation.create(:issue_from => issue2, :issue_to => issue1, :relation_type => IssueRelation::TYPE_DUPLICATES)
# 2 is a dup of 1 but 1 is not a duplicate of 2
assert !issue2.reload.duplicates.include?(issue1)
# Closing issue 2
issue2.init_journal(User.find(:first), "Closing issue2")
issue2.status = IssueStatus.find :first, :conditions => {:is_closed => true}
assert issue2.save
# 1 should not be also closed
assert !issue1.reload.closed?
end
Jean-Philippe Lang
When moving an issue to another project, reassign it to the category with same name if any (#1653)....
r1688 def test_move_to_another_project_with_same_category
Jean-Philippe Lang
Fixed: Update of time entry fails when the issue has been moved to an other project....
r896 issue = Issue.find(1)
assert issue.move_to(Project.find(2))
issue.reload
assert_equal 2, issue.project_id
Jean-Philippe Lang
When moving an issue to another project, reassign it to the category with same name if any (#1653)....
r1688 # Category changes
assert_equal 4, issue.category_id
Jean-Philippe Lang
Fixed: Update of time entry fails when the issue has been moved to an other project....
r896 # Make sure time entries were move to the target project
assert_equal 2, issue.time_entries.first.project_id
end
Jean-Philippe Lang
Let the user choose when deleting issues with reported hours (closes #734, #71):...
r1168
Jean-Philippe Lang
When moving an issue to another project, reassign it to the category with same name if any (#1653)....
r1688 def test_move_to_another_project_without_same_category
issue = Issue.find(2)
assert issue.move_to(Project.find(2))
issue.reload
assert_equal 2, issue.project_id
# Category cleared
assert_nil issue.category_id
end
Jean-Philippe Lang
Adds ability to bulk copy issues (#1847)....
r2311 def test_copy_to_the_same_project
issue = Issue.find(1)
copy = nil
assert_difference 'Issue.count' do
copy = issue.move_to(issue.project, nil, :copy => true)
end
assert_kind_of Issue, copy
assert_equal issue.project, copy.project
assert_equal "125", copy.custom_value_for(2).value
end
def test_copy_to_another_project_and_tracker
issue = Issue.find(1)
copy = nil
assert_difference 'Issue.count' do
copy = issue.move_to(Project.find(3), Tracker.find(2), :copy => true)
end
assert_kind_of Issue, copy
assert_equal Project.find(3), copy.project
assert_equal Tracker.find(2), copy.tracker
# Custom field #2 is not associated with target tracker
assert_nil copy.custom_value_for(2)
end
Jean-Philippe Lang
Let the user choose when deleting issues with reported hours (closes #734, #71):...
r1168 def test_issue_destroy
Issue.find(1).destroy
assert_nil Issue.find_by_id(1)
assert_nil TimeEntry.find_by_issue_id(1)
end
Jean-Philippe Lang
Adds a css class (overdue) to overdue issues on issue lists and detail views (#2337)....
r2138
def test_overdue
Eric Davis
Fixed a failing test caused by comparing a Time object (n.day.ago) with a Date object...
r2139 assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
Jean-Philippe Lang
Adds a css class (overdue) to overdue issues on issue lists and detail views (#2337)....
r2138 assert !Issue.new(:due_date => Date.today).overdue?
Eric Davis
Fixed a failing test caused by comparing a Time object (n.day.ago) with a Date object...
r2139 assert !Issue.new(:due_date => 1.day.from_now.to_date).overdue?
Jean-Philippe Lang
Adds a css class (overdue) to overdue issues on issue lists and detail views (#2337)....
r2138 assert !Issue.new(:due_date => nil).overdue?
Jean-Philippe Lang
Closed issue are not overdue, fixes r2140 (#2337)....
r2357 assert !Issue.new(:due_date => 1.day.ago.to_date, :status => IssueStatus.find(:first, :conditions => {:is_closed => true})).overdue?
Jean-Philippe Lang
Adds a css class (overdue) to overdue issues on issue lists and detail views (#2337)....
r2138 end
Jean-Philippe Lang
Each category can now be associated to a user, so that new issues in that category are automatically assigned to that user....
r574 end