DEV: Ensure DiscourseEvent handlers cleaned up during specs (#11205)

This commit is contained in:
David Taylor 2020-11-11 19:46:13 +00:00 committed by GitHub
parent 24976669b8
commit 803b8933fa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 54 additions and 28 deletions

View File

@ -23,6 +23,7 @@ class DiscourseEvent
end end
def self.off(event_name, &block) def self.off(event_name, &block)
raise ArgumentError.new "DiscourseEvent.off must reference a block" if block.nil?
events[event_name].delete(block) events[event_name].delete(block)
end end

View File

@ -31,10 +31,16 @@ describe DiscourseEvent do
) )
} }
let(:event_handler) do
Proc.new { |user| user.name = 'Two Face' }
end
before do before do
DiscourseEvent.on(:acid_face) do |user| DiscourseEvent.on(:acid_face, &event_handler)
user.name = 'Two Face' end
end
after do
DiscourseEvent.off(:acid_face, &event_handler)
end end
context 'when event does not exist' do context 'when event does not exist' do
@ -60,14 +66,19 @@ describe DiscourseEvent do
context 'when multiple events exist' do context 'when multiple events exist' do
before do let(:event_handler_2) do
DiscourseEvent.on(:acid_face) do |user| Proc.new { |user| user.job = 'Supervillian' }
user.job = 'Supervillian' end
end
before do
DiscourseEvent.on(:acid_face, &event_handler_2)
DiscourseEvent.trigger(:acid_face, harvey) DiscourseEvent.trigger(:acid_face, harvey)
end end
after do
DiscourseEvent.off(:acid_face, &event_handler_2)
end
it 'triggers both events' do it 'triggers both events' do
expect(harvey.job).to eq('Supervillian') expect(harvey.job).to eq('Supervillian')
expect(harvey.name).to eq('Two Face') expect(harvey.name).to eq('Two Face')

View File

@ -22,21 +22,22 @@ describe Jobs::AutomaticGroupMembership do
group = Fabricate(:group, automatic_membership_email_domains: "wat.com") group = Fabricate(:group, automatic_membership_email_domains: "wat.com")
automatic = nil
called = false
blk = Proc.new do |_u, _g, options|
automatic = options[:automatic]
called = true
end
begin begin
automatic = nil DiscourseEvent.on(:user_added_to_group, &blk)
called = false
DiscourseEvent.on(:user_added_to_group) do |_u, _g, options|
automatic = options[:automatic]
called = true
end
Jobs::AutomaticGroupMembership.new.execute(group_id: group.id) Jobs::AutomaticGroupMembership.new.execute(group_id: group.id)
expect(automatic).to eql(true) expect(automatic).to eql(true)
expect(called).to eq(true) expect(called).to eq(true)
ensure ensure
DiscourseEvent.off(:user_added_to_group) DiscourseEvent.off(:user_added_to_group, &blk)
end end
group.reload group.reload

View File

@ -853,21 +853,22 @@ describe Group do
end end
it 'triggers a user_added_to_group event' do it 'triggers a user_added_to_group event' do
begin automatic = nil
automatic = nil called = false
called = false
DiscourseEvent.on(:user_added_to_group) do |_u, _g, options| block = Proc.new do |_u, _g, options|
automatic = options[:automatic] automatic = options[:automatic]
called = true called = true
end end
begin
DiscourseEvent.on(:user_added_to_group, &block)
group.add(user) group.add(user)
expect(automatic).to eql(false) expect(automatic).to eql(false)
expect(called).to eq(true) expect(called).to eq(true)
ensure ensure
DiscourseEvent.off(:user_added_to_group) DiscourseEvent.off(:user_added_to_group, &block)
end end
end end

View File

@ -2344,14 +2344,18 @@ describe Topic do
user.admin = true user.admin = true
@topic_status_event_triggered = false @topic_status_event_triggered = false
DiscourseEvent.on(:topic_status_updated) do blk = Proc.new do
@topic_status_event_triggered = true @topic_status_event_triggered = true
end end
DiscourseEvent.on(:topic_status_updated, &blk)
topic.update_status('closed', true, user) topic.update_status('closed', true, user)
topic.reload topic.reload
expect(@topic_status_event_triggered).to eq(true) expect(@topic_status_event_triggered).to eq(true)
ensure
DiscourseEvent.off(:topic_status_updated, &blk)
end end
it 'allows users to normalize counts' do it 'allows users to normalize counts' do

View File

@ -109,15 +109,16 @@ describe TopicUser do
describe 'notifications' do describe 'notifications' do
it 'should trigger the right DiscourseEvent' do it 'should trigger the right DiscourseEvent' do
called = false
blk = Proc.new { called = true }
begin begin
called = false DiscourseEvent.on(:topic_notification_level_changed, &blk)
DiscourseEvent.on(:topic_notification_level_changed) { called = true }
TopicUser.change(user.id, topic.id, notification_level: TopicUser.notification_levels[:tracking]) TopicUser.change(user.id, topic.id, notification_level: TopicUser.notification_levels[:tracking])
expect(called).to eq(true) expect(called).to eq(true)
ensure ensure
DiscourseEvent.off(:topic_notification_level_changed) { called = true } DiscourseEvent.off(:topic_notification_level_changed, &blk)
end end
end end

View File

@ -266,6 +266,13 @@ RSpec.configure do |config|
config.before :each, &TestSetup.method(:test_setup) config.before :each, &TestSetup.method(:test_setup)
config.around :each do |example|
before_event_count = DiscourseEvent.events.values.sum(&:count)
example.run
after_event_count = DiscourseEvent.events.values.sum(&:count)
expect(before_event_count).to eq(after_event_count), "DiscourseEvent registrations were not cleaned up"
end
config.before(:each, type: :multisite) do config.before(:each, type: :multisite) do
Rails.configuration.multisite = true # rubocop:disable Discourse/NoDirectMultisiteManipulation Rails.configuration.multisite = true # rubocop:disable Discourse/NoDirectMultisiteManipulation