@@ -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