##// END OF EJS Templates
Fixed: Circular loop when using relations and subtasks (#8794)....
Jean-Philippe Lang -
r11411:38b3e045cf22
parent child
Show More
@@ -576,6 +576,8 class Issue < ActiveRecord::Base
576 elsif @parent_issue
576 elsif @parent_issue
577 if !valid_parent_project?(@parent_issue)
577 if !valid_parent_project?(@parent_issue)
578 errors.add :parent_issue_id, :invalid
578 errors.add :parent_issue_id, :invalid
579 elsif (@parent_issue != parent) && (all_dependent_issues.include?(@parent_issue) || @parent_issue.all_dependent_issues.include?(self))
580 errors.add :parent_issue_id, :invalid
579 elsif !new_record?
581 elsif !new_record?
580 # moving an existing issue
582 # moving an existing issue
581 if @parent_issue.root_id != root_id
583 if @parent_issue.root_id != root_id
@@ -860,6 +862,18 class Issue < ActiveRecord::Base
860 dependencies += relation.issue_to.all_dependent_issues(except)
862 dependencies += relation.issue_to.all_dependent_issues(except)
861 end
863 end
862 end
864 end
865 unless leaf?
866 children.each do |child|
867 if !except.include?(child)
868 dependencies << child
869 dependencies += child.all_dependent_issues(except)
870 end
871 end
872 end
873 if parent && !except.include?(parent)
874 dependencies << parent
875 dependencies += parent.all_dependent_issues(except)
876 end
863 dependencies
877 dependencies
864 end
878 end
865
879
@@ -3474,6 +3474,8 class IssuesControllerTest < ActionController::TestCase
3474 end
3474 end
3475
3475
3476 def test_bulk_update_parent_id
3476 def test_bulk_update_parent_id
3477 IssueRelation.delete_all
3478
3477 @request.session[:user_id] = 2
3479 @request.session[:user_id] = 2
3478 post :bulk_update, :ids => [1, 3],
3480 post :bulk_update, :ids => [1, 3],
3479 :notes => 'Bulk editing parent',
3481 :notes => 'Bulk editing parent',
@@ -166,22 +166,6 class IssueNestedSetTest < ActiveSupport::TestCase
166 assert_not_nil child.errors[:parent_issue_id]
166 assert_not_nil child.errors[:parent_issue_id]
167 end
167 end
168
168
169 def test_moving_an_issue_should_keep_valid_relations_only
170 issue1 = Issue.generate!
171 issue2 = Issue.generate!
172 issue3 = Issue.generate!(:parent_issue_id => issue2.id)
173 issue4 = Issue.generate!
174 r1 = IssueRelation.create!(:issue_from => issue1, :issue_to => issue2, :relation_type => IssueRelation::TYPE_PRECEDES)
175 r2 = IssueRelation.create!(:issue_from => issue1, :issue_to => issue3, :relation_type => IssueRelation::TYPE_PRECEDES)
176 r3 = IssueRelation.create!(:issue_from => issue2, :issue_to => issue4, :relation_type => IssueRelation::TYPE_PRECEDES)
177 issue2.reload
178 issue2.parent_issue_id = issue1.id
179 issue2.save!
180 assert !IssueRelation.exists?(r1.id)
181 assert !IssueRelation.exists?(r2.id)
182 assert IssueRelation.exists?(r3.id)
183 end
184
185 def test_destroy_should_destroy_children
169 def test_destroy_should_destroy_children
186 issue1 = Issue.generate!
170 issue1 = Issue.generate!
187 issue2 = Issue.generate!
171 issue2 = Issue.generate!
@@ -30,6 +30,8 class IssueRelationTest < ActiveSupport::TestCase
30 :enumerations,
30 :enumerations,
31 :trackers
31 :trackers
32
32
33 include Redmine::I18n
34
33 def test_create
35 def test_create
34 from = Issue.find(1)
36 from = Issue.find(1)
35 to = Issue.find(2)
37 to = Issue.find(2)
@@ -115,6 +117,26 class IssueRelationTest < ActiveSupport::TestCase
115 assert_not_nil r.errors[:base]
117 assert_not_nil r.errors[:base]
116 end
118 end
117
119
120 def test_validates_circular_dependency_of_subtask
121 set_language_if_valid 'en'
122 issue1 = Issue.generate!
123 issue2 = Issue.generate!
124 IssueRelation.create!(
125 :issue_from => issue1, :issue_to => issue2,
126 :relation_type => IssueRelation::TYPE_PRECEDES
127 )
128 child = Issue.generate!(:parent_issue_id => issue2.id)
129 issue1.reload
130 child.reload
131
132 r = IssueRelation.new(
133 :issue_from => child, :issue_to => issue1,
134 :relation_type => IssueRelation::TYPE_PRECEDES
135 )
136 assert !r.save
137 assert_include 'This relation would create a circular dependency', r.errors.full_messages
138 end
139
118 def test_validates_circular_dependency_on_reverse_relations
140 def test_validates_circular_dependency_on_reverse_relations
119 IssueRelation.delete_all
141 IssueRelation.delete_all
120 assert IssueRelation.create!(
142 assert IssueRelation.create!(
@@ -1531,6 +1531,36 class IssueTest < ActiveSupport::TestCase
1531 assert child.save
1531 assert child.save
1532 end
1532 end
1533
1533
1534 def test_setting_parent_to_a_dependent_issue_should_not_validate
1535 set_language_if_valid 'en'
1536 issue1 = Issue.generate!
1537 issue2 = Issue.generate!
1538 issue3 = Issue.generate!
1539 IssueRelation.create!(:issue_from => issue1, :issue_to => issue2, :relation_type => IssueRelation::TYPE_PRECEDES)
1540 IssueRelation.create!(:issue_from => issue3, :issue_to => issue1, :relation_type => IssueRelation::TYPE_PRECEDES)
1541 issue3.reload
1542 issue3.parent_issue_id = issue2.id
1543 assert !issue3.valid?
1544 assert_include 'Parent task is invalid', issue3.errors.full_messages
1545 end
1546
1547 def test_setting_parent_should_not_allow_circular_dependency
1548 set_language_if_valid 'en'
1549 issue1 = Issue.generate!
1550 issue2 = Issue.generate!
1551 IssueRelation.create!(:issue_from => issue1, :issue_to => issue2, :relation_type => IssueRelation::TYPE_PRECEDES)
1552 issue3 = Issue.generate!
1553 issue2.reload
1554 issue2.parent_issue_id = issue3.id
1555 issue2.save!
1556 issue4 = Issue.generate!
1557 IssueRelation.create!(:issue_from => issue3, :issue_to => issue4, :relation_type => IssueRelation::TYPE_PRECEDES)
1558 issue4.reload
1559 issue4.parent_issue_id = issue1.id
1560 assert !issue4.valid?
1561 assert_include 'Parent task is invalid', issue4.errors.full_messages
1562 end
1563
1534 def test_overdue
1564 def test_overdue
1535 assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
1565 assert Issue.new(:due_date => 1.day.ago.to_date).overdue?
1536 assert !Issue.new(:due_date => Date.today).overdue?
1566 assert !Issue.new(:due_date => Date.today).overdue?
General Comments 0
You need to be logged in to leave comments. Login now