##// END OF EJS Templates
remove unneeded instance variable assignment from ProjectNestedSetTest...
Toshi MARUYAMA -
r13066:bfe7997e38cc
parent child
Show More
@@ -1,183 +1,181
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 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 ProjectNestedSetTest < ActiveSupport::TestCase
21 21
22 22 def setup
23 23 Project.delete_all
24 24
25 25 @a = Project.create!(:name => 'A', :identifier => 'projecta')
26 26 @a1 = Project.create!(:name => 'A1', :identifier => 'projecta1')
27 27 @a1.set_parent!(@a)
28 28 @a2 = Project.create!(:name => 'A2', :identifier => 'projecta2')
29 29 @a2.set_parent!(@a)
30 30
31 31 @c = Project.create!(:name => 'C', :identifier => 'projectc')
32 32 @c1 = Project.create!(:name => 'C1', :identifier => 'projectc1')
33 33 @c1.set_parent!(@c)
34 34
35 35 @b = Project.create!(:name => 'B', :identifier => 'projectb')
36 36 @b2 = Project.create!(:name => 'B2', :identifier => 'projectb2')
37 37 @b2.set_parent!(@b)
38 38 @b1 = Project.create!(:name => 'B1', :identifier => 'projectb1')
39 39 @b1.set_parent!(@b)
40 40 @b11 = Project.create!(:name => 'B11', :identifier => 'projectb11')
41 41 @b11.set_parent!(@b1)
42
43 @a, @a1, @a2, @b, @b1, @b11, @b2, @c, @c1 = *(Project.all.sort_by(&:name))
44 42 end
45 43
46 44 def test_valid_tree
47 45 assert_valid_nested_set
48 46 end
49 47
50 48 def test_rebuild_should_build_valid_tree
51 49 Project.update_all "lft = NULL, rgt = NULL"
52 50
53 51 Project.rebuild_tree!
54 52 assert_valid_nested_set
55 53 end
56 54
57 55 def test_rebuild_tree_should_build_valid_tree_even_with_valid_lft_rgt_values
58 56 Project.where({:id => @a.id }).update_all("name = 'YY'")
59 57 # lft and rgt values are still valid (Project.rebuild! would not update anything)
60 58 # but projects are not ordered properly (YY is in the first place)
61 59
62 60 Project.rebuild_tree!
63 61 assert_valid_nested_set
64 62 end
65 63
66 64 def test_moving_a_child_to_a_different_parent_should_keep_valid_tree
67 65 assert_no_difference 'Project.count' do
68 66 Project.find_by_name('B1').set_parent!(Project.find_by_name('A2'))
69 67 end
70 68 assert_valid_nested_set
71 69 end
72 70
73 71 def test_renaming_a_root_to_first_position_should_update_nested_set_order
74 72 @c.name = '1'
75 73 @c.save!
76 74 assert_valid_nested_set
77 75 end
78 76
79 77 def test_renaming_a_root_to_middle_position_should_update_nested_set_order
80 78 @a.name = 'BA'
81 79 @a.save!
82 80 assert_valid_nested_set
83 81 end
84 82
85 83 def test_renaming_a_root_to_last_position_should_update_nested_set_order
86 84 @a.name = 'D'
87 85 @a.save!
88 86 assert_valid_nested_set
89 87 end
90 88
91 89 def test_renaming_a_root_to_same_position_should_update_nested_set_order
92 90 @c.name = 'D'
93 91 @c.save!
94 92 assert_valid_nested_set
95 93 end
96 94
97 95 def test_renaming_a_child_should_update_nested_set_order
98 96 @a1.name = 'A3'
99 97 @a1.save!
100 98 assert_valid_nested_set
101 99 end
102 100
103 101 def test_renaming_a_child_with_child_should_update_nested_set_order
104 102 @b1.name = 'B3'
105 103 @b1.save!
106 104 assert_valid_nested_set
107 105 end
108 106
109 107 def test_adding_a_root_to_first_position_should_update_nested_set_order
110 108 project = Project.create!(:name => '1', :identifier => 'projectba')
111 109 assert_valid_nested_set
112 110 end
113 111
114 112 def test_adding_a_root_to_middle_position_should_update_nested_set_order
115 113 project = Project.create!(:name => 'BA', :identifier => 'projectba')
116 114 assert_valid_nested_set
117 115 end
118 116
119 117 def test_adding_a_root_to_last_position_should_update_nested_set_order
120 118 project = Project.create!(:name => 'Z', :identifier => 'projectba')
121 119 assert_valid_nested_set
122 120 end
123 121
124 122 def test_destroying_a_root_with_children_should_keep_valid_tree
125 123 assert_difference 'Project.count', -4 do
126 124 Project.find_by_name('B').destroy
127 125 end
128 126 assert_valid_nested_set
129 127 end
130 128
131 129 def test_destroying_a_child_with_children_should_keep_valid_tree
132 130 assert_difference 'Project.count', -2 do
133 131 Project.find_by_name('B1').destroy
134 132 end
135 133 assert_valid_nested_set
136 134 end
137 135
138 136 private
139 137
140 138 def assert_nested_set_values(h)
141 139 assert Project.valid?
142 140 h.each do |project, expected|
143 141 project.reload
144 142 assert_equal expected, [project.parent_id, project.lft, project.rgt], "Unexpected nested set values for #{project.name}"
145 143 end
146 144 end
147 145
148 146 def assert_valid_nested_set
149 147 projects = Project.all
150 148 lft_rgt = projects.map {|p| [p.lft, p.rgt]}.flatten
151 149 assert_equal projects.size * 2, lft_rgt.uniq.size
152 150 assert_equal 1, lft_rgt.min
153 151 assert_equal projects.size * 2, lft_rgt.max
154 152
155 153 projects.each do |project|
156 154 # lft should always be < rgt
157 155 assert project.lft < project.rgt, "lft=#{project.lft} was not < rgt=#{project.rgt} for project #{project.name}"
158 156 if project.parent_id
159 157 # child lft/rgt values must be greater/lower
160 158 assert_not_nil project.parent, "parent was nil for project #{project.name}"
161 159 assert project.lft > project.parent.lft, "lft=#{project.lft} was not > parent.lft=#{project.parent.lft} for project #{project.name}"
162 160 assert project.rgt < project.parent.rgt, "rgt=#{project.rgt} was not < parent.rgt=#{project.parent.rgt} for project #{project.name}"
163 161 end
164 162 # no overlapping lft/rgt values
165 163 overlapping = projects.detect {|other|
166 164 other != project && (
167 165 (other.lft > project.lft && other.lft < project.rgt && other.rgt > project.rgt) ||
168 166 (other.rgt > project.lft && other.rgt < project.rgt && other.lft < project.lft)
169 167 )
170 168 }
171 169 assert_nil overlapping, (overlapping && "Project #{overlapping.name} (#{overlapping.lft}/#{overlapping.rgt}) overlapped #{project.name} (#{project.lft}/#{project.rgt})")
172 170 end
173 171
174 172 # root projects sorted alphabetically
175 173 assert_equal Project.roots.map(&:name).sort, Project.roots.sort_by(&:lft).map(&:name), "Root projects were not properly sorted"
176 174 projects.each do |project|
177 175 if project.children.any?
178 176 # sibling projects sorted alphabetically
179 177 assert_equal project.children.map(&:name).sort, project.children.sort_by(&:lft).map(&:name), "Project #{project.name}'s children were not properly sorted"
180 178 end
181 179 end
182 180 end
183 181 end
General Comments 0
You need to be logged in to leave comments. Login now