members_block_test.rb 9.74 KB
require_relative '../test_helper'

class MembersBlockTest < ActionView::TestCase

  should 'inherit from Block' do
    assert_kind_of Block, MembersBlock.new
  end


  should 'declare its default title' do
    assert_not_equal Block.new.default_title, MembersBlock.new.default_title
  end


  should 'describe itself' do
    assert_not_equal Block.description, MembersBlock.description
  end


  should 'is editable' do
    block = MembersBlock.new
    assert block.editable?
  end


  should 'have field limit' do
    block = MembersBlock.new
    assert_respond_to block, :limit
  end


  should 'default value of limit' do
    block = MembersBlock.new
    assert_equal 6, block.limit
  end


  should 'have field name' do
    block = MembersBlock.new
    assert_respond_to block, :name
  end


  should 'default value of name' do
    block = MembersBlock.new
    assert_equal "", block.name
  end


  should 'have field address' do
    block = MembersBlock.new
    assert_respond_to block, :address
  end


  should 'default value of address' do
    block = MembersBlock.new
    assert_equal "", block.address
  end


  should 'prioritize profiles with image by default' do
    assert MembersBlock.new.prioritize_profiles_with_image
  end


  should 'respect limit when listing members' do
    community = fast_create(Community)
    p1 = fast_create(Person)
    p2 = fast_create(Person)
    p3 = fast_create(Person)
    p4 = fast_create(Person)

    community.add_member(p1)
    community.add_member(p2)
    community.add_member(p3)
    community.add_member(p4)

    block = MembersBlock.new(:limit => 3)
    block.stubs(:owner).returns(community)

    assert_equal 3, block.profile_list.size
  end


  should 'accept a limit of members to be displayed' do
    block = MembersBlock.new
    block.limit = 20
    assert_equal 20, block.limit
  end


  should 'count number of public and private members' do
    owner = fast_create(Community)
    private_p = fast_create(Person, {:public_profile => false})
    public_p = fast_create(Person, {:public_profile => true})

    owner.add_member(private_p)
    owner.add_member(public_p)

    block = MembersBlock.new
    block.expects(:owner).returns(owner).at_least_once

    assert_equal 2, block.profile_count
  end


  should 'not count number of invisible members' do
    owner = fast_create(Community)
    private_p = fast_create(Person, {:visible => false})
    public_p = fast_create(Person, {:visible => true})

    owner.add_member(private_p)
    owner.add_member(public_p)

    block = MembersBlock.new
    block.expects(:owner).returns(owner).at_least_once

    assert_equal 1, block.profile_count
  end

  should 'provide a role to be displayed (and default to nil)' do
    env = fast_create(Environment)
    env.boxes << Box.new
    block = MembersBlock.new
    assert_equal nil, block.visible_role
    env.boxes.first.blocks << block
    block.visible_role = 'profile_member'
    block.save!
    assert_equal 'profile_member', block.visible_role
  end

  should 'list all members' do
    env = fast_create(Environment)
    env.boxes << Box.new
    profile1 = fast_create(Person, :environment_id => env.id)
    profile2 = fast_create(Person, :environment_id => env.id)

    block = MembersBlock.new
    owner = fast_create(Community)
    block.stubs(:owner).returns(owner)
    env.boxes.first.blocks << block
    block.save!

    owner.add_member profile1
    owner.add_member profile2
    profiles = block.profiles

    assert_includes profiles, profile1
    assert_includes profiles, profile2
  end

  should 'list only profiles with moderator role' do
    env = fast_create(Environment)
    env.boxes << Box.new
    profile1 = fast_create(Person, :environment_id => env.id)
    profile2 = fast_create(Person, :environment_id => env.id)

    block = MembersBlock.new
    owner = fast_create(Community)
    block.visible_role = Profile::Roles.moderator(owner.environment.id).key
    block.stubs(:owner).returns(owner)
    env.boxes.first.blocks << block
    block.save!

    owner.add_member profile2
    owner.add_moderator profile1
    profiles = block.profiles

    assert_includes profiles, profile1
    assert_not_includes profiles, profile2

    profile_list = block.profile_list
    assert_includes profile_list, profile1
    assert_not_includes profile_list, profile2
  end

  should 'list only profiles with member role' do
    env = fast_create(Environment)
    env.boxes << Box.new
    profile1 = fast_create(Person, :environment_id => env.id)
    profile2 = fast_create(Person, :environment_id => env.id)

    block = MembersBlock.new
    owner = fast_create(Community)
    block.visible_role = Profile::Roles.member(owner.environment.id).key
    block.stubs(:owner).returns(owner)
    env.boxes.first.blocks << block
    block.save!

    owner.add_member profile2
    owner.add_moderator profile1
    profiles = block.profiles

    assert_not_includes profiles, profile1
    assert_includes profiles, profile2

    profile_list = block.profile_list
    assert_not_includes profile_list, profile1
    assert_includes profile_list, profile2
  end

  should 'list available roles' do
    block = MembersBlock.new
    owner = fast_create(Community)
    block.stubs(:owner).returns(owner)
    assert_includes block.roles, Profile::Roles.member(owner.environment.id)
    assert_includes block.roles, Profile::Roles.admin(owner.environment.id)
    assert_includes block.roles, Profile::Roles.moderator(owner.environment.id)
  end

  should 'count number of profiles by role' do
    owner = fast_create(Community)
    profile1 = fast_create(Person, {:public_profile => true})
    profile2 = fast_create(Person, {:public_profile => true})

    owner.add_member profile2
    owner.add_moderator profile1

    block = MembersBlock.new
    block.visible_role = Profile::Roles.moderator(owner.environment.id).key
    block.expects(:owner).returns(owner).at_least_once

    assert_equivalent [profile1], block.profile_list
  end

  protected
  include NoosferoTestHelper

end

require 'boxes_helper'

class MembersBlockViewTest < ActionView::TestCase
  include BoxesHelper

  should 'list members from community' do
    owner = fast_create(Community)
    person1 = fast_create(Person)
    person2 = fast_create(Person)
    owner.add_member(person1)
    owner.add_member(person2)
    profile = Profile.new
    profile.identifier = 42

    block = MembersBlock.new

    block.expects(:owner).returns(owner).at_least_once
    ActionView::Base.any_instance.expects(:profile_image_link).with(person1, :minor).returns(person1.name)
    ActionView::Base.any_instance.expects(:profile_image_link).with(person2, :minor).returns(person2.name)
    ActionView::Base.any_instance.expects(:block_title).with(anything, anything).returns('')

    content = render_block_content(block)

    assert_match(/#{person1.name}/, content)
    assert_match(/#{person2.name}/, content)
  end

  should 'provide link to members page without a visible_role selected' do
    profile = create_user('mytestuser').person
    block = MembersBlock.new
    block.box = profile.boxes.first
    block.save!

    render_block_footer(block)
    assert_select 'a.view-all' do |elements|
      assert_select "[href=/profile/mytestuser/members#members-tab]"
    end
  end

  should 'provide link to members page when visible_role is profile_member' do
    profile = create_user('mytestuser').person
    block = MembersBlock.new
    block.box = profile.boxes.first
    block.visible_role = 'profile_member'
    block.save!

    render_block_footer(block)
    assert_select 'a.view-all' do |elements|
      assert_select '[href=/profile/mytestuser/members#members-tab]'
    end
  end

  should 'provide link to members page when visible_role is profile_moderator' do
    profile = create_user('mytestuser').person
    block = MembersBlock.new
    block.box = profile.boxes.first
    block.visible_role = 'profile_moderator'
    block.save!

    render_block_footer(block)
    assert_select 'a.view-all' do |elements|
      assert_select '[href=/profile/mytestuser/members#members-tab]'
    end
  end

  should 'provide link to admins page when visible_role is profile_admin' do
    profile = create_user('mytestuser').person
    block = MembersBlock.new
    block.box = profile.boxes.first
    block.visible_role = 'profile_admin'
    block.save!

    render_block_footer(block)
    assert_select 'a.view-all' do |elements|
      assert_select '[href=/profile/mytestuser/members#admins-tab]'
    end
  end

  should 'not have a linear increase in time to display members block' do
    owner = fast_create(Community)
    owner.boxes<< Box.new
    block = MembersBlock.create!(:box => owner.boxes.first)

    ActionView::Base.any_instance.stubs(:profile_image_link).returns('some name')
    ActionView::Base.any_instance.stubs(:block_title).returns("")

    # no people
    block.reload
    time0 = (Benchmark.measure { 10.times { render_block_content(block) } })

    1.upto(50).map do |n|
      p = create_user("user #{n}").person
      owner.add_member(p)
    end

    # first 50
    block.reload
    time1 = (Benchmark.measure { 10.times { render_block_content(block) } })

    1.upto(50).map do |n|
      p = create_user("user 1#{n}").person
      owner.add_member(p)
    end
    block.reload
    # another 50
    time2 = (Benchmark.measure { 10.times { render_block_content(block) } })

    # should not scale linearly, i.e. the inclination of the first segment must
    # be a lot higher than the one of the segment segment. To compensate for
    # small variations due to hardware and/or execution environment, we are
    # satisfied if the the inclination of the first segment is at least twice
    # the inclination of the second segment.
    a1 = (time1.total - time0.total)/50.0
    a2 = (time2.total - time1.total)/50.0
    assert a1 > a2*NON_LINEAR_FACTOR, "#{a1} should be larger than #{a2} by at least a factor of #{NON_LINEAR_FACTOR}"
  end

end