Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/member_spec.rb')
-rw-r--r--spec/models/member_spec.rb113
1 files changed, 94 insertions, 19 deletions
diff --git a/spec/models/member_spec.rb b/spec/models/member_spec.rb
index 2ecd10cccc6..0ebccf1cb65 100644
--- a/spec/models/member_spec.rb
+++ b/spec/models/member_spec.rb
@@ -175,26 +175,31 @@ RSpec.describe Member do
end
context 'member role access level' do
- let_it_be(:member) { create(:group_member, access_level: Gitlab::Access::DEVELOPER) }
+ let_it_be_with_reload(:member) { create(:group_member, access_level: Gitlab::Access::DEVELOPER) }
- context 'no member role is associated' do
+ context 'when no member role is associated' do
it 'is valid' do
expect(member).to be_valid
end
end
- context 'member role is associated' do
+ context 'when member role is associated' do
let!(:member_role) do
- create(:member_role, members: [member], base_access_level: Gitlab::Access::DEVELOPER)
+ create(
+ :member_role,
+ members: [member],
+ base_access_level: Gitlab::Access::DEVELOPER,
+ namespace: member.member_namespace
+ )
end
- context 'member role matches access level' do
+ context 'when member role matches access level' do
it 'is valid' do
expect(member).to be_valid
end
end
- context 'member role does not match access level' do
+ context 'when member role does not match access level' do
it 'is invalid' do
member_role.base_access_level = Gitlab::Access::MAINTAINER
@@ -202,13 +207,57 @@ RSpec.describe Member do
end
end
- context 'access_level cannot be changed' do
+ context 'when access_level is changed' do
it 'is invalid' do
member.access_level = Gitlab::Access::MAINTAINER
expect(member).not_to be_valid
- expect(member.errors.full_messages).to include(
- "Access level cannot be changed since member is associated with a custom role"
+ expect(member.errors[:access_level]).to include(
+ _("cannot be changed since member is associated with a custom role")
+ )
+ end
+ end
+ end
+ end
+
+ context 'member role namespace' do
+ let_it_be_with_reload(:member) { create(:group_member) }
+
+ context 'when no member role is associated' do
+ it 'is valid' do
+ expect(member).to be_valid
+ end
+ end
+
+ context 'when member role is associated' do
+ let_it_be(:member_role) do
+ create(:member_role, members: [member], namespace: member.group, base_access_level: member.access_level)
+ end
+
+ context 'when member#member_namespace is a group within hierarchy of member_role#namespace' do
+ it 'is valid' do
+ member.member_namespace = create(:group, parent: member_role.namespace)
+
+ expect(member).to be_valid
+ end
+ end
+
+ context 'when member#member_namespace is a project within hierarchy of member_role#namespace' do
+ it 'is valid' do
+ project = create(:project, group: member_role.namespace)
+ member.member_namespace = Namespace.find(project.parent_id)
+
+ expect(member).to be_valid
+ end
+ end
+
+ context 'when member#member_namespace is outside hierarchy of member_role#namespace' do
+ it 'is invalid' do
+ member.member_namespace = create(:group)
+
+ expect(member).not_to be_valid
+ expect(member.errors[:member_namespace]).to include(
+ _("must be in same hierarchy as custom role's namespace")
)
end
end
@@ -248,7 +297,7 @@ RSpec.describe Member do
accepted_invite_user = build(:user, state: :active)
@accepted_invite_member = create(:project_member, :invited, :developer, project: project)
- .tap { |u| u.accept_invite!(accepted_invite_user) }
+ .tap { |u| u.accept_invite!(accepted_invite_user) }
requested_user = create(:user).tap { |u| project.request_access(u) }
@requested_member = project.requesters.find_by(user_id: requested_user.id)
@@ -612,14 +661,14 @@ RSpec.describe Member do
subject { described_class.authorizable.to_a }
it 'includes the member who has an associated user record,'\
- 'but also having an invite_token' do
- member = create(:project_member,
- :developer,
- :invited,
- user: create(:user))
+ 'but also having an invite_token' do
+ member = create(:project_member,
+ :developer,
+ :invited,
+ user: create(:user))
- expect(subject).to include(member)
- end
+ expect(subject).to include(member)
+ end
it { is_expected.to include @owner }
it { is_expected.to include @maintainer }
@@ -750,9 +799,35 @@ RSpec.describe Member do
end
describe '#request?' do
- subject { create(:project_member, requested_at: Time.current.utc) }
+ context 'when request for project' do
+ subject { create(:project_member, requested_at: Time.current.utc) }
+
+ it 'calls notification service but not todo service' do
+ expect_next_instance_of(NotificationService) do |instance|
+ expect(instance).to receive(:new_access_request)
+ end
- it { is_expected.to be_request }
+ expect(TodoService).not_to receive(:new)
+
+ is_expected.to be_request
+ end
+ end
+
+ context 'when request for group' do
+ subject { create(:group_member, requested_at: Time.current.utc) }
+
+ it 'calls notification and todo service' do
+ expect_next_instance_of(NotificationService) do |instance|
+ expect(instance).to receive(:new_access_request)
+ end
+
+ expect_next_instance_of(TodoService) do |instance|
+ expect(instance).to receive(:create_member_access_request)
+ end
+
+ is_expected.to be_request
+ end
+ end
end
describe '#pending?' do