2008-01-21 17:20:51 +00:00
require " cases/helper "
2008-01-18 07:31:37 +00:00
require 'models/topic'
require 'models/customer'
require 'models/company'
require 'models/company_in_module'
require 'models/subscriber'
2009-12-31 13:03:04 +00:00
require 'models/ship'
2009-03-06 19:11:13 +00:00
require 'models/pirate'
2009-06-29 13:54:09 +00:00
require 'models/price_estimate'
2004-11-24 01:04:44 +00:00
2008-01-21 17:20:51 +00:00
class ReflectionTest < ActiveRecord :: TestCase
2010-01-03 20:45:08 +00:00
include ActiveRecord :: Reflection
2009-06-29 13:54:09 +00:00
fixtures :topics , :customers , :companies , :subscribers , :price_estimates
2005-06-10 14:58:02 +00:00
2004-11-24 01:04:44 +00:00
def setup
@first = Topic . find ( 1 )
end
2009-06-29 13:54:09 +00:00
def test_human_name
2009-10-21 00:20:01 +00:00
assert_equal " Price estimate " , PriceEstimate . model_name . human
assert_equal " Subscriber " , Subscriber . model_name . human
2009-06-29 13:54:09 +00:00
end
2004-11-24 01:04:44 +00:00
def test_read_attribute_names
assert_equal (
2010-11-02 01:23:58 +00:00
%w( id title author_name author_email_address bonus_time written_on last_read content group approved replies_count parent_id parent_title type created_at updated_at ) . sort ,
2004-11-24 01:04:44 +00:00
@first . attribute_names
)
end
2005-07-10 04:22:08 +00:00
2004-11-24 01:04:44 +00:00
def test_columns
2010-11-02 01:23:58 +00:00
assert_equal 16 , Topic . columns . length
2004-11-24 01:04:44 +00:00
end
2005-06-12 06:56:51 +00:00
def test_columns_are_returned_in_the_order_they_were_declared
column_names = Topic . columns . map { | column | column . name }
2010-11-02 01:23:58 +00:00
assert_equal %w( id title author_name author_email_address written_on bonus_time last_read content approved replies_count parent_id parent_title type group created_at updated_at ) , column_names
2005-06-12 06:56:51 +00:00
end
2004-11-24 01:04:44 +00:00
def test_content_columns
2005-10-11 03:51:58 +00:00
content_columns = Topic . content_columns
content_column_names = content_columns . map { | column | column . name }
2010-11-02 01:23:58 +00:00
assert_equal 12 , content_columns . length
assert_equal %w( title author_name author_email_address written_on bonus_time last_read content group approved parent_title created_at updated_at ) . sort , content_column_names . sort
2004-11-24 01:04:44 +00:00
end
2005-07-10 04:22:08 +00:00
2004-11-24 01:04:44 +00: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 07:30:42 +00:00
2006-04-27 22:39:45 +00: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-24 01:04:44 +00:00
def test_human_name_for_column
assert_equal " Author name " , @first . column_for_attribute ( " author_name " ) . human_name
end
2005-07-10 04:22:08 +00:00
2004-11-24 01:04:44 +00:00
def test_integer_columns
assert_equal :integer , @first . column_for_attribute ( " id " ) . type
2005-07-10 04:22:08 +00:00
end
2004-11-24 01:04:44 +00:00
2007-01-14 12:08:44 +00:00
def test_reflection_klass_for_nested_class_name
2010-01-03 20:45:08 +00:00
reflection = MacroReflection . new ( nil , nil , { :class_name = > 'MyApplication::Business::Company' } , nil )
2007-01-14 12:08:44 +00:00
assert_nothing_raised do
assert_equal MyApplication :: Business :: Company , reflection . klass
end
end
2004-11-24 01:04:44 +00:00
def test_aggregation_reflection
2010-01-03 20:45:08 +00:00
reflection_for_address = AggregateReflection . new (
2005-02-27 17:18:35 +00:00
:composed_of , :address , { :mapping = > [ %w( address_street street ) , %w( address_city city ) , %w( address_country country ) ] } , Customer
2004-11-24 01:04:44 +00:00
)
2010-01-03 20:45:08 +00:00
reflection_for_balance = AggregateReflection . new (
2005-02-27 17:18:35 +00:00
:composed_of , :balance , { :class_name = > " Money " , :mapping = > %w( balance amount ) } , Customer
2004-11-24 01:04:44 +00:00
)
2010-01-03 20:45:08 +00:00
reflection_for_gps_location = AggregateReflection . new (
2005-03-06 11:56:22 +00:00
:composed_of , :gps_location , { } , Customer
)
2005-12-03 04:29:55 +00: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 04:22:08 +00:00
2004-11-24 01:04:44 +00:00
assert_equal reflection_for_address , Customer . reflect_on_aggregation ( :address )
2005-07-10 04:22:08 +00:00
2004-11-24 01:04:44 +00:00
assert_equal Address , Customer . reflect_on_aggregation ( :address ) . klass
2008-01-18 07:30:42 +00:00
2006-04-06 02:58:32 +00:00
assert_equal Money , Customer . reflect_on_aggregation ( :balance ) . klass
2004-11-24 01:04:44 +00:00
end
2005-07-10 04:22:08 +00:00
2009-02-01 01:44:30 +00:00
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
2005-07-10 04:22:08 +00:00
def test_has_many_reflection
2010-01-03 20:45:08 +00:00
reflection_for_clients = AssociationReflection . new ( :has_many , :clients , { :order = > " id " , :dependent = > :destroy } , Firm )
2004-11-24 01:04:44 +00:00
assert_equal reflection_for_clients , Firm . reflect_on_association ( :clients )
assert_equal Client , Firm . reflect_on_association ( :clients ) . klass
2005-07-10 04:22:08 +00:00
assert_equal 'companies' , Firm . reflect_on_association ( :clients ) . table_name
2004-11-24 01:04:44 +00:00
assert_equal Client , Firm . reflect_on_association ( :clients_of_firm ) . klass
2005-07-10 04:22:08 +00:00
assert_equal 'companies' , Firm . reflect_on_association ( :clients_of_firm ) . table_name
end
def test_has_one_reflection
2010-01-03 20:45:08 +00:00
reflection_for_account = AssociationReflection . new ( :has_one , :account , { :foreign_key = > " firm_id " , :dependent = > :destroy } , Firm )
2005-07-10 04:22:08 +00: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-24 01:04:44 +00:00
end
2005-07-10 04:22:08 +00:00
2007-07-16 20:21:36 +00: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-24 01:04:44 +00:00
def test_association_reflection_in_modules
2010-01-04 03:30:28 +00:00
ActiveRecord :: Base . store_full_sti_class = false
2010-08-14 05:13:00 +00:00
2006-02-22 18:44:14 +00: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'
2010-01-04 03:30:28 +00:00
ensure
ActiveRecord :: Base . store_full_sti_class = true
2004-11-24 01:04:44 +00:00
end
2008-01-18 07:30:42 +00:00
2005-12-27 05:41:23 +00:00
def test_reflection_of_all_associations
2008-05-24 06:34:59 +00:00
# FIXME these assertions bust a lot
2009-11-07 19:00:54 +00:00
assert_equal 37 , Firm . reflect_on_all_associations . size
assert_equal 27 , Firm . reflect_on_all_associations ( :has_many ) . size
2009-09-26 13:33:50 +00:00
assert_equal 10 , Firm . reflect_on_all_associations ( :has_one ) . size
2005-12-31 04:14:07 +00:00
assert_equal 0 , Firm . reflect_on_all_associations ( :belongs_to ) . size
2005-12-27 05:41:23 +00:00
end
2006-02-22 18:44:14 +00:00
2008-08-15 20:51:57 +00:00
def test_reflection_should_not_raise_error_when_compared_to_other_object
assert_nothing_raised { Firm . reflections [ :clients ] == Object . new }
end
2008-10-04 15:53:13 +00:00
def test_has_many_through_reflection
2010-01-03 20:45:08 +00:00
assert_kind_of ThroughReflection , Subscriber . reflect_on_association ( :books )
2008-10-04 15:53:13 +00:00
end
2010-01-03 20:45:08 +00:00
def test_collection_association
2010-01-08 20:44:06 +00:00
assert Pirate . reflect_on_association ( :birds ) . collection?
assert Pirate . reflect_on_association ( :parrots ) . collection?
2009-12-31 13:03:04 +00:00
2010-01-08 20:44:06 +00:00
assert ! Pirate . reflect_on_association ( :ship ) . collection?
assert ! Ship . reflect_on_association ( :pirate ) . collection?
2009-12-31 13:03:04 +00:00
end
2010-01-03 20:45:08 +00:00
def test_default_association_validation
assert AssociationReflection . new ( :has_many , :clients , { } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_one , :client , { } , Firm ) . validate?
assert ! AssociationReflection . new ( :belongs_to , :client , { } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_and_belongs_to_many , :clients , { } , Firm ) . validate?
end
def test_always_validate_association_if_explicit
assert AssociationReflection . new ( :has_one , :client , { :validate = > true } , Firm ) . validate?
assert AssociationReflection . new ( :belongs_to , :client , { :validate = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_many , :clients , { :validate = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_and_belongs_to_many , :clients , { :validate = > true } , Firm ) . validate?
end
def test_validate_association_if_autosave
assert AssociationReflection . new ( :has_one , :client , { :autosave = > true } , Firm ) . validate?
assert AssociationReflection . new ( :belongs_to , :client , { :autosave = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_many , :clients , { :autosave = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_and_belongs_to_many , :clients , { :autosave = > true } , Firm ) . validate?
end
def test_never_validate_association_if_explicit
assert ! AssociationReflection . new ( :has_one , :client , { :autosave = > true , :validate = > false } , Firm ) . validate?
assert ! AssociationReflection . new ( :belongs_to , :client , { :autosave = > true , :validate = > false } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_many , :clients , { :autosave = > true , :validate = > false } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_and_belongs_to_many , :clients , { :autosave = > true , :validate = > false } , Firm ) . validate?
end
2006-02-22 18:44:14 +00: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 14:58:02 +00:00
end