# encoding: UTF-8
require_relative "../test_helper"
require 'test_controller'
# Re-raise errors caught by the controller.
class TestController; def rescue_action(e) raise e end; end
class ApplicationControllerTest < ActionController::TestCase
all_fixtures
def setup
@controller = TestController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
end
def test_detection_of_environment_by_host
uses_host 'www.colivre.net'
get :index
assert_kind_of Environment, assigns(:environment)
assert_kind_of Domain, assigns(:domain)
assert_equal 'colivre.net', assigns(:domain).name
assert_nil assigns(:profile)
end
def test_detect_profile_by_host
uses_host 'www.jrh.net'
get :index
assert_kind_of Environment, assigns(:environment)
assert_kind_of Domain, assigns(:domain)
assert_equal 'jrh.net', assigns(:domain).name
assert_kind_of Profile, assigns(:profile)
end
def test_unknown_domain_falls_back_to_default_environment
uses_host 'veryunprobabledomain.com'
get :index
assert_kind_of Environment, assigns(:environment)
assert assigns(:environment).is_default?
end
should 'detect the current environment' do
default = Environment.default
Environment.stubs(:default).returns(default)
default.stubs(:top_url).returns('http://default.com/')
current = fast_create(Environment, :name => 'test environment')
current.domains.create!(:name => 'example.com')
@request.expects(:host).returns('example.com').at_least_once
get :index
assert_equal current, assigns(:environment)
end
def test_exist_environment_variable_to_helper_environment_identification
get :index
assert_not_nil assigns(:environment)
end
def test_get_against_post_only
get :post_only
assert_redirected_to :action => 'index'
end
def test_post_against_post_only
post :post_only
assert_response :success
assert_tag :tag => 'span', :content => 'post_only'
end
def test_should_generate_help_box_when_passing_string
get :help_with_string
assert_tag({
:tag => 'div',
:attributes => { :class => 'help_box'},
:descendant => {
:tag => 'div',
:attributes => { :class => 'help_message', :style => /display:\s+none/},
:descendant => { :tag => 'div', :content => /my_help_message/ }
}
})
end
def test_should_generate_help_box_when_passing_block
get :help_with_block
assert_tag({
:tag => 'div',
:attributes => { :class => 'help_box'},
:descendant => {
:tag => 'div',
:attributes => { :class => 'help_message', :style => /display:\s+none/},
:descendant => { :tag => 'div', :content => /my_help_message/ }
}
})
end
def test_should_generate_help_box_expanding_textile_markup_when_passing_string
get :help_textile_with_string
assert_tag({
:tag => 'div',
:attributes => { :class => 'help_box'},
:descendant => {
:tag => 'div',
:attributes => { :class => 'help_message', :style => /display:\s+none/},
:descendant => {
:tag => 'strong',
:content => /my_bold_help_message/
}
}
})
end
def test_should_generate_help_box_expanding_textile_markup_when_passing_block
get :help_textile_with_block
assert_tag({
:tag => 'div',
:attributes => { :class => 'help_box'},
:descendant => {
:tag => 'div',
:attributes => { :class => 'help_message', :style => /display:\s+none/},
:descendant => {
:tag => 'strong',
:content => /my_bold_help_message/
}
}
})
end
def test_shouldnt_generate_help_box_markup_when_no_block_is_passed
get :help_without_block
assert_no_tag({
:tag => 'div',
:attributes => { :class => 'help_box'},
})
end
should 'be able to not use design blocks' do
class UsesBlocksTestController < ApplicationController
end
assert UsesBlocksTestController.new.send(:uses_design_blocks?)
class DoesNotUsesBlocksTestController < ApplicationController
no_design_blocks
end
assert !DoesNotUsesBlocksTestController.new.send(:uses_design_blocks?)
end
should 'generate blocks' do
get :index
assert_tag :tag => 'div', :attributes => { :id => 'boxes', :class => 'boxes' }
end
should 'not generate blocks when told not to do so' do
@controller.stubs(:uses_design_blocks?).returns(false)
get :index
assert_no_tag :tag => 'div', :attributes => { :id => 'boxes', :class => 'boxes' }
end
should 'display only some categories in menu' do
@controller.stubs(:get_layout).returns('application')
c1 = Environment.default.categories.create!(:name => 'Category 1', :display_color => 'ffa500', :parent_id => nil, :display_in_menu => true )
c2 = Environment.default.categories.create!(:name => 'Category 2', :display_color => nil, :parent_id => c1.id, :display_in_menu => true )
get :index
assert_tag :tag => 'a', :content => /Category 2/
end
should 'not display some categories in menu' do
@controller.stubs(:get_layout).returns('application')
c1 = Environment.default.categories.create!(:name => 'Category 1', :display_color => 'ffa500', :parent_id => nil, :display_in_menu => true)
c2 = Environment.default.categories.create!(:name => 'Category 2', :display_color => nil, :parent_id => c1)
get :index
assert_no_tag :tag => 'a', :content => /Category 2/
end
should 'display dropdown for select language' do
@controller.stubs(:get_layout).returns('application')
Noosfero.expects(:locales).returns({ 'en' => 'English', 'pt_BR' => 'Português Brasileiro', 'fr' => 'Français', 'it' => 'Italiano' }).at_least_once
get :index, :lang => 'en'
assert_tag :tag => 'option', :attributes => { :value => 'en', :selected => 'selected' }, :content => 'English'
assert_no_tag :tag => 'option', :attributes => { :value => 'pt_BR', :selected => 'selected' }, :content => 'Português Brasileiro'
assert_tag :tag => 'option', :attributes => { :value => 'pt_BR' }, :content => 'Português Brasileiro'
assert_tag :tag => 'option', :attributes => { :value => 'fr' }, :content => 'Français'
assert_tag :tag => 'option', :attributes => { :value => 'it' }, :content => 'Italiano'
end
should 'display link to webmail if enabled for system' do
@controller.stubs(:get_layout).returns('application')
login_as('ze')
MailConf.expects(:enabled?).returns(true)
MailConf.expects(:webmail_url).returns('http://web.mail/')
get :index
assert_tag :tag => 'div', :attributes => { :id => 'user_box' }, :descendant => { :tag => 'a', :attributes => { :href => 'http://web.mail/' } }
end
should 'not display link to webmail if not enabled for system' do
@controller.stubs(:get_layout).returns('application')
login_as('ze')
MailConf.expects(:enabled?).returns(false)
get :index
assert_no_tag :tag => 'div', :attributes => { :id => 'user_box' }, :descendant => { :tag => 'a', :attributes => { :href => 'http://web.mail/' } }
end
should 'display search form with id' do
@controller.stubs(:get_layout).returns('application-ng')
get :index
assert_tag :tag => 'form', :attributes => { :class => 'search_form clean', :id => 'top-search' }
end
should 'display theme test panel when testing theme' do
@request.session[:theme] = 'my-test-theme'
theme = mock
profile = mock
theme.expects(:owner).returns(profile).at_least_once
profile.expects(:identifier).returns('testinguser').at_least_once
Theme.expects(:find).with('my-test-theme').returns(theme).at_least_once
get :index
assert_tag :tag => 'div', :attributes => { :id => 'theme-test-panel' }, :descendant => {
:tag => 'a', :attributes => { :href => '/myprofile/testinguser/profile_themes/edit/my-test-theme'}
}
#{ :tag => 'a', :attributes => { :href => '/myprofile/testinguser/themes/stop_test/my-test-theme'} }
end
should 'not display theme test panel in general' do
@controller.stubs(:session).returns({})
get :index
assert_no_tag :tag => 'div', :attributes => { :id => 'theme-test-panel' }
end
should 'not display categories menu if categories feature disabled' do
Environment.any_instance.stubs(:enabled?).with(anything).returns(true)
c1 = Environment.default.categories.create!(:name => 'Category 1', :display_color => 'ffa500', :parent_id => nil, :display_in_menu => true )
c2 = Environment.default.categories.create!(:name => 'Category 2', :display_color => nil, :parent_id => c1.id, :display_in_menu => true )
get :index
assert_no_tag :tag => 'a', :content => /Category 2/
end
should 'show name of article as title of page without environment' do
p = create_user('test_user').person
a = p.articles.create!(:name => 'test article')
@controller.instance_variable_set('@profile', p)
@controller.instance_variable_set('@page', a)
get :index
assert_tag 'title', :content => 'test article - ' + p.name
end
should 'diplay name of profile in the title without environment' do
p = create_user('test_user').person
p.name = 'Some Test User'
p.save!
@controller.instance_variable_set('@profile', p)
get :index, :profile => p.identifier
assert_tag 'title', :content => p.name
end
should 'display environment name in title when profile and page are not defined' do
get :index
assert_tag 'title', :content => assigns(:environment).name
end
should 'display menu links for my environment when logged in other environment' do
@controller.stubs(:get_layout).returns('application')
e = fast_create(Environment, :name => 'other_environment')
e.domains << Domain.new(:name => 'other.environment')
e.save!
login_as(create_admin_user(e))
uses_host 'other.environment'
get :index
assert_tag :tag => 'div', :attributes => {:id => 'user_menu_ul'}
assert_tag :tag => 'div', :attributes => {:id => 'user_menu_ul'},
:descendant => {:tag => 'a', :attributes => { :href => 'http://other.environment/adminuser' }},
:descendant => {:tag => 'a', :attributes => { :href => 'http://other.environment/myprofile/adminuser' }},
:descendant => {:tag => 'a', :attributes => { :href => '/admin' }}
end
should 'not display invisible blocks' do
@controller.expects(:uses_design_blocks?).returns(true)
p = create_user('test_user').person
@controller.expects(:profile).at_least_once.returns(p)
box = p.boxes.first
invisible_block = fast_create(Block, :box_id => box.id)
invisible_block.display = 'never'
invisible_block.save
visible_block = fast_create(Block, :box_id => box.id)
visible_block.display = 'always'
visible_block.save
get :index, :profile => p.identifier
assert_no_tag :tag => 'div', :attributes => {:id => 'block-' + invisible_block.id.to_s}
assert_tag :tag => 'div', :attributes => {:id => 'block-' + visible_block.id.to_s}
end
should 'diplay name of environment in description' do
get :index
assert_tag :tag => 'meta', :attributes => { :name => 'description', :content => assigns(:environment).name }
end
should 'set html lang as the article language if an article is present and has a language' do
p = create_user('test_user').person
a = fast_create(Article, :name => 'test article', :language => 'fr', :profile_id => p.id )
@controller.instance_variable_set('@page', a)
FastGettext.stubs(:locale).returns('es')
get :index
assert_tag :html, :attributes => { :lang => 'fr' }
end
should 'set html lang as locale if no page present' do
FastGettext.stubs(:locale).returns('es')
get :index
assert_tag :html, :attributes => { :lang => 'es' }
end
should 'set html lang as locale if page has no language' do
p = create_user('test_user').person
a = fast_create(Article, :name => 'test article', :language => nil, :profile_id => p.id )
@controller.instance_variable_set('@page', a)
FastGettext.stubs(:locale).returns('es')
get :index
assert_tag :html, :attributes => { :lang => 'es' }
end
should 'set Rails locale correctly' do
@request.env['HTTP_ACCEPT_LANGUAGE'] = 'pt-BR,pt;q=0.8,en;q=0.6,en-US;q=0.4'
get :index
assert_equal 'pt', I18n.locale.to_s
end
should 'include stylesheets supplied by plugins' do
class Plugin1 < Noosfero::Plugin
def stylesheet?
true
end
end
plugin1_path = '/plugin1/style.css'
class Plugin2 < Noosfero::Plugin
def stylesheet?
true
end
end
plugin2_path = '/plugin2/style.css'
Noosfero::Plugin.stubs(:all).returns([Plugin1.name, Plugin2.name])
environment = Environment.default
environment.enable_plugin(Plugin1.name)
environment.enable_plugin(Plugin2.name)
ActionView::Helpers::AssetTagHelper::StylesheetIncludeTag.any_instance.stubs('asset_file_path!')
ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag.any_instance.stubs('asset_file_path!')
get :index
assert_tag :tag => 'link', :attributes => {:href => /#{plugin1_path}/, :type => 'text/css', :rel => 'stylesheet'}
assert_tag :tag => 'link', :attributes => {:href => /#{plugin2_path}/, :type => 'text/css', :rel => 'stylesheet'}
end
should 'include javascripts supplied by plugins' do
class Plugin1 < Noosfero::Plugin
def js_files
['js1.js']
end
end
js1 = 'js1.js'
plugin1_path = '/plugin1/'+js1
class Plugin2 < Noosfero::Plugin
def js_files
['js2.js', 'js3.js']
end
end
js2 = 'js2.js'
js3 = 'js3.js'
plugin2_path2 = '/plugin2/'+js2
plugin2_path3 = '/plugin2/'+js3
Noosfero::Plugin.stubs(:all).returns([Plugin1.name, Plugin2.name])
environment = Environment.default
environment.enable_plugin(Plugin1.name)
environment.enable_plugin(Plugin2.name)
ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag.any_instance.stubs('asset_file_path!')
get :index
assert_tag :tag => 'script', :attributes => {:src => /#{plugin1_path}/, :type => 'text/javascript'}
assert_tag :tag => 'script', :attributes => {:src => /#{plugin2_path2}/, :type => 'text/javascript'}
assert_tag :tag => 'script', :attributes => {:src => /#{plugin2_path3}/, :type => 'text/javascript'}
end
should 'include content in the beginning of body supplied by plugins regardless it is a block or html code' do
class TestBodyBeginning1Plugin < Noosfero::Plugin
def body_beginning
lambda {"This is [[plugin1]] speaking!"}
end
end
class TestBodyBeginning2Plugin < Noosfero::Plugin
def body_beginning
"This is Plugin2 speaking!"
end
end
Noosfero::Plugin.stubs(:all).returns([TestBodyBeginning1Plugin.name, TestBodyBeginning2Plugin.name])
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBodyBeginning1Plugin.new, TestBodyBeginning2Plugin.new])
get :index
assert_tag :tag => 'span', :content => 'This is [[plugin1]] speaking!', :attributes => {:id => 'plugin1'}
assert_tag :tag => 'span', :content => 'This is Plugin2 speaking!', :attributes => {:id => 'plugin2'}
end
should 'include content in the ending of head supplied by plugins regardless it is a block or html code' do
class TestHeadEnding1Plugin < Noosfero::Plugin
def head_ending
lambda {""}
end
end
class TestHeadEnding2Plugin < Noosfero::Plugin
def head_ending
""
end
end
Noosfero::Plugin.stubs(:all).returns([TestHeadEnding1Plugin.name, TestHeadEnding2Plugin.name])
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestHeadEnding1Plugin.new, TestHeadEnding2Plugin.new])
get :index
assert_tag :tag => 'script', :content => "alert('This is [[plugin1]] speaking!')"
assert_tag :tag => 'style', :content => 'This is Plugin2 speaking!'
end
should 'not include jquery-validation language script if they do not exist' do
Noosfero.stubs(:available_locales).returns(['bli'])
get :index, :lang => 'bli'
assert_no_tag :tag => 'script', :attributes => {:src => /messages_bli/}
assert_no_tag :tag => 'script', :attributes => {:src => /methods_bli/}
end
should 'set access-control-allow-origin and method if configured' do
e = Environment.default
e.access_control_allow_origin = ['http://allowed']
e.save!
@request.env["Origin"] = "http://allowed"
get :index
assert_response :success
@request.env["Origin"] = "http://other"
get :index
assert_response :success
@request.env["Origin"] = "http://other"
e.restrict_to_access_control_origins = true
e.save!
get :index
assert_response :forbidden
end
if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
should 'change postgresql schema' do
uses_host 'schema1.com'
Noosfero::MultiTenancy.expects(:on?).returns(true)
Noosfero::MultiTenancy.expects(:mapping).returns({ 'schema1.com' => 'schema1' })
exception = assert_raise(ActiveRecord::StatementInvalid) { get :index }
assert_match /SET search_path TO schema1/, exception.message
end
should 'not change postgresql schema if multitenancy is off' do
uses_host 'schema1.com'
Noosfero::MultiTenancy.stubs(:on?).returns(false)
Noosfero::MultiTenancy.stubs(:mapping).returns({ 'schema1.com' => 'schema1' })
assert_nothing_raised(ActiveRecord::StatementInvalid) { get :index }
end
end
should 'register search_term occurrence on find_by_contents' do
controller = ApplicationController.new
controller.stubs(:environment).returns(Environment.default)
assert_difference 'SearchTermOccurrence.count', 1 do
controller.send(:find_by_contents, :people, Environment.default, Person, 'search_term', paginate_options={:page => 1}, options={})
process_delayed_job_queue
end
end
should 'allow plugin to propose search terms suggestions' do
class SuggestionsPlugin < Noosfero::Plugin
def find_suggestions(query, context, asset, options={:limit => 5})
['a', 'b', 'c']
end
end
controller = ApplicationController.new
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([SuggestionsPlugin.new])
assert_equal ['a', 'b', 'c'], controller.send(:find_suggestions, 'random', Environment.default, 'random')
end
should 'redirect to login if environment is restrict to members' do
Environment.default.enable(:restrict_to_members)
get :index
assert_redirected_to :controller => 'account', :action => 'login'
end
should 'do not allow member not included in whitelist to access an restricted environment' do
user = create_user
e = Environment.default
e.enable(:restrict_to_members)
e.members_whitelist_enabled = true
e.save!
login_as(user.login)
get :index
assert_response :forbidden
end
should 'allow member in whitelist to access an environment' do
user = create_user
e = Environment.default
e.members_whitelist_enabled = true
e.members_whitelist = "#{user.person.id}"
e.save!
login_as(user.login)
get :index
assert_response :success
end
should 'allow members to access an environment if whitelist is disabled' do
user = create_user
e = Environment.default
e.members_whitelist_enabled = false
e.save!
login_as(user.login)
get :index
assert_response :success
end
should 'allow admin to access an environment if whitelist is enabled' do
e = Environment.default
e.members_whitelist_enabled = true
e.save!
login_as(create_admin_user(e))
get :index
assert_response :success
end
should 'not check whitelist members if the environment is not restrict to members' do
e = Environment.default
e.disable(:restrict_to_members)
e.members_whitelist_enabled = true
e.save!
@controller.expects(:verify_members_whitelist).never
login_as create_user.login
get :index
assert_response :success
end
end