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/members/last_group_owner_assigner_spec.rb')
-rw-r--r--spec/models/members/last_group_owner_assigner_spec.rb98
1 files changed, 98 insertions, 0 deletions
diff --git a/spec/models/members/last_group_owner_assigner_spec.rb b/spec/models/members/last_group_owner_assigner_spec.rb
new file mode 100644
index 00000000000..3c9a7a11555
--- /dev/null
+++ b/spec/models/members/last_group_owner_assigner_spec.rb
@@ -0,0 +1,98 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Members::LastGroupOwnerAssigner do
+ describe "#execute" do
+ let_it_be(:user, reload: true) { create(:user) }
+ let_it_be(:group) { create(:group) }
+
+ let(:group_member) { user.members.last }
+
+ subject(:assigner) { described_class.new(group, [group_member]) }
+
+ before do
+ group.add_owner(user)
+ end
+
+ it "avoids extra database queries utilizing memoization", :aggregate_failures do
+ control = ActiveRecord::QueryRecorder.new { assigner.execute }
+ count_queries = control.occurrences_by_line_method.first[1][:occurrences].find_all { |i| i.include?('SELECT COUNT') }
+
+ expect(control.count).to be <= 5
+ expect(count_queries.count).to eq(0)
+ end
+
+ context "when there are unblocked owners" do
+ context "with one unblocked owner" do
+ specify do
+ expect { assigner.execute }.to change(group_member, :last_owner)
+ .from(nil).to(true)
+ .and change(group_member, :last_blocked_owner)
+ .from(nil).to(false)
+ end
+ end
+
+ context "with multiple unblocked owners" do
+ let_it_be(:unblocked_owner_member) { create(:group_member, :owner, source: group) }
+
+ specify do
+ expect { assigner.execute }.to change(group_member, :last_owner)
+ .from(nil).to(false)
+ .and change(group_member, :last_blocked_owner)
+ .from(nil).to(false)
+ end
+
+ it "has many members passed" do
+ assigner = described_class.new(group, [unblocked_owner_member, group_member])
+
+ expect { assigner.execute }.to change(group_member, :last_owner)
+ .from(nil).to(false)
+ .and change(group_member, :last_blocked_owner)
+ .from(nil).to(false)
+ .and change(unblocked_owner_member, :last_owner)
+ .from(nil).to(false)
+ .and change(unblocked_owner_member, :last_blocked_owner)
+ .from(nil).to(false)
+ end
+ end
+ end
+
+ context "when there are blocked owners" do
+ before do
+ user.block!
+ end
+
+ context "with one blocked owner" do
+ specify do
+ expect { assigner.execute }.to change(group_member, :last_owner)
+ .from(nil).to(false)
+ .and change(group_member, :last_blocked_owner)
+ .from(nil).to(true)
+ end
+ end
+
+ context "with multiple unblocked owners" do
+ specify do
+ create_list(:group_member, 2, :owner, source: group)
+
+ expect { assigner.execute }.to change(group_member, :last_owner)
+ .from(nil).to(false)
+ .and change(group_member, :last_blocked_owner)
+ .from(nil).to(false)
+ end
+ end
+
+ context "with multiple blocked owners" do
+ specify do
+ create(:group_member, :owner, :blocked, source: group)
+
+ expect { assigner.execute }.to change(group_member, :last_owner)
+ .from(nil).to(false)
+ .and change(group_member, :last_blocked_owner)
+ .from(nil).to(false)
+ end
+ end
+ end
+ end
+end