DEV: Refactor user_badge_granted DiscourseEvent logic (#17579)

Follow-up to 02ce9b8a62
This commit is contained in:
Alan Guo Xiang Tan
2022-07-22 09:06:02 +08:00
committed by GitHub
parent 9630095370
commit 78427e0797
7 changed files with 44 additions and 29 deletions

View File

@@ -234,17 +234,4 @@ describe Badge do
expect(regular_badge.allow_title).to eq(false)
end
end
context "#trigger_badge_granted_event" do
it "triggers a 'user_badge_granted' event" do
badge = Fabricate(:badge)
user = Fabricate(:user)
event = DiscourseEvent.track(:user_badge_granted) do
badge.trigger_badge_granted_event(user.id)
end
expect(event[:event_name]).to eq(:user_badge_granted)
expect(event[:params]).to eq([badge.id, user.id])
end
end
end

View File

@@ -1,10 +1,10 @@
# frozen_string_literal: true
describe UserBadge do
fab!(:badge) { Fabricate(:badge) }
fab!(:user) { Fabricate(:user) }
context 'validations' do
fab!(:badge) { Fabricate(:badge) }
fab!(:user) { Fabricate(:user) }
let(:subject) { BadgeGranter.grant(badge, user) }
it { is_expected.to validate_presence_of(:badge_id) }
@@ -14,6 +14,18 @@ describe UserBadge do
it { is_expected.to validate_uniqueness_of(:badge_id).scoped_to(:user_id) }
end
describe '#save' do
it "triggers the 'user_badge_granted' DiscourseEvent" do
user_badge = UserBadge.new(badge: badge, user: user, granted_at: Time.zone.now, granted_by: Discourse.system_user)
event = DiscourseEvent.track(:user_badge_granted, args: [badge.id, user.id]) do
user_badge.save!
end
expect(event).to be_present
end
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) }

View File

@@ -482,14 +482,17 @@ describe BadgeGranter do
expect(UserBadge.find_by(user_id: user.id, badge_id: Badge::GreatPost)).to eq(nil)
end
it 'calls user_badge_granted on backfilled badge' do
it "triggers the 'user_badge_granted' DiscourseEvent per badge when badges are backfilled" do
post = create_post(user: user)
action = PostActionCreator.like(liker, post).post_action
Badge.any_instance.expects(:trigger_badge_granted_event).with(user.id).once
Badge.any_instance.expects(:trigger_badge_granted_event).with(liker.id).once
events = DiscourseEvent.track_events(:user_badge_granted) do
BadgeGranter.process_queue!
end
BadgeGranter.process_queue!
expect(events.length).to eq(2)
expect(events[0][:params]).to eq([Badge::FirstLike, liker.id])
expect(events[1][:params]).to eq([Badge::Welcome, user.id])
end
end

View File

@@ -9,16 +9,25 @@ module DiscourseEvent::TestHelper
end
end
def track_events
def track_events(event_name = nil, args: nil)
@events_trigger = events_trigger = []
yield
@events_trigger = nil
if event_name
events_trigger = events_trigger.filter do |event|
next if event[:event_name] != event_name
next if args && event[:params] != args
true
end
end
events_trigger
end
def track(event_type)
events = track_events { yield }
events.find { |e| e[:event_name] == event_type }
def track(event_name, args: nil)
events = track_events(event_name, args: args) { yield }
events.first
end
end