Upgraded Rails and RSpec
[monkeycharger.git] / vendor / rails / activerecord / test / reflection_test.rb
blob1ed5c2610cef5affe4a3f4d447c355e08043c2aa
1 require 'abstract_unit'
2 require 'fixtures/topic'
3 require 'fixtures/customer'
4 require 'fixtures/company'
5 require 'fixtures/company_in_module'
6 require 'fixtures/subscriber'
8 class ReflectionTest < Test::Unit::TestCase
9   fixtures :topics, :customers, :companies, :subscribers
11   def setup
12     @first = Topic.find(1)
13   end
15   def test_column_null_not_null
16     subscriber = Subscriber.find(:first)
17     assert subscriber.column_for_attribute("name").null
18     assert !subscriber.column_for_attribute("nick").null
19   end
21   def test_read_attribute_names
22     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,
24       @first.attribute_names
25     )
26   end
28   def test_columns
29     assert_equal 12, Topic.columns.length
30   end
32   def test_columns_are_returned_in_the_order_they_were_declared
33     column_names = Topic.columns.map { |column| column.name }
34     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
35   end
37   def test_content_columns
38     content_columns        = Topic.content_columns
39     content_column_names   = content_columns.map {|column| column.name}
40     assert_equal 8, content_columns.length
41     assert_equal %w(title author_name author_email_address written_on bonus_time last_read content approved).sort, content_column_names.sort
42   end
44   def test_column_string_type_and_limit
45     assert_equal :string, @first.column_for_attribute("title").type
46     assert_equal 255, @first.column_for_attribute("title").limit
47   end
48   
49   def test_column_null_not_null
50     subscriber = Subscriber.find(:first)
51     assert subscriber.column_for_attribute("name").null
52     assert !subscriber.column_for_attribute("nick").null
53   end
55   def test_human_name_for_column
56     assert_equal "Author name", @first.column_for_attribute("author_name").human_name
57   end
59   def test_integer_columns
60     assert_equal :integer, @first.column_for_attribute("id").type
61   end
63   def test_reflection_klass_for_nested_class_name
64     reflection = ActiveRecord::Reflection::MacroReflection.new(nil, nil, { :class_name => 'MyApplication::Business::Company' }, nil)
65     assert_nothing_raised do
66       assert_equal MyApplication::Business::Company, reflection.klass
67     end
68   end
70   def test_aggregation_reflection
71     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
73     )
75     reflection_for_balance = ActiveRecord::Reflection::AggregateReflection.new(
76       :composed_of, :balance, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
77     )
79     reflection_for_gps_location = ActiveRecord::Reflection::AggregateReflection.new(
80       :composed_of, :gps_location, { }, Customer
81     )
83     assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
84     assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
85     assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
87     assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
89     assert_equal Address, Customer.reflect_on_aggregation(:address).klass
90     
91     assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
92   end
94   def test_has_many_reflection
95     reflection_for_clients = ActiveRecord::Reflection::AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
97     assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
99     assert_equal Client, Firm.reflect_on_association(:clients).klass
100     assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
102     assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
103     assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
104   end
106   def test_has_one_reflection
107     reflection_for_account = ActiveRecord::Reflection::AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
108     assert_equal reflection_for_account, Firm.reflect_on_association(:account)
110     assert_equal Account, Firm.reflect_on_association(:account).klass
111     assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
112   end
114   def test_belongs_to_inferred_foreign_key_from_assoc_name
115     Company.belongs_to :foo
116     assert_equal "foo_id", Company.reflect_on_association(:foo).primary_key_name
117     Company.belongs_to :bar, :class_name => "Xyzzy"
118     assert_equal "bar_id", Company.reflect_on_association(:bar).primary_key_name
119     Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
120     assert_equal "xyzzy_id", Company.reflect_on_association(:baz).primary_key_name
121   end
123   def test_association_reflection_in_modules
124     assert_reflection MyApplication::Business::Firm,
125       :clients_of_firm,
126       :klass      => MyApplication::Business::Client,
127       :class_name => 'Client',
128       :table_name => 'companies'
130     assert_reflection MyApplication::Billing::Account,
131       :firm,
132       :klass      => MyApplication::Business::Firm,
133       :class_name => 'MyApplication::Business::Firm',
134       :table_name => 'companies'
136     assert_reflection MyApplication::Billing::Account,
137       :qualified_billing_firm,
138       :klass      => MyApplication::Billing::Firm,
139       :class_name => 'MyApplication::Billing::Firm',
140       :table_name => 'companies'
142     assert_reflection MyApplication::Billing::Account,
143       :unqualified_billing_firm,
144       :klass      => MyApplication::Billing::Firm,
145       :class_name => 'Firm',
146       :table_name => 'companies'
148     assert_reflection MyApplication::Billing::Account,
149       :nested_qualified_billing_firm,
150       :klass      => MyApplication::Billing::Nested::Firm,
151       :class_name => 'MyApplication::Billing::Nested::Firm',
152       :table_name => 'companies'
154     assert_reflection MyApplication::Billing::Account,
155       :nested_unqualified_billing_firm,
156       :klass      => MyApplication::Billing::Nested::Firm,
157       :class_name => 'Nested::Firm',
158       :table_name => 'companies'
159   end
160   
161   def test_reflection_of_all_associations
162     assert_equal 17, Firm.reflect_on_all_associations.size
163     assert_equal 15, Firm.reflect_on_all_associations(:has_many).size
164     assert_equal 2, Firm.reflect_on_all_associations(:has_one).size
165     assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
166   end
168   private
169     def assert_reflection(klass, association, options)
170       assert reflection = klass.reflect_on_association(association)
171       options.each do |method, value|
172         assert_equal(value, reflection.send(method))
173       end
174     end