comparison test/unit/issue_nested_set_test.rb @ 1517:dffacf8a6908 redmine-2.5

Update to Redmine SVN revision 13367 on 2.5-stable branch
author Chris Cannam
date Tue, 09 Sep 2014 09:29:00 +0100
parents e248c7af89ec
children
comparison
equal deleted inserted replaced
1516:b450a9d58aed 1517:dffacf8a6908
22 :trackers, :projects_trackers, 22 :trackers, :projects_trackers,
23 :issue_statuses, :issue_categories, :issue_relations, 23 :issue_statuses, :issue_categories, :issue_relations,
24 :enumerations, 24 :enumerations,
25 :issues 25 :issues
26 26
27 def test_new_record_is_leaf
28 i = Issue.new
29 assert i.leaf?
30 end
31
27 def test_create_root_issue 32 def test_create_root_issue
33 lft1 = new_issue_lft
28 issue1 = Issue.generate! 34 issue1 = Issue.generate!
35 lft2 = new_issue_lft
29 issue2 = Issue.generate! 36 issue2 = Issue.generate!
30 issue1.reload 37 issue1.reload
31 issue2.reload 38 issue2.reload
32 39 assert_equal [issue1.id, nil, lft1, lft1 + 1], [issue1.root_id, issue1.parent_id, issue1.lft, issue1.rgt]
33 assert_equal [issue1.id, nil, 1, 2], [issue1.root_id, issue1.parent_id, issue1.lft, issue1.rgt] 40 assert_equal [issue2.id, nil, lft2, lft2 + 1], [issue2.root_id, issue2.parent_id, issue2.lft, issue2.rgt]
34 assert_equal [issue2.id, nil, 1, 2], [issue2.root_id, issue2.parent_id, issue2.lft, issue2.rgt]
35 end 41 end
36 42
37 def test_create_child_issue 43 def test_create_child_issue
38 parent = Issue.generate! 44 lft = new_issue_lft
39 child = Issue.generate!(:parent_issue_id => parent.id) 45 parent = Issue.generate!
46 child = parent.generate_child!
40 parent.reload 47 parent.reload
41 child.reload 48 child.reload
42 49 assert_equal [parent.id, nil, lft, lft + 3], [parent.root_id, parent.parent_id, parent.lft, parent.rgt]
43 assert_equal [parent.id, nil, 1, 4], [parent.root_id, parent.parent_id, parent.lft, parent.rgt] 50 assert_equal [parent.id, parent.id, lft + 1, lft + 2], [child.root_id, child.parent_id, child.lft, child.rgt]
44 assert_equal [parent.id, parent.id, 2, 3], [child.root_id, child.parent_id, child.lft, child.rgt]
45 end 51 end
46 52
47 def test_creating_a_child_in_a_subproject_should_validate 53 def test_creating_a_child_in_a_subproject_should_validate
48 issue = Issue.generate! 54 issue = Issue.generate!
49 child = Issue.new(:project_id => 3, :tracker_id => 2, :author_id => 1, 55 child = Issue.new(:project_id => 3, :tracker_id => 2, :author_id => 1,
59 assert !child.save 65 assert !child.save
60 assert_not_equal [], child.errors[:parent_issue_id] 66 assert_not_equal [], child.errors[:parent_issue_id]
61 end 67 end
62 68
63 def test_move_a_root_to_child 69 def test_move_a_root_to_child
70 lft = new_issue_lft
64 parent1 = Issue.generate! 71 parent1 = Issue.generate!
65 parent2 = Issue.generate! 72 parent2 = Issue.generate!
66 child = Issue.generate!(:parent_issue_id => parent1.id) 73 child = parent1.generate_child!
67
68 parent2.parent_issue_id = parent1.id 74 parent2.parent_issue_id = parent1.id
69 parent2.save! 75 parent2.save!
70 child.reload 76 child.reload
71 parent1.reload 77 parent1.reload
72 parent2.reload 78 parent2.reload
73 79 assert_equal [parent1.id, lft, lft + 5], [parent1.root_id, parent1.lft, parent1.rgt]
74 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt] 80 assert_equal [parent1.id, lft + 3, lft + 4], [parent2.root_id, parent2.lft, parent2.rgt]
75 assert_equal [parent1.id, 4, 5], [parent2.root_id, parent2.lft, parent2.rgt] 81 assert_equal [parent1.id, lft + 1, lft + 2], [child.root_id, child.lft, child.rgt]
76 assert_equal [parent1.id, 2, 3], [child.root_id, child.lft, child.rgt]
77 end 82 end
78 83
79 def test_move_a_child_to_root 84 def test_move_a_child_to_root
80 parent1 = Issue.generate! 85 lft1 = new_issue_lft
86 parent1 = Issue.generate!
87 lft2 = new_issue_lft
81 parent2 = Issue.generate! 88 parent2 = Issue.generate!
82 child = Issue.generate!(:parent_issue_id => parent1.id) 89 child = parent1.generate_child!
83
84 child.parent_issue_id = nil 90 child.parent_issue_id = nil
85 child.save! 91 child.save!
86 child.reload 92 child.reload
87 parent1.reload 93 parent1.reload
88 parent2.reload 94 parent2.reload
89 95 assert_equal [parent1.id, lft1, lft1 + 1], [parent1.root_id, parent1.lft, parent1.rgt]
90 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt] 96 assert_equal [parent2.id, lft2, lft2 + 1], [parent2.root_id, parent2.lft, parent2.rgt]
91 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt]
92 assert_equal [child.id, 1, 2], [child.root_id, child.lft, child.rgt] 97 assert_equal [child.id, 1, 2], [child.root_id, child.lft, child.rgt]
93 end 98 end
94 99
95 def test_move_a_child_to_another_issue 100 def test_move_a_child_to_another_issue
96 parent1 = Issue.generate! 101 lft1 = new_issue_lft
102 parent1 = Issue.generate!
103 lft2 = new_issue_lft
97 parent2 = Issue.generate! 104 parent2 = Issue.generate!
98 child = Issue.generate!(:parent_issue_id => parent1.id) 105 child = parent1.generate_child!
99
100 child.parent_issue_id = parent2.id 106 child.parent_issue_id = parent2.id
101 child.save! 107 child.save!
102 child.reload 108 child.reload
103 parent1.reload 109 parent1.reload
104 parent2.reload 110 parent2.reload
105 111 assert_equal [parent1.id, lft1, lft1 + 1], [parent1.root_id, parent1.lft, parent1.rgt]
106 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt] 112 assert_equal [parent2.id, lft2, lft2 + 3], [parent2.root_id, parent2.lft, parent2.rgt]
107 assert_equal [parent2.id, 1, 4], [parent2.root_id, parent2.lft, parent2.rgt] 113 assert_equal [parent2.id, lft2 + 1, lft2 + 2], [child.root_id, child.lft, child.rgt]
108 assert_equal [parent2.id, 2, 3], [child.root_id, child.lft, child.rgt]
109 end 114 end
110 115
111 def test_move_a_child_with_descendants_to_another_issue 116 def test_move_a_child_with_descendants_to_another_issue
112 parent1 = Issue.generate! 117 lft1 = new_issue_lft
118 parent1 = Issue.generate!
119 lft2 = new_issue_lft
113 parent2 = Issue.generate! 120 parent2 = Issue.generate!
114 child = Issue.generate!(:parent_issue_id => parent1.id) 121 child = parent1.generate_child!
115 grandchild = Issue.generate!(:parent_issue_id => child.id) 122 grandchild = child.generate_child!
116
117 parent1.reload 123 parent1.reload
118 parent2.reload 124 parent2.reload
119 child.reload 125 child.reload
120 grandchild.reload 126 grandchild.reload
121 127 assert_equal [parent1.id, lft1, lft1 + 5], [parent1.root_id, parent1.lft, parent1.rgt]
122 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt] 128 assert_equal [parent2.id, lft2, lft2 + 1], [parent2.root_id, parent2.lft, parent2.rgt]
123 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt] 129 assert_equal [parent1.id, lft1 + 1, lft1 + 4], [child.root_id, child.lft, child.rgt]
124 assert_equal [parent1.id, 2, 5], [child.root_id, child.lft, child.rgt] 130 assert_equal [parent1.id, lft1 + 2, lft1 + 3], [grandchild.root_id, grandchild.lft, grandchild.rgt]
125 assert_equal [parent1.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt]
126
127 child.reload.parent_issue_id = parent2.id 131 child.reload.parent_issue_id = parent2.id
128 child.save! 132 child.save!
129 child.reload 133 child.reload
130 grandchild.reload 134 grandchild.reload
131 parent1.reload 135 parent1.reload
132 parent2.reload 136 parent2.reload
133 137 assert_equal [parent1.id, lft1, lft1 + 1], [parent1.root_id, parent1.lft, parent1.rgt]
134 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt] 138 assert_equal [parent2.id, lft2, lft2 + 5], [parent2.root_id, parent2.lft, parent2.rgt]
135 assert_equal [parent2.id, 1, 6], [parent2.root_id, parent2.lft, parent2.rgt] 139 assert_equal [parent2.id, lft2 + 1, lft2 + 4], [child.root_id, child.lft, child.rgt]
136 assert_equal [parent2.id, 2, 5], [child.root_id, child.lft, child.rgt] 140 assert_equal [parent2.id, lft2 + 2, lft2 + 3], [grandchild.root_id, grandchild.lft, grandchild.rgt]
137 assert_equal [parent2.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt]
138 end 141 end
139 142
140 def test_move_a_child_with_descendants_to_another_project 143 def test_move_a_child_with_descendants_to_another_project
141 parent1 = Issue.generate! 144 lft1 = new_issue_lft
142 child = Issue.generate!(:parent_issue_id => parent1.id) 145 parent1 = Issue.generate!
143 grandchild = Issue.generate!(:parent_issue_id => child.id) 146 child = parent1.generate_child!
144 147 grandchild = child.generate_child!
145 child.reload 148 child.reload
146 child.project = Project.find(2) 149 child.project = Project.find(2)
147 assert child.save 150 assert child.save
148 child.reload 151 child.reload
149 grandchild.reload 152 grandchild.reload
150 parent1.reload 153 parent1.reload
151 154 assert_equal [1, parent1.id, lft1, lft1 + 1], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
152 assert_equal [1, parent1.id, 1, 2], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
153 assert_equal [2, child.id, 1, 4], [child.project_id, child.root_id, child.lft, child.rgt] 155 assert_equal [2, child.id, 1, 4], [child.project_id, child.root_id, child.lft, child.rgt]
154 assert_equal [2, child.id, 2, 3], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt] 156 assert_equal [2, child.id, 2, 3], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt]
155 end 157 end
156 158
157 def test_moving_an_issue_to_a_descendant_should_not_validate 159 def test_moving_an_issue_to_a_descendant_should_not_validate
158 parent1 = Issue.generate! 160 parent1 = Issue.generate!
159 parent2 = Issue.generate! 161 parent2 = Issue.generate!
160 child = Issue.generate!(:parent_issue_id => parent1.id) 162 child = parent1.generate_child!
161 grandchild = Issue.generate!(:parent_issue_id => child.id) 163 grandchild = child.generate_child!
162 164
163 child.reload 165 child.reload
164 child.parent_issue_id = grandchild.id 166 child.parent_issue_id = grandchild.id
165 assert !child.save 167 assert !child.save
166 assert_not_equal [], child.errors[:parent_issue_id] 168 assert_not_equal [], child.errors[:parent_issue_id]
200 issue.expects(:update_nested_set_attributes_on_parent_change).once 202 issue.expects(:update_nested_set_attributes_on_parent_change).once
201 issue.save! 203 issue.save!
202 end 204 end
203 205
204 def test_destroy_should_destroy_children 206 def test_destroy_should_destroy_children
207 lft1 = new_issue_lft
205 issue1 = Issue.generate! 208 issue1 = Issue.generate!
206 issue2 = Issue.generate! 209 issue2 = Issue.generate!
207 issue3 = Issue.generate!(:parent_issue_id => issue2.id) 210 issue3 = issue2.generate_child!
208 issue4 = Issue.generate!(:parent_issue_id => issue1.id) 211 issue4 = issue1.generate_child!
209
210 issue3.init_journal(User.find(2)) 212 issue3.init_journal(User.find(2))
211 issue3.subject = 'child with journal' 213 issue3.subject = 'child with journal'
212 issue3.save! 214 issue3.save!
213
214 assert_difference 'Issue.count', -2 do 215 assert_difference 'Issue.count', -2 do
215 assert_difference 'Journal.count', -1 do 216 assert_difference 'Journal.count', -1 do
216 assert_difference 'JournalDetail.count', -1 do 217 assert_difference 'JournalDetail.count', -1 do
217 Issue.find(issue2.id).destroy 218 Issue.find(issue2.id).destroy
218 end 219 end
219 end 220 end
220 end 221 end
221
222 issue1.reload 222 issue1.reload
223 issue4.reload 223 issue4.reload
224 assert !Issue.exists?(issue2.id) 224 assert !Issue.exists?(issue2.id)
225 assert !Issue.exists?(issue3.id) 225 assert !Issue.exists?(issue3.id)
226 assert_equal [issue1.id, 1, 4], [issue1.root_id, issue1.lft, issue1.rgt] 226 assert_equal [issue1.id, lft1, lft1 + 3], [issue1.root_id, issue1.lft, issue1.rgt]
227 assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt] 227 assert_equal [issue1.id, lft1 + 1, lft1 + 2], [issue4.root_id, issue4.lft, issue4.rgt]
228 end 228 end
229 229
230 def test_destroy_child_should_update_parent 230 def test_destroy_child_should_update_parent
231 lft1 = new_issue_lft
231 issue = Issue.generate! 232 issue = Issue.generate!
232 child1 = Issue.generate!(:parent_issue_id => issue.id) 233 child1 = issue.generate_child!
233 child2 = Issue.generate!(:parent_issue_id => issue.id) 234 child2 = issue.generate_child!
234
235 issue.reload 235 issue.reload
236 assert_equal [issue.id, 1, 6], [issue.root_id, issue.lft, issue.rgt] 236 assert_equal [issue.id, lft1, lft1 + 5], [issue.root_id, issue.lft, issue.rgt]
237
238 child2.reload.destroy 237 child2.reload.destroy
239
240 issue.reload 238 issue.reload
241 assert_equal [issue.id, 1, 4], [issue.root_id, issue.lft, issue.rgt] 239 assert_equal [issue.id, lft1, lft1 + 3], [issue.root_id, issue.lft, issue.rgt]
242 end 240 end
243 241
244 def test_destroy_parent_issue_updated_during_children_destroy 242 def test_destroy_parent_issue_updated_during_children_destroy
245 parent = Issue.generate! 243 parent = Issue.generate!
246 Issue.generate!(:start_date => Date.today, :parent_issue_id => parent.id) 244 parent.generate_child!(:start_date => Date.today)
247 Issue.generate!(:start_date => 2.days.from_now, :parent_issue_id => parent.id) 245 parent.generate_child!(:start_date => 2.days.from_now)
248 246
249 assert_difference 'Issue.count', -3 do 247 assert_difference 'Issue.count', -3 do
250 Issue.find(parent.id).destroy 248 Issue.find(parent.id).destroy
251 end 249 end
252 end 250 end
253 251
254 def test_destroy_child_issue_with_children 252 def test_destroy_child_issue_with_children
255 root = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'root') 253 root = Issue.generate!
256 child = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => root.id) 254 child = root.generate_child!
257 leaf = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'leaf', :parent_issue_id => child.id) 255 leaf = child.generate_child!
258 leaf.init_journal(User.find(2)) 256 leaf.init_journal(User.find(2))
259 leaf.subject = 'leaf with journal' 257 leaf.subject = 'leaf with journal'
260 leaf.save! 258 leaf.save!
261 259
262 assert_difference 'Issue.count', -2 do 260 assert_difference 'Issue.count', -2 do
270 root = Issue.find(root.id) 268 root = Issue.find(root.id)
271 assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})" 269 assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})"
272 end 270 end
273 271
274 def test_destroy_issue_with_grand_child 272 def test_destroy_issue_with_grand_child
275 parent = Issue.generate! 273 lft1 = new_issue_lft
276 issue = Issue.generate!(:parent_issue_id => parent.id) 274 parent = Issue.generate!
277 child = Issue.generate!(:parent_issue_id => issue.id) 275 issue = parent.generate_child!
278 grandchild1 = Issue.generate!(:parent_issue_id => child.id) 276 child = issue.generate_child!
279 grandchild2 = Issue.generate!(:parent_issue_id => child.id) 277 grandchild1 = child.generate_child!
280 278 grandchild2 = child.generate_child!
281 assert_difference 'Issue.count', -4 do 279 assert_difference 'Issue.count', -4 do
282 Issue.find(issue.id).destroy 280 Issue.find(issue.id).destroy
283 parent.reload 281 parent.reload
284 assert_equal [1, 2], [parent.lft, parent.rgt] 282 assert_equal [lft1, lft1 + 1], [parent.lft, parent.rgt]
285 end 283 end
286 end 284 end
287 285
288 def test_parent_priority_should_be_the_highest_child_priority 286 def test_parent_priority_should_be_the_highest_child_priority
289 parent = Issue.generate!(:priority => IssuePriority.find_by_name('Normal')) 287 parent = Issue.generate!(:priority => IssuePriority.find_by_name('Normal'))
290 # Create children 288 # Create children
291 child1 = Issue.generate!(:priority => IssuePriority.find_by_name('High'), :parent_issue_id => parent.id) 289 child1 = parent.generate_child!(:priority => IssuePriority.find_by_name('High'))
292 assert_equal 'High', parent.reload.priority.name 290 assert_equal 'High', parent.reload.priority.name
293 child2 = Issue.generate!(:priority => IssuePriority.find_by_name('Immediate'), :parent_issue_id => child1.id) 291 child2 = child1.generate_child!(:priority => IssuePriority.find_by_name('Immediate'))
294 assert_equal 'Immediate', child1.reload.priority.name 292 assert_equal 'Immediate', child1.reload.priority.name
295 assert_equal 'Immediate', parent.reload.priority.name 293 assert_equal 'Immediate', parent.reload.priority.name
296 child3 = Issue.generate!(:priority => IssuePriority.find_by_name('Low'), :parent_issue_id => parent.id) 294 child3 = parent.generate_child!(:priority => IssuePriority.find_by_name('Low'))
297 assert_equal 'Immediate', parent.reload.priority.name 295 assert_equal 'Immediate', parent.reload.priority.name
298 # Destroy a child 296 # Destroy a child
299 child1.destroy 297 child1.destroy
300 assert_equal 'Low', parent.reload.priority.name 298 assert_equal 'Low', parent.reload.priority.name
301 # Update a child 299 # Update a child
304 assert_equal 'Normal', parent.reload.priority.name 302 assert_equal 'Normal', parent.reload.priority.name
305 end 303 end
306 304
307 def test_parent_dates_should_be_lowest_start_and_highest_due_dates 305 def test_parent_dates_should_be_lowest_start_and_highest_due_dates
308 parent = Issue.generate! 306 parent = Issue.generate!
309 Issue.generate!(:start_date => '2010-01-25', :due_date => '2010-02-15', :parent_issue_id => parent.id) 307 parent.generate_child!(:start_date => '2010-01-25', :due_date => '2010-02-15')
310 Issue.generate!( :due_date => '2010-02-13', :parent_issue_id => parent.id) 308 parent.generate_child!( :due_date => '2010-02-13')
311 Issue.generate!(:start_date => '2010-02-01', :due_date => '2010-02-22', :parent_issue_id => parent.id) 309 parent.generate_child!(:start_date => '2010-02-01', :due_date => '2010-02-22')
312 parent.reload 310 parent.reload
313 assert_equal Date.parse('2010-01-25'), parent.start_date 311 assert_equal Date.parse('2010-01-25'), parent.start_date
314 assert_equal Date.parse('2010-02-22'), parent.due_date 312 assert_equal Date.parse('2010-02-22'), parent.due_date
315 end 313 end
316 314
317 def test_parent_done_ratio_should_be_average_done_ratio_of_leaves 315 def test_parent_done_ratio_should_be_average_done_ratio_of_leaves
318 parent = Issue.generate! 316 parent = Issue.generate!
319 Issue.generate!(:done_ratio => 20, :parent_issue_id => parent.id) 317 parent.generate_child!(:done_ratio => 20)
320 assert_equal 20, parent.reload.done_ratio 318 assert_equal 20, parent.reload.done_ratio
321 Issue.generate!(:done_ratio => 70, :parent_issue_id => parent.id) 319 parent.generate_child!(:done_ratio => 70)
322 assert_equal 45, parent.reload.done_ratio 320 assert_equal 45, parent.reload.done_ratio
323 321
324 child = Issue.generate!(:done_ratio => 0, :parent_issue_id => parent.id) 322 child = parent.generate_child!(:done_ratio => 0)
325 assert_equal 30, parent.reload.done_ratio 323 assert_equal 30, parent.reload.done_ratio
326 324
327 Issue.generate!(:done_ratio => 30, :parent_issue_id => child.id) 325 child.generate_child!(:done_ratio => 30)
328 assert_equal 30, child.reload.done_ratio 326 assert_equal 30, child.reload.done_ratio
329 assert_equal 40, parent.reload.done_ratio 327 assert_equal 40, parent.reload.done_ratio
330 end 328 end
331 329
332 def test_parent_done_ratio_should_be_weighted_by_estimated_times_if_any 330 def test_parent_done_ratio_should_be_weighted_by_estimated_times_if_any
333 parent = Issue.generate! 331 parent = Issue.generate!
334 Issue.generate!(:estimated_hours => 10, :done_ratio => 20, :parent_issue_id => parent.id) 332 parent.generate_child!(:estimated_hours => 10, :done_ratio => 20)
335 assert_equal 20, parent.reload.done_ratio 333 assert_equal 20, parent.reload.done_ratio
336 Issue.generate!(:estimated_hours => 20, :done_ratio => 50, :parent_issue_id => parent.id) 334 parent.generate_child!(:estimated_hours => 20, :done_ratio => 50)
337 assert_equal (50 * 20 + 20 * 10) / 30, parent.reload.done_ratio 335 assert_equal (50 * 20 + 20 * 10) / 30, parent.reload.done_ratio
338 end 336 end
339 337
340 def test_parent_done_ratio_with_child_estimate_to_0_should_reach_100 338 def test_parent_done_ratio_with_child_estimate_to_0_should_reach_100
341 parent = Issue.generate! 339 parent = Issue.generate!
342 issue1 = Issue.generate!(:parent_issue_id => parent.id) 340 issue1 = parent.generate_child!
343 issue2 = Issue.generate!(:parent_issue_id => parent.id, :estimated_hours => 0) 341 issue2 = parent.generate_child!(:estimated_hours => 0)
344 assert_equal 0, parent.reload.done_ratio 342 assert_equal 0, parent.reload.done_ratio
345 issue1.reload.update_attribute :status_id, 5 343 issue1.reload.close!
346 assert_equal 50, parent.reload.done_ratio 344 assert_equal 50, parent.reload.done_ratio
347 issue2.reload.update_attribute :status_id, 5 345 issue2.reload.close!
348 assert_equal 100, parent.reload.done_ratio 346 assert_equal 100, parent.reload.done_ratio
349 end 347 end
350 348
351 def test_parent_estimate_should_be_sum_of_leaves 349 def test_parent_estimate_should_be_sum_of_leaves
352 parent = Issue.generate! 350 parent = Issue.generate!
353 Issue.generate!(:estimated_hours => nil, :parent_issue_id => parent.id) 351 parent.generate_child!(:estimated_hours => nil)
354 assert_equal nil, parent.reload.estimated_hours 352 assert_equal nil, parent.reload.estimated_hours
355 Issue.generate!(:estimated_hours => 5, :parent_issue_id => parent.id) 353 parent.generate_child!(:estimated_hours => 5)
356 assert_equal 5, parent.reload.estimated_hours 354 assert_equal 5, parent.reload.estimated_hours
357 Issue.generate!(:estimated_hours => 7, :parent_issue_id => parent.id) 355 parent.generate_child!(:estimated_hours => 7)
358 assert_equal 12, parent.reload.estimated_hours 356 assert_equal 12, parent.reload.estimated_hours
359 end 357 end
360 358
359 def test_done_ratio_of_parent_with_a_child_without_estimated_time_should_not_exceed_100
360 parent = Issue.generate!
361 parent.generate_child!(:estimated_hours => 40)
362 parent.generate_child!(:estimated_hours => 40)
363 parent.generate_child!(:estimated_hours => 20)
364 parent.generate_child!
365 parent.reload.children.each(&:close!)
366 assert_equal 100, parent.reload.done_ratio
367 end
368
361 def test_done_ratio_of_parent_with_a_child_with_estimated_time_at_0_should_not_exceed_100 369 def test_done_ratio_of_parent_with_a_child_with_estimated_time_at_0_should_not_exceed_100
362 parent = Issue.generate! 370 parent = Issue.generate!
363 Issue.generate!(:estimated_hours => 40, :parent_issue_id => parent.id) 371 parent.generate_child!(:estimated_hours => 40)
364 Issue.generate!(:estimated_hours => 40, :parent_issue_id => parent.id) 372 parent.generate_child!(:estimated_hours => 40)
365 Issue.generate!(:estimated_hours => 20, :parent_issue_id => parent.id) 373 parent.generate_child!(:estimated_hours => 20)
366 Issue.generate!(:estimated_hours => 0, :parent_issue_id => parent.id) 374 parent.generate_child!(:estimated_hours => 0)
367 parent.reload.children.each do |child| 375 parent.reload.children.each(&:close!)
368 child.update_attribute :status_id, 5
369 end
370 assert_equal 100, parent.reload.done_ratio 376 assert_equal 100, parent.reload.done_ratio
371 end 377 end
372 378
373 def test_move_parent_updates_old_parent_attributes 379 def test_move_parent_updates_old_parent_attributes
374 first_parent = Issue.generate! 380 first_parent = Issue.generate!
375 second_parent = Issue.generate! 381 second_parent = Issue.generate!
376 child = Issue.generate!(:estimated_hours => 5, :parent_issue_id => first_parent.id) 382 child = first_parent.generate_child!(:estimated_hours => 5)
377 assert_equal 5, first_parent.reload.estimated_hours 383 assert_equal 5, first_parent.reload.estimated_hours
378 child.update_attributes(:estimated_hours => 7, :parent_issue_id => second_parent.id) 384 child.update_attributes(:estimated_hours => 7, :parent_issue_id => second_parent.id)
379 assert_equal 7, second_parent.reload.estimated_hours 385 assert_equal 7, second_parent.reload.estimated_hours
380 assert_nil first_parent.reload.estimated_hours 386 assert_nil first_parent.reload.estimated_hours
381 end 387 end
382 388
383 def test_reschuling_a_parent_should_reschedule_subtasks 389 def test_reschuling_a_parent_should_reschedule_subtasks
384 parent = Issue.generate! 390 parent = Issue.generate!
385 c1 = Issue.generate!(:start_date => '2010-05-12', :due_date => '2010-05-18', :parent_issue_id => parent.id) 391 c1 = parent.generate_child!(:start_date => '2010-05-12', :due_date => '2010-05-18')
386 c2 = Issue.generate!(:start_date => '2010-06-03', :due_date => '2010-06-10', :parent_issue_id => parent.id) 392 c2 = parent.generate_child!(:start_date => '2010-06-03', :due_date => '2010-06-10')
387 parent.reload 393 parent.reload
388 parent.reschedule_on!(Date.parse('2010-06-02')) 394 parent.reschedule_on!(Date.parse('2010-06-02'))
389 c1.reload 395 c1.reload
390 assert_equal [Date.parse('2010-06-02'), Date.parse('2010-06-08')], [c1.start_date, c1.due_date] 396 assert_equal [Date.parse('2010-06-02'), Date.parse('2010-06-08')], [c1.start_date, c1.due_date]
391 c2.reload 397 c2.reload
395 end 401 end
396 402
397 def test_project_copy_should_copy_issue_tree 403 def test_project_copy_should_copy_issue_tree
398 p = Project.create!(:name => 'Tree copy', :identifier => 'tree-copy', :tracker_ids => [1, 2]) 404 p = Project.create!(:name => 'Tree copy', :identifier => 'tree-copy', :tracker_ids => [1, 2])
399 i1 = Issue.generate!(:project => p, :subject => 'i1') 405 i1 = Issue.generate!(:project => p, :subject => 'i1')
400 i2 = Issue.generate!(:project => p, :subject => 'i2', :parent_issue_id => i1.id) 406 i2 = i1.generate_child!(:project => p, :subject => 'i2')
401 i3 = Issue.generate!(:project => p, :subject => 'i3', :parent_issue_id => i1.id) 407 i3 = i1.generate_child!(:project => p, :subject => 'i3')
402 i4 = Issue.generate!(:project => p, :subject => 'i4', :parent_issue_id => i2.id) 408 i4 = i2.generate_child!(:project => p, :subject => 'i4')
403 i5 = Issue.generate!(:project => p, :subject => 'i5') 409 i5 = Issue.generate!(:project => p, :subject => 'i5')
404 c = Project.new(:name => 'Copy', :identifier => 'copy', :tracker_ids => [1, 2]) 410 c = Project.new(:name => 'Copy', :identifier => 'copy', :tracker_ids => [1, 2])
405 c.copy(p, :only => 'issues') 411 c.copy(p, :only => 'issues')
406 c.reload 412 c.reload
407 413