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'
2009-12-31 08:03:04 -05:00
require 'models/ship'
2009-03-06 14:11:13 -05:00
require 'models/pirate'
2009-06-29 09:54:09 -04:00
require 'models/price_estimate'
2010-10-19 12:22:42 -04:00
require 'models/essay'
require 'models/author'
require 'models/organization'
require 'models/post'
require 'models/tagging'
require 'models/category'
require 'models/book'
require 'models/subscriber'
require 'models/subscription'
require 'models/tag'
2011-01-01 13:52:48 -05:00
require 'models/sponsor'
2004-11-23 20:04:44 -05:00
2008-01-21 12:20:51 -05:00
class ReflectionTest < ActiveRecord :: TestCase
2010-01-03 15:45:08 -05:00
include ActiveRecord :: Reflection
2009-06-29 09:54:09 -04:00
fixtures :topics , :customers , :companies , :subscribers , :price_estimates
2005-06-10 10:58:02 -04:00
2004-11-23 20:04:44 -05:00
def setup
@first = Topic . find ( 1 )
end
2009-06-29 09:54:09 -04:00
def test_human_name
2009-10-20 20:20:01 -04:00
assert_equal " Price estimate " , PriceEstimate . model_name . human
assert_equal " Subscriber " , Subscriber . model_name . human
2009-06-29 09:54:09 -04:00
end
2004-11-23 20:04:44 -05:00
def test_read_attribute_names
assert_equal (
2010-11-01 21:23:58 -04: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 ,
2010-12-02 14:59:55 -05:00
@first . attribute_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_columns
2010-11-01 21:23:58 -04:00
assert_equal 16 , 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 }
2010-11-01 21:23:58 -04: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 02:56:51 -04:00
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 }
2010-11-01 21:23:58 -04: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-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
2010-01-03 15:45:08 -05:00
reflection = MacroReflection . new ( nil , nil , { :class_name = > 'MyApplication::Business::Company' } , nil )
2007-01-14 07:08:44 -05:00
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
2010-01-03 15:45:08 -05:00
reflection_for_address = 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
)
2010-01-03 15:45:08 -05:00
reflection_for_balance = 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
)
2010-01-03 15:45:08 -05:00
reflection_for_gps_location = AggregateReflection . new (
2005-03-06 06:56:22 -05:00
: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
2009-01-31 20:44:30 -05: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 00:22:08 -04:00
def test_has_many_reflection
2010-01-03 15:45:08 -05:00
reflection_for_clients = 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
2010-01-03 15:45:08 -05:00
reflection_for_account = 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
2010-12-31 15:00:24 -05:00
assert_equal " foo_id " , Company . reflect_on_association ( :foo ) . foreign_key
2007-07-16 16:21:36 -04:00
Company . belongs_to :bar , :class_name = > " Xyzzy "
2010-12-31 15:00:24 -05:00
assert_equal " bar_id " , Company . reflect_on_association ( :bar ) . foreign_key
2007-07-16 16:21:36 -04:00
Company . belongs_to :baz , :class_name = > " Xyzzy " , :foreign_key = > " xyzzy_id "
2010-12-31 15:00:24 -05:00
assert_equal " xyzzy_id " , Company . reflect_on_association ( :baz ) . foreign_key
2007-07-16 16:21:36 -04:00
end
2004-11-23 20:04:44 -05:00
def test_association_reflection_in_modules
2010-01-03 22:30:28 -05:00
ActiveRecord :: Base . store_full_sti_class = false
2010-08-14 01:13:00 -04:00
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'
2010-01-03 22:30:28 -05:00
ensure
ActiveRecord :: Base . store_full_sti_class = true
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
2011-01-06 13:04:32 -05:00
assert_equal 36 , Firm . reflect_on_all_associations . size
assert_equal 26 , Firm . reflect_on_all_associations ( :has_many ) . size
2009-09-26 09:33:50 -04:00
assert_equal 10 , 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
2008-08-15 16:51:57 -04: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 11:53:13 -04:00
def test_has_many_through_reflection
2010-01-03 15:45:08 -05:00
assert_kind_of ThroughReflection , Subscriber . reflect_on_association ( :books )
2008-10-04 11:53:13 -04:00
end
2010-10-31 07:21:28 -04:00
2011-03-10 14:28:26 -05:00
def test_chain
2010-10-19 12:22:42 -04:00
expected = [
2011-03-10 19:51:57 -05:00
Organization . reflect_on_association ( :author_essay_categories ) ,
2010-10-19 12:22:42 -04:00
Author . reflect_on_association ( :essays ) ,
Organization . reflect_on_association ( :authors )
]
2011-03-10 14:28:26 -05:00
actual = Organization . reflect_on_association ( :author_essay_categories ) . chain
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
assert_equal expected , actual
end
2010-10-31 07:21:28 -04:00
2011-03-10 14:28:26 -05:00
def test_conditions
2010-10-19 12:22:42 -04:00
expected = [
2011-03-16 14:54:34 -04:00
[ { :tags = > { :name = > 'Blue' } } ] ,
2011-05-16 12:07:21 -04:00
[ { :taggings = > { :comment = > 'first' } } ] ,
2011-03-16 14:54:34 -04:00
[ { :posts = > { :title = > [ 'misc post by bob' , 'misc post by mary' ] } } ]
2010-10-19 12:22:42 -04:00
]
2011-03-10 14:28:26 -05:00
actual = Author . reflect_on_association ( :misc_post_first_blue_tags ) . conditions
2010-10-19 12:22:42 -04:00
assert_equal expected , actual
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
expected = [
2011-03-16 14:54:34 -04:00
[ { :tags = > { :name = > 'Blue' } } , { :taggings = > { :comment = > 'first' } } , { :posts = > { :title = > [ 'misc post by bob' , 'misc post by mary' ] } } ] ,
2011-05-16 12:07:21 -04:00
[ ] ,
2010-10-19 12:22:42 -04:00
[ ]
]
2011-03-10 14:28:26 -05:00
actual = Author . reflect_on_association ( :misc_post_first_blue_tags_2 ) . conditions
2010-10-19 12:22:42 -04:00
assert_equal expected , actual
end
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
def test_nested?
assert ! Author . reflect_on_association ( :comments ) . nested?
assert Author . reflect_on_association ( :tags ) . nested?
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
# Only goes :through once, but the through_reflection is a has_and_belongs_to_many, so this is
# a nested through association
assert Category . reflect_on_association ( :post_comments ) . nested?
end
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
def test_association_primary_key
# Normal association
assert_equal " id " , Author . reflect_on_association ( :posts ) . association_primary_key . to_s
assert_equal " name " , Author . reflect_on_association ( :essay ) . association_primary_key . to_s
2011-03-02 16:24:56 -05:00
assert_equal " id " , Tagging . reflect_on_association ( :taggable ) . association_primary_key . to_s
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
# Through association (uses the :primary_key option from the source reflection)
assert_equal " nick " , Author . reflect_on_association ( :subscribers ) . association_primary_key . to_s
assert_equal " name " , Author . reflect_on_association ( :essay_category ) . association_primary_key . to_s
assert_equal " custom_primary_key " , Author . reflect_on_association ( :tags_with_primary_key ) . association_primary_key . to_s # nested
end
2010-10-31 07:21:28 -04:00
2010-10-19 12:22:42 -04:00
def test_active_record_primary_key
assert_equal " nick " , Subscriber . reflect_on_association ( :subscriptions ) . active_record_primary_key . to_s
assert_equal " name " , Author . reflect_on_association ( :essay ) . active_record_primary_key . to_s
end
2008-10-04 11:53:13 -04:00
2011-01-01 13:52:48 -05:00
def test_foreign_type
assert_equal " sponsorable_type " , Sponsor . reflect_on_association ( :sponsorable ) . foreign_type . to_s
assert_equal " sponsorable_type " , Sponsor . reflect_on_association ( :thing ) . foreign_type . to_s
end
2010-01-03 15:45:08 -05:00
def test_collection_association
2010-01-08 15:44:06 -05:00
assert Pirate . reflect_on_association ( :birds ) . collection?
assert Pirate . reflect_on_association ( :parrots ) . collection?
2009-12-31 08:03:04 -05:00
2010-01-08 15:44:06 -05:00
assert ! Pirate . reflect_on_association ( :ship ) . collection?
assert ! Ship . reflect_on_association ( :pirate ) . collection?
2009-12-31 08:03:04 -05:00
end
2010-01-03 15:45:08 -05: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
2011-01-03 14:54:38 -05:00
def test_foreign_key
assert_equal " author_id " , Author . reflect_on_association ( :posts ) . foreign_key . to_s
assert_equal " category_id " , Post . reflect_on_association ( :categorizations ) . foreign_key . to_s
end
def test_primary_key_name
assert_deprecated do
assert_equal " author_id " , Author . reflect_on_association ( :posts ) . primary_key_name . to_s
assert_equal " category_id " , Post . reflect_on_association ( :categorizations ) . primary_key_name . to_s
end
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