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/serializers/member_serializer_spec.rb')
-rw-r--r--spec/serializers/member_serializer_spec.rb65
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