PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/spec/lib/gitlab/project_authorizations_spec.rb

https://gitlab.com/klml/gitlab-ee
Ruby | 311 lines | 236 code | 74 blank | 1 comment | 0 complexity | 6cfa4c820f960400c424dc66d9b720db MD5 | raw file
  1. # frozen_string_literal: true
  2. require 'spec_helper'
  3. RSpec.describe Gitlab::ProjectAuthorizations do
  4. def map_access_levels(rows)
  5. rows.each_with_object({}) do |row, hash|
  6. hash[row.project_id] = row.access_level
  7. end
  8. end
  9. subject(:authorizations) do
  10. described_class.new(user).calculate
  11. end
  12. context 'user added to group and project' do
  13. let(:group) { create(:group) }
  14. let!(:other_project) { create(:project) }
  15. let!(:group_project) { create(:project, namespace: group) }
  16. let!(:owned_project) { create(:project) }
  17. let(:user) { owned_project.namespace.owner }
  18. before do
  19. other_project.add_reporter(user)
  20. group.add_developer(user)
  21. end
  22. it 'returns the correct number of authorizations' do
  23. expect(authorizations.length).to eq(3)
  24. end
  25. it 'includes the correct projects' do
  26. expect(authorizations.pluck(:project_id))
  27. .to include(owned_project.id, other_project.id, group_project.id)
  28. end
  29. it 'includes the correct access levels' do
  30. mapping = map_access_levels(authorizations)
  31. expect(mapping[owned_project.id]).to eq(Gitlab::Access::MAINTAINER)
  32. expect(mapping[other_project.id]).to eq(Gitlab::Access::REPORTER)
  33. expect(mapping[group_project.id]).to eq(Gitlab::Access::DEVELOPER)
  34. end
  35. end
  36. context 'unapproved access request' do
  37. let_it_be(:group) { create(:group) }
  38. let_it_be(:user) { create(:user) }
  39. subject(:mapping) { map_access_levels(authorizations) }
  40. context 'group membership' do
  41. let!(:group_project) { create(:project, namespace: group) }
  42. before do
  43. create(:group_member, :developer, :access_request, user: user, group: group)
  44. end
  45. it 'does not create authorization' do
  46. expect(mapping[group_project.id]).to be_nil
  47. end
  48. end
  49. context 'inherited group membership' do
  50. let!(:sub_group) { create(:group, parent: group) }
  51. let!(:sub_group_project) { create(:project, namespace: sub_group) }
  52. before do
  53. create(:group_member, :developer, :access_request, user: user, group: group)
  54. end
  55. it 'does not create authorization' do
  56. expect(mapping[sub_group_project.id]).to be_nil
  57. end
  58. end
  59. context 'project membership' do
  60. let!(:group_project) { create(:project, namespace: group) }
  61. before do
  62. create(:project_member, :developer, :access_request, user: user, project: group_project)
  63. end
  64. it 'does not create authorization' do
  65. expect(mapping[group_project.id]).to be_nil
  66. end
  67. end
  68. context 'shared group' do
  69. let!(:shared_group) { create(:group) }
  70. let!(:shared_group_project) { create(:project, namespace: shared_group) }
  71. before do
  72. create(:group_group_link, shared_group: shared_group, shared_with_group: group)
  73. create(:group_member, :developer, :access_request, user: user, group: group)
  74. end
  75. it 'does not create authorization' do
  76. expect(mapping[shared_group_project.id]).to be_nil
  77. end
  78. end
  79. context 'shared project' do
  80. let!(:another_group) { create(:group) }
  81. let!(:shared_project) { create(:project, namespace: another_group) }
  82. before do
  83. create(:project_group_link, group: group, project: shared_project)
  84. create(:group_member, :developer, :access_request, user: user, group: group)
  85. end
  86. it 'does not create authorization' do
  87. expect(mapping[shared_project.id]).to be_nil
  88. end
  89. end
  90. end
  91. context 'user with minimal access to group' do
  92. let_it_be(:group) { create(:group) }
  93. let_it_be(:user) { create(:user) }
  94. subject(:mapping) { map_access_levels(authorizations) }
  95. context 'group membership' do
  96. let!(:group_project) { create(:project, namespace: group) }
  97. before do
  98. create(:group_member, :minimal_access, user: user, source: group)
  99. end
  100. it 'does not create authorization' do
  101. expect(mapping[group_project.id]).to be_nil
  102. end
  103. end
  104. context 'inherited group membership' do
  105. let!(:sub_group) { create(:group, parent: group) }
  106. let!(:sub_group_project) { create(:project, namespace: sub_group) }
  107. before do
  108. create(:group_member, :minimal_access, user: user, source: group)
  109. end
  110. it 'does not create authorization' do
  111. expect(mapping[sub_group_project.id]).to be_nil
  112. end
  113. end
  114. context 'shared group' do
  115. let!(:shared_group) { create(:group) }
  116. let!(:shared_group_project) { create(:project, namespace: shared_group) }
  117. before do
  118. create(:group_group_link, shared_group: shared_group, shared_with_group: group)
  119. create(:group_member, :minimal_access, user: user, source: group)
  120. end
  121. it 'does not create authorization' do
  122. expect(mapping[shared_group_project.id]).to be_nil
  123. end
  124. end
  125. context 'shared project' do
  126. let!(:another_group) { create(:group) }
  127. let!(:shared_project) { create(:project, namespace: another_group) }
  128. before do
  129. create(:project_group_link, group: group, project: shared_project)
  130. create(:group_member, :minimal_access, user: user, source: group)
  131. end
  132. it 'does not create authorization' do
  133. expect(mapping[shared_project.id]).to be_nil
  134. end
  135. end
  136. end
  137. context 'with nested groups' do
  138. let(:group) { create(:group) }
  139. let!(:nested_group) { create(:group, parent: group) }
  140. let!(:nested_project) { create(:project, namespace: nested_group) }
  141. let(:user) { create(:user) }
  142. before do
  143. group.add_developer(user)
  144. end
  145. it 'includes nested groups' do
  146. expect(authorizations.pluck(:project_id)).to include(nested_project.id)
  147. end
  148. it 'inherits access levels when the user is not a member of a nested group' do
  149. mapping = map_access_levels(authorizations)
  150. expect(mapping[nested_project.id]).to eq(Gitlab::Access::DEVELOPER)
  151. end
  152. it 'uses the greatest access level when a user is a member of a nested group' do
  153. nested_group.add_maintainer(user)
  154. mapping = map_access_levels(authorizations)
  155. expect(mapping[nested_project.id]).to eq(Gitlab::Access::MAINTAINER)
  156. end
  157. end
  158. context 'with shared groups' do
  159. let(:parent_group_user) { create(:user) }
  160. let(:group_user) { create(:user) }
  161. let(:child_group_user) { create(:user) }
  162. let_it_be(:group_parent) { create(:group, :private) }
  163. let_it_be(:group) { create(:group, :private, parent: group_parent) }
  164. let_it_be(:group_child) { create(:group, :private, parent: group) }
  165. let_it_be(:shared_group_parent) { create(:group, :private) }
  166. let_it_be(:shared_group) { create(:group, :private, parent: shared_group_parent) }
  167. let_it_be(:shared_group_child) { create(:group, :private, parent: shared_group) }
  168. let_it_be(:project_parent) { create(:project, group: shared_group_parent) }
  169. let_it_be(:project) { create(:project, group: shared_group) }
  170. let_it_be(:project_child) { create(:project, group: shared_group_child) }
  171. before do
  172. group_parent.add_owner(parent_group_user)
  173. group.add_owner(group_user)
  174. group_child.add_owner(child_group_user)
  175. create(:group_group_link, shared_group: shared_group, shared_with_group: group)
  176. end
  177. context 'group user' do
  178. let(:user) { group_user }
  179. it 'creates proper authorizations' do
  180. mapping = map_access_levels(authorizations)
  181. expect(mapping[project_parent.id]).to be_nil
  182. expect(mapping[project.id]).to eq(Gitlab::Access::DEVELOPER)
  183. expect(mapping[project_child.id]).to eq(Gitlab::Access::DEVELOPER)
  184. end
  185. end
  186. context 'with lower group access level than max access level for share' do
  187. let(:user) { create(:user) }
  188. it 'creates proper authorizations' do
  189. group.add_reporter(user)
  190. mapping = map_access_levels(authorizations)
  191. expect(mapping[project_parent.id]).to be_nil
  192. expect(mapping[project.id]).to eq(Gitlab::Access::REPORTER)
  193. expect(mapping[project_child.id]).to eq(Gitlab::Access::REPORTER)
  194. end
  195. end
  196. context 'parent group user' do
  197. let(:user) { parent_group_user }
  198. it 'creates proper authorizations' do
  199. mapping = map_access_levels(authorizations)
  200. expect(mapping[project_parent.id]).to be_nil
  201. expect(mapping[project.id]).to be_nil
  202. expect(mapping[project_child.id]).to be_nil
  203. end
  204. end
  205. context 'child group user' do
  206. let(:user) { child_group_user }
  207. it 'creates proper authorizations' do
  208. mapping = map_access_levels(authorizations)
  209. expect(mapping[project_parent.id]).to be_nil
  210. expect(mapping[project.id]).to be_nil
  211. expect(mapping[project_child.id]).to be_nil
  212. end
  213. end
  214. context 'user without accepted access request' do
  215. let!(:user) { create(:user) }
  216. it 'does not have access to group and its projects' do
  217. create(:group_member, :developer, :access_request, user: user, group: group)
  218. mapping = map_access_levels(authorizations)
  219. expect(mapping[project_parent.id]).to be_nil
  220. expect(mapping[project.id]).to be_nil
  221. expect(mapping[project_child.id]).to be_nil
  222. end
  223. end
  224. context 'unrelated project owner' do
  225. let(:common_id) { non_existing_record_id }
  226. let!(:group) { create(:group, id: common_id) }
  227. let!(:unrelated_project) { create(:project, id: common_id) }
  228. let(:user) { unrelated_project.owner }
  229. it 'does not have access to group and its projects' do
  230. mapping = map_access_levels(authorizations)
  231. expect(mapping[project_parent.id]).to be_nil
  232. expect(mapping[project.id]).to be_nil
  233. expect(mapping[project_child.id]).to be_nil
  234. end
  235. end
  236. end
  237. end