reflection_test.rb 7.0 KB
Newer Older
1
require "cases/helper"
J
Jeremy Kemper 已提交
2 3 4 5 6
require 'models/topic'
require 'models/customer'
require 'models/company'
require 'models/company_in_module'
require 'models/subscriber'
D
Initial  
David Heinemeier Hansson 已提交
7

8
class ReflectionTest < ActiveRecord::TestCase
9
  fixtures :topics, :customers, :companies, :subscribers
10

D
Initial  
David Heinemeier Hansson 已提交
11 12 13 14
  def setup
    @first = Topic.find(1)
  end

15 16 17 18 19 20
  def test_column_null_not_null
    subscriber = Subscriber.find(:first)
    assert subscriber.column_for_attribute("name").null
    assert !subscriber.column_for_attribute("nick").null
  end

D
Initial  
David Heinemeier Hansson 已提交
21 22
  def test_read_attribute_names
    assert_equal(
23
      %w( id title author_name author_email_address bonus_time written_on last_read content approved replies_count parent_id type ).sort,
D
Initial  
David Heinemeier Hansson 已提交
24 25 26
      @first.attribute_names
    )
  end
27

D
Initial  
David Heinemeier Hansson 已提交
28
  def test_columns
29
    assert_equal 12, Topic.columns.length
D
Initial  
David Heinemeier Hansson 已提交
30 31
  end

32 33 34 35 36
  def test_columns_are_returned_in_the_order_they_were_declared
    column_names = Topic.columns.map { |column| column.name }
    assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content approved replies_count parent_id type), column_names
  end

D
Initial  
David Heinemeier Hansson 已提交
37
  def test_content_columns
38 39 40 41
    content_columns        = Topic.content_columns
    content_column_names   = content_columns.map {|column| column.name}
    assert_equal 8, content_columns.length
    assert_equal %w(title author_name author_email_address written_on bonus_time last_read content approved).sort, content_column_names.sort
D
Initial  
David Heinemeier Hansson 已提交
42
  end
43

D
Initial  
David Heinemeier Hansson 已提交
44 45 46 47
  def test_column_string_type_and_limit
    assert_equal :string, @first.column_for_attribute("title").type
    assert_equal 255, @first.column_for_attribute("title").limit
  end
J
Jeremy Kemper 已提交
48

49 50 51 52 53
  def test_column_null_not_null
    subscriber = Subscriber.find(:first)
    assert subscriber.column_for_attribute("name").null
    assert !subscriber.column_for_attribute("nick").null
  end
D
Initial  
David Heinemeier Hansson 已提交
54 55 56 57

  def test_human_name_for_column
    assert_equal "Author name", @first.column_for_attribute("author_name").human_name
  end
58

D
Initial  
David Heinemeier Hansson 已提交
59 60
  def test_integer_columns
    assert_equal :integer, @first.column_for_attribute("id").type
61
  end
D
Initial  
David Heinemeier Hansson 已提交
62

63 64 65 66 67 68 69
  def test_reflection_klass_for_nested_class_name
    reflection = ActiveRecord::Reflection::MacroReflection.new(nil, nil, { :class_name => 'MyApplication::Business::Company' }, nil)
    assert_nothing_raised do
      assert_equal MyApplication::Business::Company, reflection.klass
    end
  end

D
Initial  
David Heinemeier Hansson 已提交
70 71
  def test_aggregation_reflection
    reflection_for_address = ActiveRecord::Reflection::AggregateReflection.new(
72
      :composed_of, :address, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
D
Initial  
David Heinemeier Hansson 已提交
73 74 75
    )

    reflection_for_balance = ActiveRecord::Reflection::AggregateReflection.new(
76
      :composed_of, :balance, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
D
Initial  
David Heinemeier Hansson 已提交
77 78
    )

79 80 81 82
    reflection_for_gps_location = ActiveRecord::Reflection::AggregateReflection.new(
      :composed_of, :gps_location, { }, Customer
    )

83 84 85
    assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
    assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
    assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
86

D
Initial  
David Heinemeier Hansson 已提交
87
    assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
88

D
Initial  
David Heinemeier Hansson 已提交
89
    assert_equal Address, Customer.reflect_on_aggregation(:address).klass
J
Jeremy Kemper 已提交
90

91
    assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
D
Initial  
David Heinemeier Hansson 已提交
92
  end
93 94

  def test_has_many_reflection
95
    reflection_for_clients = ActiveRecord::Reflection::AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
D
Initial  
David Heinemeier Hansson 已提交
96 97 98 99

    assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)

    assert_equal Client, Firm.reflect_on_association(:clients).klass
100 101
    assert_equal 'companies', Firm.reflect_on_association(:clients).table_name

D
Initial  
David Heinemeier Hansson 已提交
102
    assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
103 104 105 106
    assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
  end

  def test_has_one_reflection
107
    reflection_for_account = ActiveRecord::Reflection::AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
108 109 110 111
    assert_equal reflection_for_account, Firm.reflect_on_association(:account)

    assert_equal Account, Firm.reflect_on_association(:account).klass
    assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
D
Initial  
David Heinemeier Hansson 已提交
112
  end
113

114 115 116 117 118 119 120 121 122
  def test_belongs_to_inferred_foreign_key_from_assoc_name
    Company.belongs_to :foo
    assert_equal "foo_id", Company.reflect_on_association(:foo).primary_key_name
    Company.belongs_to :bar, :class_name => "Xyzzy"
    assert_equal "bar_id", Company.reflect_on_association(:bar).primary_key_name
    Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
    assert_equal "xyzzy_id", Company.reflect_on_association(:baz).primary_key_name
  end

D
Initial  
David Heinemeier Hansson 已提交
123
  def test_association_reflection_in_modules
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
    assert_reflection MyApplication::Business::Firm,
      :clients_of_firm,
      :klass      => MyApplication::Business::Client,
      :class_name => 'Client',
      :table_name => 'companies'

    assert_reflection MyApplication::Billing::Account,
      :firm,
      :klass      => MyApplication::Business::Firm,
      :class_name => 'MyApplication::Business::Firm',
      :table_name => 'companies'

    assert_reflection MyApplication::Billing::Account,
      :qualified_billing_firm,
      :klass      => MyApplication::Billing::Firm,
      :class_name => 'MyApplication::Billing::Firm',
      :table_name => 'companies'

    assert_reflection MyApplication::Billing::Account,
      :unqualified_billing_firm,
      :klass      => MyApplication::Billing::Firm,
      :class_name => 'Firm',
      :table_name => 'companies'

    assert_reflection MyApplication::Billing::Account,
      :nested_qualified_billing_firm,
      :klass      => MyApplication::Billing::Nested::Firm,
      :class_name => 'MyApplication::Billing::Nested::Firm',
      :table_name => 'companies'

    assert_reflection MyApplication::Billing::Account,
      :nested_unqualified_billing_firm,
      :klass      => MyApplication::Billing::Nested::Firm,
      :class_name => 'Nested::Firm',
      :table_name => 'companies'
D
Initial  
David Heinemeier Hansson 已提交
159
  end
J
Jeremy Kemper 已提交
160

161
  def test_reflection_of_all_associations
162
    # FIXME these assertions bust a lot
163 164
    assert_equal 26, Firm.reflect_on_all_associations.size
    assert_equal 20, Firm.reflect_on_all_associations(:has_many).size
165
    assert_equal 6, Firm.reflect_on_all_associations(:has_one).size
166
    assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
167
  end
168

169 170 171 172
  def test_reflection_should_not_raise_error_when_compared_to_other_object
    assert_nothing_raised { Firm.reflections[:clients] == Object.new }
  end

173 174 175 176
  def test_has_many_through_reflection
    assert_kind_of ActiveRecord::Reflection::ThroughReflection, Subscriber.reflect_on_association(:books)
  end

177 178 179 180 181 182 183
  private
    def assert_reflection(klass, association, options)
      assert reflection = klass.reflect_on_association(association)
      options.each do |method, value|
        assert_equal(value, reflection.send(method))
      end
    end
184
end