aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/test/controller/active_record_assertions_test.rb
blob: 915750f667e62623c9dabbe88168d76bec7cc622 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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_sqlite3'

    unless Object.const_defined?("ActiveRecord")
      require File.join(path_to_ar, 'lib', 'active_record') unless Object.const_defined?(:ActiveRecord)
    end
    $: << path_to_ar + '/test/'
    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 Object => e
    puts "Skipping active record based tests"    
    puts e.message    
  end

end