enterprise_controller_test.rb 4.53 KB
require File.dirname(__FILE__) + '/../test_helper'
require 'enterprise_controller'

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

class EnterpriseControllerTest < Test::Unit::TestCase
  all_fixtures

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

  # FIXME: this should be generic
  def get(action, params = {})
    super(action, {:profile => 'ze'}.merge(params))
  end

  # FIXME: this should be generic
  def post(action, params = {})
    super(action, {:profile => 'ze'}.merge(params))
  end

  def test_logged_with_one_enterprise_index
    login_as 'ze'
    get :index, :profile => 'ze'
    assert_response :redirect
    assert_redirected_to :action => 'show'

    assert_kind_of Array, assigns(:my_pending_enterprises)
  end

  def test_logged_with_two_enterprises_index
    login_as 'johndoe'
    get :index
    assert_response :redirect
    assert_redirected_to :action => 'list'

    assert_kind_of Array, assigns(:my_pending_enterprises)
  end

  def test_not_logged_index
    get :index
    assert_response :redirect
    assert_redirected_to :controller => 'account'
  end

  def test_my_enterprises
    login_as 'ze'
    get :index
    assert_not_nil assigns(:my_enterprises)
    assert_kind_of Array, assigns(:my_enterprises)
  end

  def test_enterprise_listing
    login_as 'ze'
    get :list
    assert_not_nil assigns(:enterprises)
    assert Array, assigns(:enterprises)
  end

  def test_enterprise_showing
    login_as 'ze'
    get :show, :id => 5
    assert_not_nil assigns(:enterprise)
    assert_kind_of Enterprise, assigns(:enterprise)
  end

  def test_register_form
    login_as 'ze'
    get :register_form
    assert_response :success
  end

  def test_register
    login_as 'ze'
    post :register, :enterprise => {:name => 'register_test', :identifier => 'register_test'}
    assert_not_nil assigns(:enterprise)
    assert_response :redirect
    assert_redirected_to :action => 'index'
  end

  def test_fail_register
    login_as 'ze'
    post :register, :enterprise => {:name => ''}
    assert_response :success
    assert !assigns(:enterprise).valid?
  end

  def test_enterprise_editing
    login_as 'ze'
    e = create_enterprise
    get :edit, :id => e
    assert_not_nil assigns(:enterprise)
    assert_kind_of Enterprise, assigns(:enterprise)
  end

  def test_enterprise_updating
    login_as 'ze'
    e = create_enterprise
    post :update, :id => e, :enterprise => {:name => 'colivre'}
    assert_not_nil assigns(:enterprise)
    assert_kind_of Enterprise, assigns(:enterprise)
    assert_response :redirect
    assert_redirected_to :action => 'index'
  end

  def test_enterprise_updating_wrong
    login_as 'ze'
    e = create_enterprise
    post :update, :id => e, :enterprise => {:name => ''} # name can't be blank
    assert_not_nil assigns(:enterprise)
    assert_kind_of Enterprise, assigns(:enterprise)
    assert_response :success
    assert_template 'edit'
  end

  def test_affiliate
    login_as 'ze'
    e = create_enterprise(:owner => 'johndoe', :user => 'ze')
    post :affiliate, :id => e
    assert assigns(:enterprise)
    assert assigns(:enterprise).people.include?(assigns(:person))
    assert assigns(:person).enterprises.include?(assigns(:enterprise))
  end

  def test_destroy
    login_as 'ze'
    e = create_enterprise
    c = Enterprise.count
    assert_nothing_raised { Enterprise.find(e) }
    post :destroy, :id => e
    assert assigns(:enterprise)
    assert_raise ActiveRecord::RecordNotFound do
      Enterprise.find(e)
    end
    assert_equal c - 1, Enterprise.count
  end

  def test_search
    login_as 'ze'
    e = create_enterprise(:tag_list => 'bla')
    get :search, :query => 'bla'
    assert assigns(:tagged_enterprises)
    assert_kind_of Array, assigns(:tagged_enterprises)
  end

  def test_activate
    login_as 'ze'
    e = create_enterprise
    post :activate, :id => e
    assert assigns(:enterprise)
    assert_kind_of Enterprise, assigns(:enterprise)
    assert assigns(:enterprise).active
  end

  def test_approve
    login_as 'ze'
    e = create_enterprise
    post :approve, :id => e
    assert assigns(:enterprise)
  end

  protected
  
  def create_enterprise(options = {})
    owner = options.delete(:owner)
    user = options.delete(:user)
    login_as owner if owner
    post :register, :enterprise => {:identifier => 'enterprise_a', :name => 'Enterprise A'}.merge(options)
    id = assigns(:enterprise).id
    login_as user if user
    id
  end
end