From c1c50cb90b849e0ac79aa53485aab6830e22d413 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Wed, 3 May 2023 10:18:08 +0100 Subject: [PATCH] DEV: Prevent clearing plugin modifiers during plugin spec runs (#21359) Clearing modifiers during a plugin spec run will affect all future specs. Instead, this commit introduces a more surgical `.unregister_modifier` API which plugins can use if they need to add/remove a modifier during a specific spec. --- lib/discourse_plugin_registry.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb index 138b124bfd8..9ea9aad9ea8 100644 --- a/lib/discourse_plugin_registry.rb +++ b/lib/discourse_plugin_registry.rb @@ -247,6 +247,9 @@ class DiscoursePluginRegistry end def self.clear_modifiers! + if Rails.env.test? && GlobalSetting.load_plugins? + raise "Clearing modifiers during a plugin spec run will affect all future specs. Use unregister_modifier instead." + end @modifiers = nil end @@ -256,6 +259,18 @@ class DiscoursePluginRegistry modifiers << [plugin_instance, blk] end + def self.unregister_modifier(plugin_instance, name, &blk) + raise "unregister_modifier can only be used in tests" if !Rails.env.test? + + modifiers_for_name = @modifiers&.[](name) + raise "no #{name} modifiers found" if !modifiers_for_name + + i = modifiers_for_name.find_index { |info| info == [plugin_instance, blk] } + raise "no modifier found for that plugin/block combination" if !i + + modifiers_for_name.delete_at(i) + end + def self.apply_modifier(name, arg, *more_args) return arg if !@modifiers