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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2017 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. :projects, :trackers, :issue_statuses
  21. def setup
  22. @parent = Project.generate!
  23. @member = Member.create!(:principal => User.find(2), :project => @parent, :role_ids => [1, 2])
  24. assert_equal 2, @member.reload.roles.size
  25. end
  26. def test_project_created_with_inherit_members_disabled_should_not_inherit_members
  27. assert_no_difference 'Member.count' do
  28. project = Project.generate_with_parent!(@parent, :inherit_members => false)
  29. assert_equal 0, project.memberships.count
  30. end
  31. end
  32. def test_project_created_with_inherit_members_should_inherit_members
  33. assert_difference 'Member.count', 1 do
  34. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  35. project.reload
  36. assert_equal 1, project.memberships.count
  37. member = project.memberships.first
  38. assert_equal @member.principal, member.principal
  39. assert_equal @member.roles.sort, member.roles.sort
  40. end
  41. end
  42. def test_turning_on_inherit_members_should_inherit_members
  43. Project.generate_with_parent!(@parent, :inherit_members => false)
  44. assert_difference 'Member.count', 1 do
  45. project = Project.order('id desc').first
  46. project.inherit_members = true
  47. project.save!
  48. project.reload
  49. assert_equal 1, project.memberships.count
  50. member = project.memberships.first
  51. assert_equal @member.principal, member.principal
  52. assert_equal @member.roles.sort, member.roles.sort
  53. end
  54. end
  55. def test_turning_off_inherit_members_should_remove_inherited_members
  56. Project.generate_with_parent!(@parent, :inherit_members => true)
  57. assert_difference 'Member.count', -1 do
  58. project = Project.order('id desc').first
  59. project.inherit_members = false
  60. project.save!
  61. project.reload
  62. assert_equal 0, project.memberships.count
  63. end
  64. end
  65. def test_moving_a_root_project_under_a_parent_should_inherit_members
  66. Project.generate!(:inherit_members => true)
  67. project = Project.order('id desc').first
  68. assert_difference 'Member.count', 1 do
  69. project.set_parent!(@parent)
  70. project.reload
  71. assert_equal 1, project.memberships.count
  72. member = project.memberships.first
  73. assert_equal @member.principal, member.principal
  74. assert_equal @member.roles.sort, member.roles.sort
  75. end
  76. end
  77. def test_moving_a_subproject_as_root_should_loose_inherited_members
  78. Project.generate_with_parent!(@parent, :inherit_members => true)
  79. project = Project.order('id desc').first
  80. assert_difference 'Member.count', -1 do
  81. project.set_parent!(nil)
  82. project.reload
  83. assert_equal 0, project.memberships.count
  84. end
  85. end
  86. def test_moving_a_subproject_to_another_parent_should_change_inherited_members
  87. other_parent = Project.generate!
  88. other_member = Member.create!(:principal => User.find(4), :project => other_parent, :role_ids => [3])
  89. other_member.reload
  90. Project.generate_with_parent!(@parent, :inherit_members => true)
  91. project = Project.order('id desc').first
  92. project.set_parent!(other_parent.reload)
  93. project.reload
  94. assert_equal 1, project.memberships.count
  95. member = project.memberships.first
  96. assert_equal other_member.principal, member.principal
  97. assert_equal other_member.roles.sort, member.roles.sort
  98. end
  99. def test_inheritance_should_propagate_to_subprojects
  100. project = Project.generate_with_parent!(@parent, :inherit_members => false)
  101. subproject = Project.generate_with_parent!(project, :inherit_members => true)
  102. project.reload
  103. assert_difference 'Member.count', 2 do
  104. project.inherit_members = true
  105. project.save
  106. project.reload
  107. subproject.reload
  108. assert_equal 1, project.memberships.count
  109. assert_equal 1, subproject.memberships.count
  110. member = subproject.memberships.first
  111. assert_equal @member.principal, member.principal
  112. assert_equal @member.roles.sort, member.roles.sort
  113. end
  114. end
  115. def test_inheritance_removal_should_propagate_to_subprojects
  116. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  117. subproject = Project.generate_with_parent!(project, :inherit_members => true)
  118. project.reload
  119. assert_difference 'Member.count', -2 do
  120. project.inherit_members = false
  121. project.save
  122. project.reload
  123. subproject.reload
  124. assert_equal 0, project.memberships.count
  125. assert_equal 0, subproject.memberships.count
  126. end
  127. end
  128. def test_adding_a_member_should_propagate
  129. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  130. assert_difference 'Member.count', 2 do
  131. member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
  132. member.reload
  133. inherited_member = project.memberships.order('id desc').first
  134. assert_equal member.principal, inherited_member.principal
  135. assert_equal member.roles.sort, inherited_member.roles.sort
  136. end
  137. end
  138. def test_adding_a_member_should_not_propagate_if_child_does_not_inherit
  139. project = Project.generate_with_parent!(@parent, :inherit_members => false)
  140. assert_difference 'Member.count', 1 do
  141. member = Member.create!(:principal => User.find(4), :project => @parent, :role_ids => [1, 3])
  142. assert_nil project.reload.memberships.detect {|m| m.principal == member.principal}
  143. end
  144. end
  145. def test_removing_a_member_should_propagate
  146. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  147. assert_difference 'Member.count', -2 do
  148. @member.reload.destroy
  149. project.reload
  150. assert_equal 0, project.memberships.count
  151. end
  152. end
  153. def test_adding_a_group_member_should_propagate_with_its_users
  154. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  155. group = Group.generate!
  156. user = User.find(4)
  157. group.users << user
  158. assert_difference 'Member.count', 4 do
  159. assert_difference 'MemberRole.count', 8 do
  160. member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
  161. project.reload
  162. member.reload
  163. inherited_group_member = project.memberships.detect {|m| m.principal == group}
  164. assert_not_nil inherited_group_member
  165. assert_equal member.roles.sort, inherited_group_member.roles.sort
  166. inherited_user_member = project.memberships.detect {|m| m.principal == user}
  167. assert_not_nil inherited_user_member
  168. assert_equal member.roles.sort, inherited_user_member.roles.sort
  169. end
  170. end
  171. end
  172. def test_removing_a_group_member_should_propagate
  173. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  174. group = Group.generate!
  175. user = User.find(4)
  176. group.users << user
  177. member = Member.create!(:principal => group, :project => @parent, :role_ids => [1, 3])
  178. assert_difference 'Member.count', -4 do
  179. assert_difference 'MemberRole.count', -8 do
  180. member.destroy
  181. project.reload
  182. inherited_group_member = project.memberships.detect {|m| m.principal == group}
  183. assert_nil inherited_group_member
  184. inherited_user_member = project.memberships.detect {|m| m.principal == user}
  185. assert_nil inherited_user_member
  186. end
  187. end
  188. end
  189. def test_adding_user_who_use_is_already_a_member_to_parent_project_should_merge_roles
  190. project = Project.generate_with_parent!(@parent, :inherit_members => true)
  191. user = User.find(4)
  192. Member.create!(:principal => user, :project => project, :role_ids => [1, 2])
  193. assert_difference 'Member.count', 1 do
  194. Member.create!(:principal => User.find(4), :project => @parent.reload, :role_ids => [1, 3])
  195. member = project.reload.memberships.detect {|m| m.principal == user}
  196. assert_not_nil member
  197. assert_equal [1, 2, 3], member.roles.map(&:id).uniq.sort
  198. end
  199. end
  200. def test_turning_on_inheritance_with_user_who_is_already_a_member_should_merge_roles
  201. project = Project.generate_with_parent!(@parent)
  202. user = @member.user
  203. Member.create!(:principal => user, :project => project, :role_ids => [1, 3])
  204. project.reload
  205. assert_no_difference 'Member.count' do
  206. project.inherit_members = true
  207. project.save!
  208. member = project.reload.memberships.detect {|m| m.principal == user}
  209. assert_not_nil member
  210. assert_equal [1, 2, 3], member.roles.map(&:id).uniq.sort
  211. end
  212. end
  213. end