stoa_plugin_controller_test.rb 6.41 KB
require File.dirname(__FILE__) + '/../../../../test/test_helper'
require File.dirname(__FILE__) + '/../../controllers/stoa_plugin_controller'

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

class StoaPluginControllerTest < ActionController::TestCase

  SALT=YAML::load(File.open(StoaPlugin.root_path + 'config.yml'))['salt']

  def setup
    @controller = StoaPluginController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
    ActiveRecord::Base.configurations['stoa'] = {:adapter => 'sqlite3', :database => ':memory:', :verbosity => 'quiet'}
    env = Environment.default
    env.enable_plugin(StoaPlugin.name)
    env.enable('skip_new_user_email_confirmation')
    env.save!
    @user = create_user_full('real_user', {:password => '123456', :password_confirmation => '123456'}, {:usp_id => 9999999})
    @user.activate
  end

  attr_accessor :user

  should 'not authenticate if method not post' do
    get :authenticate, :login => user.login, :password => '123456'

    assert_not_nil json_response['error']
    assert_match /post method/,json_response['error']
  end

  should 'not authenticate if method password is wrong' do
    post :authenticate, :login => user.login, :password => 'wrong_password'

    assert_not_nil json_response['error']
    assert_match /password/,json_response['error']
  end

  should 'authenticate if everything is right' do
    post :authenticate, :login => user.login, :password => '123456'

    assert_nil json_response['error']
    assert_equal user.login, json_response['username']
  end

  should 'authenticate with usp_id' do
    post :authenticate, :usp_id => user.person.usp_id.to_s, :password => '123456'

    assert_nil json_response['error']
    assert_equal user.login, json_response['username']
  end

  should 'return no fields if fields requested was none' do
    post :authenticate, :login => user.login, :password => '123456', :fields => 'none'

    expected_response = {'ok' => true}

    assert_nil json_response['error']
    assert_equal expected_response, json_response
  end

  should 'return only the essential fields if no fields requested' do
    post :authenticate, :login => user.login, :password => '123456'
    response = json_response.clone

    assert_nil response['error']
    assert_equal true, response.delete('ok')
    assert_equal user.login, response.delete('username')
    assert_equal user.email, response.delete('email')
    assert_equal user.person.usp_id.to_s, response.delete('nusp')
    assert response.blank?
  end

  should 'return only selected fields' do
    Person.any_instance.stubs(:f1).returns('field1')
    Person.any_instance.stubs(:f2).returns('field2')
    Person.any_instance.stubs(:f3).returns('field3')
    @controller.stubs(:selected_fields).returns(%w[f1 f2 f3])

    post :authenticate, :login => user.login, :password => '123456', :fields => 'special'
    response = json_response.clone

    assert_equal true, response.delete('ok')
    assert_equal 'field1', response.delete('f1')
    assert_equal 'field2', response.delete('f2')
    assert_equal 'field3', response.delete('f3')
    assert response.blank?
  end

  should 'not return private fields' do
    Person.any_instance.stubs(:f1).returns('field1')
    Person.any_instance.stubs(:f2).returns('field2')
    Person.any_instance.stubs(:f3).returns('field3')
    StoaPluginController::FIELDS['special'] = %w[f1 f2 f3]
    person = user.person
    person.fields_privacy = {:f1 => 'private', :f2 => 'public', :f3 => 'public'}
    person.save!

    post :authenticate, :login => user.login, :password => '123456', :fields => 'special'

    assert !json_response.keys.include?('f1')
    assert json_response.keys.include?('f2')
    assert json_response.keys.include?('f3')
  end

  should 'return essential fields even if they are private' do
    person = user.person
    person.fields_privacy = {:email => 'private'}
    person.save!

    post :authenticate, :login => user.login, :password => '123456'

    assert json_response.keys.include?('email')
  end

  should 'return only essential fields when profile is private' do
    Person.any_instance.stubs(:f1).returns('field1')
    Person.any_instance.stubs(:f2).returns('field2')
    Person.any_instance.stubs(:f3).returns('field3')
    StoaPluginController::FIELDS['special'] = %w[f1 f2 f3] + StoaPluginController::FIELDS['essential']
    person = user.person
    person.public_profile = false
    person.save!

    post :authenticate, :login => user.login, :password => '123456', :fields => 'special'
    response = json_response.clone

    assert_nil response['error']
    assert_equal true, response.delete('ok')
    assert_equal user.login, response.delete('username')
    assert_equal user.email, response.delete('email')
    assert_equal user.person.usp_id.to_s, response.delete('nusp')
    assert response.blank?
  end

  should 'not crash if usp_id is invalid' do
    assert_nothing_raised do
      post :authenticate, :usp_id => 12321123, :password => '123456'
    end
    assert_not_nil json_response['error']
    assert_match /user/,json_response['error']
  end

  should 'check valid usp id' do
    usp_id = '12345678'
    StoaPlugin::UspUser.stubs(:exists?).with(usp_id).returns(true)
    get :check_usp_id, :usp_id => usp_id
    assert json_response['exists']
  end

  should 'check invalid usp id' do
    usp_id = '87654321'
    StoaPlugin::UspUser.stubs(:exists?).with(usp_id).returns(false)
    get :check_usp_id, :usp_id => usp_id
    assert !json_response['exists']
  end

  should 'check existent cpf' do
    usp_id = '12345678'
    user = mock
    user.stubs(:cpf).returns('12345678')
    StoaPlugin::UspUser.stubs(:find_by_codpes).with(usp_id).returns(user)
    get :check_cpf, :usp_id => usp_id
    assert json_response['exists']
  end

  should 'check not existent cpf' do
    usp_id_with_cpf = '12345678'
    user_with_cpf = mock
    user_with_cpf.stubs(:cpf).returns('12345678')
    StoaPlugin::UspUser.stubs(:find_by_codpes).with(usp_id_with_cpf).returns(user_with_cpf)
    get :check_cpf, :usp_id => usp_id_with_cpf
    usp_id_without_cpf = '87654321'
    user_without_cpf = mock
    user_with_cpf.stubs(:cpf).returns(nil)
    StoaPlugin::UspUser.stubs(:find_by_codpes).with(usp_id_without_cpf).returns(user_without_cpf)
    get :check_cpf, :usp_id => usp_id_without_cpf
    assert !json_response['exists']
  end

  private

  def json_response
    ActiveSupport::JSON.decode @response.body
  end

end