aboutsummaryrefslogblamecommitdiffstats
path: root/actionpack/test/controller/active_record_assertions_test.rb
blob: 49db40c5a281b21b75f1707c32928f37a6f7fb33 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11


                                                                   







                                                                                   
 
       
 
                                   
 






























                                                                                   
  






                                        
  






                                        
  




                                 
  


                                     
 
                                                                                   
 
                                                                                             
 







                                                                     
 








                                                              
 








                                                                    
 





                                                       
 










                                                    
     
 
   
path_to_ar = File.dirname(__FILE__) + '/../../../activerecord'

if Object.const_defined?("ActiveRecord") || File.exist?(path_to_ar)
  
  # This test is very different than the others.  It requires ActiveRecord to 
  # run.  There's a bunch of stuff we are assuming here:
  #
  # 1.  activerecord exists as a sibling directory to actionpack
  #     (i.e., actionpack/../activerecord)
  # 2.  you've created the appropriate database to run the active_record unit tests
  # 3.  you set the appropriate database connection below

  begin

    driver_to_use = 'native_sqlite'

    $: << path_to_ar + '/lib/'
    $: << path_to_ar + '/test/'
    require 'active_record' unless Object.const_defined?("ActiveRecord")
    require "connections/#{driver_to_use}/connection"
    require 'fixtures/company'

    # -----------------------------------------------------------------------------

    # add some validation rules to trip up the assertions
    class Company
      protected
        def validate
          errors.add_on_empty('name')
          errors.add('rating', 'rating should not be 2') if rating == 2
          errors.add_to_base('oh oh') if rating == 3
        end  
    end

    # -----------------------------------------------------------------------------

    require File.dirname(__FILE__) + '/../abstract_unit'

    # a controller class to handle the AR assertions
    class ActiveRecordAssertionsController < ActionController::Base
      # fail with 1 bad column
      def nasty_columns_1
        @company = Company.new
        @company.name = "B"
        @company.rating = 2
        render_text "snicker...."
      end
  
      # fail with 2 bad column
      def nasty_columns_2
        @company = Company.new
        @company.name = ""
        @company.rating = 2
        render_text "double snicker...."
      end
  
      # this will pass validation
      def good_company
        @company = Company.new
        @company.name = "A"
        @company.rating = 69
        render_text "Goodness Gracious!"
      end
  
      # this will fail validation
      def bad_company
        @company = Company.new 
        render_text "Who's Bad?"
      end
  
      # the safety dance......
      def rescue_action(e) raise; end
    end

    # -----------------------------------------------------------------------------

    ActiveRecordAssertionsController.template_root = File.dirname(__FILE__) + "/../fixtures/"

    # The test case to try the AR assertions
    class ActiveRecordAssertionsControllerTest < Test::Unit::TestCase
      # set it up
      def setup
        @request = ActionController::TestRequest.new
        @response = ActionController::TestResponse.new
        @controller = ActiveRecordAssertionsController.new
      end

      # test for 1 bad apple column
      def test_some_invalid_columns
        process :nasty_columns_1
        assert_success
        assert_invalid_record 'company'
        assert_invalid_column_on_record 'company', 'rating'
        assert_valid_column_on_record 'company', 'name'
        assert_valid_column_on_record 'company', ['name','id']
      end

      # test for 2 bad apples columns
      def test_all_invalid_columns
        process :nasty_columns_2
        assert_success
        assert_invalid_record 'company'
        assert_invalid_column_on_record 'company', 'rating'
        assert_invalid_column_on_record 'company', 'name'
        assert_invalid_column_on_record 'company', ['name','rating']
      end

      # ensure we have no problems with an ActiveRecord
      def test_valid_record
        process :good_company
        assert_success
        assert_valid_record 'company'
      end
 
      # ensure we have problems with an ActiveRecord
      def test_invalid_record
        process :bad_company
        assert_success
        assert_invalid_record 'company'
      end
    end 

  rescue SqliteError => e
    puts "Skipping active record based tests"    
    puts e.message    
  end

end