reflection_test.rb 7.3 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'
7
require 'models/pirate'
D
Initial  
David Heinemeier Hansson 已提交
8

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

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

16 17 18 19 20 21
  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 已提交
22 23
  def test_read_attribute_names
    assert_equal(
24
      %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 已提交
25 26 27
      @first.attribute_names
    )
  end
28

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

33 34 35 36 37
  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 已提交
38
  def test_content_columns
39 40 41 42
    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 已提交
43
  end
44

D
Initial  
David Heinemeier Hansson 已提交
45 46 47 48
  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 已提交
49

50 51 52 53 54
  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 已提交
55 56 57 58

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

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

64 65 66 67 68 69 70
  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 已提交
71 72
  def test_aggregation_reflection
    reflection_for_address = ActiveRecord::Reflection::AggregateReflection.new(
73
      :composed_of, :address, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
D
Initial  
David Heinemeier Hansson 已提交
74 75 76
    )

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

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

84 85 86
    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)
87

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

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

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

95 96 97 98 99 100 101 102 103
  def test_reflect_on_all_autosave_associations
    expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
    received = Pirate.reflect_on_all_autosave_associations

    assert !received.empty?
    assert_not_equal Pirate.reflect_on_all_associations.length, received.length
    assert_equal expected, received
  end

104
  def test_has_many_reflection
105
    reflection_for_clients = ActiveRecord::Reflection::AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
D
Initial  
David Heinemeier Hansson 已提交
106 107 108 109

    assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)

    assert_equal Client, Firm.reflect_on_association(:clients).klass
110 111
    assert_equal 'companies', Firm.reflect_on_association(:clients).table_name

D
Initial  
David Heinemeier Hansson 已提交
112
    assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
113 114 115 116
    assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
  end

  def test_has_one_reflection
117
    reflection_for_account = ActiveRecord::Reflection::AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
118 119 120 121
    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 已提交
122
  end
123

124 125 126 127 128 129 130 131 132
  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 已提交
133
  def test_association_reflection_in_modules
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 159 160 161 162 163 164 165 166 167 168
    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 已提交
169
  end
J
Jeremy Kemper 已提交
170

171
  def test_reflection_of_all_associations
172
    # FIXME these assertions bust a lot
173 174
    assert_equal 28, Firm.reflect_on_all_associations.size
    assert_equal 21, Firm.reflect_on_all_associations(:has_many).size
175
    assert_equal 7, Firm.reflect_on_all_associations(:has_one).size
176
    assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
177
  end
178

179 180 181 182
  def test_reflection_should_not_raise_error_when_compared_to_other_object
    assert_nothing_raised { Firm.reflections[:clients] == Object.new }
  end

183 184 185 186
  def test_has_many_through_reflection
    assert_kind_of ActiveRecord::Reflection::ThroughReflection, Subscriber.reflect_on_association(:books)
  end

187 188 189 190 191 192 193
  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
194
end