Commit 71066d56ee18279d8ef5f98534905536ad228967

Authored by Antonio Terceiro
1 parent 53ee2cd4

Consistent interface for Noosfero::Plugin::Manager

I had to change a lot of plugin hotspot tests that depended on
heavy/evil mocking and stubbing to pass.

(ActionItem2315)
app/controllers/application_controller.rb
@@ -104,8 +104,8 @@ class ApplicationController < ActionController::Base @@ -104,8 +104,8 @@ class ApplicationController < ActionController::Base
104 104
105 def init_noosfero_plugins 105 def init_noosfero_plugins
106 @plugins = Noosfero::Plugin::Manager.new(self) 106 @plugins = Noosfero::Plugin::Manager.new(self)
107 - @plugins.enabled_plugins.map(&:class).each do |plugin|  
108 - prepend_view_path(plugin.view_path) 107 + @plugins.each do |plugin|
  108 + prepend_view_path(plugin.class.view_path)
109 end 109 end
110 init_noosfero_plugins_controller_filters 110 init_noosfero_plugins_controller_filters
111 end 111 end
@@ -113,7 +113,7 @@ class ApplicationController < ActionController::Base @@ -113,7 +113,7 @@ class ApplicationController < ActionController::Base
113 # This is a generic method that initialize any possible filter defined by a 113 # This is a generic method that initialize any possible filter defined by a
114 # plugin to the current controller being initialized. 114 # plugin to the current controller being initialized.
115 def init_noosfero_plugins_controller_filters 115 def init_noosfero_plugins_controller_filters
116 - @plugins.enabled_plugins.each do |plugin| 116 + @plugins.each do |plugin|
117 plugin.send(self.class.name.underscore + '_filters').each do |plugin_filter| 117 plugin.send(self.class.name.underscore + '_filters').each do |plugin_filter|
118 self.class.send(plugin_filter[:type], plugin.class.name.underscore + '_' + plugin_filter[:method_name], (plugin_filter[:options] || {})) 118 self.class.send(plugin_filter[:type], plugin.class.name.underscore + '_' + plugin_filter[:method_name], (plugin_filter[:options] || {}))
119 self.class.send(:define_method, plugin.class.name.underscore + '_' + plugin_filter[:method_name], plugin_filter[:block]) 119 self.class.send(:define_method, plugin.class.name.underscore + '_' + plugin_filter[:method_name], plugin_filter[:block])
app/controllers/my_profile/cms_controller.rb
@@ -50,7 +50,7 @@ class CmsController < MyProfileController @@ -50,7 +50,7 @@ class CmsController < MyProfileController
50 end 50 end
51 51
52 def special_article_types 52 def special_article_types
53 - [Folder, Blog, UploadedFile, Forum, Gallery, RssFeed] + @plugins.map(:content_types) 53 + [Folder, Blog, UploadedFile, Forum, Gallery, RssFeed] + @plugins.dispatch(:content_types)
54 end 54 end
55 55
56 def view 56 def view
app/controllers/public/account_controller.rb
@@ -242,7 +242,7 @@ class AccountController < ApplicationController @@ -242,7 +242,7 @@ class AccountController < ApplicationController
242 session[:notice] = nil # consume the notice 242 session[:notice] = nil # consume the notice
243 end 243 end
244 244
245 - @plugins.enabled_plugins.each { |plugin| user_data.merge!(plugin.user_data_extras) } 245 + @plugins.each { |plugin| user_data.merge!(plugin.user_data_extras) }
246 246
247 render :text => user_data.to_json, :layout => false, :content_type => "application/javascript" 247 render :text => user_data.to_json, :layout => false, :content_type => "application/javascript"
248 end 248 end
app/helpers/application_helper.rb
@@ -1020,7 +1020,7 @@ module ApplicationHelper @@ -1020,7 +1020,7 @@ module ApplicationHelper
1020 options.merge!(:page => params[:npage]) 1020 options.merge!(:page => params[:npage])
1021 content = article.to_html(options) 1021 content = article.to_html(options)
1022 content = content.kind_of?(Proc) ? self.instance_eval(&content) : content 1022 content = content.kind_of?(Proc) ? self.instance_eval(&content) : content
1023 - @plugins && @plugins.enabled_plugins.each do |plugin| 1023 + @plugins && @plugins.each do |plugin|
1024 content = plugin.parse_content(content) 1024 content = plugin.parse_content(content)
1025 end 1025 end
1026 content 1026 content
app/helpers/boxes_helper.rb
@@ -99,7 +99,7 @@ module BoxesHelper @@ -99,7 +99,7 @@ module BoxesHelper
99 unless block.visible? 99 unless block.visible?
100 options[:title] = _("This block is invisible. Your visitors will not see it.") 100 options[:title] = _("This block is invisible. Your visitors will not see it.")
101 end 101 end
102 - @controller.send(:content_editor?) || @plugins.enabled_plugins.each do |plugin| 102 + @controller.send(:content_editor?) || @plugins.each do |plugin|
103 result = plugin.parse_content(result) 103 result = plugin.parse_content(result)
104 end 104 end
105 box_decorator.block_target(block.box, block) + 105 box_decorator.block_target(block.box, block) +
app/views/admin_panel/index.rhtml
@@ -15,7 +15,7 @@ @@ -15,7 +15,7 @@
15 <tr><td><%= link_to _('Edit Templates'), :action => 'edit_templates' %></td></tr> 15 <tr><td><%= link_to _('Edit Templates'), :action => 'edit_templates' %></td></tr>
16 <tr><td><%= link_to _('Manage Fields'), :controller => 'features', :action => 'manage_fields' %></td></tr> 16 <tr><td><%= link_to _('Manage Fields'), :controller => 'features', :action => 'manage_fields' %></td></tr>
17 <tr><td><%= link_to _('Set Portal'), :action => 'set_portal_community' %></td></tr> 17 <tr><td><%= link_to _('Set Portal'), :action => 'set_portal_community' %></td></tr>
18 - <% @plugins.map(:admin_panel_links).each do |link| %> 18 + <% @plugins.dispatch(:admin_panel_links).each do |link| %>
19 <tr><td><%= link_to link[:title], link[:url] %></td></tr> 19 <tr><td><%= link_to link[:title], link[:url] %></td></tr>
20 <% end %> 20 <% end %>
21 </table> 21 </table>
app/views/catalog/index.rhtml
@@ -5,8 +5,8 @@ @@ -5,8 +5,8 @@
5 <li><h1><%= _('Products/Services') %></h1></li> 5 <li><h1><%= _('Products/Services') %></h1></li>
6 6
7 <% @products.each do |product| %> 7 <% @products.each do |product| %>
8 - <% extra_content = @plugins.map(:catalog_item_extras, product).collect { |content| instance_eval(&content) } %>  
9 - <% extra_content_list = @plugins.map(:catalog_list_item_extras, product).collect { |content| instance_eval(&content) } %> 8 + <% extra_content = @plugins.dispatch(:catalog_item_extras, product).collect { |content| instance_eval(&content) } %>
  9 + <% extra_content_list = @plugins.dispatch(:catalog_list_item_extras, product).collect { |content| instance_eval(&content) } %>
10 10
11 <li class="product <%= "not-available" unless product.available %>"> 11 <li class="product <%= "not-available" unless product.available %>">
12 <ul> 12 <ul>
app/views/layouts/application-ng.rhtml
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 <%= stylesheet_link_tag icon_theme_stylesheet_path %> 13 <%= stylesheet_link_tag icon_theme_stylesheet_path %>
14 <%= stylesheet_link_tag jquery_ui_theme_stylesheet_path %> 14 <%= stylesheet_link_tag jquery_ui_theme_stylesheet_path %>
15 <% 15 <%
16 - plugins_stylesheets = @plugins.enabled_plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') } 16 + plugins_stylesheets = @plugins.select(&:stylesheet?).map { |plugin| plugin.class.public_path('style.css') }
17 %> 17 %>
18 <%= stylesheet_link_tag(plugins_stylesheets, :cache => 'cache-plugins-style-' + Digest::MD5.hexdigest(plugins_stylesheets.to_s)) unless plugins_stylesheets.empty? %> 18 <%= stylesheet_link_tag(plugins_stylesheets, :cache => 'cache-plugins-style-' + Digest::MD5.hexdigest(plugins_stylesheets.to_s)) unless plugins_stylesheets.empty? %>
19 <%= stylesheet_link_tag theme_stylesheet_path %> 19 <%= stylesheet_link_tag theme_stylesheet_path %>
@@ -22,11 +22,11 @@ @@ -22,11 +22,11 @@
22 <%= yield :head %> 22 <%= yield :head %>
23 <%= javascript_tag('render_all_jquery_ui_widgets()') %> 23 <%= javascript_tag('render_all_jquery_ui_widgets()') %>
24 <% 24 <%
25 - plugins_javascripts = @plugins.enabled_plugins.map { |plugin| plugin.js_files.map { |js| plugin.class.public_path(js) } }.flatten 25 + plugins_javascripts = @plugins.map { |plugin| plugin.js_files.map { |js| plugin.class.public_path(js) } }.flatten
26 %> 26 %>
27 <%= javascript_include_tag(plugins_javascripts, :cache => 'cache-plugins-js-' + Digest::MD5.hexdigest(plugins_javascripts.to_s)) unless plugins_javascripts.empty? %> 27 <%= javascript_include_tag(plugins_javascripts, :cache => 'cache-plugins-js-' + Digest::MD5.hexdigest(plugins_javascripts.to_s)) unless plugins_javascripts.empty? %>
28 <%= 28 <%=
29 - @plugins.map(:head_ending).collect do |content| 29 + @plugins.dispatch(:head_ending).collect do |content|
30 content.respond_to?(:call) ? content.call : content 30 content.respond_to?(:call) ? content.call : content
31 end.join("\n") 31 end.join("\n")
32 %> 32 %>
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 41
42 <a href="#content" id="link-go-content"><span><%= _("Go to the content") %></span></a> 42 <a href="#content" id="link-go-content"><span><%= _("Go to the content") %></span></a>
43 <%= 43 <%=
44 - @plugins.map(:body_beginning).collect do |content| 44 + @plugins.dispatch(:body_beginning).collect do |content|
45 content.respond_to?(:call) ? content.call : content 45 content.respond_to?(:call) ? content.call : content
46 end.join("\n") 46 end.join("\n")
47 %> 47 %>
app/views/manage_products/show.rhtml
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 <%= render :partial => 'manage_products/display_image' %> 13 <%= render :partial => 'manage_products/display_image' %>
14 </div> 14 </div>
15 <div id='product-extra-content'> 15 <div id='product-extra-content'>
16 - <% extra_content = @plugins.map(:product_info_extras, @product).collect { |content| instance_eval(&content) } %> 16 + <% extra_content = @plugins.dispatch(:product_info_extras, @product).collect { |content| instance_eval(&content) } %>
17 <%= extra_content.join("\n") %> 17 <%= extra_content.join("\n") %>
18 </div> 18 </div>
19 <div id='product-info'> 19 <div id='product-info'>
app/views/profile/_profile.rhtml
1 <tr> 1 <tr>
2 <td colspan='2'> 2 <td colspan='2'>
3 3
4 - <% plugins_tabs = @plugins.map(:profile_tabs). 4 + <% plugins_tabs = @plugins.dispatch(:profile_tabs).
5 map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content]), :start => tab[:title]} }%> 5 map { |tab| {:title => tab[:title], :id => tab[:id], :content => instance_eval(&tab[:content]), :start => tab[:title]} }%>
6 6
7 <% tabs = plugins_tabs.select { |tab| tab[:start] } %> 7 <% tabs = plugins_tabs.select { |tab| tab[:start] } %>
app/views/profile_editor/edit.rhtml
@@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@
82 )%> 82 )%>
83 83
84 <%= 84 <%=
85 - @plugins.map(:profile_editor_extras).each do |content| 85 + @plugins.dispatch(:profile_editor_extras).each do |content|
86 content.respond_to?(:call) ? content.call : content 86 content.respond_to?(:call) ? content.call : content
87 end.join("\n") 87 end.join("\n")
88 %> 88 %>
app/views/profile_editor/index.rhtml
@@ -66,7 +66,7 @@ @@ -66,7 +66,7 @@
66 66
67 <%= control_panel_button(_('Manage my groups'), 'groups', :controller => 'memberships') if profile.person? %> 67 <%= control_panel_button(_('Manage my groups'), 'groups', :controller => 'memberships') if profile.person? %>
68 68
69 - <% @plugins.map(:control_panel_buttons).each do |button| %> 69 + <% @plugins.dispatch(:control_panel_buttons).each do |button| %>
70 <%= control_panel_button(button[:title], button[:icon], button[:url]) %> 70 <%= control_panel_button(button[:title], button[:icon], button[:url]) %>
71 <% end %> 71 <% end %>
72 72
app/views/profile_members/_index_buttons.rhtml
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 <%= button :search, _('Invite your friends to join %s') % profile.short_name, :controller => 'invite', :action => 'select_address_book' %> 5 <%= button :search, _('Invite your friends to join %s') % profile.short_name, :controller => 'invite', :action => 'select_address_book' %>
6 <% end %> 6 <% end %>
7 <%= button :send, _('Send e-mail to members'), :action => 'send_mail' %> 7 <%= button :send, _('Send e-mail to members'), :action => 'send_mail' %>
8 - <% @plugins.map(:manage_members_extra_buttons).each do |plugin_button| %> 8 + <% @plugins.dispatch(:manage_members_extra_buttons).each do |plugin_button| %>
9 <%= button plugin_button[:icon], plugin_button[:title], plugin_button[:url] %> 9 <%= button plugin_button[:icon], plugin_button[:title], plugin_button[:url] %>
10 <% end %> 10 <% end %>
11 <% end %> 11 <% end %>
app/views/search/_product.rhtml
@@ -5,8 +5,8 @@ product_item_pos = 0 if ! product_item_pos @@ -5,8 +5,8 @@ product_item_pos = 0 if ! product_item_pos
5 product_item_pos += 1 5 product_item_pos += 1
6 %> 6 %>
7 7
8 -<% extra_content = @plugins.map(:asset_product_extras, product, product.enterprise).collect { |content| instance_eval(&content) } %>  
9 -<% extra_properties = @plugins.map(:asset_product_properties, product)%> 8 +<% extra_content = @plugins.dispatch(:asset_product_extras, product, product.enterprise).collect { |content| instance_eval(&content) } %>
  9 +<% extra_properties = @plugins.dispatch(:asset_product_properties, product)%>
10 10
11 <li class="product-item <%= ( pos % 2 == 0 ) ? 'odd' : 'even' %>"> 11 <li class="product-item <%= ( pos % 2 == 0 ) ? 'odd' : 'even' %>">
12 <%= link_to_product product, :class => 'product-pic', :style => 'background-image:url(%s)' % product.default_image(:minor) %> 12 <%= link_to_product product, :class => 'product-pic', :style => 'background-image:url(%s)' % product.default_image(:minor) %>
lib/noosfero/plugin/manager.rb
@@ -6,12 +6,19 @@ class Noosfero::Plugin::Manager @@ -6,12 +6,19 @@ class Noosfero::Plugin::Manager
6 @context = Noosfero::Plugin::Context.new(controller) 6 @context = Noosfero::Plugin::Context.new(controller)
7 end 7 end
8 8
9 - def map(event, *args)  
10 - enabled_plugins.map { |plugin| plugin.send(event, *args) }.compact.flatten  
11 - end 9 + delegate :each, :to => :enabled_plugins
  10 + include Enumerable
12 11
13 - def collect(&block)  
14 - enabled_plugins.collect(&block) 12 + # Dispatches +event+ to each enabled plugin and collect the results.
  13 + #
  14 + # Returns an Array containing the objects returned by the event method in
  15 + # each plugin. This array is compacted (i.e. nils are removed) and flattened
  16 + # (i.e. elements of arrays are added to the resulting array). For example, if
  17 + # the enabled plugins return 1, 0, nil, and [1,2,3], then this method will
  18 + # return [1,0,1,2,3]
  19 + #
  20 + def dispatch(event, *args)
  21 + map { |plugin| plugin.send(event, *args) }.compact.flatten
15 end 22 end
16 23
17 def enabled_plugins 24 def enabled_plugins
test/functional/admin_panel_controller_test.rb
@@ -332,20 +332,23 @@ class AdminPanelControllerTest &lt; ActionController::TestCase @@ -332,20 +332,23 @@ class AdminPanelControllerTest &lt; ActionController::TestCase
332 end 332 end
333 333
334 should 'display plugins links' do 334 should 'display plugins links' do
335 - plugin1_link = {:title => 'Plugin1 link', :url => 'plugin1.com'}  
336 - plugin2_link = {:title => 'Plugin2 link', :url => 'plugin2.com'}  
337 - links = [plugin1_link, plugin2_link]  
338 - plugins = mock()  
339 - plugins.stubs(:map).with(:admin_panel_links).returns(links)  
340 - plugins.stubs(:enabled_plugins).returns([])  
341 - plugins.stubs(:map).with(:body_beginning).returns([])  
342 - plugins.stubs(:map).with(:head_ending).returns([])  
343 - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 335 + class TestAdminPanelLinks1 < Noosfero::Plugin
  336 + def admin_panel_links
  337 + {:title => 'Plugin1 link', :url => 'plugin1.com'}
  338 + end
  339 + end
  340 + class TestAdminPanelLinks2 < Noosfero::Plugin
  341 + def admin_panel_links
  342 + {:title => 'Plugin2 link', :url => 'plugin2.com'}
  343 + end
  344 + end
  345 +
  346 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestAdminPanelLinks1.new, TestAdminPanelLinks2.new])
344 347
345 get :index 348 get :index
346 349
347 - assert_tag :tag => 'a', :content => /#{plugin1_link[:title]}/, :attributes => {:href => /#{plugin1_link[:url]}/}  
348 - assert_tag :tag => 'a', :content => /#{plugin2_link[:title]}/, :attributes => {:href => /#{plugin2_link[:url]}/} 350 + assert_tag :tag => 'a', :content => /Plugin1 link/, :attributes => {:href => /plugin1.com/}
  351 + assert_tag :tag => 'a', :content => /Plugin2 link/, :attributes => {:href => /plugin2.com/}
349 end 352 end
350 353
351 end 354 end
test/functional/application_controller_test.rb
@@ -392,38 +392,49 @@ class ApplicationControllerTest &lt; ActionController::TestCase @@ -392,38 +392,49 @@ class ApplicationControllerTest &lt; ActionController::TestCase
392 end 392 end
393 393
394 should 'include content in the beginning of body supplied by plugins regardless it is a block or html code' do 394 should 'include content in the beginning of body supplied by plugins regardless it is a block or html code' do
395 - plugin1_local_variable = "Plugin1"  
396 - plugin1_content = lambda {"<span id='plugin1'>This is #{plugin1_local_variable} speaking!</span>"}  
397 - plugin2_content = "<span id='plugin2'>This is Plugin2 speaking!</span>"  
398 - contents = [plugin1_content, plugin2_content] 395 + class TestBodyBeginning1Plugin < Noosfero::Plugin
  396 + def plugin1_method
  397 + '[[plugin1]]'
  398 + end
  399 + def body_beginning
  400 + lambda {"<span id='plugin1'>This is #{plugin1_method} speaking!</span>"}
  401 + end
  402 + end
  403 + class TestBodyBeginning2Plugin < Noosfero::Plugin
  404 + def body_beginning
  405 + "<span id='plugin2'>This is Plugin2 speaking!</span>"
  406 + end
  407 + end
399 408
400 - plugins = mock()  
401 - plugins.stubs(:enabled_plugins).returns([])  
402 - plugins.stubs(:map).with(:body_beginning).returns(contents)  
403 - plugins.stubs(:map).with(:head_ending).returns([])  
404 - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 409 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBodyBeginning1Plugin.new, TestBodyBeginning2Plugin.new])
405 410
406 get :index 411 get :index
407 412
408 - assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'} 413 + assert_tag :tag => 'span', :content => 'This is [[plugin1]] speaking!', :attributes => {:id => 'plugin1'}
409 assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'} 414 assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'}
410 end 415 end
411 416
412 should 'include content in the ending of head supplied by plugins regardless it is a block or html code' do 417 should 'include content in the ending of head supplied by plugins regardless it is a block or html code' do
413 - plugin1_local_variable = "Plugin1"  
414 - plugin1_content = lambda {"<script>alert('This is #{plugin1_local_variable} speaking!')</script>"}  
415 - plugin2_content = "<style>This is Plugin2 speaking!</style>"  
416 - contents = [plugin1_content, plugin2_content]  
417 418
418 - plugins = mock()  
419 - plugins.stubs(:enabled_plugins).returns([])  
420 - plugins.stubs(:map).with(:head_ending).returns(contents)  
421 - plugins.stubs(:map).with(:body_beginning).returns([])  
422 - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 419 + class TestHeadEnding1Plugin < Noosfero::Plugin
  420 + def plugin1_method
  421 + '[[plugin1]]'
  422 + end
  423 + def head_ending
  424 + lambda {"<script>alert('This is #{plugin1_method} speaking!')</script>"}
  425 + end
  426 + end
  427 + class TestHeadEnding2Plugin < Noosfero::Plugin
  428 + def head_ending
  429 + "<style>This is Plugin2 speaking!</style>"
  430 + end
  431 + end
  432 +
  433 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestHeadEnding1Plugin.new, TestHeadEnding2Plugin.new])
423 434
424 get :index 435 get :index
425 436
426 - assert_tag :tag => 'script', :content => "alert('This is #{plugin1_local_variable} speaking!')" 437 + assert_tag :tag => 'script', :content => "alert('This is [[plugin1]] speaking!')"
427 assert_tag :tag => 'style', :content => 'This is Plugin2 speaking!' 438 assert_tag :tag => 'style', :content => 'This is Plugin2 speaking!'
428 end 439 end
429 440
test/functional/cms_controller_test.rb
@@ -1509,14 +1509,13 @@ class CmsControllerTest &lt; ActionController::TestCase @@ -1509,14 +1509,13 @@ class CmsControllerTest &lt; ActionController::TestCase
1509 end 1509 end
1510 1510
1511 should 'include new contents special types from plugins' do 1511 should 'include new contents special types from plugins' do
1512 - types = [Integer, Float]  
1513 - plugins = mock()  
1514 -  
1515 - Noosfero::Plugin::Manager.expects(:new).with(@controller).returns(plugins).times(2)  
1516 - plugins.stubs(:map).with(:content_types).returns(types)  
1517 - plugins.stubs(:map).with(:body_beginning).returns([])  
1518 - plugins.stubs(:map).with(:head_ending).returns([])  
1519 - plugins.stubs(:enabled_plugins).returns([]) 1512 + class TestContentTypesPlugin < Noosfero::Plugin
  1513 + def content_types
  1514 + [Integer, Float]
  1515 + end
  1516 + end
  1517 +
  1518 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestContentTypesPlugin.new])
1520 1519
1521 get :index, :profile => profile.identifier 1520 get :index, :profile => profile.identifier
1522 1521
test/functional/manage_products_controller_test.rb
@@ -437,24 +437,25 @@ class ManageProductsControllerTest &lt; ActionController::TestCase @@ -437,24 +437,25 @@ class ManageProductsControllerTest &lt; ActionController::TestCase
437 end 437 end
438 438
439 should 'include extra content supplied by plugins on products info extras' do 439 should 'include extra content supplied by plugins on products info extras' do
  440 + class TestProductInfoExtras1Plugin < Noosfero::Plugin
  441 + def product_info_extras(p)
  442 + lambda {"<span id='plugin1'>This is Plugin1 speaking!</span>"}
  443 + end
  444 + end
  445 + class TestProductInfoExtras2Plugin < Noosfero::Plugin
  446 + def product_info_extras(p)
  447 + lambda { "<span id='plugin2'>This is Plugin2 speaking!</span>" }
  448 + end
  449 + end
  450 +
440 product = fast_create(Product, :enterprise_id => @enterprise.id) 451 product = fast_create(Product, :enterprise_id => @enterprise.id)
441 - plugin1_local_variable = "Plugin1"  
442 - plugin1_content = lambda {"<span id='plugin1'>This is #{plugin1_local_variable} speaking!</span>"}  
443 - plugin2_local_variable = "Plugin2"  
444 - plugin2_content = lambda {"<span id='plugin2'>This is #{plugin2_local_variable} speaking!</span>"}  
445 - contents = [plugin1_content, plugin2_content]  
446 -  
447 - plugins = mock()  
448 - plugins.stubs(:enabled_plugins).returns([])  
449 - plugins.stubs(:map).with(:body_beginning).returns([])  
450 - plugins.stubs(:map).with(:head_ending).returns([])  
451 - plugins.stubs(:map).with(:product_info_extras, product).returns(contents)  
452 - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 452 +
  453 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestProductInfoExtras1Plugin.new, TestProductInfoExtras2Plugin.new])
453 454
454 get :show, :id => product.id, :profile => @enterprise.identifier 455 get :show, :id => product.id, :profile => @enterprise.identifier
455 456
456 - assert_tag :tag => 'span', :content => 'This is ' + plugin1_local_variable + ' speaking!', :attributes => {:id => 'plugin1'}  
457 - assert_tag :tag => 'span', :content => 'This is ' + plugin2_local_variable + ' speaking!', :attributes => {:id => 'plugin2'} 457 + assert_tag :tag => 'span', :content => 'This is Plugin1 speaking!', :attributes => {:id => 'plugin1'}
  458 + assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'}
458 end 459 end
459 460
460 should 'not allow product creation for profiles that can\'t do it' do 461 should 'not allow product creation for profiles that can\'t do it' do
test/functional/profile_editor_controller_test.rb
@@ -864,30 +864,34 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase @@ -864,30 +864,34 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
864 end 864 end
865 865
866 should 'display plugins buttons on the control panel' do 866 should 'display plugins buttons on the control panel' do
867 - plugin1_button = {:title => "Plugin1 button", :icon => 'plugin1_icon', :url => 'plugin1_url'}  
868 - plugin2_button = {:title => "Plugin2 button", :icon => 'plugin2_icon', :url => 'plugin2_url'}  
869 - buttons = [plugin1_button, plugin2_button]  
870 - plugins = mock()  
871 - plugins.stubs(:map).with(:control_panel_buttons).returns(buttons)  
872 - plugins.stubs(:enabled_plugins).returns([])  
873 - plugins.stubs(:map).with(:body_beginning).returns([])  
874 - plugins.stubs(:map).with(:head_ending).returns([])  
875 - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 867 +
  868 + class TestControlPanelButtons1 < Noosfero::Plugin
  869 + def control_panel_buttons
  870 + {:title => "Plugin1 button", :icon => 'plugin1_icon', :url => 'plugin1_url'}
  871 + end
  872 + end
  873 + class TestControlPanelButtons2 < Noosfero::Plugin
  874 + def control_panel_buttons
  875 + {:title => "Plugin2 button", :icon => 'plugin2_icon', :url => 'plugin2_url'}
  876 + end
  877 + end
  878 +
  879 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestControlPanelButtons1.new, TestControlPanelButtons2.new])
876 880
877 get :index, :profile => profile.identifier 881 get :index, :profile => profile.identifier
878 882
879 - assert_tag :tag => 'a', :content => plugin1_button[:title], :attributes => {:class => /#{plugin1_button[:icon]}/, :href => /#{plugin1_button[:url]}/}  
880 - assert_tag :tag => 'a', :content => plugin2_button[:title], :attributes => {:class => /#{plugin2_button[:icon]}/, :href => /#{plugin2_button[:url]}/} 883 + assert_tag :tag => 'a', :content => 'Plugin1 button', :attributes => {:class => /plugin1_icon/, :href => /plugin1_url/}
  884 + assert_tag :tag => 'a', :content => 'Plugin2 button', :attributes => {:class => /plugin2_icon/, :href => /plugin2_url/}
881 end 885 end
882 886
883 should 'add extra content provided by plugins on edit' do 887 should 'add extra content provided by plugins on edit' do
884 - plugin1_content = "<input id='field_added_by_plugin' value='value_of_field_added_by_plugin'/>"  
885 - plugins = mock()  
886 - plugins.stubs(:enabled_plugins).returns([])  
887 - plugins.stubs(:map).with(:profile_editor_extras).returns([plugin1_content])  
888 - plugins.stubs(:map).with(:head_ending).returns([])  
889 - plugins.stubs(:map).with(:body_beginning).returns([])  
890 - Noosfero::Plugin::Manager.stubs(:new).returns(plugins) 888 + class TestProfileEditPlugin < Noosfero::Plugin
  889 + def profile_editor_extras
  890 + "<input id='field_added_by_plugin' value='value_of_field_added_by_plugin'/>"
  891 + end
  892 + end
  893 +
  894 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestProfileEditPlugin.new])
891 895
892 get :edit, :profile => profile.identifier 896 get :edit, :profile => profile.identifier
893 897
test/unit/plugin_manager_test.rb
@@ -51,7 +51,7 @@ class PluginManagerTest &lt; ActiveSupport::TestCase @@ -51,7 +51,7 @@ class PluginManagerTest &lt; ActiveSupport::TestCase
51 p1 = Plugin1.new 51 p1 = Plugin1.new
52 p2 = Plugin2.new 52 p2 = Plugin2.new
53 53
54 - assert_equal [p1.random_event, p2.random_event], manager.map(:random_event) 54 + assert_equal [p1.random_event, p2.random_event], manager.dispatch(:random_event)
55 end 55 end
56 56
57 end 57 end