diff options
Diffstat (limited to 'spec/serializers/member_serializer_spec.rb')
-rw-r--r-- | spec/serializers/member_serializer_spec.rb | 65 |
1 files changed, 57 insertions, 8 deletions
diff --git a/spec/serializers/member_serializer_spec.rb b/spec/serializers/member_serializer_spec.rb index af209c0191f..f7415214e95 100644 --- a/spec/serializers/member_serializer_spec.rb +++ b/spec/serializers/member_serializer_spec.rb @@ -7,28 +7,77 @@ RSpec.describe MemberSerializer do let_it_be(:current_user) { create(:user) } - subject { described_class.new.represent(members, { current_user: current_user, group: group, source: source }) } + subject(:representation) do + described_class.new.represent(members, { current_user: current_user, group: group, source: source }).to_json + end shared_examples 'members.json' do - it 'matches json schema' do - expect(subject.to_json).to match_schema('members') - end + it { is_expected.to match_schema('members') } end context 'group member' do - let(:group) { create(:group) } + let_it_be(:group) { create(:group) } + let_it_be(:members) { present_members(create_list(:group_member, 1, group: group)) } + let(:source) { group } - let(:members) { present_members(create_list(:group_member, 1, group: group)) } it_behaves_like 'members.json' + + it 'handles last group owner assignment' do + group_member = members.last + + expect { representation }.to change(group_member, :last_owner) + .from(nil).to(true) + .and change(group_member, :last_blocked_owner).from(nil).to(false) + end + + context "with LastGroupOwnerAssigner query improvements" do + it "avoids N+1 database queries for last group owner assignment in MembersPresenter" do + group_member = create(:group_member, group: group) + control_count = ActiveRecord::QueryRecorder.new { member_last_owner_with_preload([group_member]) }.count + group_members = create_list(:group_member, 3, group: group) + + expect { member_last_owner_with_preload(group_members) }.not_to exceed_query_limit(control_count) + end + + it "avoids N+1 database queries for last blocked owner assignment in MembersPresenter" do + group_member = create(:group_member, group: group) + control_count = ActiveRecord::QueryRecorder.new { member_last_blocked_owner_with_preload([group_member]) }.count + group_members = create_list(:group_member, 3, group: group) + + expect { member_last_blocked_owner_with_preload(group_members) }.not_to exceed_query_limit(control_count) + end + + def member_last_owner_with_preload(members) + assigner_with_preload(members) + members.map { |m| group.member_last_owner?(m) } + end + + def member_last_blocked_owner_with_preload(members) + assigner_with_preload(members) + members.map { |m| group.member_last_blocked_owner?(m) } + end + + def assigner_with_preload(members) + MembersPreloader.new(members).preload_all + Members::LastGroupOwnerAssigner.new(group, members).execute + end + end end context 'project member' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } + let_it_be(:members) { present_members(create_list(:project_member, 1, project: project)) } + let(:source) { project } let(:group) { project.group } - let(:members) { present_members(create_list(:project_member, 1, project: project)) } it_behaves_like 'members.json' + + it 'does not invoke group owner assignment' do + expect(Members::LastGroupOwnerAssigner).not_to receive(:new) + + representation + end end end |