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