mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
PERF: Cache ranks for featured badges, to simplify user serialization (#8698)
This commit is contained in:
@@ -16,4 +16,50 @@ describe UserBadge do
|
||||
it { is_expected.to validate_uniqueness_of(:badge_id).scoped_to(:user_id) }
|
||||
end
|
||||
|
||||
describe "featured rank" do
|
||||
fab!(:user) { Fabricate(:user) }
|
||||
fab!(:user_badge_tl1) { UserBadge.create!(badge_id: Badge::BasicUser, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
fab!(:user_badge_tl2) { UserBadge.create!(badge_id: Badge::Member, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
fab!(:user_badge_wiki) { UserBadge.create!(badge_id: Badge::WikiEditor, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
fab!(:user_badge_like) { UserBadge.create!(badge_id: Badge::FirstLike, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
|
||||
it "gives user badges the correct rank" do
|
||||
expect(user_badge_tl2.reload.featured_rank).to eq(1)
|
||||
expect(user_badge_wiki.reload.featured_rank).to eq(2)
|
||||
expect(user_badge_like.reload.featured_rank).to eq(3)
|
||||
expect(user_badge_tl1.reload.featured_rank).to eq(4) # Previous trust level badges last
|
||||
end
|
||||
|
||||
it "gives duplicate user_badges the same rank" do
|
||||
ub1 = UserBadge.create!(badge_id: Badge::GreatTopic, user: user, granted_by: Discourse.system_user, granted_at: Time.now)
|
||||
ub2 = UserBadge.create!(badge_id: Badge::GreatTopic, user: user, granted_by: Discourse.system_user, granted_at: Time.now, seq: 1)
|
||||
|
||||
expect(ub1.reload.featured_rank).to eq(2)
|
||||
expect(ub2.reload.featured_rank).to eq(2)
|
||||
end
|
||||
|
||||
it "skips disabled badges" do
|
||||
user_badge_wiki.badge.update(enabled: false)
|
||||
expect(user_badge_tl2.reload.featured_rank).to eq(1)
|
||||
expect(user_badge_like.reload.featured_rank).to eq(2)
|
||||
expect(user_badge_tl1.reload.featured_rank).to eq(3) # Previous trust level badges last
|
||||
expect(user_badge_wiki.reload.featured_rank).to eq(4) # Disabled
|
||||
end
|
||||
|
||||
it "can ensure consistency per user" do
|
||||
user_badge_tl2.update_column(:featured_rank, 20) # Update without hooks
|
||||
expect(user_badge_tl2.reload.featured_rank).to eq(20) # Double check
|
||||
UserBadge.update_featured_ranks! user.id
|
||||
expect(user_badge_tl2.reload.featured_rank).to eq(1)
|
||||
end
|
||||
|
||||
it "can ensure consistency for all users" do
|
||||
user_badge_tl2.update_column(:featured_rank, 20) # Update without hooks
|
||||
expect(user_badge_tl2.reload.featured_rank).to eq(20) # Double check
|
||||
UserBadge.update_featured_ranks!
|
||||
expect(user_badge_tl2.reload.featured_rank).to eq(1)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -1706,15 +1706,12 @@ describe User do
|
||||
|
||||
describe "#featured_user_badges" do
|
||||
fab!(:user) { Fabricate(:user) }
|
||||
let!(:user_badge_tl1) { UserBadge.create(badge_id: 1, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
let!(:user_badge_tl2) { UserBadge.create(badge_id: 2, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
let!(:user_badge_tl1) { UserBadge.create(badge_id: Badge::BasicUser, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
let!(:user_badge_tl2) { UserBadge.create(badge_id: Badge::Member, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
let!(:user_badge_like) { UserBadge.create(badge_id: Badge::FirstLike, user: user, granted_by: Discourse.system_user, granted_at: Time.now) }
|
||||
|
||||
it 'should display highest trust level badge first' do
|
||||
expect(user.featured_user_badges[0].badge_id).to eq(2)
|
||||
end
|
||||
|
||||
it 'should display only 1 trust level badge' do
|
||||
expect(user.featured_user_badges.length).to eq(1)
|
||||
it 'should display badges in the correct order' do
|
||||
expect(user.featured_user_badges.map(&:badge_id)).to eq([Badge::Member, Badge::FirstLike, Badge::BasicUser])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user