You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

project_members_inheritance_test.rb 9.0KB

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