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