require_relative "../test_helper"
require 'memberships_controller'
# Re-raise errors caught by the controller.
class MembershipsController; def rescue_action(e) raise e end; end
class MembershipsControllerTest < ActionController::TestCase
include ApplicationHelper
def setup
@controller = MembershipsController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
@profile = create_user('testuser').person
login_as('testuser')
end
attr_reader :profile
should 'list current memberships' do
get :index, :profile => profile.identifier
assert assigns(:memberships)
end
should 'present new community form' do
get :new_community, :profile => profile.identifier
assert_response :success
assert_template 'new_community'
end
should 'be able to create a new community' do
assert_difference 'Community.count' do
post :new_community, :profile => profile.identifier, :community => { :name => 'My shiny new community', :description => 'This is a community devoted to anything interesting we find in the internet '}
assert_response :redirect
assert Community.find_by_identifier('my-shiny-new-community').members.include?(profile), "Creator user should be added as member of the community just created"
end
end
should 'link to new community creation in index' do
get :index, :profile => profile.identifier
assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{profile.identifier}/memberships/new_community" }
end
should 'filter html from name' do
login_as(profile.identifier)
post :new_community, :profile => profile.identifier, :community => { :name => 'new community' }
assert_sanitized assigns(:community).name
end
should 'filter html from description' do
login_as(profile.identifier)
post :new_community, :profile => profile.identifier, :community => { :name => 'new community', :description => 'new community' }
assert_sanitized assigns(:community).description
end
should 'show number of members on list' do
community = Community.create!(:name => 'my test community')
community.add_member(profile)
get :index, :profile => profile.identifier
assert_tag :tag => 'li', :content => /Members: 1/
end
should 'show description on list' do
community = Community.create!(:name => 'my test community', :description => 'description test')
community.add_member(profile)
get :index, :profile => profile.identifier
assert_tag :tag => 'li', :content => /Description: description test/
end
should 'not show description to enterprises on list' do
enterprise = fast_create(Enterprise, :identifier => 'enterprise-test', :name => 'my test enterprise')
enterprise.add_member(profile)
get :index, :profile => profile.identifier
assert_no_tag :tag => 'li', :content => /Description:/
end
should 'show link to leave from community with reload' do
community = Community.create!(:name => 'my test community', :description => 'description test')
community.add_member(profile)
get :index, :profile => profile.identifier
assert_tag :tag => 'a', :attributes => { :href => "/profile/#{community.identifier}/leave?reload=true" }, :content => 'Leave community'
end
should 'current user is added as admin after create new community' do
post :new_community, :profile => profile.identifier, :community => { :name => 'My shiny new community', :description => 'This is a community devoted to anything interesting we find in the internet '}
assert_equal Profile::Roles.admin(profile.environment.id), profile.find_roles(Community.find_by_identifier('my-shiny-new-community')).first.role
end
should 'display button to create community' do
get :index, :profile => 'testuser'
assert_tag :tag => 'a', :attributes => { :href => "/myprofile/testuser/memberships/new_community" }
end
should 'display destroy link only to communities' do
community = Community.create!(:name => 'A community to destroy')
enterprise = fast_create(Enterprise, :name => 'A enterprise test')
person = Person['testuser']
community.add_admin(person)
enterprise.add_admin(person)
get :index, :profile => 'testuser'
assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{community.identifier}/profile_editor/destroy_profile" }
assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/#{enterprise.identifier}/profile_editor/destroy_profile" }
end
should 'not display destroy link to normal members' do
community = fast_create(Community)
admin = fast_create(Person)
community.add_member(admin)
person = Person['testuser']
community.add_member(person)
login_as('testuser')
get :index, :profile => 'testuser'
assert_template 'index'
assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/#{community.identifier}/profile_editor/destroy_profile" }
end
should 'use the current environment for the template of user' do
template = Community.create!(:identifier => 'test_template', :name => 'test@bli.com', :is_template => true)
template.boxes.destroy_all
template.boxes << Box.new
template.boxes[0].blocks << Block.new
template.save!
env = fast_create(Environment, :name => 'test_env')
env.settings[:community_template_id] = template.id
env.save!
profile.environment = env
profile.save!
@controller.stubs(:environment).returns(env)
post :new_community, :profile => profile.identifier, :community => { :name => 'test community', :description => 'a test community'}
assert_equal 1, assigns(:community).boxes.size
assert_equal 1, assigns(:community).boxes[0].blocks.size
end
should 'display only templates of the current environment' do
env2 = fast_create(Environment)
template1 = fast_create(Community, :name => 'template1', :environment_id => Environment.default.id, :is_template => true)
template2 = fast_create(Community, :name => 'template2', :environment_id => Environment.default.id, :is_template => true)
template3 = fast_create(Community, :name => 'template3', :environment_id => env2.id, :is_template => true)
get :new_community, :profile => profile.identifier
assert_select '#template-options' do |elements|
assert_match /template1/, elements[0].to_s
assert_match /template2/, elements[0].to_s
assert_no_match /template3/, elements[0].to_s
end
end
should 'display only required fields when register new community' do
env = Environment.default
env.custom_community_fields = {
'contact_email' => {'active' => 'true', 'required' => 'true'},
'contact_phone' => {'active' => 'true', 'required' => 'false'}
}
env.save!
get :new_community, :profile => profile.identifier
assert_tag :tag => 'input', :attributes => { :name => 'community[contact_email]' }
assert_no_tag :tag => 'input', :attributes => { :name => 'community[contact_phone]' }
end
should 'display all required fields when register new community' do
env = Environment.default
env.custom_community_fields = {
'contact_email' => {'active' => 'true', 'required' => 'true'},
'contact_phone' => {'active' => 'true', 'required' => 'true'}
}
env.save!
get :new_community, :profile => profile.identifier
env.required_community_fields.each do |field|
assert_tag :tag => 'input', :attributes => { :name => "community[#{field}]" }
end
end
should 'set environment when render new community form' do
get :new_community, :profile => profile.identifier
assert_not_nil assigns(:community).environment
end
should 'set environment' do
@controller.stubs(:environment).returns(Environment.default).at_least_once
post :new_community, :profile => profile.identifier, :community => {:name => 'test community'}
assert_not_nil assigns(:community).environment
end
should 'not show description if isnt enabled when register new community' do
env = Environment.default
env.custom_community_fields = { :description => {:active => 'false', :required => 'false'} }
env.save!
get :new_community, :profile => profile.identifier
assert_no_tag :tag => 'textarea', :attributes => {:name => 'community[description]'}
end
should 'include hidden fields supplied by plugins on new community' do
class Plugin1 < Noosfero::Plugin
def new_community_hidden_fields
{'plugin1' => 'Plugin 1'}
end
end
class Plugin2 < Noosfero::Plugin
def new_community_hidden_fields
{'plugin2' => 'Plugin 2'}
end
end
Noosfero::Plugin.stubs(:all).returns([Plugin1.name, Plugin2.name])
environment = Environment.default
environment.enable_plugin(Plugin1.name)
environment.enable_plugin(Plugin2.name)
get :new_community, :profile => profile.identifier
assert_tag :tag => 'input', :attributes => {:id => 'community_plugin1', :type => 'hidden', :value => 'Plugin 1'}
assert_tag :tag => 'input', :attributes => {:id => 'community_plugin2', :type => 'hidden', :value => 'Plugin 2'}
end
should 'redirect to back_to parameter when community needs admin approval' do
back_to = '/'
environment = Environment.default
environment.enable('admin_must_approve_new_communities')
post :new_community, :profile => profile.identifier, :community => { :name => 'My shiny new community', :description => 'This is a community devoted to anything interesting we find in the internet '}, :back_to => back_to
assert_response :redirect
assert_redirected_to back_to
end
should 'cancel button redirect to back_to parameter' do
back_to = '/'
get :new_community, :profile => profile.identifier, :back_to => back_to
assert_tag :tag => 'a', :attributes => { :class => 'button icon-cancel with-text', :href => back_to }
end
should 'only display control panel link to members with permission' do
c1 = fast_create(Community, :name => 'My own community')
c2 = fast_create(Community, :name => 'Not my community')
owner = fast_create(Person)
c2.add_admin(owner)
person = Person['testuser']
c1.add_admin(person)
c2.add_member(person)
login_as('testuser')
get :index, :profile => 'testuser'
assert_template 'index'
assert_no_tag :tag => 'a', :attributes => { :href => "/myprofile/#{c2.identifier}" }
assert_tag :tag => 'a', :attributes => { :href => "/myprofile/#{c1.identifier}" }
end
should 'filter memberships by role' do
c1 = fast_create(Community, :name => 'First community')
c2 = fast_create(Community, :name => 'Second community')
role = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c2.environment)
person = Person['testuser']
c1.add_member(person)
c2.add_member(person)
person.add_role(role, c2)
login_as('testuser')
get :index, :profile => 'testuser'
assert_includes assigns(:memberships), c1
assert_includes assigns(:memberships), c2
get :index, :profile => 'testuser', :filter_type => role.id
assert_not_includes assigns(:memberships), c1
assert_includes assigns(:memberships), c2
end
should 'only show roles the user has' do
c1 = fast_create(Community, :name => 'First community')
role1 = Role.create!(:name => 'normal_role', :permissions => ['edit_profile'], :environment => c1.environment)
role2 = Role.create!(:name => 'special_role', :permissions => ['edit_profile'], :environment => c1.environment)
person = Person['testuser']
c1.add_member(person)
person.add_role(role1, c1)
login_as('testuser')
get :index, :profile => 'testuser'
assert_includes assigns(:roles), role1
assert_not_includes assigns(:roles), role2
end
should 'only show roles related to profiles' do
c1 = fast_create(Community, :name => 'First community')
role1 = Role.create!(:name => 'profile_role', :permissions => ['edit_profile'], :environment => c1.environment)
role2 = Role.create!(:name => 'environment_role', :permissions => ['edit_profile'], :environment => c1.environment)
person = Person['testuser']
c1.add_member(person)
person.add_role(role2, c1.environment)
person.add_role(role1, c1)
login_as('testuser')
get :index, :profile => 'testuser'
assert_includes assigns(:roles), role1
assert_not_includes assigns(:roles), role2
end
should 'display list suggestions button' do
community = fast_create(Community)
profile.suggested_profiles.create(:suggestion => community)
get :index, :profile => 'testuser'
assert_tag :tag => 'a', :content => 'See some suggestions of communities...', :attributes => { :href => "/myprofile/testuser/memberships/suggest" }
end
should 'display communities suggestions' do
community = fast_create(Community)
profile.suggested_profiles.create(:suggestion => community)
get :suggest, :profile => 'testuser'
assert_tag :tag => 'a', :content => "+ #{community.name}", :attributes => { :href => "/profile/#{community.identifier}/join" }
end
should 'display button to join on community suggestion' do
community = fast_create(Community)
profile.suggested_profiles.create(:suggestion => community)
get :suggest, :profile => 'testuser'
assert_tag :tag => 'a', :attributes => { :href => "/profile/#{community.identifier}/join" }
end
should 'display button to remove community suggestion' do
community = fast_create(Community)
profile.suggested_profiles.create(:suggestion => community)
get :suggest, :profile => 'testuser'
assert_tag :tag => 'a', :attributes => { :href => /\/myprofile\/testuser\/memberships\/remove_suggestion\/#{community.identifier}/ }
end
should 'remove suggestion of community' do
community = fast_create(Community)
suggestion = profile.suggested_profiles.create(:suggestion => community)
post :remove_suggestion, :profile => 'testuser', :id => community.identifier
assert_response :success
assert_equal false, ProfileSuggestion.find(suggestion.id).enabled
end
end