2017-07-09 13:41:28 -04:00
# frozen_string_literal: true
2011-06-06 14:17:44 -04:00
require " cases/helper "
2016-08-06 12:26:20 -04:00
require " models/topic "
require " models/customer "
require " models/company "
require " models/company_in_module "
require " models/ship "
require " models/pirate "
require " models/price_estimate "
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 "
require " models/sponsor "
require " models/edge "
require " models/hotel "
require " models/chef "
require " models/department "
require " models/cake_designer "
require " models/drink_designer "
require " models/recipe "
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 (
2013-05-18 05:22:21 -04:00
%w( id title author_name author_email_address bonus_time written_on last_read content important group approved replies_count unique_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
2013-05-18 05:22:21 -04:00
assert_equal 18 , 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
2014-10-27 12:28:53 -04:00
column_names = Topic . columns . map ( & :name )
2013-05-18 05:22:21 -04:00
assert_equal %w( id title author_name author_email_address written_on bonus_time last_read content important approved replies_count unique_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
2014-10-27 12:28:53 -04:00
content_column_names = content_columns . map ( & :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
2014-04-03 08:59:53 -04:00
assert_equal 250 , @first . column_for_attribute ( " title " ) . limit
2004-11-23 20:04:44 -05:00
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
2015-01-03 21:42:59 -05:00
def test_non_existent_columns_return_null_object
column = @first . column_for_attribute ( " attribute_that_doesnt_exist " )
assert_instance_of ActiveRecord :: ConnectionAdapters :: NullColumn , column
assert_equal " attribute_that_doesnt_exist " , column . name
2016-12-24 12:29:52 -05:00
assert_nil column . sql_type
assert_nil column . type
2015-01-03 21:42:59 -05:00
end
2015-01-30 13:42:54 -05:00
def test_non_existent_types_are_identity_types
type = @first . type_for_attribute ( " attribute_that_doesnt_exist " )
2015-01-03 21:42:59 -05:00
object = Object . new
2015-02-17 13:29:51 -05:00
assert_equal object , type . deserialize ( object )
2015-02-17 15:39:42 -05:00
assert_equal object , type . cast ( object )
2015-02-17 15:35:23 -05:00
assert_equal object , type . serialize ( object )
2014-05-30 18:57:42 -04:00
end
2007-01-14 07:08:44 -05:00
def test_reflection_klass_for_nested_class_name
2016-12-31 13:42:53 -05:00
reflection = ActiveRecord :: Reflection . create (
:has_many ,
nil ,
nil ,
{ class_name : " MyApplication::Business::Company " } ,
Customer
)
2007-01-14 07:08:44 -05:00
assert_nothing_raised do
assert_equal MyApplication :: Business :: Company , reflection . klass
end
end
2014-04-18 01:11:47 -04:00
def test_irregular_reflection_class_name
ActiveSupport :: Inflector . inflections do | inflect |
2016-08-06 12:26:20 -04:00
inflect . irregular " plural_irregular " , " plurales_irregulares "
2014-04-18 01:11:47 -04:00
end
2016-08-06 12:26:20 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , " plurales_irregulares " , nil , { } , ActiveRecord :: Base )
assert_equal " PluralIrregular " , reflection . class_name
2014-04-18 01:11:47 -04:00
end
2012-07-27 17:21:29 -04:00
def test_aggregation_reflection
reflection_for_address = AggregateReflection . new (
2016-08-06 13:37:57 -04:00
:address , nil , { mapping : [ %w( address_street street ) , %w( address_city city ) , %w( address_country country ) ] } , Customer
2012-07-27 17:21:29 -04:00
)
reflection_for_balance = AggregateReflection . new (
2016-08-06 13:37:57 -04:00
:balance , nil , { class_name : " Money " , mapping : %w( balance amount ) } , Customer
2012-07-27 17:21:29 -04:00
)
reflection_for_gps_location = AggregateReflection . new (
2016-08-16 03:30:11 -04:00
:gps_location , nil , { } , Customer
2012-07-27 17:21:29 -04:00
)
2016-09-16 12:44:05 -04:00
assert_includes Customer . reflect_on_all_aggregations , reflection_for_gps_location
assert_includes Customer . reflect_on_all_aggregations , reflection_for_balance
assert_includes Customer . reflect_on_all_aggregations , reflection_for_address
2012-07-27 17:21:29 -04:00
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
2018-01-25 18:14:09 -05:00
assert_not_predicate received , :empty?
2009-01-31 20:44:30 -05:00
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
2016-08-06 13:37:57 -04:00
reflection_for_clients = ActiveRecord :: Reflection . create ( :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
2016-08-06 12:26:20 -04:00
assert_equal " companies " , Firm . reflect_on_association ( :clients ) . table_name
2005-07-10 00:22:08 -04:00
2004-11-23 20:04:44 -05:00
assert_equal Client , Firm . reflect_on_association ( :clients_of_firm ) . klass
2016-08-06 12:26:20 -04:00
assert_equal " companies " , Firm . reflect_on_association ( :clients_of_firm ) . table_name
2005-07-10 00:22:08 -04:00
end
def test_has_one_reflection
2016-08-06 13:37:57 -04:00
reflection_for_account = ActiveRecord :: Reflection . create ( :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
2016-08-06 12:26:20 -04:00
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
2016-08-06 13:37:57 -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
2016-08-06 13:37:57 -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 ,
2016-08-06 13:37:57 -04:00
klass : MyApplication :: Business :: Client ,
class_name : " Client " ,
table_name : " companies "
2006-02-22 13:44:14 -05:00
assert_reflection MyApplication :: Billing :: Account ,
:firm ,
2016-08-06 13:37:57 -04:00
klass : MyApplication :: Business :: Firm ,
class_name : " MyApplication::Business::Firm " ,
table_name : " companies "
2006-02-22 13:44:14 -05:00
assert_reflection MyApplication :: Billing :: Account ,
:qualified_billing_firm ,
2016-08-06 13:37:57 -04:00
klass : MyApplication :: Billing :: Firm ,
class_name : " MyApplication::Billing::Firm " ,
table_name : " companies "
2006-02-22 13:44:14 -05:00
assert_reflection MyApplication :: Billing :: Account ,
:unqualified_billing_firm ,
2016-08-06 13:37:57 -04:00
klass : MyApplication :: Billing :: Firm ,
class_name : " Firm " ,
table_name : " companies "
2006-02-22 13:44:14 -05:00
assert_reflection MyApplication :: Billing :: Account ,
:nested_qualified_billing_firm ,
2016-08-06 13:37:57 -04:00
klass : MyApplication :: Billing :: Nested :: Firm ,
class_name : " MyApplication::Billing::Nested::Firm " ,
table_name : " companies "
2006-02-22 13:44:14 -05:00
assert_reflection MyApplication :: Billing :: Account ,
:nested_unqualified_billing_firm ,
2016-08-06 13:37:57 -04:00
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
2008-08-15 16:51:57 -04:00
def test_reflection_should_not_raise_error_when_compared_to_other_object
2016-08-06 12:26:20 -04:00
assert_not_equal Object . new , Firm . _reflections [ " clients " ]
2014-05-24 14:03:30 -04:00
end
2014-11-23 15:06:57 -05:00
def test_reflections_should_return_keys_as_strings
assert Category . reflections . keys . all? { | key | key . is_a? String } , " Model.reflections is expected to return string for keys "
end
2014-05-24 14:03:30 -04:00
def test_has_and_belongs_to_many_reflection
2016-08-06 12:26:20 -04:00
assert_equal :has_and_belongs_to_many , Category . reflections [ " posts " ] . macro
2014-05-24 14:03:30 -04:00
assert_equal :posts , Category . reflect_on_all_associations ( :has_and_belongs_to_many ) . first . name
2008-08-15 16:51:57 -04:00
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
2013-05-09 13:08:44 -04:00
def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case
2018-01-07 10:49:11 -05:00
hotel = Hotel . create!
department = hotel . departments . create!
department . chefs . create! ( employable : CakeDesigner . create! )
department . chefs . create! ( employable : DrinkDesigner . create! )
assert_equal 1 , hotel . cake_designers . size
assert_equal 1 , hotel . cake_designers . count
assert_equal 1 , hotel . drink_designers . size
assert_equal 1 , hotel . drink_designers . count
assert_equal 2 , hotel . chefs . size
assert_equal 2 , hotel . chefs . count
2013-05-09 13:08:44 -04:00
end
2016-01-24 11:33:00 -05:00
def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case_and_sti
2018-01-07 10:49:11 -05:00
hotel = Hotel . create!
hotel . mocktail_designers << MocktailDesigner . create!
assert_equal 1 , hotel . mocktail_designers . size
assert_equal 1 , hotel . mocktail_designers . count
assert_equal 1 , hotel . chef_lists . size
assert_equal 1 , hotel . chef_lists . count
hotel . mocktail_designers = [ ]
2016-01-24 11:33:00 -05:00
2018-01-07 10:49:11 -05:00
assert_equal 0 , hotel . mocktail_designers . size
assert_equal 0 , hotel . mocktail_designers . count
assert_equal 0 , hotel . chef_lists . size
assert_equal 0 , hotel . chef_lists . count
2016-01-24 11:33:00 -05:00
end
2015-03-15 10:33:29 -04:00
def test_scope_chain_of_polymorphic_association_does_not_leak_into_other_hmt_associations
hotel = Hotel . create!
department = hotel . departments . create!
drink = department . chefs . create! ( employable : DrinkDesigner . create! )
2015-03-16 22:48:36 -04:00
Recipe . create! ( chef_id : drink . id , hotel_id : hotel . id )
2015-03-15 10:33:29 -04:00
2015-03-18 08:04:21 -04:00
expected_sql = capture_sql { hotel . recipes . to_a }
Hotel . reflect_on_association ( :recipes ) . clear_association_scope_cache
hotel . reload
2015-03-15 10:33:29 -04:00
hotel . drink_designers . to_a
2015-03-18 08:04:21 -04:00
loaded_sql = capture_sql { hotel . recipes . to_a }
assert_equal expected_sql , loaded_sql
2015-03-15 10:33:29 -04:00
end
2010-10-19 12:22:42 -04:00
def test_nested?
2018-01-25 18:14:09 -05:00
assert_not_predicate Author . reflect_on_association ( :comments ) , :nested?
assert_predicate 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
2018-01-25 18:14:09 -05:00
assert_predicate Category . reflect_on_association ( :post_comments ) , :nested?
2010-10-19 12:22:42 -04:00
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
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :edge , nil , { } , Author )
2011-10-05 15:20:04 -04:00
assert_raises ( ActiveRecord :: UnknownPrimaryKey ) { reflection . association_primary_key }
2013-07-23 20:00:15 -04:00
through = Class . new ( ActiveRecord :: Reflection :: ThroughReflection ) {
define_method ( :source_reflection ) { reflection }
2014-06-09 18:45:29 -04:00
} . new ( reflection )
2011-10-05 15:20:04 -04:00
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
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :author , nil , { } , Edge )
2011-10-05 15:20:04 -04:00
assert_raises ( ActiveRecord :: UnknownPrimaryKey ) { reflection . active_record_primary_key }
end
2017-10-20 16:37:53 -04:00
def test_type
assert_equal " taggable_type " , Post . reflect_on_association ( :taggings ) . type . to_s
assert_equal " imageable_class " , Post . reflect_on_association ( :images ) . type . to_s
assert_nil Post . reflect_on_association ( :readers ) . type
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
2017-10-20 16:37:53 -04:00
assert_nil Sponsor . reflect_on_association ( :sponsor_club ) . foreign_type
2011-01-01 13:52:48 -05:00
end
2010-01-03 15:45:08 -05:00
def test_collection_association
2018-01-25 18:14:09 -05:00
assert_predicate Pirate . reflect_on_association ( :birds ) , :collection?
assert_predicate Pirate . reflect_on_association ( :parrots ) , :collection?
2009-12-31 08:03:04 -05:00
2018-01-25 18:14:09 -05:00
assert_not_predicate Pirate . reflect_on_association ( :ship ) , :collection?
assert_not_predicate 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
2018-01-25 18:14:09 -05:00
assert_predicate ActiveRecord :: Reflection . create ( :has_many , :clients , nil , { } , Firm ) , :validate?
2010-01-03 15:45:08 -05:00
2018-01-25 18:14:09 -05:00
assert_not_predicate ActiveRecord :: Reflection . create ( :has_one , :client , nil , { } , Firm ) , :validate?
assert_not_predicate ActiveRecord :: Reflection . create ( :belongs_to , :client , nil , { } , Firm ) , :validate?
2010-01-03 15:45:08 -05:00
end
def test_always_validate_association_if_explicit
2018-01-25 18:14:09 -05:00
assert_predicate ActiveRecord :: Reflection . create ( :has_one , :client , nil , { validate : true } , Firm ) , :validate?
assert_predicate ActiveRecord :: Reflection . create ( :belongs_to , :client , nil , { validate : true } , Firm ) , :validate?
assert_predicate ActiveRecord :: Reflection . create ( :has_many , :clients , nil , { validate : true } , Firm ) , :validate?
2010-01-03 15:45:08 -05:00
end
def test_validate_association_if_autosave
2018-01-25 18:14:09 -05:00
assert_predicate ActiveRecord :: Reflection . create ( :has_one , :client , nil , { autosave : true } , Firm ) , :validate?
assert_predicate ActiveRecord :: Reflection . create ( :belongs_to , :client , nil , { autosave : true } , Firm ) , :validate?
assert_predicate ActiveRecord :: Reflection . create ( :has_many , :clients , nil , { autosave : true } , Firm ) , :validate?
2010-01-03 15:45:08 -05:00
end
def test_never_validate_association_if_explicit
2018-01-25 18:14:09 -05:00
assert_not_predicate ActiveRecord :: Reflection . create ( :has_one , :client , nil , { autosave : true , validate : false } , Firm ) , :validate?
assert_not_predicate ActiveRecord :: Reflection . create ( :belongs_to , :client , nil , { autosave : true , validate : false } , Firm ) , :validate?
assert_not_predicate ActiveRecord :: Reflection . create ( :has_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
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
2017-01-03 10:12:47 -05:00
def test_class_for_class_name
2017-08-23 16:07:48 -04:00
error = assert_raises ( ArgumentError ) do
ActiveRecord :: Reflection . create ( :has_many , :clients , nil , { class_name : Client } , Firm )
2017-01-03 10:12:47 -05:00
end
2017-08-23 16:07:48 -04:00
assert_equal " A class was passed to `:class_name` but we are expecting a string. " , error . message
2017-01-03 10:12:47 -05:00
end
2012-06-23 05:43:00 -04:00
def test_join_table
2016-08-06 12:26:20 -04:00
category = Struct . new ( :table_name , :pluralize_table_names ) . new ( " categories " , true )
product = Struct . new ( :table_name , :pluralize_table_names ) . new ( " products " , true )
2012-06-23 05:43:00 -04:00
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :categories , nil , { } , product )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , category ) do
2016-08-06 12:26:20 -04:00
assert_equal " categories_products " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :products , nil , { } , category )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , product ) do
2016-08-06 12:26:20 -04:00
assert_equal " categories_products " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
end
def test_join_table_with_common_prefix
2016-08-06 12:26:20 -04:00
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-06-23 05:43:00 -04:00
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :categories , nil , { } , product )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , category ) do
2016-08-06 12:26:20 -04:00
assert_equal " catalog_categories_products " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :products , nil , { } , category )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , product ) do
2016-08-06 12:26:20 -04:00
assert_equal " catalog_categories_products " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
end
def test_join_table_with_different_prefix
2016-08-06 12:26:20 -04:00
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-06-23 05:43:00 -04:00
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :categories , nil , { } , page )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , category ) do
2016-08-06 12:26:20 -04:00
assert_equal " catalog_categories_content_pages " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
2014-06-09 18:45:29 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :pages , nil , { } , category )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , page ) do
2016-08-06 12:26:20 -04:00
assert_equal " catalog_categories_content_pages " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
end
def test_join_table_can_be_overridden
2016-08-06 12:26:20 -04:00
category = Struct . new ( :table_name , :pluralize_table_names ) . new ( " categories " , true )
product = Struct . new ( :table_name , :pluralize_table_names ) . new ( " products " , true )
2012-06-23 05:43:00 -04:00
2016-08-06 13:37:57 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :categories , nil , { join_table : " product_categories " } , product )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , category ) do
2016-08-06 12:26:20 -04:00
assert_equal " product_categories " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
2016-08-06 13:37:57 -04:00
reflection = ActiveRecord :: Reflection . create ( :has_many , :products , nil , { join_table : " product_categories " } , category )
2015-08-15 15:35:42 -04:00
reflection . stub ( :klass , product ) do
2016-08-06 12:26:20 -04:00
assert_equal " product_categories " , reflection . join_table
2015-08-15 15:35:42 -04:00
end
2012-06-23 05:43:00 -04:00
end
2014-07-01 08:19:04 -04:00
def test_includes_accepts_symbols
hotel = Hotel . create!
department = hotel . departments . create!
department . chefs . create!
assert_nothing_raised do
assert_equal department . chefs , Hotel . includes ( [ departments : :chefs ] ) . first . chefs
end
end
def test_includes_accepts_strings
hotel = Hotel . create!
department = hotel . departments . create!
department . chefs . create!
assert_nothing_raised do
2016-08-06 12:26:20 -04:00
assert_equal department . chefs , Hotel . includes ( [ " departments " = > " chefs " ] ) . first . chefs
2014-07-01 08:19:04 -04:00
end
end
def test_reflect_on_association_accepts_symbols
assert_nothing_raised do
assert_equal Hotel . reflect_on_association ( :departments ) . name , :departments
end
end
def test_reflect_on_association_accepts_strings
assert_nothing_raised do
assert_equal Hotel . reflect_on_association ( " departments " ) . name , :departments
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