diff options
Diffstat (limited to 'spec/finders/group_members_finder_spec.rb')
-rw-r--r-- | spec/finders/group_members_finder_spec.rb | 282 |
1 files changed, 144 insertions, 138 deletions
diff --git a/spec/finders/group_members_finder_spec.rb b/spec/finders/group_members_finder_spec.rb index a87a05d4408..3238f6744f7 100644 --- a/spec/finders/group_members_finder_spec.rb +++ b/spec/finders/group_members_finder_spec.rb @@ -3,174 +3,180 @@ require 'spec_helper' RSpec.describe GroupMembersFinder, '#execute' do - let(:group) { create(:group) } - let(:nested_group) { create(:group, parent: group) } - let(:deeper_nested_group) { create(:group, parent: nested_group) } - let(:user1) { create(:user) } - let(:user2) { create(:user) } - let(:user3) { create(:user) } - let(:user4) { create(:user) } - let(:user5) { create(:user, :two_factor_via_otp) } - - it 'returns members for top-level group' do - member1 = group.add_maintainer(user1) - member2 = group.add_maintainer(user2) - member3 = group.add_maintainer(user3) - create(:group_member, :minimal_access, user: create(:user), source: group) - - result = described_class.new(group).execute - - expect(result.to_a).to match_array([member3, member2, member1]) + let(:group) { create(:group) } + let(:sub_group) { create(:group, parent: group) } + let(:sub_sub_group) { create(:group, parent: sub_group) } + let(:user1) { create(:user) } + let(:user2) { create(:user) } + let(:user3) { create(:user) } + let(:user4) { create(:user) } + let(:user5) { create(:user, :two_factor_via_otp) } + + let(:groups) do + { + group: group, + sub_group: sub_group, + sub_sub_group: sub_sub_group + } end - it 'returns members & inherited members for nested group by default' do - group.add_developer(user2) - nested_group.request_access(user4) - member1 = group.add_maintainer(user1) - member3 = nested_group.add_maintainer(user2) - member4 = nested_group.add_maintainer(user3) - - result = described_class.new(nested_group).execute - - expect(result.to_a).to match_array([member1, member3, member4]) + context 'relations' do + let!(:members) do + { + user1_sub_sub_group: create(:group_member, :maintainer, group: sub_sub_group, user: user1), + user1_sub_group: create(:group_member, :developer, group: sub_group, user: user1), + user1_group: create(:group_member, :reporter, group: group, user: user1), + user2_sub_sub_group: create(:group_member, :reporter, group: sub_sub_group, user: user2), + user2_sub_group: create(:group_member, :developer, group: sub_group, user: user2), + user2_group: create(:group_member, :maintainer, group: group, user: user2), + user3_sub_sub_group: create(:group_member, :developer, group: sub_sub_group, user: user3, expires_at: 1.day.from_now), + user3_sub_group: create(:group_member, :developer, group: sub_group, user: user3, expires_at: 2.days.from_now), + user3_group: create(:group_member, :reporter, group: group, user: user3), + user4_sub_sub_group: create(:group_member, :reporter, group: sub_sub_group, user: user4), + user4_sub_group: create(:group_member, :developer, group: sub_group, user: user4, expires_at: 1.day.from_now), + user4_group: create(:group_member, :developer, group: group, user: user4, expires_at: 2.days.from_now) + } + end + + using RSpec::Parameterized::TableSyntax + + where(:subject_relations, :subject_group, :expected_members) do + nil | :group | [:user1_group, :user2_group, :user3_group, :user4_group] + [:direct] | :group | [:user1_group, :user2_group, :user3_group, :user4_group] + [:inherited] | :group | [] + [:descendants] | :group | [:user1_sub_sub_group, :user2_sub_group, :user3_sub_group, :user4_sub_group] + [:direct, :inherited] | :group | [:user1_group, :user2_group, :user3_group, :user4_group] + [:direct, :descendants] | :group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:descendants, :inherited] | :group | [:user1_sub_sub_group, :user2_sub_group, :user3_sub_group, :user4_sub_group] + [:direct, :descendants, :inherited] | :group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + nil | :sub_group | [:user1_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:direct] | :sub_group | [:user1_sub_group, :user2_sub_group, :user3_sub_group, :user4_sub_group] + [:inherited] | :sub_group | [:user1_group, :user2_group, :user3_group, :user4_group] + [:descendants] | :sub_group | [:user1_sub_sub_group, :user2_sub_sub_group, :user3_sub_sub_group, :user4_sub_sub_group] + [:direct, :inherited] | :sub_group | [:user1_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:direct, :descendants] | :sub_group | [:user1_sub_sub_group, :user2_sub_group, :user3_sub_group, :user4_sub_group] + [:descendants, :inherited] | :sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_sub_group, :user4_group] + [:direct, :descendants, :inherited] | :sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + nil | :sub_sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:direct] | :sub_sub_group | [:user1_sub_sub_group, :user2_sub_sub_group, :user3_sub_sub_group, :user4_sub_sub_group] + [:inherited] | :sub_sub_group | [:user1_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:descendants] | :sub_sub_group | [] + [:direct, :inherited] | :sub_sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:direct, :descendants] | :sub_sub_group | [:user1_sub_sub_group, :user2_sub_sub_group, :user3_sub_sub_group, :user4_sub_sub_group] + [:descendants, :inherited] | :sub_sub_group | [:user1_sub_group, :user2_group, :user3_sub_group, :user4_group] + [:direct, :descendants, :inherited] | :sub_sub_group | [:user1_sub_sub_group, :user2_group, :user3_sub_group, :user4_group] + end + + with_them do + it 'returns correct members' do + result = if subject_relations + described_class.new(groups[subject_group]).execute(include_relations: subject_relations) + else + described_class.new(groups[subject_group]).execute + end + + expect(result.to_a).to match_array(expected_members.map { |name| members[name] }) + end + end end - it 'does not return inherited members for nested group if requested' do - group.add_maintainer(user1) - group.add_developer(user2) - member2 = nested_group.add_maintainer(user2) - member3 = nested_group.add_maintainer(user3) + context 'search' do + it 'returns searched members if requested' do + group.add_maintainer(user2) + group.add_developer(user3) + member = group.add_maintainer(user1) - result = described_class.new(nested_group).execute(include_relations: [:direct]) + result = described_class.new(group, params: { search: user1.name }).execute - expect(result.to_a).to match_array([member2, member3]) - end + expect(result.to_a).to match_array([member]) + end - it 'returns only inherited members for nested group if requested' do - group.add_developer(user2) - nested_group.request_access(user4) - member1 = group.add_maintainer(user1) - nested_group.add_maintainer(user2) - nested_group.add_maintainer(user3) + it 'returns nothing if search only in inherited relation' do + group.add_maintainer(user2) + group.add_developer(user3) + group.add_maintainer(user1) - result = described_class.new(nested_group).execute(include_relations: [:inherited]) + result = described_class.new(group, params: { search: user1.name }).execute(include_relations: [:inherited]) - expect(result.to_a).to match_array([member1]) - end + expect(result.to_a).to match_array([]) + end - it 'does not return nil if `inherited only` relation is requested on root group' do - group.add_developer(user2) + it 'returns searched member only from sub_group if search only in inherited relation' do + group.add_maintainer(user2) + group.add_developer(user3) + sub_group.add_maintainer(create(:user, name: user1.name)) + member = group.add_maintainer(user1) - result = described_class.new(group).execute(include_relations: [:inherited]) + result = described_class.new(sub_group, params: { search: member.user.name }).execute(include_relations: [:inherited]) - expect(result).not_to be_nil + expect(result.to_a).to contain_exactly(member) + end end - it 'returns members for descendant groups if requested' do - member1 = group.add_maintainer(user2) - member2 = group.add_maintainer(user1) - nested_group.add_maintainer(user2) - member3 = nested_group.add_maintainer(user3) - member4 = nested_group.add_maintainer(user4) + context 'filter by two-factor' do + it 'returns members with two-factor auth if requested by owner' do + group.add_owner(user2) + group.add_maintainer(user1) + member = group.add_maintainer(user5) - result = described_class.new(group).execute(include_relations: [:direct, :descendants]) + result = described_class.new(group, user2, params: { two_factor: 'enabled' }).execute - expect(result.to_a).to match_array([member1, member2, member3, member4]) - end + expect(result.to_a).to contain_exactly(member) + end - it 'returns searched members if requested' do - group.add_maintainer(user2) - group.add_developer(user3) - member = group.add_maintainer(user1) + it 'returns members without two-factor auth if requested by owner' do + member1 = group.add_owner(user2) + member2 = group.add_maintainer(user1) + member_with_2fa = group.add_maintainer(user5) - result = described_class.new(group, params: { search: user1.name }).execute + result = described_class.new(group, user2, params: { two_factor: 'disabled' }).execute - expect(result.to_a).to match_array([member]) - end + expect(result.to_a).not_to include(member_with_2fa) + expect(result.to_a).to match_array([member1, member2]) + end - it 'returns nothing if search only in inherited relation' do - group.add_maintainer(user2) - group.add_developer(user3) - group.add_maintainer(user1) + it 'returns direct members with two-factor auth if requested by owner' do + group.add_owner(user1) + group.add_maintainer(user2) + sub_group.add_maintainer(user3) + member_with_2fa = sub_group.add_maintainer(user5) - result = described_class.new(group, params: { search: user1.name }).execute(include_relations: [:inherited]) + result = described_class.new(sub_group, user1, params: { two_factor: 'enabled' }).execute(include_relations: [:direct]) - expect(result.to_a).to match_array([]) - end + expect(result.to_a).to match_array([member_with_2fa]) + end - it 'returns searched member only from nested_group if search only in inherited relation' do - group.add_maintainer(user2) - group.add_developer(user3) - nested_group.add_maintainer(create(:user, name: user1.name)) - member = group.add_maintainer(user1) + it 'returns inherited members with two-factor auth if requested by owner' do + group.add_owner(user1) + member_with_2fa = group.add_maintainer(user5) + sub_group.add_maintainer(user2) + sub_group.add_maintainer(user3) - result = described_class.new(nested_group, params: { search: member.user.name }).execute(include_relations: [:inherited]) + result = described_class.new(sub_group, user1, params: { two_factor: 'enabled' }).execute(include_relations: [:inherited]) - expect(result.to_a).to contain_exactly(member) - end - - it 'returns members with two-factor auth if requested by owner' do - group.add_owner(user2) - group.add_maintainer(user1) - member = group.add_maintainer(user5) - - result = described_class.new(group, user2, params: { two_factor: 'enabled' }).execute + expect(result.to_a).to match_array([member_with_2fa]) + end - expect(result.to_a).to contain_exactly(member) - end - - it 'returns members without two-factor auth if requested by owner' do - member1 = group.add_owner(user2) - member2 = group.add_maintainer(user1) - member_with_2fa = group.add_maintainer(user5) + it 'returns direct members without two-factor auth if requested by owner' do + group.add_owner(user1) + group.add_maintainer(user2) + member3 = sub_group.add_maintainer(user3) + sub_group.add_maintainer(user5) - result = described_class.new(group, user2, params: { two_factor: 'disabled' }).execute + result = described_class.new(sub_group, user1, params: { two_factor: 'disabled' }).execute(include_relations: [:direct]) - expect(result.to_a).not_to include(member_with_2fa) - expect(result.to_a).to match_array([member1, member2]) - end - - it 'returns direct members with two-factor auth if requested by owner' do - group.add_owner(user1) - group.add_maintainer(user2) - nested_group.add_maintainer(user3) - member_with_2fa = nested_group.add_maintainer(user5) - - result = described_class.new(nested_group, user1, params: { two_factor: 'enabled' }).execute(include_relations: [:direct]) - - expect(result.to_a).to match_array([member_with_2fa]) - end - - it 'returns inherited members with two-factor auth if requested by owner' do - group.add_owner(user1) - member_with_2fa = group.add_maintainer(user5) - nested_group.add_maintainer(user2) - nested_group.add_maintainer(user3) - - result = described_class.new(nested_group, user1, params: { two_factor: 'enabled' }).execute(include_relations: [:inherited]) - - expect(result.to_a).to match_array([member_with_2fa]) - end - - it 'returns direct members without two-factor auth if requested by owner' do - group.add_owner(user1) - group.add_maintainer(user2) - member3 = nested_group.add_maintainer(user3) - nested_group.add_maintainer(user5) - - result = described_class.new(nested_group, user1, params: { two_factor: 'disabled' }).execute(include_relations: [:direct]) - - expect(result.to_a).to match_array([member3]) - end + expect(result.to_a).to match_array([member3]) + end - it 'returns inherited members without two-factor auth if requested by owner' do - member1 = group.add_owner(user1) - group.add_maintainer(user5) - nested_group.add_maintainer(user2) - nested_group.add_maintainer(user3) + it 'returns inherited members without two-factor auth if requested by owner' do + member1 = group.add_owner(user1) + group.add_maintainer(user5) + sub_group.add_maintainer(user2) + sub_group.add_maintainer(user3) - result = described_class.new(nested_group, user1, params: { two_factor: 'disabled' }).execute(include_relations: [:inherited]) + result = described_class.new(sub_group, user1, params: { two_factor: 'disabled' }).execute(include_relations: [:inherited]) - expect(result.to_a).to match_array([member1]) + expect(result.to_a).to match_array([member1]) + end end end |