Project

General

Profile

Download (10.2 KB) Statistics
| Branch: | Tag: | Revision:
require 'test_helper'

class ::TestableResourcesController < ::ApplicationController
def self.controller_path
"realms"
end

def index
if params[:exception].present?
raise ProxyAPI::ProxyException.new('url', StandardError.new('noo'),
params[:exception])
end
render :plain => Time.zone.name, :status => :ok
end
end

class ::TestableResource < ApplicationRecord
# ugly hack - causing ActiveRecord to check the resource against "realms" table in the DB.
# If removed, the ActiveRecord will fail to find a table with name "testable_resources" which will fail tests,
# even if there are no actual calls to the find/select... methods.
def self.table_name
'realms'
end
end

module Testscope
class TestableResourcesController < ::ApplicationController
def self.controller_path
"realms"
end

def index
render :plain => Time.zone.name, :status => :ok
end
end

class TestableResource < ApplicationRecord
# ugly hack - causing ActiveRecord to check the resource against "realms" table in the DB.
# If removed, the ActiveRecord will fail to find a table with name "testable_resources" which will fail tests,
# even if there are no actual calls to the find/select... methods.
def self.table_name
'realms'
end
end
end

class TestableResourcesControllerTest < ActionController::TestCase
tests ::TestableResourcesController

context "when authentication is disabled" do
setup do
User.current = nil
SETTINGS[:login] = false
end

teardown do
SETTINGS[:login] = true
end

it "does not need a username and password" do
get :index
assert_response :success
end
end

context "when authentication is enabled" do
setup do
User.current = nil
SETTINGS[:login] = true
end

it "requires a username and password" do
get :index
assert_response :redirect
end

it "retains original request URI in session" do
get :index
assert_equal '/realms', session[:original_uri]
end

it "requires an account with mail" do
as_admin do
@user = FactoryBot.create(:user)
end
get :index, session: set_session_user.merge(:user => @user.id)
assert_response :redirect
assert_redirected_to edit_user_path(@user)
assert_equal "An email address is required, please update your account details", flash[:error]
end

context "and SSO authenticates" do
setup do
@sso = mock('dummy_sso')
@sso.stubs(:authenticated?).returns(true)
@sso.stubs(:current_user).returns(users(:admin))
@sso.stubs(:support_expiration?).returns(true)
@sso.stubs(:expiration_url).returns("/users/extlogin")
@sso.stubs(:controller).returns(@controller)
@controller.instance_variable_set(:@available_sso, @sso)
@controller.stubs(:get_sso_method).returns(@sso)
end

it "sets the session user" do
get :index
assert_response :success
assert_equal users(:admin).id, session[:user]
end

it "redirects correctly on expiry" do
get :index
session[:expires_at] = 5.minutes.ago
get :index
assert_redirected_to "/users/extlogin"
end

it "changes the session ID to prevent fixation" do
@controller.expects(:reset_session)
get :index
end

it "retains taxonomy session attributes in new session" do
get :index, session: {:location_id => taxonomies(:location1).id,
:organization_id => taxonomies(:organization1).id,
:sso_method => 'SSO::Apache',
:foo => 'bar'}
assert_equal taxonomies(:location1).id, session[:location_id]
assert_equal taxonomies(:organization1).id, session[:organization_id]
assert_equal 'SSO::Apache', session[:sso_method]
refute session[:foo], "session contains 'foo', but should have been reset"
end

context 'with redirecting authentication' do
setup do
@sso.stubs(:support_login?).returns(true)
end

it 'redirects to login page on page refresh or navigation by deleted user' do
sample_user = users(:admin)
get :index, session: set_session_user.merge(:user => sample_user.id)
sample_user.destroy

def @sso.authenticated?
controller.redirect_to '/users/extlogin'
end
@sso.stubs(:has_rendered).returns(true)
@sso.stubs(:current_user).returns(nil)
get :index, session: set_session_user.merge(:user => sample_user.id)
assert_response :redirect
assert_redirected_to '/users/extlogin'
assert_equal('Your session has expired, please login again', flash[:warning])
end
end
end
end

context "can filter parameters" do
setup do
@controller.class.send(:include, Foreman::Controller::FilterParameters)
@params = {'foo' => 'foo', 'name' => 'name', 'id' => 'id' }
@request = OpenStruct.new({:filtered_parameters => @params.clone })
@controller.stubs(:request).returns(@request)
ApplicationController.any_instance.stubs(:process_action).returns(nil)
end

it "filters parameters" do
@controller.class.filter_parameters :name, :id
@controller.process_action("")
assert_equal @request.filtered_parameters['foo'], 'foo'
assert_includes @request.filtered_parameters['name'], 'FILTERED'
assert_includes @request.filtered_parameters['id'], 'FILTERED'
end

it "doesn't filter when filter_parameters isn't set" do
@controller.class.filter_parameters nil
@controller.process_action("")
assert_equal @request.filtered_parameters, @params
end

it "doesn't filter when params don't match" do
@controller.class.filter_parameters :description, :something
@controller.process_action("")
assert_equal @request.filtered_parameters, @params
end
end

context 'controllers uses timezone' do
setup do
SETTINGS[:login] = true
@user = users(:admin)
@user.update_attribute(:timezone, 'Fiji')
end

it 'modifies timezone only inside a controller' do
get :index, session: { :user => @user.id, :expires_at => 5.minutes.from_now }
# inside the controller
assert_equal(@response.body, @user.timezone)
# outside the controller
refute_equal(Time.zone.name, @user.timezone)
end

it 'defaults to UTC timezone if user timezone and cookie are not set' do
@user.update_attribute(:timezone, nil)
get :index, session: { :user => @user.id, :expires_at => 5.minutes.from_now }
assert_equal(@response.body, 'UTC')
end

it 'changes the timezone according to cookie when user timezone is nil' do
@user.update_attribute(:timezone, nil)
cookies[:timezone] = 'Australia/Sydney'
get :index, session: { :user => @user.id, :expires_at => 5.minutes.from_now }
assert_equal(@response.body, cookies[:timezone])
end
end

context 'controllers should be connected to resource' do
it 'finds the right resource' do
actual_resource = @controller.resource_class

assert_equal(actual_resource, TestableResource)
end

it 'creates valid scope' do
actual_scope = @controller.resource_scope

assert actual_scope.is_a?(ActiveRecord::Relation)
end

it 'creates authorized scope' do
mock_scope = mock('mock_scope')

auth_scope = mock('auth_scope')
auth_scope.stubs(:where).returns(mock_scope)

resource_class = mock('authorized_resource')
resource_class.stubs(:authorized).returns(auth_scope)

@controller.stubs(:resource_class).returns(resource_class)
@controller.stubs(:action_permission).returns('my_action')

actual_scope = @controller.resource_scope

assert_equal(actual_scope, mock_scope)
end

it 'creates valid scope with options' do
actual_scope = @controller.resource_scope(field1: 'value1')

assert_equal 'value1', actual_scope.where_values_hash['field1']
end
end

context 'migration checker' do
teardown do
Foreman::Controller::MigrationChecker.instance_variable_set('@needs_migration', nil)
ActiveRecord::Migrator.unstub(:needs_migration?)
end

it 'fails when pending migrations' do
Foreman::Controller::MigrationChecker.instance_variable_set('@needs_migration', nil)
ActiveRecord::Migrator.stubs(:needs_migration?).returns(true)
get :index
assert_response :service_unavailable
end
end

context 'welcome page' do
it 'shows a welcome page' do
Realm.destroy_all # Realm is our TestableResource
get :index, session: set_session_user
assert_response :success
assert_template 'welcome'
end

it 'does not shows a welcome page when there is content' do
FactoryBot.create(:realm) # Realm is our TestableResource
get :index, session: set_session_user
assert_response :success
assert_template :partial => false
end
end

context 'logged in user is deleted' do
it 'redirects to login page on page refresh or navigation by deleted user' do
sample_user = users(:admin)
get :index, session: set_session_user.merge(:user => sample_user.id)
sample_user.destroy
get :index, session: set_session_user.merge(:user => sample_user.id)
assert_response :redirect
assert_redirected_to login_users_url
assert_equal('Your session has expired, please login again', flash[:warning])
end
end

context 'smart proxy errors are displayed when no referer is set' do
test 'proxy exception' do
get :index, params: { :exception => 'some error' }, session: set_session_user
assert_response :success
assert_match(/.*ProxyAPI::ProxyException.*some error.*/, response.body)
end
end
end

class Testscope::TestableResourcesControllerTest < ActionController::TestCase
tests Testscope::TestableResourcesController

context 'welcome page' do
it 'shows a welcome page' do
Realm.destroy_all # Realm is our Testscope::TestableResource
get :index, session: set_session_user
assert_response :success
assert_template 'welcome'
end
end
end
(2-2/53)