comparison test/unit/.svn/text-base/issue_nested_set_test.rb.svn-base @ 441:cbce1fd3b1b7 redmine-1.2

Update to Redmine 1.2-stable branch (Redmine SVN rev 6000)
author Chris Cannam
date Mon, 06 Jun 2011 14:24:13 +0100
parents 0579821a129a
children
comparison
equal deleted inserted replaced
245:051f544170fe 441:cbce1fd3b1b7
1 # redMine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
3 # 3 #
4 # This program is free software; you can redistribute it and/or 4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License 5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2 6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version. 7 # of the License, or (at your option) any later version.
8 # 8 #
9 # This program is distributed in the hope that it will be useful, 9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details. 12 # GNU General Public License for more details.
13 # 13 #
14 # You should have received a copy of the GNU General Public License 14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software 15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 require File.expand_path('../../test_helper', __FILE__) 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 class IssueNestedSetTest < ActiveSupport::TestCase 20 class IssueNestedSetTest < ActiveSupport::TestCase
21 fixtures :projects, :users, :members, :member_roles, :roles, 21 fixtures :projects, :users, :members, :member_roles, :roles,
22 :trackers, :projects_trackers, 22 :trackers, :projects_trackers,
23 :versions, 23 :versions,
24 :issue_statuses, :issue_categories, :issue_relations, :workflows, 24 :issue_statuses, :issue_categories, :issue_relations, :workflows,
25 :enumerations, 25 :enumerations,
26 :issues, 26 :issues,
27 :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values, 27 :custom_fields, :custom_fields_projects, :custom_fields_trackers, :custom_values,
28 :time_entries 28 :time_entries
29 29
30 self.use_transactional_fixtures = false 30 self.use_transactional_fixtures = false
31 31
32 def test_create_root_issue 32 def test_create_root_issue
33 issue1 = create_issue! 33 issue1 = create_issue!
34 issue2 = create_issue! 34 issue2 = create_issue!
35 issue1.reload 35 issue1.reload
36 issue2.reload 36 issue2.reload
37 37
38 assert_equal [issue1.id, nil, 1, 2], [issue1.root_id, issue1.parent_id, issue1.lft, issue1.rgt] 38 assert_equal [issue1.id, nil, 1, 2], [issue1.root_id, issue1.parent_id, issue1.lft, issue1.rgt]
39 assert_equal [issue2.id, nil, 1, 2], [issue2.root_id, issue2.parent_id, issue2.lft, issue2.rgt] 39 assert_equal [issue2.id, nil, 1, 2], [issue2.root_id, issue2.parent_id, issue2.lft, issue2.rgt]
40 end 40 end
41 41
42 def test_create_child_issue 42 def test_create_child_issue
43 parent = create_issue! 43 parent = create_issue!
44 child = create_issue!(:parent_issue_id => parent.id) 44 child = create_issue!(:parent_issue_id => parent.id)
45 parent.reload 45 parent.reload
46 child.reload 46 child.reload
47 47
48 assert_equal [parent.id, nil, 1, 4], [parent.root_id, parent.parent_id, parent.lft, parent.rgt] 48 assert_equal [parent.id, nil, 1, 4], [parent.root_id, parent.parent_id, parent.lft, parent.rgt]
49 assert_equal [parent.id, parent.id, 2, 3], [child.root_id, child.parent_id, child.lft, child.rgt] 49 assert_equal [parent.id, parent.id, 2, 3], [child.root_id, child.parent_id, child.lft, child.rgt]
50 end 50 end
51 51
52 def test_creating_a_child_in_different_project_should_not_validate 52 def test_creating_a_child_in_different_project_should_not_validate
53 issue = create_issue! 53 issue = create_issue!
54 child = Issue.new(:project_id => 2, :tracker_id => 1, :author_id => 1, :subject => 'child', :parent_issue_id => issue.id) 54 child = Issue.new(:project_id => 2, :tracker_id => 1, :author_id => 1, :subject => 'child', :parent_issue_id => issue.id)
55 assert !child.save 55 assert !child.save
56 assert_not_nil child.errors.on(:parent_issue_id) 56 assert_not_nil child.errors.on(:parent_issue_id)
57 end 57 end
58 58
59 def test_move_a_root_to_child 59 def test_move_a_root_to_child
60 parent1 = create_issue! 60 parent1 = create_issue!
61 parent2 = create_issue! 61 parent2 = create_issue!
62 child = create_issue!(:parent_issue_id => parent1.id) 62 child = create_issue!(:parent_issue_id => parent1.id)
63 63
64 parent2.parent_issue_id = parent1.id 64 parent2.parent_issue_id = parent1.id
65 parent2.save! 65 parent2.save!
66 child.reload 66 child.reload
67 parent1.reload 67 parent1.reload
68 parent2.reload 68 parent2.reload
69 69
70 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt] 70 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt]
71 assert_equal [parent1.id, 4, 5], [parent2.root_id, parent2.lft, parent2.rgt] 71 assert_equal [parent1.id, 4, 5], [parent2.root_id, parent2.lft, parent2.rgt]
72 assert_equal [parent1.id, 2, 3], [child.root_id, child.lft, child.rgt] 72 assert_equal [parent1.id, 2, 3], [child.root_id, child.lft, child.rgt]
73 end 73 end
74 74
75 def test_move_a_child_to_root 75 def test_move_a_child_to_root
76 parent1 = create_issue! 76 parent1 = create_issue!
77 parent2 = create_issue! 77 parent2 = create_issue!
78 child = create_issue!(:parent_issue_id => parent1.id) 78 child = create_issue!(:parent_issue_id => parent1.id)
79 79
80 child.parent_issue_id = nil 80 child.parent_issue_id = nil
81 child.save! 81 child.save!
82 child.reload 82 child.reload
83 parent1.reload 83 parent1.reload
84 parent2.reload 84 parent2.reload
85 85
86 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt] 86 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt]
87 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt] 87 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt]
88 assert_equal [child.id, 1, 2], [child.root_id, child.lft, child.rgt] 88 assert_equal [child.id, 1, 2], [child.root_id, child.lft, child.rgt]
89 end 89 end
90 90
91 def test_move_a_child_to_another_issue 91 def test_move_a_child_to_another_issue
92 parent1 = create_issue! 92 parent1 = create_issue!
93 parent2 = create_issue! 93 parent2 = create_issue!
94 child = create_issue!(:parent_issue_id => parent1.id) 94 child = create_issue!(:parent_issue_id => parent1.id)
95 95
96 child.parent_issue_id = parent2.id 96 child.parent_issue_id = parent2.id
97 child.save! 97 child.save!
98 child.reload 98 child.reload
99 parent1.reload 99 parent1.reload
100 parent2.reload 100 parent2.reload
101 101
102 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt] 102 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt]
103 assert_equal [parent2.id, 1, 4], [parent2.root_id, parent2.lft, parent2.rgt] 103 assert_equal [parent2.id, 1, 4], [parent2.root_id, parent2.lft, parent2.rgt]
104 assert_equal [parent2.id, 2, 3], [child.root_id, child.lft, child.rgt] 104 assert_equal [parent2.id, 2, 3], [child.root_id, child.lft, child.rgt]
105 end 105 end
106 106
107 def test_move_a_child_with_descendants_to_another_issue 107 def test_move_a_child_with_descendants_to_another_issue
108 parent1 = create_issue! 108 parent1 = create_issue!
109 parent2 = create_issue! 109 parent2 = create_issue!
110 child = create_issue!(:parent_issue_id => parent1.id) 110 child = create_issue!(:parent_issue_id => parent1.id)
111 grandchild = create_issue!(:parent_issue_id => child.id) 111 grandchild = create_issue!(:parent_issue_id => child.id)
112 112
113 parent1.reload 113 parent1.reload
114 parent2.reload 114 parent2.reload
115 child.reload 115 child.reload
116 grandchild.reload 116 grandchild.reload
117 117
118 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt] 118 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt]
119 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt] 119 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt]
120 assert_equal [parent1.id, 2, 5], [child.root_id, child.lft, child.rgt] 120 assert_equal [parent1.id, 2, 5], [child.root_id, child.lft, child.rgt]
121 assert_equal [parent1.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt] 121 assert_equal [parent1.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt]
122 122
123 child.reload.parent_issue_id = parent2.id 123 child.reload.parent_issue_id = parent2.id
124 child.save! 124 child.save!
125 child.reload 125 child.reload
126 grandchild.reload 126 grandchild.reload
127 parent1.reload 127 parent1.reload
128 parent2.reload 128 parent2.reload
129 129
130 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt] 130 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt]
131 assert_equal [parent2.id, 1, 6], [parent2.root_id, parent2.lft, parent2.rgt] 131 assert_equal [parent2.id, 1, 6], [parent2.root_id, parent2.lft, parent2.rgt]
132 assert_equal [parent2.id, 2, 5], [child.root_id, child.lft, child.rgt] 132 assert_equal [parent2.id, 2, 5], [child.root_id, child.lft, child.rgt]
133 assert_equal [parent2.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt] 133 assert_equal [parent2.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt]
134 end 134 end
135 135
136 def test_move_a_child_with_descendants_to_another_project 136 def test_move_a_child_with_descendants_to_another_project
137 parent1 = create_issue! 137 parent1 = create_issue!
138 child = create_issue!(:parent_issue_id => parent1.id) 138 child = create_issue!(:parent_issue_id => parent1.id)
139 grandchild = create_issue!(:parent_issue_id => child.id) 139 grandchild = create_issue!(:parent_issue_id => child.id)
140 140
141 assert child.reload.move_to_project(Project.find(2)) 141 assert child.reload.move_to_project(Project.find(2))
142 child.reload 142 child.reload
143 grandchild.reload 143 grandchild.reload
144 parent1.reload 144 parent1.reload
145 145
146 assert_equal [1, parent1.id, 1, 2], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt] 146 assert_equal [1, parent1.id, 1, 2], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
147 assert_equal [2, child.id, 1, 4], [child.project_id, child.root_id, child.lft, child.rgt] 147 assert_equal [2, child.id, 1, 4], [child.project_id, child.root_id, child.lft, child.rgt]
148 assert_equal [2, child.id, 2, 3], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt] 148 assert_equal [2, child.id, 2, 3], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt]
149 end 149 end
150 150
151 def test_invalid_move_to_another_project 151 def test_invalid_move_to_another_project
152 parent1 = create_issue! 152 parent1 = create_issue!
153 child = create_issue!(:parent_issue_id => parent1.id) 153 child = create_issue!(:parent_issue_id => parent1.id)
154 grandchild = create_issue!(:parent_issue_id => child.id, :tracker_id => 2) 154 grandchild = create_issue!(:parent_issue_id => child.id, :tracker_id => 2)
155 Project.find(2).tracker_ids = [1] 155 Project.find(2).tracker_ids = [1]
156 156
157 parent1.reload 157 parent1.reload
158 assert_equal [1, parent1.id, 1, 6], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt] 158 assert_equal [1, parent1.id, 1, 6], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
159 159
160 # child can not be moved to Project 2 because its child is on a disabled tracker 160 # child can not be moved to Project 2 because its child is on a disabled tracker
161 assert_equal false, Issue.find(child.id).move_to_project(Project.find(2)) 161 assert_equal false, Issue.find(child.id).move_to_project(Project.find(2))
162 child.reload 162 child.reload
163 grandchild.reload 163 grandchild.reload
164 parent1.reload 164 parent1.reload
165 165
166 # no change 166 # no change
167 assert_equal [1, parent1.id, 1, 6], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt] 167 assert_equal [1, parent1.id, 1, 6], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
168 assert_equal [1, parent1.id, 2, 5], [child.project_id, child.root_id, child.lft, child.rgt] 168 assert_equal [1, parent1.id, 2, 5], [child.project_id, child.root_id, child.lft, child.rgt]
169 assert_equal [1, parent1.id, 3, 4], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt] 169 assert_equal [1, parent1.id, 3, 4], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt]
170 end 170 end
171 171
172 def test_moving_an_issue_to_a_descendant_should_not_validate 172 def test_moving_an_issue_to_a_descendant_should_not_validate
173 parent1 = create_issue! 173 parent1 = create_issue!
174 parent2 = create_issue! 174 parent2 = create_issue!
175 child = create_issue!(:parent_issue_id => parent1.id) 175 child = create_issue!(:parent_issue_id => parent1.id)
176 grandchild = create_issue!(:parent_issue_id => child.id) 176 grandchild = create_issue!(:parent_issue_id => child.id)
177 177
178 child.reload 178 child.reload
179 child.parent_issue_id = grandchild.id 179 child.parent_issue_id = grandchild.id
180 assert !child.save 180 assert !child.save
181 assert_not_nil child.errors.on(:parent_issue_id) 181 assert_not_nil child.errors.on(:parent_issue_id)
182 end 182 end
183 183
184 def test_moving_an_issue_should_keep_valid_relations_only 184 def test_moving_an_issue_should_keep_valid_relations_only
185 issue1 = create_issue! 185 issue1 = create_issue!
186 issue2 = create_issue! 186 issue2 = create_issue!
187 issue3 = create_issue!(:parent_issue_id => issue2.id) 187 issue3 = create_issue!(:parent_issue_id => issue2.id)
188 issue4 = create_issue! 188 issue4 = create_issue!
194 issue2.save! 194 issue2.save!
195 assert !IssueRelation.exists?(r1.id) 195 assert !IssueRelation.exists?(r1.id)
196 assert !IssueRelation.exists?(r2.id) 196 assert !IssueRelation.exists?(r2.id)
197 assert IssueRelation.exists?(r3.id) 197 assert IssueRelation.exists?(r3.id)
198 end 198 end
199 199
200 def test_destroy_should_destroy_children 200 def test_destroy_should_destroy_children
201 issue1 = create_issue! 201 issue1 = create_issue!
202 issue2 = create_issue! 202 issue2 = create_issue!
203 issue3 = create_issue!(:parent_issue_id => issue2.id) 203 issue3 = create_issue!(:parent_issue_id => issue2.id)
204 issue4 = create_issue!(:parent_issue_id => issue1.id) 204 issue4 = create_issue!(:parent_issue_id => issue1.id)
205 205
206 issue3.init_journal(User.find(2)) 206 issue3.init_journal(User.find(2))
207 issue3.subject = 'child with journal' 207 issue3.subject = 'child with journal'
208 issue3.save! 208 issue3.save!
209 209
210 assert_difference 'Issue.count', -2 do 210 assert_difference 'Issue.count', -2 do
211 assert_difference 'Journal.count', -1 do 211 assert_difference 'Journal.count', -1 do
212 assert_difference 'JournalDetail.count', -1 do 212 assert_difference 'JournalDetail.count', -1 do
213 Issue.find(issue2.id).destroy 213 Issue.find(issue2.id).destroy
214 end 214 end
215 end 215 end
216 end 216 end
217 217
218 issue1.reload 218 issue1.reload
219 issue4.reload 219 issue4.reload
220 assert !Issue.exists?(issue2.id) 220 assert !Issue.exists?(issue2.id)
221 assert !Issue.exists?(issue3.id) 221 assert !Issue.exists?(issue3.id)
222 assert_equal [issue1.id, 1, 4], [issue1.root_id, issue1.lft, issue1.rgt] 222 assert_equal [issue1.id, 1, 4], [issue1.root_id, issue1.lft, issue1.rgt]
223 assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt] 223 assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt]
224 end 224 end
225 225
226 def test_destroy_parent_issue_updated_during_children_destroy
227 parent = create_issue!
228 create_issue!(:start_date => Date.today, :parent_issue_id => parent.id)
229 create_issue!(:start_date => 2.days.from_now, :parent_issue_id => parent.id)
230
231 assert_difference 'Issue.count', -3 do
232 Issue.find(parent.id).destroy
233 end
234 end
235
226 def test_destroy_child_issue_with_children 236 def test_destroy_child_issue_with_children
227 root = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'root') 237 root = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'root')
228 child = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => root.id) 238 child = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => root.id)
229 leaf = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'leaf', :parent_issue_id => child.id) 239 leaf = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'leaf', :parent_issue_id => child.id)
230 leaf.init_journal(User.find(2)) 240 leaf.init_journal(User.find(2))
231 leaf.subject = 'leaf with journal' 241 leaf.subject = 'leaf with journal'
232 leaf.save! 242 leaf.save!
233 243
234 assert_difference 'Issue.count', -2 do 244 assert_difference 'Issue.count', -2 do
235 assert_difference 'Journal.count', -1 do 245 assert_difference 'Journal.count', -1 do
236 assert_difference 'JournalDetail.count', -1 do 246 assert_difference 'JournalDetail.count', -1 do
237 Issue.find(child.id).destroy 247 Issue.find(child.id).destroy
238 end 248 end
239 end 249 end
240 end 250 end
241 251
242 root = Issue.find(root.id) 252 root = Issue.find(root.id)
243 assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})" 253 assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})"
244 end 254 end
245 255
246 def test_parent_priority_should_be_the_highest_child_priority 256 def test_parent_priority_should_be_the_highest_child_priority
247 parent = create_issue!(:priority => IssuePriority.find_by_name('Normal')) 257 parent = create_issue!(:priority => IssuePriority.find_by_name('Normal'))
248 # Create children 258 # Create children
249 child1 = create_issue!(:priority => IssuePriority.find_by_name('High'), :parent_issue_id => parent.id) 259 child1 = create_issue!(:priority => IssuePriority.find_by_name('High'), :parent_issue_id => parent.id)
250 assert_equal 'High', parent.reload.priority.name 260 assert_equal 'High', parent.reload.priority.name
259 # Update a child 269 # Update a child
260 child3.reload.priority = IssuePriority.find_by_name('Normal') 270 child3.reload.priority = IssuePriority.find_by_name('Normal')
261 child3.save! 271 child3.save!
262 assert_equal 'Normal', parent.reload.priority.name 272 assert_equal 'Normal', parent.reload.priority.name
263 end 273 end
264 274
265 def test_parent_dates_should_be_lowest_start_and_highest_due_dates 275 def test_parent_dates_should_be_lowest_start_and_highest_due_dates
266 parent = create_issue! 276 parent = create_issue!
267 create_issue!(:start_date => '2010-01-25', :due_date => '2010-02-15', :parent_issue_id => parent.id) 277 create_issue!(:start_date => '2010-01-25', :due_date => '2010-02-15', :parent_issue_id => parent.id)
268 create_issue!( :due_date => '2010-02-13', :parent_issue_id => parent.id) 278 create_issue!( :due_date => '2010-02-13', :parent_issue_id => parent.id)
269 create_issue!(:start_date => '2010-02-01', :due_date => '2010-02-22', :parent_issue_id => parent.id) 279 create_issue!(:start_date => '2010-02-01', :due_date => '2010-02-22', :parent_issue_id => parent.id)
270 parent.reload 280 parent.reload
271 assert_equal Date.parse('2010-01-25'), parent.start_date 281 assert_equal Date.parse('2010-01-25'), parent.start_date
272 assert_equal Date.parse('2010-02-22'), parent.due_date 282 assert_equal Date.parse('2010-02-22'), parent.due_date
273 end 283 end
274 284
275 def test_parent_done_ratio_should_be_average_done_ratio_of_leaves 285 def test_parent_done_ratio_should_be_average_done_ratio_of_leaves
276 parent = create_issue! 286 parent = create_issue!
277 create_issue!(:done_ratio => 20, :parent_issue_id => parent.id) 287 create_issue!(:done_ratio => 20, :parent_issue_id => parent.id)
278 assert_equal 20, parent.reload.done_ratio 288 assert_equal 20, parent.reload.done_ratio
279 create_issue!(:done_ratio => 70, :parent_issue_id => parent.id) 289 create_issue!(:done_ratio => 70, :parent_issue_id => parent.id)
280 assert_equal 45, parent.reload.done_ratio 290 assert_equal 45, parent.reload.done_ratio
281 291
282 child = create_issue!(:done_ratio => 0, :parent_issue_id => parent.id) 292 child = create_issue!(:done_ratio => 0, :parent_issue_id => parent.id)
283 assert_equal 30, parent.reload.done_ratio 293 assert_equal 30, parent.reload.done_ratio
284 294
285 create_issue!(:done_ratio => 30, :parent_issue_id => child.id) 295 create_issue!(:done_ratio => 30, :parent_issue_id => child.id)
286 assert_equal 30, child.reload.done_ratio 296 assert_equal 30, child.reload.done_ratio
287 assert_equal 40, parent.reload.done_ratio 297 assert_equal 40, parent.reload.done_ratio
288 end 298 end
289 299
290 def test_parent_done_ratio_should_be_weighted_by_estimated_times_if_any 300 def test_parent_done_ratio_should_be_weighted_by_estimated_times_if_any
291 parent = create_issue! 301 parent = create_issue!
292 create_issue!(:estimated_hours => 10, :done_ratio => 20, :parent_issue_id => parent.id) 302 create_issue!(:estimated_hours => 10, :done_ratio => 20, :parent_issue_id => parent.id)
293 assert_equal 20, parent.reload.done_ratio 303 assert_equal 20, parent.reload.done_ratio
294 create_issue!(:estimated_hours => 20, :done_ratio => 50, :parent_issue_id => parent.id) 304 create_issue!(:estimated_hours => 20, :done_ratio => 50, :parent_issue_id => parent.id)
295 assert_equal (50 * 20 + 20 * 10) / 30, parent.reload.done_ratio 305 assert_equal (50 * 20 + 20 * 10) / 30, parent.reload.done_ratio
296 end 306 end
297 307
298 def test_parent_estimate_should_be_sum_of_leaves 308 def test_parent_estimate_should_be_sum_of_leaves
299 parent = create_issue! 309 parent = create_issue!
300 create_issue!(:estimated_hours => nil, :parent_issue_id => parent.id) 310 create_issue!(:estimated_hours => nil, :parent_issue_id => parent.id)
301 assert_equal nil, parent.reload.estimated_hours 311 assert_equal nil, parent.reload.estimated_hours
302 create_issue!(:estimated_hours => 5, :parent_issue_id => parent.id) 312 create_issue!(:estimated_hours => 5, :parent_issue_id => parent.id)
326 c2.reload 336 c2.reload
327 assert_equal [Date.parse('2010-06-03'), Date.parse('2010-06-10')], [c2.start_date, c2.due_date] # no change 337 assert_equal [Date.parse('2010-06-03'), Date.parse('2010-06-10')], [c2.start_date, c2.due_date] # no change
328 parent.reload 338 parent.reload
329 assert_equal [Date.parse('2010-06-02'), Date.parse('2010-06-10')], [parent.start_date, parent.due_date] 339 assert_equal [Date.parse('2010-06-02'), Date.parse('2010-06-10')], [parent.start_date, parent.due_date]
330 end 340 end
331 341
332 def test_project_copy_should_copy_issue_tree 342 def test_project_copy_should_copy_issue_tree
333 p = Project.create!(:name => 'Tree copy', :identifier => 'tree-copy', :tracker_ids => [1, 2]) 343 p = Project.create!(:name => 'Tree copy', :identifier => 'tree-copy', :tracker_ids => [1, 2])
334 i1 = create_issue!(:project_id => p.id, :subject => 'i1') 344 i1 = create_issue!(:project_id => p.id, :subject => 'i1')
335 i2 = create_issue!(:project_id => p.id, :subject => 'i2', :parent_issue_id => i1.id) 345 i2 = create_issue!(:project_id => p.id, :subject => 'i2', :parent_issue_id => i1.id)
336 i3 = create_issue!(:project_id => p.id, :subject => 'i3', :parent_issue_id => i1.id) 346 i3 = create_issue!(:project_id => p.id, :subject => 'i3', :parent_issue_id => i1.id)
337 i4 = create_issue!(:project_id => p.id, :subject => 'i4', :parent_issue_id => i2.id) 347 i4 = create_issue!(:project_id => p.id, :subject => 'i4', :parent_issue_id => i2.id)
338 i5 = create_issue!(:project_id => p.id, :subject => 'i5') 348 i5 = create_issue!(:project_id => p.id, :subject => 'i5')
339 c = Project.new(:name => 'Copy', :identifier => 'copy', :tracker_ids => [1, 2]) 349 c = Project.new(:name => 'Copy', :identifier => 'copy', :tracker_ids => [1, 2])
340 c.copy(p, :only => 'issues') 350 c.copy(p, :only => 'issues')
341 c.reload 351 c.reload
342 352
343 assert_equal 5, c.issues.count 353 assert_equal 5, c.issues.count
344 ic1, ic2, ic3, ic4, ic5 = c.issues.find(:all, :order => 'subject') 354 ic1, ic2, ic3, ic4, ic5 = c.issues.find(:all, :order => 'subject')
345 assert ic1.root? 355 assert ic1.root?
346 assert_equal ic1, ic2.parent 356 assert_equal ic1, ic2.parent
347 assert_equal ic1, ic3.parent 357 assert_equal ic1, ic3.parent
348 assert_equal ic2, ic4.parent 358 assert_equal ic2, ic4.parent
349 assert ic5.root? 359 assert ic5.root?
350 end 360 end
351 361
352 # Helper that creates an issue with default attributes 362 # Helper that creates an issue with default attributes
353 def create_issue!(attributes={}) 363 def create_issue!(attributes={})
354 Issue.create!({:project_id => 1, :tracker_id => 1, :author_id => 1, :subject => 'test'}.merge(attributes)) 364 Issue.create!({:project_id => 1, :tracker_id => 1, :author_id => 1, :subject => 'test'}.merge(attributes))
355 end 365 end
356 end 366 end