environment_design_controller_test.rb 15 KB
require_relative "../test_helper"
require 'environment_design_controller'

# Re-raise errors caught by the controller.
class EnvironmentDesignController; def rescue_action(e) raise e end; end

class EnvironmentDesignControllerTest < ActionController::TestCase

  ALL_BLOCKS = [ArticleBlock, LoginBlock, RecentDocumentsBlock, EnterprisesBlock, CommunitiesBlock, SellersSearchBlock, LinkListBlock, FeedReaderBlock, SlideshowBlock, HighlightsBlock, FeaturedProductsBlock, CategoriesBlock, RawHTMLBlock, TagsBlock ]

  def setup
    @controller = EnvironmentDesignController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
    Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([])
  end

  should 'indicate only actual blocks as such' do
    assert(@controller.available_blocks.all? {|item| item.new.is_a? Block})
  end

  ALL_BLOCKS.map do |block|
    define_method "test_should_#{block.to_s}_is_available" do
      assert_includes @controller.available_blocks,block
    end
  end

  should 'all available block in test' do
    assert_equal ALL_BLOCKS, @controller.available_blocks
  end

  should 'be able to edit LinkListBlock' do
    login_as(create_admin_user(Environment.default))
    l = LinkListBlock.create!(:links => [{:name => 'link 1', :address => '/address_1'}])
    Environment.default.boxes.create!
    Environment.default.boxes.first.blocks << l
    get :edit, :id => l.id
    assert_tag :tag => 'input', :attributes => { :name => 'block[links][][name]' }
    assert_tag :tag => 'input', :attributes => { :name => 'block[links][][address]' }
  end

  should 'be able to save LinkListBlock' do
    login_as(create_admin_user(Environment.default))
    l = LinkListBlock.create!()
    Environment.default.boxes.create!
    Environment.default.boxes.first.blocks << l
    post :save, :id => l.id, :block => { :links => [{:name => 'link 1', :address => '/address_1'}] }
    l.reload
    assert_equal [{'name' => 'link 1', 'address' => '/address_1'}], l.links
  end

  should 'be able to edit ArticleBlock with portal community' do
    login_as(create_admin_user(Environment.default))
    l = ArticleBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << l
    community = mock()
    Environment.any_instance.stubs(:portal_community).returns(community)
    article = fast_create(Article)
    community.stubs(:articles).returns([article])
    get :edit, :id => l.id
    assert_tag :tag => 'select', :attributes => { :name => 'block[article_id]' }
  end

  should 'be able to edit ArticleBlock without portal community' do
    login_as(create_admin_user(Environment.default))
    l = ArticleBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << l
    community = mock()
    Environment.any_instance.expects(:portal_community).returns(nil)
    get :edit, :id => l.id
    assert_tag :tag => 'p', :attributes => { :id => 'no_portal_community' }
  end

  should 'be able to edit EnterprisesBlock' do
    login_as(create_admin_user(Environment.default))
    b = EnterprisesBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_limit' }
  end

  should 'be able to edit SlideshowBlock' do
    login_as(create_admin_user(Environment.default))
    b = SlideshowBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'select', :attributes => { :id => 'block_gallery_id' }
  end

  should 'be able to edit LoginBlock' do
    login_as(create_admin_user(Environment.default))
    b = LoginBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_title' }
  end

  should 'be able to edit RecentDocumentsBlock' do
    login_as(create_admin_user(Environment.default))
    b = RecentDocumentsBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_limit' }
  end

  should 'be able to edit CommunitiesBlock' do
    login_as(create_admin_user(Environment.default))
    b = CommunitiesBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_limit' }
  end

  should 'be able to edit SellersSearchBlock' do
    login_as(create_admin_user(Environment.default))
    b = SellersSearchBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_title' }
  end

  should 'be able to edit FeedReaderBlock' do
    login_as(create_admin_user(Environment.default))
    b = FeedReaderBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_address' }
  end

  should 'be able to edit TagsBlock' do
    login_as(create_admin_user(Environment.default))
    b = TagsBlock.create!
    e = Environment.default
    e.boxes.create!
    e.boxes.first.blocks << b
    get :edit, :id => b.id
    assert_tag :tag => 'input', :attributes => { :id => 'block_title' }
  end

  should 'create back link to environment control panel' do
    Environment.default.boxes.create!.blocks << CommunitiesBlock.new
    Environment.default.boxes.create!.blocks << EnterprisesBlock.new
    Environment.default.boxes.create!.blocks << LoginBlock.new
    login_as(create_admin_user(Environment.default))
    get :index

    assert_tag :tag => 'a', :attributes => {:href => '/admin'}, :child => {:tag => 'span', :content => "Back to control panel"}
  end

  should 'render add a new block functionality' do
    login_as(create_admin_user(Environment.default))
    get :add_block

    assert_response :success
    assert_template 'add_block'
  end

  should 'a environment block plugin add new blocks for environments' do
    class CustomBlock1 < Block; end;

    class TestBlockPlugin < Noosfero::Plugin
      def self.extra_blocks
        {
          CustomBlock1 => {:type => Environment},
        }
      end
    end

    Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
    assert @controller.available_blocks.include?(CustomBlock1)
  end

  should 'a person, enterprise and community blocks plugins do not add new blocks for environments' do
    class CustomBlock1 < Block; end;
    class CustomBlock2 < Block; end;
    class CustomBlock3 < Block; end;
    class CustomBlock4 < Block; end;

    class TestBlockPlugin < Noosfero::Plugin
      def self.extra_blocks
        {
          CustomBlock1 => {:type => Environment},
          CustomBlock2 => {:type => Enterprise},
          CustomBlock3 => {:type => Community},
          CustomBlock4 => {:type => Person},
        }
      end
    end

    Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
    assert @controller.available_blocks.include?(CustomBlock1)
    assert !@controller.available_blocks.include?(CustomBlock2)
    assert !@controller.available_blocks.include?(CustomBlock3)
    assert !@controller.available_blocks.include?(CustomBlock4)
  end

  should 'a block plugin with center position add new blocks only in this position' do
    class CustomBlock1 < Block; end;
    class CustomBlock2 < Block; end;
    class CustomBlock3 < Block; end;
    class CustomBlock4 < Block; end;
    class CustomBlock5 < Block; end;
    class CustomBlock6 < Block; end;
    class CustomBlock7 < Block; end;
    class CustomBlock8 < Block; end;
    class CustomBlock9 < Block; end;

    class TestBlockPlugin < Noosfero::Plugin
      def self.extra_blocks
        {
          CustomBlock1 => {:type => Environment, :position => [1]},
          CustomBlock2 => {:type => Environment, :position => 1},
          CustomBlock3 => {:type => Environment, :position => '1'},
          CustomBlock4 => {:type => Environment, :position => [2]},
          CustomBlock5 => {:type => Environment, :position => 2},
          CustomBlock6 => {:type => Environment, :position => '2'},
          CustomBlock7 => {:type => Environment, :position => [3]},
          CustomBlock8 => {:type => Environment, :position => 3},
          CustomBlock9 => {:type => Environment, :position => '3'},
        }
      end
    end

    Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
    login_as(create_admin_user(Environment.default))
    get :add_block

    assert_response :success
    assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1)
    assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock2)
    assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock3)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock4)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock5)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock6)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock7)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock8)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock9)
  end

  should 'a block plugin with side position add new blocks only in this position' do
    class CustomBlock1 < Block; end;
    class CustomBlock2 < Block; end;
    class CustomBlock3 < Block; end;
    class CustomBlock4 < Block; end;
    class CustomBlock5 < Block; end;
    class CustomBlock6 < Block; end;
    class CustomBlock7 < Block; end;
    class CustomBlock8 < Block; end;
    class CustomBlock9 < Block; end;

    class TestBlockPlugin < Noosfero::Plugin
      def self.extra_blocks
        {
          CustomBlock1 => {:type => Environment, :position => [1]},
          CustomBlock2 => {:type => Environment, :position => 1},
          CustomBlock3 => {:type => Environment, :position => '1'},
          CustomBlock4 => {:type => Environment, :position => [2]},
          CustomBlock5 => {:type => Environment, :position => 2},
          CustomBlock6 => {:type => Environment, :position => '2'},
          CustomBlock7 => {:type => Environment, :position => [3]},
          CustomBlock8 => {:type => Environment, :position => 3},
          CustomBlock9 => {:type => Environment, :position => '3'},
        }
      end
    end

    Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
    login_as(create_admin_user(Environment.default))
    get :add_block
    assert_response :success

    assert !@controller.instance_variable_get('@side_block_types').include?(CustomBlock1)
    assert !@controller.instance_variable_get('@side_block_types').include?(CustomBlock2)
    assert !@controller.instance_variable_get('@side_block_types').include?(CustomBlock3)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock4)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock6)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock7)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock9)
  end

  should 'a block plugin cannot be listed for unspecified types' do
    class CustomBlock1 < Block; end;
    class CustomBlock2 < Block; end;
    class CustomBlock3 < Block; end;
    class CustomBlock4 < Block; end;
    class CustomBlock5 < Block; end;
    class CustomBlock6 < Block; end;
    class CustomBlock7 < Block; end;
    class CustomBlock8 < Block; end;

    class TestBlockPlugin < Noosfero::Plugin
      def self.extra_blocks
        {
          CustomBlock1 => {:type => Person, :position => 1},
          CustomBlock2 => {:type => Community, :position => 1},
          CustomBlock3 => {:type => Enterprise, :position => 1},
          CustomBlock4 => {:type => Environment, :position => 1},
          CustomBlock5 => {:type => Person, :position => 2},
          CustomBlock6 => {:type => Community, :position => 3},
          CustomBlock7 => {:type => Enterprise, :position => 2},
          CustomBlock8 => {:type => Environment, :position => 3},
        }
      end
    end

    Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
    login_as(create_admin_user(Environment.default))
    get :add_block
    assert_response :success

    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock1)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock2)
    assert !@controller.instance_variable_get('@center_block_types').include?(CustomBlock3)
    assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock4)
    assert !@controller.instance_variable_get('@side_block_types').include?(CustomBlock5)
    assert !@controller.instance_variable_get('@side_block_types').include?(CustomBlock6)
    assert !@controller.instance_variable_get('@side_block_types').include?(CustomBlock7)
    assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8)
  end

  should 'clone a block' do
    login_as(create_admin_user(Environment.default))
    block = TagsBlock.create!
    assert_difference 'TagsBlock.count', 1 do
      post :clone_block, :id => block.id
      assert_response :redirect
    end
  end

  should 'return a list of paths from portal related to the words used in the query search' do
    env = Environment.default
    login_as(create_admin_user(env))
    community = fast_create(Community, :environment_id => env)
    env.portal_community = community
    env.enable('use_portal_community')
    env.save
    @controller.stubs(:boxes_holder).returns(env)
    article1 = fast_create(Article, :profile_id => community.id, :name => "Some thing")
    article2 = fast_create(Article, :profile_id => community.id, :name => "Some article")
    article3 = fast_create(Article, :profile_id => community.id, :name => "Not an article")

    xhr :get, :search_autocomplete, :query => 'Some'

    json_response = ActiveSupport::JSON.decode(@response.body)

    assert_response :success
    assert_equal json_response.include?("/{portal}/"+article1.path), true
    assert_equal json_response.include?("/{portal}/"+article2.path), true
    assert_equal json_response.include?("/{portal}/"+article3.path), false
  end

  should 'return empty if portal not configured' do
    env = Environment.default
    login_as(create_admin_user(env))

    xhr :get, :search_autocomplete, :query => 'Some'

    json_response = ActiveSupport::JSON.decode(@response.body)

    assert_response :success
    assert_equal json_response, []
  end

end