2011-06-06 14:17:44 -04: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'
2011-10-05 15:20:04 -04:00
require 'models/edge'
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 (
2011-12-20 19:10:17 -05:00
%w( id title author_name author_email_address bonus_time written_on last_read content important 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
2011-12-20 19:10:17 -05:00
assert_equal 17 , 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 }
2011-12-20 19:10:17 -05:00
assert_equal %w( id title author_name author_email_address written_on bonus_time last_read content important 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 }
2011-12-20 19:10:17 -05:00
assert_equal 13 , content_columns . length
assert_equal %w( title author_name author_email_address written_on bonus_time last_read content important 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
2012-04-26 13:32:55 -04:00
subscriber = Subscriber . first
2006-04-27 18:39:45 -04:00
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
2012-06-22 06:40:13 -04:00
reflection = MacroReflection . new ( :company , nil , nil , { :class_name = > 'MyApplication::Business::Company' } , ActiveRecord :: Base )
2007-01-14 07:08:44 -05:00
assert_nothing_raised do
assert_equal MyApplication :: Business :: Company , reflection . klass
end
end
2012-07-27 17:21:29 -04:00
def test_aggregation_reflection
reflection_for_address = AggregateReflection . new (
:composed_of , :address , nil , { :mapping = > [ %w( address_street street ) , %w( address_city city ) , %w( address_country country ) ] } , Customer
)
reflection_for_balance = AggregateReflection . new (
:composed_of , :balance , nil , { :class_name = > " Money " , :mapping = > %w( balance amount ) } , Customer
)
reflection_for_gps_location = AggregateReflection . new (
:composed_of , :gps_location , nil , { } , Customer
)
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 )
assert_equal reflection_for_address , Customer . reflect_on_aggregation ( :address )
assert_equal Address , Customer . reflect_on_aggregation ( :address ) . klass
assert_equal Money , Customer . reflect_on_aggregation ( :balance ) . klass
end
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
2012-06-22 06:40:13 -04:00
reflection_for_clients = AssociationReflection . new ( :has_many , :clients , nil , { :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
2012-06-22 06:40:13 -04:00
reflection_for_account = AssociationReflection . new ( :has_one , :account , nil , { :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
2012-07-20 13:52:35 -04:00
assert_equal 34 , Firm . reflect_on_all_associations . size
assert_equal 24 , 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
2012-07-06 13:20:20 -04:00
def test_scope_chain
2010-10-19 12:22:42 -04:00
expected = [
2012-07-06 13:20:20 -04:00
[ Tagging . reflect_on_association ( :tag ) . scope , Post . reflect_on_association ( :first_blue_tags ) . scope ] ,
[ Post . reflect_on_association ( :first_taggings ) . scope ] ,
[ Author . reflect_on_association ( :misc_posts ) . scope ]
2010-10-19 12:22:42 -04:00
]
2012-07-06 13:20:20 -04:00
actual = Author . reflect_on_association ( :misc_post_first_blue_tags ) . scope_chain
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 = [
2012-07-06 13:20:20 -04:00
[
Tagging . reflect_on_association ( :blue_tag ) . scope ,
Post . reflect_on_association ( :first_blue_tags_2 ) . scope ,
Author . reflect_on_association ( :misc_post_first_blue_tags_2 ) . scope
] ,
2011-05-16 12:07:21 -04:00
[ ] ,
2010-10-19 12:22:42 -04:00
[ ]
]
2012-07-06 13:20:20 -04:00
actual = Author . reflect_on_association ( :misc_post_first_blue_tags_2 ) . scope_chain
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-09-29 12:59:40 -04:00
assert_equal " name " , Essay . reflect_on_association ( :writer ) . 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
2011-10-05 15:20:04 -04:00
def test_association_primary_key_raises_when_missing_primary_key
2012-06-22 06:40:13 -04:00
reflection = ActiveRecord :: Reflection :: AssociationReflection . new ( :fuu , :edge , nil , { } , Author )
2011-10-05 15:20:04 -04:00
assert_raises ( ActiveRecord :: UnknownPrimaryKey ) { reflection . association_primary_key }
2012-06-22 06:40:13 -04:00
through = ActiveRecord :: Reflection :: ThroughReflection . new ( :fuu , :edge , nil , { } , Author )
2011-10-05 15:20:04 -04:00
through . stubs ( :source_reflection ) . returns ( stub_everything ( :options = > { } , :class_name = > 'Edge' ) )
assert_raises ( ActiveRecord :: UnknownPrimaryKey ) { through . association_primary_key }
end
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-10-05 15:20:04 -04:00
def test_active_record_primary_key_raises_when_missing_primary_key
2012-06-22 06:40:13 -04:00
reflection = ActiveRecord :: Reflection :: AssociationReflection . new ( :fuu , :author , nil , { } , Edge )
2011-10-05 15:20:04 -04:00
assert_raises ( ActiveRecord :: UnknownPrimaryKey ) { reflection . active_record_primary_key }
end
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
2012-06-22 06:40:13 -04:00
assert AssociationReflection . new ( :has_many , :clients , nil , { } , Firm ) . validate?
2010-01-03 15:45:08 -05:00
2012-06-22 06:40:13 -04:00
assert ! AssociationReflection . new ( :has_one , :client , nil , { } , Firm ) . validate?
assert ! AssociationReflection . new ( :belongs_to , :client , nil , { } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_and_belongs_to_many , :clients , nil , { } , Firm ) . validate?
2010-01-03 15:45:08 -05:00
end
def test_always_validate_association_if_explicit
2012-06-22 06:40:13 -04:00
assert AssociationReflection . new ( :has_one , :client , nil , { :validate = > true } , Firm ) . validate?
assert AssociationReflection . new ( :belongs_to , :client , nil , { :validate = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_many , :clients , nil , { :validate = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_and_belongs_to_many , :clients , nil , { :validate = > true } , Firm ) . validate?
2010-01-03 15:45:08 -05:00
end
def test_validate_association_if_autosave
2012-06-22 06:40:13 -04:00
assert AssociationReflection . new ( :has_one , :client , nil , { :autosave = > true } , Firm ) . validate?
assert AssociationReflection . new ( :belongs_to , :client , nil , { :autosave = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_many , :clients , nil , { :autosave = > true } , Firm ) . validate?
assert AssociationReflection . new ( :has_and_belongs_to_many , :clients , nil , { :autosave = > true } , Firm ) . validate?
2010-01-03 15:45:08 -05:00
end
def test_never_validate_association_if_explicit
2012-06-22 06:40:13 -04:00
assert ! AssociationReflection . new ( :has_one , :client , nil , { :autosave = > true , :validate = > false } , Firm ) . validate?
assert ! AssociationReflection . new ( :belongs_to , :client , nil , { :autosave = > true , :validate = > false } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_many , :clients , nil , { :autosave = > true , :validate = > false } , Firm ) . validate?
assert ! AssociationReflection . new ( :has_and_belongs_to_many , :clients , nil , { :autosave = > true , :validate = > false } , Firm ) . validate?
2010-01-03 15:45:08 -05:00
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
2012-07-06 13:20:20 -04:00
def test_through_reflection_scope_chain_does_not_modify_other_reflections
orig_conds = Post . reflect_on_association ( :first_blue_tags_2 ) . scope_chain . inspect
Author . reflect_on_association ( :misc_post_first_blue_tags_2 ) . scope_chain
assert_equal orig_conds , Post . reflect_on_association ( :first_blue_tags_2 ) . scope_chain . inspect
2011-11-03 11:07:24 -04:00
end
2011-11-04 07:16:55 -04:00
def test_symbol_for_class_name
assert_equal Client , Firm . reflect_on_association ( :unsorted_clients_with_symbol ) . klass
end
2012-06-23 05:43:00 -04:00
def test_join_table
category = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'categories' , true )
product = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'products' , true )
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :categories , nil , { } , product )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( category )
assert_equal 'categories_products' , reflection . join_table
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :products , nil , { } , category )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( product )
assert_equal 'categories_products' , reflection . join_table
end
def test_join_table_with_common_prefix
category = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'catalog_categories' , true )
product = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'catalog_products' , true )
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :categories , nil , { } , product )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( category )
assert_equal 'catalog_categories_products' , reflection . join_table
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :products , nil , { } , category )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( product )
assert_equal 'catalog_categories_products' , reflection . join_table
end
def test_join_table_with_different_prefix
category = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'catalog_categories' , true )
page = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'content_pages' , true )
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :categories , nil , { } , page )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( category )
assert_equal 'catalog_categories_content_pages' , reflection . join_table
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :pages , nil , { } , category )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( page )
assert_equal 'catalog_categories_content_pages' , reflection . join_table
end
def test_join_table_can_be_overridden
category = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'categories' , true )
product = Struct . new ( :table_name , :pluralize_table_names ) . new ( 'products' , true )
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :categories , nil , { :join_table = > 'product_categories' } , product )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( category )
assert_equal 'product_categories' , reflection . join_table
2012-07-06 13:20:20 -04:00
reflection = AssociationReflection . new ( :has_and_belongs_to_many , :products , nil , { :join_table = > 'product_categories' } , category )
2012-06-23 05:43:00 -04:00
reflection . stubs ( :klass ) . returns ( product )
assert_equal 'product_categories' , reflection . join_table
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