blog_archives_block_test.rb 7.05 KB
require_relative "../test_helper"

class BlogArchivesBlockTest < ActiveSupport::TestCase

  def setup
    @profile = create_user('flatline').person
    @profile.articles << Blog.new(:name => 'Blog One', :profile => @profile)
  end
  attr_reader :profile

  should 'default describe' do
    assert_not_equal Block.description, BlogArchivesBlock.description
  end

  should 'is editable' do
    l = BlogArchivesBlock.new
    assert l.editable?
  end

  should 'list amount posts by year' do
    date = DateTime.parse('2008-01-10')
    blog = profile.blog
    for i in 1..10 do
      post = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id, :parent_id => blog.id)
      post.update_attribute(:published_at, date)
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_tag_in_string block.content, :tag => 'li', :content => '2008 (10)'
  end

  should 'list amount posts by month' do
    date = DateTime.parse('2008-01-10')
    blog = profile.blog
    for i in 1..10 do
      post = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id, :parent_id => blog.id)
      assert post.update_attribute(:published_at, date)
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_tag_in_string block.content, :tag => 'a', :content => 'January (10)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=1&year=2008$/ }
  end

  should 'order list of amount posts' do
    blog = profile.blog
    for i in 1..10 do
      post = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id, :parent_id => blog.id)
      post.update_attribute(:published_at, DateTime.parse("2008-#{i}-01"))
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_tag_in_string block.content, :tag => 'li', :content => 'January (1)',
      :sibling => {:tag => 'li', :content => 'February (1)',
        :sibling => {:tag => 'li', :content => 'March (1)',
          :sibling => {:tag => 'li', :content => 'April (1)',
            :sibling => {:tag => 'li', :content => 'May (1)'}}}}
  end

  should 'order years' do
    blog = profile.blog
    for year in 2005..2009
      post = create(TextileArticle, :name => "post #{year}", :profile => profile, :parent => blog, :published_at => Date.new(year, 1, 1))
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_match(/2009.*2008.*2007.*2006.*2005/m, block.content)
  end

  should 'order months from later to former' do
    blog = profile.blog
    for month in 1..3
      post = create(TextileArticle, :name => "post #{month}", :profile => profile, :parent => blog, :published_at => Date.new(2009, month, 1))
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_match(/.*March.*February.*January.*/m, block.content)
  end

  should 'not display any content if has no blog' do
    profile.blogs.destroy_all
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_nil block.content
  end

  should 'has field to configure blog' do
    b = BlogArchivesBlock.new
    assert b.respond_to?(:blog_id)
    assert b.respond_to?(:blog_id=)
  end

  should 'show posts from first blog' do
    profile.articles << Blog.new(:name => 'Blog Two', :profile => profile)
    (blog_one, blog_two) = profile.blogs
    for month in 1..3
      create(TextileArticle, :name => "blog one - post #{month}", :profile_id => profile.id, :parent_id => blog_one.id)
      create(TextileArticle, :name => "blog two - post #{month}", :profile_id => profile.id, :parent_id => blog_two.id)
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_match(/blog-one/m, block.content)
    assert_no_match(/blog-two/m, block.content)
  end

  should 'list amount native posts by year' do
    date = DateTime.parse('2008-01-10')
    blog = profile.blog
    2.times do |i|
      post = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id,
                         :parent_id => blog.id, :language => 'en')
      post.update_attribute(:published_at, date)
      translation = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id,
                  :parent_id => blog.id, :language => 'en', :translation_of_id => post.id)
      translation.update_attribute(:published_at, date)
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_tag_in_string block.content, :tag => 'li', :content => '2008 (2)'
  end

  should 'list amount native posts by month' do
    date = DateTime.parse('2008-01-10')
    blog = profile.blog
    2.times do |i|
      post = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id,
                         :parent_id => blog.id, :language => 'en')
      post.update_attribute(:published_at, date)
      translation = fast_create(TextileArticle, :name => "post #{i} test", :profile_id => profile.id,
                  :parent_id => blog.id, :language => 'en', :translation_of_id => post.id)
      translation.update_attribute(:published_at, date)
    end
    block = BlogArchivesBlock.new
    block.stubs(:owner).returns(profile)
    assert_tag_in_string block.content, :tag => 'a', :content => 'January (2)', :attributes => {:href => /^http:\/\/.*\/flatline\/blog-one\?month=1&year=2008$/ }
  end

  should 'not try to load a removed blog' do
    block = fast_create(BlogArchivesBlock)
    block.blog_id = profile.blog.id
    block.save!
    block.stubs(:owner).returns(profile)
    profile.blog.destroy
    assert_nothing_raised do
      assert_nil block.blog
    end
  end

  should 'load next blog if configured blog was removed' do
    other_blog = fast_create(Blog, :profile_id => profile.id)
    block = fast_create(BlogArchivesBlock)
    block.blog_id = profile.blog.id
    block.save!
    block.stubs(:owner).returns(profile)
    profile.blog.destroy
    assert_nothing_raised do
      assert_equal other_blog, block.blog
    end
  end

#FIXME Performance issues with display_to. Must convert it to a scope.
# Checkout this page for further information: http://noosfero.org/Development/ActionItem2705
#
#  should 'not count articles if the user can\'t see them' do
#    person = create_user('testuser').person
#    blog = fast_create(Blog, :profile_id => profile.id, :path => 'blog_path')
#    block = fast_create(BlogArchivesBlock)
#
#    feed = mock()
#    feed.stubs(:url).returns(blog.url)
#    blog.stubs(:feed).returns(feed)
#    block.stubs(:blog).returns(blog)
#    block.stubs(:owner).returns(profile)
#
#    public_post = fast_create(TextileArticle, :profile_id => profile.id, :parent_id => blog.id, :published => true, :published_at => Time.mktime(2012, 'jan'))
#    private_post = fast_create(TextileArticle, :profile_id => profile.id, :parent_id => blog.id, :published => false, :published_at => Time.mktime(2012, 'jan'))
#
#    assert_match /January \(1\)/, block.content({:person => person})
#    assert_match /January \(1\)/, block.content()
#    assert_match /January \(2\)/, block.content({:person => profile})
#  end
end