Commit 54df9315eca43f625e95db4c37d81548d3d611e5
Committed by
Rodrigo Souto
1 parent
3e8bfd50
Exists in
master
and in
28 other branches
Do not duplicate filters for plugins
Showing
2 changed files
with
50 additions
and
2 deletions
Show diff stats
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 | ... | ... |