users_controller_test.rb 4.6 KB
require_relative "../test_helper"
require 'users_controller'

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

class UsersControllerTest < ActionController::TestCase

  def setup
    @controller = UsersController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new

    Environment.destroy_all
    @environment = fast_create(Environment, :is_default => true)
 

    admin_user = create_user_with_permission('adminuser', 'manage_environment_users', environment)
    login_as('adminuser')
  end

  attr_accessor :environment

  should 'not access without right permission' do
    create_user('guest')
    login_as 'guest'
    get :index
    assert_response 403 # forbidden
  end

  should 'grant access with right permission' do
    get :index
    assert_response :success
  end

  should 'blank search results include activated and deactivated users' do
    deactivated = create_user('deactivated')
    deactivated.activated_at = nil
    deactivated.person.visible = false
    deactivated.save!
    get :index, :q => ''
    assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /adminuser/}}
    assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /deactivated/}}
  end

  should 'blank search include all users' do
    (1..5).each {|i|
      u = create_user('user'+i.to_s)
    }
    get :index, :q => '' # blank search
    assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /adminuser/}}
    (1..5).each {|i|
      u = 'user'+i.to_s
      assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => u}}
    }
  end

  should 'search not include all users' do
    (1..5).each {|i|
      u = create_user('user'+i.to_s)
    }
    get :index, :q => 'er5' # search
    assert_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => /user5/}}
    (1..4).each {|i|
      u = 'user'+i.to_s
      assert_no_tag :tag => 'div', :attributes => { :id => /users-list/ }, :descendant => {:tag => 'a', :attributes => {:title => u}}
    }
  end

  should 'set admin role' do
    person = create_user.person
    Role.create!(:name => 'Admin', :key => 'environment_administrator', :environment => environment, :permissions => ['view_environment_admin_panel'])
    assert_equal false, person.is_admin?
    post :set_admin_role, :id => person.id, :q => ''
    person.reload
    assert person.is_admin?
  end

  should 'reset admin role' do
    person = create_user.person
    Role.create!(:name => 'Admin', :key => 'environment_administrator', :environment => environment, :permissions => ['view_environment_admin_panel'])

    environment.add_admin(person)
    assert person.is_admin?

    post :reset_admin_role, :id => person.id, :q => ''
    person.reload
    assert !person.is_admin?
  end

  should 'activate user' do
    u = create_user()
    assert_equal false, u.activated?
    post :activate, :id => u.person.id, :q => ''
    u.reload
    assert u.activated?
  end

  should 'deactivate user' do
    u = create_user()
    u.activated_at = Time.now.utc
    u.activation_code = nil
    u.person.visible = true
    assert u.activated?
    post :deactivate, :id => u.person.id, :q => ''
    u.reload
    assert_equal false, u.activated?
  end

  should 'order users by name' do
    create_user('jeremy')
    create_user('bill')
    create_user('ana')
    create_user('creed')
    get :index

    assert_order ['ana', 'bill', 'creed', 'jeremy'], assigns(:collection).map(&:name)
  end

  should 'set filter to all_users by default' do
    get :index
    assert_equal 'all_users', assigns(:filter)
  end

  should 'response as XML to export users' do
    get :download, :format => 'xml'
    assert_equal 'text/xml', @response.content_type
  end

  should 'response as CSV to export users' do
    get :download, :format => 'csv'
    assert_equal 'text/csv', @response.content_type
    assert_equal 'name;email', @response.body.split("\n")[0]
  end

  should 'be able to remove a person' do
    person = fast_create(Person, :environment_id => environment.id)
    assert_difference 'Person.count', -1 do
      post :destroy_user, :id => person.id
    end
  end

  should 'not crash if user does not exist' do
    person = fast_create(Person)

    assert_no_difference 'Person.count' do
      post :destroy_user, :id => 99999
    end
    assert_redirected_to :action => 'index'
  end

end