Commit 54df9315eca43f625e95db4c37d81548d3d611e5

Authored by Victor Costa
Committed by Rodrigo Souto
1 parent 3e8bfd50

Do not duplicate filters for plugins

app/controllers/application_controller.rb
... ... @@ -135,9 +135,15 @@ class ApplicationController < ActionController::Base
135 135 plugins.each do |plugin|
136 136 filters = plugin.send(self.class.name.underscore + '_filters')
137 137 filters = [filters] if !filters.kind_of?(Array)
  138 + controller_filters = self.class.filter_chain.map {|c| c.method }
138 139 filters.each do |plugin_filter|
139   - self.class.send(plugin_filter[:type], plugin.class.name.underscore + '_' + plugin_filter[:method_name], (plugin_filter[:options] || {}))
140   - self.class.send(:define_method, plugin.class.name.underscore + '_' + plugin_filter[:method_name], plugin_filter[:block])
  140 + filter_method = plugin.class.name.underscore.gsub('/','_') + '_' + plugin_filter[:method_name]
  141 + unless controller_filters.include?(filter_method)
  142 + self.class.send(plugin_filter[:type], filter_method, (plugin_filter[:options] || {}))
  143 + self.class.send(:define_method, filter_method) do
  144 + instance_eval(&plugin_filter[:block]) if environment.plugin_enabled?(plugin.class)
  145 + end
  146 + end
141 147 end
142 148 end
143 149 end
... ...
test/functional/application_controller_test.rb
... ... @@ -500,4 +500,46 @@ class ApplicationControllerTest < ActionController::TestCase
500 500 end
501 501  
502 502 end
  503 +
  504 + should 'do not duplicate plugin filters' do
  505 +
  506 + class FilterPlugin < Noosfero::Plugin
  507 + def test_controller_filters
  508 + { :type => 'before_filter',
  509 + :method_name => 'filter_plugin',
  510 + :options => {:only => 'some_method'},
  511 + :block => lambda {} }
  512 + end
  513 + end
  514 +
  515 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([FilterPlugin.new])
  516 +
  517 + get :index
  518 + get :index
  519 + assert_equal 1, @controller.class.filter_chain.select{|c| c.method == 'application_controller_test_filter_plugin_filter_plugin'}.count
  520 + end
  521 +
  522 + should 'do not call plugin filter block on a environment that this plugin is not enabled' do
  523 +
  524 + class OtherFilterPlugin < Noosfero::Plugin
  525 + def test_controller_filters
  526 + { :type => 'before_filter',
  527 + :method_name => 'filter_plugin',
  528 + :options => {:only => 'some_method'},
  529 + :block => lambda {'plugin block called'} }
  530 + end
  531 + end
  532 +
  533 + environment1 = fast_create(Environment, :name => 'test environment')
  534 + environment1.enable_plugin(OtherFilterPlugin.name)
  535 + environment2 = fast_create(Environment, :name => 'other test environment')
  536 +
  537 + @controller.stubs(:environment).returns(environment1)
  538 + get :index
  539 + assert_equal 'plugin block called', @controller.application_controller_test_other_filter_plugin_filter_plugin
  540 +
  541 + @controller.stubs(:environment).returns(environment2)
  542 + assert_equal nil, @controller.application_controller_test_other_filter_plugin_filter_plugin
  543 + end
  544 +
503 545 end
... ...