From 144d578353865120973b3d47f8ad357032b98cdb Mon Sep 17 00:00:00 2001 From: Rodrigo Souto Date: Thu, 13 Dec 2012 18:26:56 +0000 Subject: [PATCH] Extra methods for the plugin manager --- lib/noosfero/plugin/manager.rb | 24 ++++++++++++++++++++++++ test/unit/plugin_manager_test.rb | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 0 deletions(-) diff --git a/lib/noosfero/plugin/manager.rb b/lib/noosfero/plugin/manager.rb index 8d9f41e..ae51b3b 100644 --- a/lib/noosfero/plugin/manager.rb +++ b/lib/noosfero/plugin/manager.rb @@ -23,12 +23,36 @@ class Noosfero::Plugin::Manager dispatch_without_flatten(event, *args).flatten end + def dispatch_plugins(event, *args) + map { |plugin| plugin.class if plugin.send(event, *args) }.compact.flatten + end + def dispatch_without_flatten(event, *args) map { |plugin| plugin.send(event, *args) }.compact end alias :dispatch_scopes :dispatch_without_flatten + def first(event, *args) + result = nil + each do |plugin| + result = plugin.send(event, *args) + break if result.present? + end + result + end + + def first_plugin(event, *args) + result = nil + each do |plugin| + if plugin.send(event, *args) + result = plugin.class + break + end + end + result + end + def enabled_plugins @enabled_plugins ||= (Noosfero::Plugin.all & environment.enabled_plugins).map do |plugin| p = plugin.constantize.new diff --git a/test/unit/plugin_manager_test.rb b/test/unit/plugin_manager_test.rb index 0da0348..3a32c71 100644 --- a/test/unit/plugin_manager_test.rb +++ b/test/unit/plugin_manager_test.rb @@ -58,5 +58,87 @@ class PluginManagerTest < ActiveSupport::TestCase assert_equal [p1.random_event, p2.random_event], manager.dispatch(:random_event) end + should 'return the first non-blank result' do + class Plugin1 < Noosfero::Plugin + def random_event + end + end + + class Plugin2 < Noosfero::Plugin + def random_event + 'Plugin2' + end + end + + class Plugin3 < Noosfero::Plugin + def random_event + 'Plugin3' + end + end + + environment.enable_plugin(Plugin1.name) + environment.enable_plugin(Plugin2.name) + environment.enable_plugin(Plugin3.name) + + Plugin3.any_instance.expects(:random_event).never + + assert 'Plugin2', manager.first(:random_event) + end + + should 'returns plugins that returns true to the event' do + class Plugin1 < Noosfero::Plugin + def random_event + end + end + + class Plugin2 < Noosfero::Plugin + def random_event + true + end + end + + class Plugin3 < Noosfero::Plugin + def random_event + true + end + end + + environment.enable_plugin(Plugin1.name) + environment.enable_plugin(Plugin2.name) + environment.enable_plugin(Plugin3.name) + + results = manager.dispatch_plugins(:random_event) + + assert_includes results, Plugin2 + assert_includes results, Plugin3 + end + + should 'return the first plugin that returns true' do + class Plugin1 < Noosfero::Plugin + def random_event + end + end + + class Plugin2 < Noosfero::Plugin + def random_event + true + end + end + + class Plugin3 < Noosfero::Plugin + def random_event + true + end + end + + environment.enable_plugin(Plugin1.name) + environment.enable_plugin(Plugin2.name) + environment.enable_plugin(Plugin3.name) + + Plugin3.any_instance.expects(:random_event).never + + assert_equal Plugin2, manager.first_plugin(:random_event) + end + end -- libgit2 0.21.2