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.2KB

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