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

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