##// END OF EJS Templates
Rails3: test: replace deprecated errors.on at test_moving_an_issue_to_a_descendant_should_not_validate of unit/issue_nested_set_test.rb...
Toshi MARUYAMA -
r7497:6ebb5e834ceb
parent child
Show More
@@ -1,381 +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 54 child = Issue.new(:project_id => 2, :tracker_id => 1, :author_id => 1,
55 55 :subject => 'child', :parent_issue_id => issue.id)
56 56 assert !child.save
57 57 assert_not_nil child.errors[:parent_issue_id]
58 58 end
59 59
60 60 def test_move_a_root_to_child
61 61 parent1 = create_issue!
62 62 parent2 = create_issue!
63 63 child = create_issue!(:parent_issue_id => parent1.id)
64 64
65 65 parent2.parent_issue_id = parent1.id
66 66 parent2.save!
67 67 child.reload
68 68 parent1.reload
69 69 parent2.reload
70 70
71 71 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt]
72 72 assert_equal [parent1.id, 4, 5], [parent2.root_id, parent2.lft, parent2.rgt]
73 73 assert_equal [parent1.id, 2, 3], [child.root_id, child.lft, child.rgt]
74 74 end
75 75
76 76 def test_move_a_child_to_root
77 77 parent1 = create_issue!
78 78 parent2 = create_issue!
79 79 child = create_issue!(:parent_issue_id => parent1.id)
80 80
81 81 child.parent_issue_id = nil
82 82 child.save!
83 83 child.reload
84 84 parent1.reload
85 85 parent2.reload
86 86
87 87 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt]
88 88 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt]
89 89 assert_equal [child.id, 1, 2], [child.root_id, child.lft, child.rgt]
90 90 end
91 91
92 92 def test_move_a_child_to_another_issue
93 93 parent1 = create_issue!
94 94 parent2 = create_issue!
95 95 child = create_issue!(:parent_issue_id => parent1.id)
96 96
97 97 child.parent_issue_id = parent2.id
98 98 child.save!
99 99 child.reload
100 100 parent1.reload
101 101 parent2.reload
102 102
103 103 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt]
104 104 assert_equal [parent2.id, 1, 4], [parent2.root_id, parent2.lft, parent2.rgt]
105 105 assert_equal [parent2.id, 2, 3], [child.root_id, child.lft, child.rgt]
106 106 end
107 107
108 108 def test_move_a_child_with_descendants_to_another_issue
109 109 parent1 = create_issue!
110 110 parent2 = create_issue!
111 111 child = create_issue!(:parent_issue_id => parent1.id)
112 112 grandchild = create_issue!(:parent_issue_id => child.id)
113 113
114 114 parent1.reload
115 115 parent2.reload
116 116 child.reload
117 117 grandchild.reload
118 118
119 119 assert_equal [parent1.id, 1, 6], [parent1.root_id, parent1.lft, parent1.rgt]
120 120 assert_equal [parent2.id, 1, 2], [parent2.root_id, parent2.lft, parent2.rgt]
121 121 assert_equal [parent1.id, 2, 5], [child.root_id, child.lft, child.rgt]
122 122 assert_equal [parent1.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt]
123 123
124 124 child.reload.parent_issue_id = parent2.id
125 125 child.save!
126 126 child.reload
127 127 grandchild.reload
128 128 parent1.reload
129 129 parent2.reload
130 130
131 131 assert_equal [parent1.id, 1, 2], [parent1.root_id, parent1.lft, parent1.rgt]
132 132 assert_equal [parent2.id, 1, 6], [parent2.root_id, parent2.lft, parent2.rgt]
133 133 assert_equal [parent2.id, 2, 5], [child.root_id, child.lft, child.rgt]
134 134 assert_equal [parent2.id, 3, 4], [grandchild.root_id, grandchild.lft, grandchild.rgt]
135 135 end
136 136
137 137 def test_move_a_child_with_descendants_to_another_project
138 138 parent1 = create_issue!
139 139 child = create_issue!(:parent_issue_id => parent1.id)
140 140 grandchild = create_issue!(:parent_issue_id => child.id)
141 141
142 142 assert child.reload.move_to_project(Project.find(2))
143 143 child.reload
144 144 grandchild.reload
145 145 parent1.reload
146 146
147 147 assert_equal [1, parent1.id, 1, 2], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
148 148 assert_equal [2, child.id, 1, 4], [child.project_id, child.root_id, child.lft, child.rgt]
149 149 assert_equal [2, child.id, 2, 3], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt]
150 150 end
151 151
152 152 def test_invalid_move_to_another_project
153 153 parent1 = create_issue!
154 154 child = create_issue!(:parent_issue_id => parent1.id)
155 155 grandchild = create_issue!(:parent_issue_id => child.id, :tracker_id => 2)
156 156 Project.find(2).tracker_ids = [1]
157 157
158 158 parent1.reload
159 159 assert_equal [1, parent1.id, 1, 6], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
160 160
161 161 # child can not be moved to Project 2 because its child is on a disabled tracker
162 162 assert_equal false, Issue.find(child.id).move_to_project(Project.find(2))
163 163 child.reload
164 164 grandchild.reload
165 165 parent1.reload
166 166
167 167 # no change
168 168 assert_equal [1, parent1.id, 1, 6], [parent1.project_id, parent1.root_id, parent1.lft, parent1.rgt]
169 169 assert_equal [1, parent1.id, 2, 5], [child.project_id, child.root_id, child.lft, child.rgt]
170 170 assert_equal [1, parent1.id, 3, 4], [grandchild.project_id, grandchild.root_id, grandchild.lft, grandchild.rgt]
171 171 end
172 172
173 173 def test_moving_an_issue_to_a_descendant_should_not_validate
174 174 parent1 = create_issue!
175 175 parent2 = create_issue!
176 176 child = create_issue!(:parent_issue_id => parent1.id)
177 177 grandchild = create_issue!(:parent_issue_id => child.id)
178 178
179 179 child.reload
180 180 child.parent_issue_id = grandchild.id
181 181 assert !child.save
182 assert_not_nil child.errors.on(:parent_issue_id)
182 assert_not_nil child.errors[:parent_issue_id]
183 183 end
184 184
185 185 def test_moving_an_issue_should_keep_valid_relations_only
186 186 issue1 = create_issue!
187 187 issue2 = create_issue!
188 188 issue3 = create_issue!(:parent_issue_id => issue2.id)
189 189 issue4 = create_issue!
190 190 r1 = IssueRelation.create!(:issue_from => issue1, :issue_to => issue2, :relation_type => IssueRelation::TYPE_PRECEDES)
191 191 r2 = IssueRelation.create!(:issue_from => issue1, :issue_to => issue3, :relation_type => IssueRelation::TYPE_PRECEDES)
192 192 r3 = IssueRelation.create!(:issue_from => issue2, :issue_to => issue4, :relation_type => IssueRelation::TYPE_PRECEDES)
193 193 issue2.reload
194 194 issue2.parent_issue_id = issue1.id
195 195 issue2.save!
196 196 assert !IssueRelation.exists?(r1.id)
197 197 assert !IssueRelation.exists?(r2.id)
198 198 assert IssueRelation.exists?(r3.id)
199 199 end
200 200
201 201 def test_destroy_should_destroy_children
202 202 issue1 = create_issue!
203 203 issue2 = create_issue!
204 204 issue3 = create_issue!(:parent_issue_id => issue2.id)
205 205 issue4 = create_issue!(:parent_issue_id => issue1.id)
206 206
207 207 issue3.init_journal(User.find(2))
208 208 issue3.subject = 'child with journal'
209 209 issue3.save!
210 210
211 211 assert_difference 'Issue.count', -2 do
212 212 assert_difference 'Journal.count', -1 do
213 213 assert_difference 'JournalDetail.count', -1 do
214 214 Issue.find(issue2.id).destroy
215 215 end
216 216 end
217 217 end
218 218
219 219 issue1.reload
220 220 issue4.reload
221 221 assert !Issue.exists?(issue2.id)
222 222 assert !Issue.exists?(issue3.id)
223 223 assert_equal [issue1.id, 1, 4], [issue1.root_id, issue1.lft, issue1.rgt]
224 224 assert_equal [issue1.id, 2, 3], [issue4.root_id, issue4.lft, issue4.rgt]
225 225 end
226 226
227 227 def test_destroy_parent_issue_updated_during_children_destroy
228 228 parent = create_issue!
229 229 create_issue!(:start_date => Date.today, :parent_issue_id => parent.id)
230 230 create_issue!(:start_date => 2.days.from_now, :parent_issue_id => parent.id)
231 231
232 232 assert_difference 'Issue.count', -3 do
233 233 Issue.find(parent.id).destroy
234 234 end
235 235 end
236 236
237 237 def test_destroy_child_issue_with_children
238 238 root = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'root')
239 239 child = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => root.id)
240 240 leaf = Issue.create!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'leaf', :parent_issue_id => child.id)
241 241 leaf.init_journal(User.find(2))
242 242 leaf.subject = 'leaf with journal'
243 243 leaf.save!
244 244
245 245 assert_difference 'Issue.count', -2 do
246 246 assert_difference 'Journal.count', -1 do
247 247 assert_difference 'JournalDetail.count', -1 do
248 248 Issue.find(child.id).destroy
249 249 end
250 250 end
251 251 end
252 252
253 253 root = Issue.find(root.id)
254 254 assert root.leaf?, "Root issue is not a leaf (lft: #{root.lft}, rgt: #{root.rgt})"
255 255 end
256 256
257 257 def test_destroy_issue_with_grand_child
258 258 parent = create_issue!
259 259 issue = create_issue!(:parent_issue_id => parent.id)
260 260 child = create_issue!(:parent_issue_id => issue.id)
261 261 grandchild1 = create_issue!(:parent_issue_id => child.id)
262 262 grandchild2 = create_issue!(:parent_issue_id => child.id)
263 263
264 264 assert_difference 'Issue.count', -4 do
265 265 Issue.find(issue.id).destroy
266 266 parent.reload
267 267 assert_equal [1, 2], [parent.lft, parent.rgt]
268 268 end
269 269 end
270 270
271 271 def test_parent_priority_should_be_the_highest_child_priority
272 272 parent = create_issue!(:priority => IssuePriority.find_by_name('Normal'))
273 273 # Create children
274 274 child1 = create_issue!(:priority => IssuePriority.find_by_name('High'), :parent_issue_id => parent.id)
275 275 assert_equal 'High', parent.reload.priority.name
276 276 child2 = create_issue!(:priority => IssuePriority.find_by_name('Immediate'), :parent_issue_id => child1.id)
277 277 assert_equal 'Immediate', child1.reload.priority.name
278 278 assert_equal 'Immediate', parent.reload.priority.name
279 279 child3 = create_issue!(:priority => IssuePriority.find_by_name('Low'), :parent_issue_id => parent.id)
280 280 assert_equal 'Immediate', parent.reload.priority.name
281 281 # Destroy a child
282 282 child1.destroy
283 283 assert_equal 'Low', parent.reload.priority.name
284 284 # Update a child
285 285 child3.reload.priority = IssuePriority.find_by_name('Normal')
286 286 child3.save!
287 287 assert_equal 'Normal', parent.reload.priority.name
288 288 end
289 289
290 290 def test_parent_dates_should_be_lowest_start_and_highest_due_dates
291 291 parent = create_issue!
292 292 create_issue!(:start_date => '2010-01-25', :due_date => '2010-02-15', :parent_issue_id => parent.id)
293 293 create_issue!( :due_date => '2010-02-13', :parent_issue_id => parent.id)
294 294 create_issue!(:start_date => '2010-02-01', :due_date => '2010-02-22', :parent_issue_id => parent.id)
295 295 parent.reload
296 296 assert_equal Date.parse('2010-01-25'), parent.start_date
297 297 assert_equal Date.parse('2010-02-22'), parent.due_date
298 298 end
299 299
300 300 def test_parent_done_ratio_should_be_average_done_ratio_of_leaves
301 301 parent = create_issue!
302 302 create_issue!(:done_ratio => 20, :parent_issue_id => parent.id)
303 303 assert_equal 20, parent.reload.done_ratio
304 304 create_issue!(:done_ratio => 70, :parent_issue_id => parent.id)
305 305 assert_equal 45, parent.reload.done_ratio
306 306
307 307 child = create_issue!(:done_ratio => 0, :parent_issue_id => parent.id)
308 308 assert_equal 30, parent.reload.done_ratio
309 309
310 310 create_issue!(:done_ratio => 30, :parent_issue_id => child.id)
311 311 assert_equal 30, child.reload.done_ratio
312 312 assert_equal 40, parent.reload.done_ratio
313 313 end
314 314
315 315 def test_parent_done_ratio_should_be_weighted_by_estimated_times_if_any
316 316 parent = create_issue!
317 317 create_issue!(:estimated_hours => 10, :done_ratio => 20, :parent_issue_id => parent.id)
318 318 assert_equal 20, parent.reload.done_ratio
319 319 create_issue!(:estimated_hours => 20, :done_ratio => 50, :parent_issue_id => parent.id)
320 320 assert_equal (50 * 20 + 20 * 10) / 30, parent.reload.done_ratio
321 321 end
322 322
323 323 def test_parent_estimate_should_be_sum_of_leaves
324 324 parent = create_issue!
325 325 create_issue!(:estimated_hours => nil, :parent_issue_id => parent.id)
326 326 assert_equal nil, parent.reload.estimated_hours
327 327 create_issue!(:estimated_hours => 5, :parent_issue_id => parent.id)
328 328 assert_equal 5, parent.reload.estimated_hours
329 329 create_issue!(:estimated_hours => 7, :parent_issue_id => parent.id)
330 330 assert_equal 12, parent.reload.estimated_hours
331 331 end
332 332
333 333 def test_move_parent_updates_old_parent_attributes
334 334 first_parent = create_issue!
335 335 second_parent = create_issue!
336 336 child = create_issue!(:estimated_hours => 5, :parent_issue_id => first_parent.id)
337 337 assert_equal 5, first_parent.reload.estimated_hours
338 338 child.update_attributes(:estimated_hours => 7, :parent_issue_id => second_parent.id)
339 339 assert_equal 7, second_parent.reload.estimated_hours
340 340 assert_nil first_parent.reload.estimated_hours
341 341 end
342 342
343 343 def test_reschuling_a_parent_should_reschedule_subtasks
344 344 parent = create_issue!
345 345 c1 = create_issue!(:start_date => '2010-05-12', :due_date => '2010-05-18', :parent_issue_id => parent.id)
346 346 c2 = create_issue!(:start_date => '2010-06-03', :due_date => '2010-06-10', :parent_issue_id => parent.id)
347 347 parent.reload
348 348 parent.reschedule_after(Date.parse('2010-06-02'))
349 349 c1.reload
350 350 assert_equal [Date.parse('2010-06-02'), Date.parse('2010-06-08')], [c1.start_date, c1.due_date]
351 351 c2.reload
352 352 assert_equal [Date.parse('2010-06-03'), Date.parse('2010-06-10')], [c2.start_date, c2.due_date] # no change
353 353 parent.reload
354 354 assert_equal [Date.parse('2010-06-02'), Date.parse('2010-06-10')], [parent.start_date, parent.due_date]
355 355 end
356 356
357 357 def test_project_copy_should_copy_issue_tree
358 358 p = Project.create!(:name => 'Tree copy', :identifier => 'tree-copy', :tracker_ids => [1, 2])
359 359 i1 = create_issue!(:project_id => p.id, :subject => 'i1')
360 360 i2 = create_issue!(:project_id => p.id, :subject => 'i2', :parent_issue_id => i1.id)
361 361 i3 = create_issue!(:project_id => p.id, :subject => 'i3', :parent_issue_id => i1.id)
362 362 i4 = create_issue!(:project_id => p.id, :subject => 'i4', :parent_issue_id => i2.id)
363 363 i5 = create_issue!(:project_id => p.id, :subject => 'i5')
364 364 c = Project.new(:name => 'Copy', :identifier => 'copy', :tracker_ids => [1, 2])
365 365 c.copy(p, :only => 'issues')
366 366 c.reload
367 367
368 368 assert_equal 5, c.issues.count
369 369 ic1, ic2, ic3, ic4, ic5 = c.issues.find(:all, :order => 'subject')
370 370 assert ic1.root?
371 371 assert_equal ic1, ic2.parent
372 372 assert_equal ic1, ic3.parent
373 373 assert_equal ic2, ic4.parent
374 374 assert ic5.root?
375 375 end
376 376
377 377 # Helper that creates an issue with default attributes
378 378 def create_issue!(attributes={})
379 379 Issue.create!({:project_id => 1, :tracker_id => 1, :author_id => 1, :subject => 'test'}.merge(attributes))
380 380 end
381 381 end
General Comments 0
You need to be logged in to leave comments. Login now