Chris@1295
|
1 # Redmine - project management software
|
Chris@1295
|
2 # Copyright (C) 2006-2013 Jean-Philippe Lang
|
Chris@1295
|
3 #
|
Chris@1295
|
4 # This program is free software; you can redistribute it and/or
|
Chris@1295
|
5 # modify it under the terms of the GNU General Public License
|
Chris@1295
|
6 # as published by the Free Software Foundation; either version 2
|
Chris@1295
|
7 # of the License, or (at your option) any later version.
|
Chris@1295
|
8 #
|
Chris@1295
|
9 # This program is distributed in the hope that it will be useful,
|
Chris@1295
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
Chris@1295
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
Chris@1295
|
12 # GNU General Public License for more details.
|
Chris@1295
|
13 #
|
Chris@1295
|
14 # You should have received a copy of the GNU General Public License
|
Chris@1295
|
15 # along with this program; if not, write to the Free Software
|
Chris@1295
|
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Chris@1295
|
17
|
Chris@1295
|
18 require File.expand_path('../../test_helper', __FILE__)
|
Chris@1295
|
19
|
Chris@1295
|
20 class ProjectMembersInheritanceTest < ActiveSupport::TestCase
|
Chris@1295
|
21 fixtures :roles, :users
|
Chris@1295
|
22
|
Chris@1295
|
23 def setup
|
Chris@1295
|
24 @parent = Project.generate!
|
Chris@1295
|
25 @member = Member.create!(:principal => User.find(2), :project => @parent, :role_ids => [1, 2])
|
Chris@1295
|
26 assert_equal 2, @member.reload.roles.size
|
Chris@1295
|
27 end
|
Chris@1295
|
28
|
Chris@1295
|
29 def test_project_created_with_inherit_members_disabled_should_not_inherit_members
|
Chris@1295
|
30 assert_no_difference 'Member.count' do
|
Chris@1295
|
31 project = Project.generate_with_parent!(@parent, :inherit_members => false)
|
Chris@1295
|
32
|
Chris@1295
|
33 assert_equal 0, project.memberships.count
|
Chris@1295
|
34 end
|
Chris@1295
|
35 end
|
Chris@1295
|
36
|
Chris@1295
|
37 def test_project_created_with_inherit_members_should_inherit_members
|
Chris@1295
|
38 assert_difference 'Member.count', 1 do
|
Chris@1295
|
39 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
40 project.reload
|
Chris@1295
|
41
|
Chris@1295
|
42 assert_equal 1, project.memberships.count
|
Chris@1295
|
43 member = project.memberships.first
|
Chris@1295
|
44 assert_equal @member.principal, member.principal
|
Chris@1295
|
45 assert_equal @member.roles.sort, member.roles.sort
|
Chris@1295
|
46 end
|
Chris@1295
|
47 end
|
Chris@1295
|
48
|
Chris@1295
|
49 def test_turning_on_inherit_members_should_inherit_members
|
Chris@1295
|
50 Project.generate_with_parent!(@parent, :inherit_members => false)
|
Chris@1295
|
51
|
Chris@1295
|
52 assert_difference 'Member.count', 1 do
|
Chris@1295
|
53 project = Project.order('id desc').first
|
Chris@1295
|
54 project.inherit_members = true
|
Chris@1295
|
55 project.save!
|
Chris@1295
|
56 project.reload
|
Chris@1295
|
57
|
Chris@1295
|
58 assert_equal 1, project.memberships.count
|
Chris@1295
|
59 member = project.memberships.first
|
Chris@1295
|
60 assert_equal @member.principal, member.principal
|
Chris@1295
|
61 assert_equal @member.roles.sort, member.roles.sort
|
Chris@1295
|
62 end
|
Chris@1295
|
63 end
|
Chris@1295
|
64
|
Chris@1295
|
65 def test_turning_off_inherit_members_should_remove_inherited_members
|
Chris@1295
|
66 Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
67
|
Chris@1295
|
68 assert_difference 'Member.count', -1 do
|
Chris@1295
|
69 project = Project.order('id desc').first
|
Chris@1295
|
70 project.inherit_members = false
|
Chris@1295
|
71 project.save!
|
Chris@1295
|
72 project.reload
|
Chris@1295
|
73
|
Chris@1295
|
74 assert_equal 0, project.memberships.count
|
Chris@1295
|
75 end
|
Chris@1295
|
76 end
|
Chris@1295
|
77
|
Chris@1295
|
78 def test_moving_a_root_project_under_a_parent_should_inherit_members
|
Chris@1295
|
79 Project.generate!(:inherit_members => true)
|
Chris@1295
|
80 project = Project.order('id desc').first
|
Chris@1295
|
81
|
Chris@1295
|
82 assert_difference 'Member.count', 1 do
|
Chris@1295
|
83 project.set_parent!(@parent)
|
Chris@1295
|
84 project.reload
|
Chris@1295
|
85
|
Chris@1295
|
86 assert_equal 1, project.memberships.count
|
Chris@1295
|
87 member = project.memberships.first
|
Chris@1295
|
88 assert_equal @member.principal, member.principal
|
Chris@1295
|
89 assert_equal @member.roles.sort, member.roles.sort
|
Chris@1295
|
90 end
|
Chris@1295
|
91 end
|
Chris@1295
|
92
|
Chris@1295
|
93 def test_moving_a_subproject_as_root_should_loose_inherited_members
|
Chris@1295
|
94 Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
95 project = Project.order('id desc').first
|
Chris@1295
|
96
|
Chris@1295
|
97 assert_difference 'Member.count', -1 do
|
Chris@1295
|
98 project.set_parent!(nil)
|
Chris@1295
|
99 project.reload
|
Chris@1295
|
100
|
Chris@1295
|
101 assert_equal 0, project.memberships.count
|
Chris@1295
|
102 end
|
Chris@1295
|
103 end
|
Chris@1295
|
104
|
Chris@1295
|
105 def test_moving_a_subproject_to_another_parent_should_change_inherited_members
|
Chris@1295
|
106 other_parent = Project.generate!
|
Chris@1295
|
107 other_member = Member.create!(:principal => User.find(4), :project => other_parent, :role_ids => [3])
|
Chris@1295
|
108
|
Chris@1295
|
109 Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
110 project = Project.order('id desc').first
|
Chris@1295
|
111 project.set_parent!(other_parent.reload)
|
Chris@1295
|
112 project.reload
|
Chris@1295
|
113
|
Chris@1295
|
114 assert_equal 1, project.memberships.count
|
Chris@1295
|
115 member = project.memberships.first
|
Chris@1295
|
116 assert_equal other_member.principal, member.principal
|
Chris@1295
|
117 assert_equal other_member.roles.sort, member.roles.sort
|
Chris@1295
|
118 end
|
Chris@1295
|
119
|
Chris@1295
|
120 def test_inheritance_should_propagate_to_subprojects
|
Chris@1295
|
121 project = Project.generate_with_parent!(@parent, :inherit_members => false)
|
Chris@1295
|
122 subproject = Project.generate_with_parent!(project, :inherit_members => true)
|
Chris@1295
|
123 project.reload
|
Chris@1295
|
124
|
Chris@1295
|
125 assert_difference 'Member.count', 2 do
|
Chris@1295
|
126 project.inherit_members = true
|
Chris@1295
|
127 project.save
|
Chris@1295
|
128 project.reload
|
Chris@1295
|
129 subproject.reload
|
Chris@1295
|
130
|
Chris@1295
|
131 assert_equal 1, project.memberships.count
|
Chris@1295
|
132 assert_equal 1, subproject.memberships.count
|
Chris@1295
|
133 member = subproject.memberships.first
|
Chris@1295
|
134 assert_equal @member.principal, member.principal
|
Chris@1295
|
135 assert_equal @member.roles.sort, member.roles.sort
|
Chris@1295
|
136 end
|
Chris@1295
|
137 end
|
Chris@1295
|
138
|
Chris@1295
|
139 def test_inheritance_removal_should_propagate_to_subprojects
|
Chris@1295
|
140 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
141 subproject = Project.generate_with_parent!(project, :inherit_members => true)
|
Chris@1295
|
142 project.reload
|
Chris@1295
|
143
|
Chris@1295
|
144 assert_difference 'Member.count', -2 do
|
Chris@1295
|
145 project.inherit_members = false
|
Chris@1295
|
146 project.save
|
Chris@1295
|
147 project.reload
|
Chris@1295
|
148 subproject.reload
|
Chris@1295
|
149
|
Chris@1295
|
150 assert_equal 0, project.memberships.count
|
Chris@1295
|
151 assert_equal 0, subproject.memberships.count
|
Chris@1295
|
152 end
|
Chris@1295
|
153 end
|
Chris@1295
|
154
|
Chris@1295
|
155 def test_adding_a_member_should_propagate
|
Chris@1295
|
156 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
157
|
Chris@1295
|
158 assert_difference 'Member.count', 2 do
|
Chris@1295
|
159 member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
|
Chris@1295
|
160
|
Chris@1295
|
161 inherited_member = project.memberships.order('id desc').first
|
Chris@1295
|
162 assert_equal member.principal, inherited_member.principal
|
Chris@1295
|
163 assert_equal member.roles.sort, inherited_member.roles.sort
|
Chris@1295
|
164 end
|
Chris@1295
|
165 end
|
Chris@1295
|
166
|
Chris@1295
|
167 def test_adding_a_member_should_not_propagate_if_child_does_not_inherit
|
Chris@1295
|
168 project = Project.generate_with_parent!(@parent, :inherit_members => false)
|
Chris@1295
|
169
|
Chris@1295
|
170 assert_difference 'Member.count', 1 do
|
Chris@1295
|
171 member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
|
Chris@1295
|
172
|
Chris@1295
|
173 assert_nil project.reload.memberships.detect {|m| m.principal == member.principal}
|
Chris@1295
|
174 end
|
Chris@1295
|
175 end
|
Chris@1295
|
176
|
Chris@1295
|
177 def test_removing_a_member_should_propagate
|
Chris@1295
|
178 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
179
|
Chris@1295
|
180 assert_difference 'Member.count', -2 do
|
Chris@1295
|
181 @member.reload.destroy
|
Chris@1295
|
182 project.reload
|
Chris@1295
|
183
|
Chris@1295
|
184 assert_equal 0, project.memberships.count
|
Chris@1295
|
185 end
|
Chris@1295
|
186 end
|
Chris@1295
|
187
|
Chris@1295
|
188 def test_adding_a_group_member_should_propagate_with_its_users
|
Chris@1295
|
189 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
190 group = Group.generate!
|
Chris@1295
|
191 user = User.find(4)
|
Chris@1295
|
192 group.users << user
|
Chris@1295
|
193
|
Chris@1295
|
194 assert_difference 'Member.count', 4 do
|
Chris@1295
|
195 assert_difference 'MemberRole.count', 8 do
|
Chris@1295
|
196 member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
|
Chris@1295
|
197 project.reload
|
Chris@1295
|
198
|
Chris@1295
|
199 inherited_group_member = project.memberships.detect {|m| m.principal == group}
|
Chris@1295
|
200 assert_not_nil inherited_group_member
|
Chris@1295
|
201 assert_equal member.roles.sort, inherited_group_member.roles.sort
|
Chris@1295
|
202
|
Chris@1295
|
203 inherited_user_member = project.memberships.detect {|m| m.principal == user}
|
Chris@1295
|
204 assert_not_nil inherited_user_member
|
Chris@1295
|
205 assert_equal member.roles.sort, inherited_user_member.roles.sort
|
Chris@1295
|
206 end
|
Chris@1295
|
207 end
|
Chris@1295
|
208 end
|
Chris@1295
|
209
|
Chris@1295
|
210 def test_removing_a_group_member_should_propagate
|
Chris@1295
|
211 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
212 group = Group.generate!
|
Chris@1295
|
213 user = User.find(4)
|
Chris@1295
|
214 group.users << user
|
Chris@1295
|
215 member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
|
Chris@1295
|
216
|
Chris@1295
|
217 assert_difference 'Member.count', -4 do
|
Chris@1295
|
218 assert_difference 'MemberRole.count', -8 do
|
Chris@1295
|
219 member.destroy
|
Chris@1295
|
220 project.reload
|
Chris@1295
|
221
|
Chris@1295
|
222 inherited_group_member = project.memberships.detect {|m| m.principal == group}
|
Chris@1295
|
223 assert_nil inherited_group_member
|
Chris@1295
|
224
|
Chris@1295
|
225 inherited_user_member = project.memberships.detect {|m| m.principal == user}
|
Chris@1295
|
226 assert_nil inherited_user_member
|
Chris@1295
|
227 end
|
Chris@1295
|
228 end
|
Chris@1295
|
229 end
|
Chris@1295
|
230
|
Chris@1295
|
231 def test_adding_user_who_use_is_already_a_member_to_parent_project_should_merge_roles
|
Chris@1295
|
232 project = Project.generate_with_parent!(@parent, :inherit_members => true)
|
Chris@1295
|
233 user = User.find(4)
|
Chris@1295
|
234 Member.create!(:principal => user, :project => project, :role_ids => [1, 2])
|
Chris@1295
|
235
|
Chris@1295
|
236 assert_difference 'Member.count', 1 do
|
Chris@1295
|
237 Member.create!(:principal => User.find(4), :project => @parent.reload, :role_ids => [1, 3])
|
Chris@1295
|
238
|
Chris@1295
|
239 member = project.reload.memberships.detect {|m| m.principal == user}
|
Chris@1295
|
240 assert_not_nil member
|
Chris@1295
|
241 assert_equal [1, 2, 3], member.roles.uniq.sort.map(&:id)
|
Chris@1295
|
242 end
|
Chris@1295
|
243 end
|
Chris@1295
|
244
|
Chris@1295
|
245 def test_turning_on_inheritance_with_user_who_is_already_a_member_should_merge_roles
|
Chris@1295
|
246 project = Project.generate_with_parent!(@parent)
|
Chris@1295
|
247 user = @member.user
|
Chris@1295
|
248 Member.create!(:principal => user, :project => project, :role_ids => [1, 3])
|
Chris@1295
|
249 project.reload
|
Chris@1295
|
250
|
Chris@1295
|
251 assert_no_difference 'Member.count' do
|
Chris@1295
|
252 project.inherit_members = true
|
Chris@1295
|
253 project.save!
|
Chris@1295
|
254
|
Chris@1295
|
255 member = project.reload.memberships.detect {|m| m.principal == user}
|
Chris@1295
|
256 assert_not_nil member
|
Chris@1295
|
257 assert_equal [1, 2, 3], member.roles.uniq.sort.map(&:id)
|
Chris@1295
|
258 end
|
Chris@1295
|
259 end
|
Chris@1295
|
260 end
|