require File.dirname(__FILE__) + '/../test_helper' require 'companies_controller' # Re-raise errors caught by the controller. class CompaniesController; def rescue_action(e) raise e end; end class CompaniesControllerTest < Test::Unit::TestCase fixtures :companies def setup @controller = CompaniesController.new @request = ActionController::TestRequest.new @response = ActionController::TestResponse.new @partial_address = { :street_1 => '95 Broad Street' } @good_address = { :street_1 => '12 Popfield', :post_code => 'B15 1AU' } @good_company = { :name => 'Excellent Ltd.' } end def assert_company_not_saved assert_template 'companies/new' assert_select 'div[class=formError]' assert_equal nil, Company.find_by_name(@good_company[:name]) end def assert_company_saved assert_redirected_to :action => 'index' assert_instance_of Company, Company.find_by_name(@good_company[:name]) assert_instance_of Address, Address.find_by_street_1_and_post_code(@good_address[:street_1], @good_address[:post_code]) end # No address details supplied at all def test_create_bad_empty_address post :create, :company => @good_company assert_company_not_saved end # Partial (invalid) address details supplied def test_create_bad_street_1 post :create, :company => @good_company, :address => @partial_address assert_company_not_saved end # Valid company and address def test_create_company_address post :create, :company => @good_company, :address => @good_address assert_company_saved end # Invalid company details def test_create_bad_company post :create, :company => {} assert_template 'companies/new' assert_select 'div[class=formError]' end # Company update with empty address def test_update_bad_empty_address attrs = @acme.attributes.delete(:address_id) post :update, :company => attrs, :id => @acme.id, :address => {} assert_template 'companies/edit' assert_select 'div[class=formError]' end # Company update with invalid address def test_update_bad_post_code attrs = @acme.attributes.delete(:address_id) post :update, :company => attrs, :id => @acme.id, :address => @partial_address assert_template 'companies/edit' assert_select 'div[class=formError]' end # Company update with valid company and address def test_update_company_address post :update, :company => {:name => 'Not Acme Any More'}, :id => @acme.id, :address => @good_address updated_acme = Company.find(@acme.id) assert_equal @good_address[:street_1], updated_acme.address.street_1 assert_equal 'Not Acme Any More', updated_acme.name assert_redirected_to :action => 'index' end end