Commit 40b3903afeb2c921abf36f3c5db9cffc16e1b888
Exists in
staging
and in
42 other branches
Merge branch 'stable'
Showing
23 changed files
with
156 additions
and
23 deletions
Show diff stats
app/controllers/my_profile/profile_design_controller.rb
| @@ -25,6 +25,7 @@ class ProfileDesignController < BoxOrganizerController | @@ -25,6 +25,7 @@ class ProfileDesignController < BoxOrganizerController | ||
| 25 | blocks << DisabledEnterpriseMessageBlock | 25 | blocks << DisabledEnterpriseMessageBlock |
| 26 | blocks << HighlightsBlock | 26 | blocks << HighlightsBlock |
| 27 | blocks << FeaturedProductsBlock | 27 | blocks << FeaturedProductsBlock |
| 28 | + blocks << FansBlock | ||
| 28 | end | 29 | end |
| 29 | 30 | ||
| 30 | # product block exclusive for enterprises in environments that permits it | 31 | # product block exclusive for enterprises in environments that permits it |
app/controllers/public/profile_controller.rb
| @@ -71,6 +71,10 @@ class ProfileController < PublicController | @@ -71,6 +71,10 @@ class ProfileController < PublicController | ||
| 71 | end | 71 | end |
| 72 | end | 72 | end |
| 73 | 73 | ||
| 74 | + def fans | ||
| 75 | + @fans = profile.fans | ||
| 76 | + end | ||
| 77 | + | ||
| 74 | def favorite_enterprises | 78 | def favorite_enterprises |
| 75 | @favorite_enterprises = profile.favorite_enterprises | 79 | @favorite_enterprises = profile.favorite_enterprises |
| 76 | end | 80 | end |
app/models/blog.rb
| @@ -72,4 +72,8 @@ class Blog < Folder | @@ -72,4 +72,8 @@ class Blog < Folder | ||
| 72 | 72 | ||
| 73 | alias :display_posts_in_current_language? :display_posts_in_current_language | 73 | alias :display_posts_in_current_language? :display_posts_in_current_language |
| 74 | 74 | ||
| 75 | + def empty? | ||
| 76 | + posts.empty? | ||
| 77 | + end | ||
| 78 | + | ||
| 75 | end | 79 | end |
app/models/enterprise.rb
| @@ -8,6 +8,8 @@ class Enterprise < Organization | @@ -8,6 +8,8 @@ class Enterprise < Organization | ||
| 8 | has_many :inputs, :through => :products | 8 | has_many :inputs, :through => :products |
| 9 | has_many :production_costs, :as => :owner | 9 | has_many :production_costs, :as => :owner |
| 10 | 10 | ||
| 11 | + has_and_belongs_to_many :fans, :class_name => 'Person', :join_table => 'favorite_enteprises_people' | ||
| 12 | + | ||
| 11 | extra_data_for_index :product_categories | 13 | extra_data_for_index :product_categories |
| 12 | 14 | ||
| 13 | N_('Organization website'); N_('Historic and current context'); N_('Activities short description'); N_('City'); N_('State'); N_('Country'); N_('ZIP code') | 15 | N_('Organization website'); N_('Historic and current context'); N_('Activities short description'); N_('City'); N_('State'); N_('Country'); N_('ZIP code') |
| @@ -0,0 +1,31 @@ | @@ -0,0 +1,31 @@ | ||
| 1 | +class FansBlock < ProfileListBlock | ||
| 2 | + | ||
| 3 | + def self.description | ||
| 4 | + _('Fans') | ||
| 5 | + end | ||
| 6 | + | ||
| 7 | + def default_title | ||
| 8 | + n__('{#} fan', '{#} fans', profile_count) | ||
| 9 | + end | ||
| 10 | + | ||
| 11 | + def help | ||
| 12 | + _('This block presents the fans of an enterprise.') | ||
| 13 | + end | ||
| 14 | + | ||
| 15 | + def footer | ||
| 16 | + profile = self.owner | ||
| 17 | + lambda do | ||
| 18 | + link_to _('View all'), :profile => profile.identifier, :controller => | ||
| 19 | + 'profile', :action => 'fans' | ||
| 20 | + end | ||
| 21 | + end | ||
| 22 | + | ||
| 23 | + def profiles | ||
| 24 | + owner.fans | ||
| 25 | + end | ||
| 26 | + | ||
| 27 | + def profile_count | ||
| 28 | + profiles.visible.count | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | +end |
app/sweepers/profile_sweeper.rb
| @@ -25,10 +25,23 @@ protected | @@ -25,10 +25,23 @@ protected | ||
| 25 | profile.blocks.each do |block| | 25 | profile.blocks.each do |block| |
| 26 | expire_timeout_fragment(block.cache_key) | 26 | expire_timeout_fragment(block.cache_key) |
| 27 | end | 27 | end |
| 28 | + | ||
| 29 | + expire_blogs(profile) if profile.organization? | ||
| 28 | end | 30 | end |
| 29 | 31 | ||
| 30 | def expire_statistics_block_cache(profile) | 32 | def expire_statistics_block_cache(profile) |
| 31 | blocks = profile.environment.blocks.select { |b| b.kind_of?(EnvironmentStatisticsBlock) } | 33 | blocks = profile.environment.blocks.select { |b| b.kind_of?(EnvironmentStatisticsBlock) } |
| 32 | blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} | 34 | blocks.map(&:cache_key).each{|ck|expire_timeout_fragment(ck)} |
| 33 | end | 35 | end |
| 36 | + | ||
| 37 | + def expire_blogs(profile) | ||
| 38 | + profile.blogs.select{|b| !b.empty?}.each do |blog| | ||
| 39 | + pages = blog.posts.count / blog.posts_per_page + 1 | ||
| 40 | + ([nil] + (1..pages).to_a).each do |i| | ||
| 41 | + expire_timeout_fragment(blog.cache_key({:npage => i})) | ||
| 42 | + expire_timeout_fragment(blog.cache_key({:npage => i}, profile)) | ||
| 43 | + end | ||
| 44 | + end | ||
| 45 | + end | ||
| 46 | + | ||
| 34 | end | 47 | end |
app/views/content_viewer/blog_page.rhtml
| @@ -9,5 +9,5 @@ | @@ -9,5 +9,5 @@ | ||
| 9 | </div> | 9 | </div> |
| 10 | <hr class="pre-posts"/> | 10 | <hr class="pre-posts"/> |
| 11 | <div class="blog-posts"> | 11 | <div class="blog-posts"> |
| 12 | - <%= (@posts.compact.empty? ? content_tag('em', _('(no posts)')) : list_posts(@posts, @page.visualization_format)) %> | 12 | + <%= (@page.empty? ? content_tag('em', _('(no posts)')) : list_posts(@posts, @page.visualization_format)) %> |
| 13 | </div> | 13 | </div> |
app/views/favorite_enterprises/add.rhtml
| @@ -7,6 +7,6 @@ | @@ -7,6 +7,6 @@ | ||
| 7 | <% form_tag do %> | 7 | <% form_tag do %> |
| 8 | <%= hidden_field_tag(:confirmation, 1) %> | 8 | <%= hidden_field_tag(:confirmation, 1) %> |
| 9 | 9 | ||
| 10 | - <%= submit_button(:ok, __("Yes, I want to add %s as a favorite enterprise") % @favorite_enterprise.name) %> | 10 | + <%= submit_button(:ok, __("Yes, I am sure"), :title => _("I want to add %s as a favorite enterprise") % @favorite_enterprise.name) %> |
| 11 | <%= button(:cancel, _("No, I don't want"), :action => 'index') %> | 11 | <%= button(:cancel, _("No, I don't want"), :action => 'index') %> |
| 12 | <% end %> | 12 | <% end %> |
| @@ -0,0 +1,16 @@ | @@ -0,0 +1,16 @@ | ||
| 1 | +<div class="common-profile-list-block"> | ||
| 2 | + | ||
| 3 | +<h1><%= __("%s's fans") % profile.name %></h1> | ||
| 4 | + | ||
| 5 | +<ul class='profile-list'> | ||
| 6 | +<% @fans.each do |person| %> | ||
| 7 | + <li><%= profile_image_link(person)%></li> | ||
| 8 | +<% end %> | ||
| 9 | +</ul> | ||
| 10 | + | ||
| 11 | +<% button_bar do %> | ||
| 12 | + <%= button :back, _('Go back'), { :controller => 'profile' }%> | ||
| 13 | +<% end %> | ||
| 14 | + | ||
| 15 | +</div><!-- fim class="common-profile-list-block" --> | ||
| 16 | + |
debian/changelog
| 1 | +noosfero (0.30.2) unstable; urgency=low | ||
| 2 | + | ||
| 3 | + * Bugfix Version release. | ||
| 4 | + | ||
| 5 | + -- Joenio Costa <joenio@colivre.coop.br> Wed, 11 May 2011 21:48:31 -0300 | ||
| 6 | + | ||
| 1 | noosfero (0.30.1) unstable; urgency=low | 7 | noosfero (0.30.1) unstable; urgency=low |
| 2 | 8 | ||
| 3 | * Bugfix Version release. | 9 | * Bugfix Version release. |
lib/feed_updater.rb
| @@ -39,11 +39,12 @@ class FeedUpdater | @@ -39,11 +39,12 @@ class FeedUpdater | ||
| 39 | ['TERM', 'INT'].each do |signal| | 39 | ['TERM', 'INT'].each do |signal| |
| 40 | Signal.trap(signal) do | 40 | Signal.trap(signal) do |
| 41 | stop | 41 | stop |
| 42 | - RAILS_DEFAULT_LOGGER.info("Feed updater exiting gracefully ...") | 42 | + puts "Feed updater exiting gracefully ..." |
| 43 | end | 43 | end |
| 44 | end | 44 | end |
| 45 | + puts "Feed updater started." | ||
| 45 | run | 46 | run |
| 46 | - RAILS_DEFAULT_LOGGER.info("Feed updater exited.") | 47 | + puts "Feed updater exited." |
| 47 | end | 48 | end |
| 48 | 49 | ||
| 49 | def run | 50 | def run |
lib/noosfero.rb
| 1 | module Noosfero | 1 | module Noosfero |
| 2 | PROJECT = 'noosfero' | 2 | PROJECT = 'noosfero' |
| 3 | - VERSION = '0.30.1' | 3 | + VERSION = '0.30.2' |
| 4 | 4 | ||
| 5 | def self.pattern_for_controllers_in_directory(dir) | 5 | def self.pattern_for_controllers_in_directory(dir) |
| 6 | disjunction = controllers_in_directory(dir).join('|') | 6 | disjunction = controllers_in_directory(dir).join('|') |
public/500.html
| @@ -52,8 +52,8 @@ | @@ -52,8 +52,8 @@ | ||
| 52 | <li><a href='/'>Go to the site home page</a></li> | 52 | <li><a href='/'>Go to the site home page</a></li> |
| 53 | </ul> | 53 | </ul> |
| 54 | </div> | 54 | </div> |
| 55 | - | ||
| 56 | - | 55 | + |
| 56 | + | ||
| 57 | <div id='es' style='display: none' class='message'> | 57 | <div id='es' style='display: none' class='message'> |
| 58 | <h1>Temporary system problem</h1> | 58 | <h1>Temporary system problem</h1> |
| 59 | <p> | 59 | <p> |
| @@ -120,7 +120,7 @@ | @@ -120,7 +120,7 @@ | ||
| 120 | <a href="javascript: display_error_message('en')">English</a> | 120 | <a href="javascript: display_error_message('en')">English</a> |
| 121 | 121 | ||
| 122 | <a href="javascript: display_error_message('eo')">Esperanto</a> | 122 | <a href="javascript: display_error_message('eo')">Esperanto</a> |
| 123 | - | 123 | + |
| 124 | <a href="javascript: display_error_message('es')">Español</a> | 124 | <a href="javascript: display_error_message('es')">Español</a> |
| 125 | 125 | ||
| 126 | <a href="javascript: display_error_message('fr')">Français</a> | 126 | <a href="javascript: display_error_message('fr')">Français</a> |
public/500.html.erb
| @@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
| 16 | | 16 | |
| 17 | </div> | 17 | </div> |
| 18 | </div> | 18 | </div> |
| 19 | - <%- Noosfero.each_locale do |language_code,language_name| -%> | 19 | + <% Noosfero.each_locale do |language_code,language_name| %> |
| 20 | <% FastGettext.set_locale language_code %> | 20 | <% FastGettext.set_locale language_code %> |
| 21 | <div id='<%= language_code %>' style='display: none' class='message'> | 21 | <div id='<%= language_code %>' style='display: none' class='message'> |
| 22 | <h1><%= _('Temporary system problem') %></h1> | 22 | <h1><%= _('Temporary system problem') %></h1> |
| @@ -30,7 +30,7 @@ | @@ -30,7 +30,7 @@ | ||
| 30 | </div> | 30 | </div> |
| 31 | <% end %> | 31 | <% end %> |
| 32 | <div id='languages'> | 32 | <div id='languages'> |
| 33 | - <%- Noosfero.each_locale do |language_code,language_name| -%> | 33 | + <% Noosfero.each_locale do |language_code,language_name| %> |
| 34 | <a href="javascript: display_error_message('<%= language_code %>')"><%= language_name %></a> | 34 | <a href="javascript: display_error_message('<%= language_code %>')"><%= language_name %></a> |
| 35 | <% end %> | 35 | <% end %> |
| 36 | </div> | 36 | </div> |
public/503.html
| @@ -40,8 +40,8 @@ | @@ -40,8 +40,8 @@ | ||
| 40 | This system is under maintainance. It should be back in a few moments. | 40 | This system is under maintainance. It should be back in a few moments. |
| 41 | </p> | 41 | </p> |
| 42 | </div> | 42 | </div> |
| 43 | - | ||
| 44 | - | 43 | + |
| 44 | + | ||
| 45 | <div id='es' style='display: none' class='message'> | 45 | <div id='es' style='display: none' class='message'> |
| 46 | <h1>System maintainance</h1> | 46 | <h1>System maintainance</h1> |
| 47 | <p> | 47 | <p> |
| @@ -88,7 +88,7 @@ | @@ -88,7 +88,7 @@ | ||
| 88 | <a href="javascript: display_error_message('en')">English</a> | 88 | <a href="javascript: display_error_message('en')">English</a> |
| 89 | 89 | ||
| 90 | <a href="javascript: display_error_message('eo')">Esperanto</a> | 90 | <a href="javascript: display_error_message('eo')">Esperanto</a> |
| 91 | - | 91 | + |
| 92 | <a href="javascript: display_error_message('es')">Español</a> | 92 | <a href="javascript: display_error_message('es')">Español</a> |
| 93 | 93 | ||
| 94 | <a href="javascript: display_error_message('fr')">Français</a> | 94 | <a href="javascript: display_error_message('fr')">Français</a> |
public/503.html.erb
| @@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
| 16 | | 16 | |
| 17 | </div> | 17 | </div> |
| 18 | </div> | 18 | </div> |
| 19 | - <%- Noosfero.each_locale do |language_code,language_name| -%> | 19 | + <% Noosfero.each_locale do |language_code,language_name| %> |
| 20 | <% FastGettext.set_locale language_code %> | 20 | <% FastGettext.set_locale language_code %> |
| 21 | <div id='<%= language_code %>' style='display: none' class='message'> | 21 | <div id='<%= language_code %>' style='display: none' class='message'> |
| 22 | <h1><%= _('System maintainance') %></h1> | 22 | <h1><%= _('System maintainance') %></h1> |
| @@ -26,7 +26,7 @@ | @@ -26,7 +26,7 @@ | ||
| 26 | </div> | 26 | </div> |
| 27 | <% end %> | 27 | <% end %> |
| 28 | <div id='languages'> | 28 | <div id='languages'> |
| 29 | - <%- Noosfero.each_locale do |language_code,language_name| -%> | 29 | + <% Noosfero.each_locale do |language_code,language_name| %> |
| 30 | <a href="javascript: display_error_message('<%= language_code %>')"><%= language_name %></a> | 30 | <a href="javascript: display_error_message('<%= language_code %>')"><%= language_name %></a> |
| 31 | <% end %> | 31 | <% end %> |
| 32 | </div> | 32 | </div> |
public/designs/themes/base/style.css
| @@ -915,14 +915,17 @@ X.sep { | @@ -915,14 +915,17 @@ X.sep { | ||
| 915 | height: 225px; | 915 | height: 225px; |
| 916 | } | 916 | } |
| 917 | 917 | ||
| 918 | -#content .search-results-type-article li { | 918 | +#content .search-results-type-article li, |
| 919 | +#content .search-results-type-event li { | ||
| 919 | padding: 5px 0px; | 920 | padding: 5px 0px; |
| 920 | } | 921 | } |
| 921 | 922 | ||
| 922 | -.search-results-type-article a { | 923 | +.search-results-type-article a, |
| 924 | +.search-results-type-event a { | ||
| 923 | text-decoration: none; | 925 | text-decoration: none; |
| 924 | } | 926 | } |
| 925 | -.search-results-type-article a:hover { | 927 | +.search-results-type-article a:hover, |
| 928 | +.search-results-type-event a:hover { | ||
| 926 | text-decoration: underline; | 929 | text-decoration: underline; |
| 927 | } | 930 | } |
| 928 | 931 |
public/stylesheets/application.css
| @@ -4531,13 +4531,15 @@ h1#agenda-title { | @@ -4531,13 +4531,15 @@ h1#agenda-title { | ||
| 4531 | padding: 2px 0px 4px 0px; | 4531 | padding: 2px 0px 4px 0px; |
| 4532 | } | 4532 | } |
| 4533 | 4533 | ||
| 4534 | -.controller-search #content .search-results-type-article li { | 4534 | +.controller-search #content .search-results-type-article li, |
| 4535 | +.controller-search #content .search-results-type-event li { | ||
| 4535 | padding: 0px 0px 4px 20px; | 4536 | padding: 0px 0px 4px 20px; |
| 4536 | background-repeat: no-repeat; | 4537 | background-repeat: no-repeat; |
| 4537 | border-color: transparent; | 4538 | border-color: transparent; |
| 4538 | } | 4539 | } |
| 4539 | 4540 | ||
| 4540 | -.controller-search #content .search-results-type-article li:hover { | 4541 | +.controller-search #content .search-results-type-article li:hover, |
| 4542 | +.controller-search #content .search-results-type-event li:hover { | ||
| 4541 | background-color: transparent; | 4543 | background-color: transparent; |
| 4542 | } | 4544 | } |
| 4543 | 4545 |
script/feed-updater
| @@ -12,20 +12,22 @@ require 'optparse' | @@ -12,20 +12,22 @@ require 'optparse' | ||
| 12 | NOOSFERO_ROOT = File.expand_path(File.dirname(__FILE__) + '/../') | 12 | NOOSFERO_ROOT = File.expand_path(File.dirname(__FILE__) + '/../') |
| 13 | 13 | ||
| 14 | options = { | 14 | options = { |
| 15 | + :app_name => 'feed-updater.default', | ||
| 15 | :dir_mode => :normal, | 16 | :dir_mode => :normal, |
| 16 | :dir => File.dirname(__FILE__) + '/../tmp/pids', | 17 | :dir => File.dirname(__FILE__) + '/../tmp/pids', |
| 17 | :multiple => false, | 18 | :multiple => false, |
| 18 | :backtrace => true, | 19 | :backtrace => true, |
| 20 | + :log_output => true, | ||
| 19 | :monitor => false | 21 | :monitor => false |
| 20 | } | 22 | } |
| 21 | 23 | ||
| 22 | OptionParser.new do |opts| | 24 | OptionParser.new do |opts| |
| 23 | opts.on("-i", "--identifier=i", "Id") do |i| | 25 | opts.on("-i", "--identifier=i", "Id") do |i| |
| 24 | - options[:identifier] = i | 26 | + options[:app_name] = "feed-updater.#{i}" |
| 25 | end | 27 | end |
| 26 | end.parse!(ARGV) | 28 | end.parse!(ARGV) |
| 27 | 29 | ||
| 28 | -Daemons.run_proc("feed-updater.#{options[:identifier]}", options) do | 30 | +Daemons.run_proc(options[:app_name], options) do |
| 29 | require NOOSFERO_ROOT + '/config/environment' | 31 | require NOOSFERO_ROOT + '/config/environment' |
| 30 | FeedUpdater.new.start | 32 | FeedUpdater.new.start |
| 31 | end | 33 | end |
test/functional/profile_design_controller_test.rb
| @@ -10,7 +10,7 @@ class ProfileDesignControllerTest < Test::Unit::TestCase | @@ -10,7 +10,7 @@ class ProfileDesignControllerTest < Test::Unit::TestCase | ||
| 10 | PERSON_BLOCKS_WITH_MEMBERS = PERSON_BLOCKS + [MembersBlock] | 10 | PERSON_BLOCKS_WITH_MEMBERS = PERSON_BLOCKS + [MembersBlock] |
| 11 | PERSON_BLOCKS_WITH_BLOG = PERSON_BLOCKS + [BlogArchivesBlock] | 11 | PERSON_BLOCKS_WITH_BLOG = PERSON_BLOCKS + [BlogArchivesBlock] |
| 12 | 12 | ||
| 13 | - ENTERPRISE_BLOCKS = COMMOM_BLOCKS + [DisabledEnterpriseMessageBlock, HighlightsBlock, FeaturedProductsBlock] | 13 | + ENTERPRISE_BLOCKS = COMMOM_BLOCKS + [DisabledEnterpriseMessageBlock, HighlightsBlock, FeaturedProductsBlock, FansBlock] |
| 14 | ENTERPRISE_BLOCKS_WITH_PRODUCTS_ENABLE = ENTERPRISE_BLOCKS + [ProductsBlock] | 14 | ENTERPRISE_BLOCKS_WITH_PRODUCTS_ENABLE = ENTERPRISE_BLOCKS + [ProductsBlock] |
| 15 | 15 | ||
| 16 | attr_reader :holder | 16 | attr_reader :holder |
test/unit/blog_test.rb
| @@ -211,4 +211,11 @@ class BlogTest < ActiveSupport::TestCase | @@ -211,4 +211,11 @@ class BlogTest < ActiveSupport::TestCase | ||
| 211 | assert !folder.accept_uploads? | 211 | assert !folder.accept_uploads? |
| 212 | end | 212 | end |
| 213 | 213 | ||
| 214 | + should 'know when blog has or when has no posts' do | ||
| 215 | + blog = fast_create(Blog) | ||
| 216 | + assert blog.empty? | ||
| 217 | + fast_create(TextileArticle, :parent_id => blog.id) | ||
| 218 | + assert ! blog.empty? | ||
| 219 | + end | ||
| 220 | + | ||
| 214 | end | 221 | end |
test/unit/enterprise_test.rb
| @@ -49,6 +49,15 @@ class EnterpriseTest < Test::Unit::TestCase | @@ -49,6 +49,15 @@ class EnterpriseTest < Test::Unit::TestCase | ||
| 49 | end | 49 | end |
| 50 | end | 50 | end |
| 51 | 51 | ||
| 52 | + should 'have fans' do | ||
| 53 | + p = fast_create(Person) | ||
| 54 | + e = fast_create(Enterprise) | ||
| 55 | + | ||
| 56 | + p.favorite_enterprises << e | ||
| 57 | + | ||
| 58 | + assert_includes Enterprise.find(e.id).fans, p | ||
| 59 | + end | ||
| 60 | + | ||
| 52 | should 'remove products when removing enterprise' do | 61 | should 'remove products when removing enterprise' do |
| 53 | e = fast_create(Enterprise, :name => "My enterprise", :identifier => 'myenterprise') | 62 | e = fast_create(Enterprise, :name => "My enterprise", :identifier => 'myenterprise') |
| 54 | e.products.create!(:name => 'One product', :product_category => @product_category) | 63 | e.products.create!(:name => 'One product', :product_category => @product_category) |
| @@ -0,0 +1,32 @@ | @@ -0,0 +1,32 @@ | ||
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | ||
| 2 | + | ||
| 3 | +class FansBlockTest < ActiveSupport::TestCase | ||
| 4 | + | ||
| 5 | + should 'inherit from ProfileListBlock' do | ||
| 6 | + assert_kind_of ProfileListBlock, FansBlock.new | ||
| 7 | + end | ||
| 8 | + | ||
| 9 | + should 'declare its default title' do | ||
| 10 | + FansBlock.any_instance.stubs(:profile_count).returns(0) | ||
| 11 | + assert_not_equal ProfileListBlock.new.default_title, FansBlock.new.default_title | ||
| 12 | + end | ||
| 13 | + | ||
| 14 | + should 'describe itself' do | ||
| 15 | + assert_not_equal ProfileListBlock.description, FansBlock.description | ||
| 16 | + end | ||
| 17 | + | ||
| 18 | + should 'list owner fans' do | ||
| 19 | + | ||
| 20 | + block = FansBlock.new | ||
| 21 | + | ||
| 22 | + owner = mock | ||
| 23 | + block.expects(:owner).returns(owner) | ||
| 24 | + | ||
| 25 | + list = [] | ||
| 26 | + owner.expects(:fans).returns(list) | ||
| 27 | + | ||
| 28 | + assert_same list, block.profiles | ||
| 29 | + end | ||
| 30 | + | ||
| 31 | +end | ||
| 32 | + |