From 02ce9b8a621ef917044e138ac4289ea3e228cc1e Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 20 Jul 2022 03:33:07 +0200 Subject: [PATCH] FIX: badge backfilling triggers :user_badge_granted DiscourseEvent (#17514) --- app/models/badge.rb | 4 ++++ app/models/user_badge.rb | 2 +- app/services/badge_granter.rb | 1 + spec/models/badge_spec.rb | 13 +++++++++++++ spec/services/badge_granter_spec.rb | 10 ++++++++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/models/badge.rb b/app/models/badge.rb index 77527e2af3e..8b4c02329ac 100644 --- a/app/models/badge.rb +++ b/app/models/badge.rb @@ -318,6 +318,10 @@ class Badge < ActiveRecord::Base id == Welcome || (badge_grouping_id == BadgeGrouping::GettingStarted && id != NewUserOfTheMonth) end + def trigger_badge_granted_event(user_id) + DiscourseEvent.trigger(:user_badge_granted, self.id, user_id) + end + protected def ensure_not_system diff --git a/app/models/user_badge.rb b/app/models/user_badge.rb index 79224105a6c..05d285f4342 100644 --- a/app/models/user_badge.rb +++ b/app/models/user_badge.rb @@ -41,7 +41,7 @@ class UserBadge < ActiveRecord::Base Badge.increment_counter 'grant_count', self.badge_id UserStat.update_distinct_badge_count self.user_id UserBadge.update_featured_ranks! self.user_id - DiscourseEvent.trigger(:user_badge_granted, self.badge_id, self.user_id) + self.badge.trigger_badge_granted_event(self.user_id) end after_destroy do diff --git a/app/services/badge_granter.rb b/app/services/badge_granter.rb index 8d285a81f56..a374bcb8ca8 100644 --- a/app/services/badge_granter.rb +++ b/app/services/badge_granter.rb @@ -445,6 +445,7 @@ class BadgeGranter next if row.staff && badge.awarded_for_trust_level? notification = send_notification(row.user_id, row.username, row.locale, badge) + badge.trigger_badge_granted_event(row.user_id) DB.exec( "UPDATE user_badges SET notification_id = :notification_id WHERE id = :id", diff --git a/spec/models/badge_spec.rb b/spec/models/badge_spec.rb index c97ce3c6e02..66293964c5e 100644 --- a/spec/models/badge_spec.rb +++ b/spec/models/badge_spec.rb @@ -234,4 +234,17 @@ 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 diff --git a/spec/services/badge_granter_spec.rb b/spec/services/badge_granter_spec.rb index a0533471336..8f7b893ee6d 100644 --- a/spec/services/badge_granter_spec.rb +++ b/spec/services/badge_granter_spec.rb @@ -481,6 +481,16 @@ describe BadgeGranter do BadgeGranter.backfill(Badge.find(Badge::GreatPost)) 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 + 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 + + BadgeGranter.process_queue! + end end context 'notification locales' do