diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb index 199c3af0359..a41ab8af8c0 100644 --- a/lib/plugin/instance.rb +++ b/lib/plugin/instance.rb @@ -112,7 +112,7 @@ class Plugin::Instance end end - def add_model_callback(klass, callback, &block) + def add_model_callback(klass, callback, options = {}, &block) klass = klass.to_s.classify.constantize rescue klass.to_s.constantize plugin = self @@ -122,10 +122,11 @@ class Plugin::Instance hidden_method_name = :"#{method_name}_without_enable_check" klass.send(:define_method, hidden_method_name, &block) - klass.send(callback) do |*args| + klass.send(callback, options) do |*args| send(hidden_method_name, *args) if plugin.enabled? end + hidden_method_name end # Add validation method but check that the plugin is enabled diff --git a/spec/components/plugin/instance_spec.rb b/spec/components/plugin/instance_spec.rb index 2e99df132a3..d5c71508503 100644 --- a/spec/components/plugin/instance_spec.rb +++ b/spec/components/plugin/instance_spec.rb @@ -191,4 +191,49 @@ describe Plugin::Instance do end end + describe '#add_model_callback' do + let(:metadata) do + metadata = Plugin::Metadata.new + metadata.name = 'test' + metadata + end + + let(:plugin_instance) do + plugin = Plugin::Instance.new(nil, "/tmp/test.rb") + plugin.metadata = metadata + plugin + end + + it 'should add the right callback' do + called = 0 + + method_name = plugin_instance.add_model_callback(User, :after_create) do + called += 1 + end + + user = Fabricate(:user) + + expect(called).to eq(1) + + user.update_attributes!(username: 'some_username') + + expect(called).to eq(1) + end + + it 'should add the right callback with options' do + called = 0 + + method_name = plugin_instance.add_model_callback(User, :after_commit, on: :create) do + called += 1 + end + + user = Fabricate(:user) + + expect(called).to eq(1) + + user.update_attributes!(username: 'some_username') + + expect(called).to eq(1) + end + end end