2008-01-21 12:20:51 -05:00
|
|
|
require "cases/helper"
|
2008-01-18 02:31:37 -05:00
|
|
|
require 'models/topic'
|
|
|
|
require 'models/customer'
|
|
|
|
require 'models/company'
|
|
|
|
require 'models/company_in_module'
|
|
|
|
require 'models/subscriber'
|
2004-11-23 20:04:44 -05:00
|
|
|
|
2008-01-21 12:20:51 -05:00
|
|
|
class ReflectionTest < ActiveRecord::TestCase
|
2006-03-15 21:55:38 -05:00
|
|
|
fixtures :topics, :customers, :companies, :subscribers
|
2005-06-10 10:58:02 -04:00
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def setup
|
|
|
|
@first = Topic.find(1)
|
|
|
|
end
|
|
|
|
|
2006-03-15 21:55:38 -05:00
|
|
|
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
|
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def test_read_attribute_names
|
|
|
|
assert_equal(
|
2004-12-01 08:18:51 -05:00
|
|
|
%w( id title author_name author_email_address bonus_time written_on last_read content approved replies_count parent_id type ).sort,
|
2004-11-23 20:04:44 -05:00
|
|
|
@first.attribute_names
|
|
|
|
)
|
|
|
|
end
|
2005-07-10 00:22:08 -04:00
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def test_columns
|
2004-12-01 08:18:51 -05:00
|
|
|
assert_equal 12, Topic.columns.length
|
2004-11-23 20:04:44 -05:00
|
|
|
end
|
|
|
|
|
2005-06-12 02:56:51 -04:00
|
|
|
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
|
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def test_content_columns
|
2005-10-10 23:51:58 -04:00
|
|
|
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
|
2004-11-23 20:04:44 -05:00
|
|
|
end
|
2005-07-10 00:22:08 -04:00
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
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
|
2008-01-18 02:30:42 -05:00
|
|
|
|
2006-04-27 18:39:45 -04:00
|
|
|
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
|
2004-11-23 20:04:44 -05:00
|
|
|
|
|
|
|
def test_human_name_for_column
|
|
|
|
assert_equal "Author name", @first.column_for_attribute("author_name").human_name
|
|
|
|
end
|
2005-07-10 00:22:08 -04:00
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def test_integer_columns
|
|
|
|
assert_equal :integer, @first.column_for_attribute("id").type
|
2005-07-10 00:22:08 -04:00
|
|
|
end
|
2004-11-23 20:04:44 -05:00
|
|
|
|
2007-01-14 07:08:44 -05:00
|
|
|
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
|
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def test_aggregation_reflection
|
|
|
|
reflection_for_address = ActiveRecord::Reflection::AggregateReflection.new(
|
2005-02-27 12:18:35 -05:00
|
|
|
:composed_of, :address, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
|
2004-11-23 20:04:44 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
reflection_for_balance = ActiveRecord::Reflection::AggregateReflection.new(
|
2005-02-27 12:18:35 -05:00
|
|
|
:composed_of, :balance, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
|
2004-11-23 20:04:44 -05:00
|
|
|
)
|
|
|
|
|
2005-03-06 06:56:22 -05:00
|
|
|
reflection_for_gps_location = ActiveRecord::Reflection::AggregateReflection.new(
|
|
|
|
:composed_of, :gps_location, { }, Customer
|
|
|
|
)
|
|
|
|
|
2005-12-02 23:29:55 -05:00
|
|
|
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)
|
2005-07-10 00:22:08 -04:00
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
|
2005-07-10 00:22:08 -04:00
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
assert_equal Address, Customer.reflect_on_aggregation(:address).klass
|
2008-01-18 02:30:42 -05:00
|
|
|
|
2006-04-05 22:58:32 -04:00
|
|
|
assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
|
2004-11-23 20:04:44 -05:00
|
|
|
end
|
2005-07-10 00:22:08 -04:00
|
|
|
|
|
|
|
def test_has_many_reflection
|
2006-03-18 15:25:50 -05:00
|
|
|
reflection_for_clients = ActiveRecord::Reflection::AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
|
2004-11-23 20:04:44 -05:00
|
|
|
|
|
|
|
assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
|
|
|
|
|
|
|
|
assert_equal Client, Firm.reflect_on_association(:clients).klass
|
2005-07-10 00:22:08 -04:00
|
|
|
assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
|
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
|
2005-07-10 00:22:08 -04:00
|
|
|
assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_has_one_reflection
|
2006-03-18 15:25:50 -05:00
|
|
|
reflection_for_account = ActiveRecord::Reflection::AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
|
2005-07-10 00:22:08 -04:00
|
|
|
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
|
2004-11-23 20:04:44 -05:00
|
|
|
end
|
2005-07-10 00:22:08 -04:00
|
|
|
|
2007-07-16 16:21:36 -04:00
|
|
|
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
|
|
|
|
|
2004-11-23 20:04:44 -05:00
|
|
|
def test_association_reflection_in_modules
|
2006-02-22 13:44:14 -05:00
|
|
|
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'
|
2004-11-23 20:04:44 -05:00
|
|
|
end
|
2008-01-18 02:30:42 -05:00
|
|
|
|
2005-12-27 00:41:23 -05:00
|
|
|
def test_reflection_of_all_associations
|
2008-05-24 02:34:59 -04:00
|
|
|
# FIXME these assertions bust a lot
|
2008-06-03 01:04:46 -04:00
|
|
|
assert_equal 24, Firm.reflect_on_all_associations.size
|
|
|
|
assert_equal 18, Firm.reflect_on_all_associations(:has_many).size
|
|
|
|
assert_equal 6, Firm.reflect_on_all_associations(:has_one).size
|
2005-12-30 23:14:07 -05:00
|
|
|
assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
|
2005-12-27 00:41:23 -05:00
|
|
|
end
|
2006-02-22 13:44:14 -05:00
|
|
|
|
|
|
|
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
|
2005-06-10 10:58:02 -04:00
|
|
|
end
|