2011-06-06 18:17:44 +00:00
require " cases/helper "
2008-01-18 07:31:37 +00:00
require 'models/company_in_module'
2010-03-31 01:33:04 +00:00
require 'models/shop'
2004-11-24 01:04:44 +00:00
2008-01-21 17:20:51 +00:00
class ModulesTest < ActiveRecord :: TestCase
2010-03-31 01:33:04 +00:00
fixtures :accounts , :companies , :projects , :developers , :collections , :products , :variants
2004-11-24 01:04:44 +00:00
2009-08-09 08:35:45 +00:00
def setup
2009-08-09 08:48:49 +00:00
# need to make sure Object::Firm and Object::Client are not defined,
# so that constantize will not be able to cheat when having to load namespaced classes
@undefined_consts = { }
[ :Firm , :Client ] . each do | const |
@undefined_consts . merge! const = > Object . send ( :remove_const , const ) if Object . const_defined? ( const )
end
2010-08-14 05:13:00 +00:00
2010-01-04 03:30:28 +00:00
ActiveRecord :: Base . store_full_sti_class = false
2009-08-09 08:35:45 +00:00
end
def teardown
2009-08-09 08:48:49 +00:00
# reinstate the constants that we undefined in the setup
@undefined_consts . each do | constant , value |
Object . send :const_set , constant , value unless value . nil?
end
2010-08-14 05:13:00 +00:00
2010-01-04 03:30:28 +00:00
ActiveRecord :: Base . store_full_sti_class = true
2009-08-09 08:35:45 +00:00
end
2004-11-24 01:04:44 +00:00
def test_module_spanning_associations
2005-06-26 11:25:32 +00:00
firm = MyApplication :: Business :: Firm . find ( :first )
2006-09-15 07:02:05 +00:00
assert ! firm . clients . empty? , " Firm should have clients "
2004-11-24 01:04:44 +00:00
assert_nil firm . class . table_name . match ( '::' ) , " Firm shouldn't have the module appear in its table name "
end
def test_module_spanning_has_and_belongs_to_many_associations
2005-06-26 11:25:32 +00:00
project = MyApplication :: Business :: Project . find ( :first )
2004-11-24 01:04:44 +00:00
project . developers << MyApplication :: Business :: Developer . create ( " name " = > " John " )
2010-05-17 20:23:43 +00:00
assert_equal " John " , project . developers . last . name
2004-11-24 01:04:44 +00:00
end
2008-01-18 07:30:42 +00:00
2004-11-24 01:04:44 +00:00
def test_associations_spanning_cross_modules
2006-02-23 05:48:29 +00:00
account = MyApplication :: Billing :: Account . find ( :first , :order = > 'id' )
2006-02-22 18:44:14 +00:00
assert_kind_of MyApplication :: Business :: Firm , account . firm
assert_kind_of MyApplication :: Billing :: Firm , account . qualified_billing_firm
assert_kind_of MyApplication :: Billing :: Firm , account . unqualified_billing_firm
assert_kind_of MyApplication :: Billing :: Nested :: Firm , account . nested_qualified_billing_firm
assert_kind_of MyApplication :: Billing :: Nested :: Firm , account . nested_unqualified_billing_firm
2004-11-24 01:04:44 +00:00
end
2008-01-18 07:30:42 +00:00
2006-05-15 14:08:51 +00:00
def test_find_account_and_include_company
account = MyApplication :: Billing :: Account . find ( 1 , :include = > :firm )
assert_kind_of MyApplication :: Business :: Firm , account . firm
end
2008-01-18 07:30:42 +00:00
2008-04-07 19:44:37 +00:00
def test_table_name
assert_equal 'accounts' , MyApplication :: Billing :: Account . table_name , 'table_name for ActiveRecord model in module'
assert_equal 'companies' , MyApplication :: Business :: Client . table_name , 'table_name for ActiveRecord model subclass'
assert_equal 'company_contacts' , MyApplication :: Business :: Client :: Contact . table_name , 'table_name for ActiveRecord model enclosed by another ActiveRecord model'
end
2009-08-09 06:29:38 +00:00
2009-08-09 08:48:49 +00:00
def test_assign_ids
firm = MyApplication :: Business :: Firm . first
assert_nothing_raised NameError , " Should be able to resolve all class constants via reflection " do
firm . client_ids = [ MyApplication :: Business :: Client . first . id ]
end
end
# need to add an eager loading condition to force the eager loading model into
# the old join model, to test that. See http://dev.rubyonrails.org/ticket/9640
2009-08-09 06:29:38 +00:00
def test_eager_loading_in_modules
2009-08-09 08:48:49 +00:00
clients = [ ]
assert_nothing_raised NameError , " Should be able to resolve all class constants via reflection " do
clients << MyApplication :: Business :: Client . find ( 3 , :include = > { :firm = > :account } , :conditions = > 'accounts.id IS NOT NULL' )
clients << MyApplication :: Business :: Client . find ( 3 , :include = > { :firm = > :account } )
2009-08-09 08:35:45 +00:00
end
2009-08-09 06:29:38 +00:00
2009-08-09 08:48:49 +00:00
clients . each do | client |
2009-08-09 06:29:38 +00:00
assert_no_queries do
assert_not_nil ( client . firm . account )
end
end
end
2010-02-22 10:46:45 +00:00
def test_module_table_name_prefix
assert_equal 'prefixed_companies' , MyApplication :: Business :: Prefixed :: Company . table_name , 'inferred table_name for ActiveRecord model in module with table_name_prefix'
assert_equal 'prefixed_companies' , MyApplication :: Business :: Prefixed :: Nested :: Company . table_name , 'table_name for ActiveRecord model in nested module with a parent table_name_prefix'
assert_equal 'companies' , MyApplication :: Business :: Prefixed :: Firm . table_name , 'explicit table_name for ActiveRecord model in module with table_name_prefix should not be prefixed'
end
def test_module_table_name_prefix_with_global_prefix
classes = [ MyApplication :: Business :: Company ,
MyApplication :: Business :: Firm ,
MyApplication :: Business :: Client ,
MyApplication :: Business :: Client :: Contact ,
MyApplication :: Business :: Developer ,
MyApplication :: Business :: Project ,
MyApplication :: Business :: Prefixed :: Company ,
MyApplication :: Business :: Prefixed :: Nested :: Company ,
MyApplication :: Billing :: Account ]
ActiveRecord :: Base . table_name_prefix = 'global_'
classes . each ( & :reset_table_name )
assert_equal 'global_companies' , MyApplication :: Business :: Company . table_name , 'inferred table_name for ActiveRecord model in module without table_name_prefix'
assert_equal 'prefixed_companies' , MyApplication :: Business :: Prefixed :: Company . table_name , 'inferred table_name for ActiveRecord model in module with table_name_prefix'
assert_equal 'prefixed_companies' , MyApplication :: Business :: Prefixed :: Nested :: Company . table_name , 'table_name for ActiveRecord model in nested module with a parent table_name_prefix'
assert_equal 'companies' , MyApplication :: Business :: Prefixed :: Firm . table_name , 'explicit table_name for ActiveRecord model in module with table_name_prefix should not be prefixed'
ensure
ActiveRecord :: Base . table_name_prefix = ''
classes . each ( & :reset_table_name )
end
2010-03-31 01:33:04 +00:00
def test_compute_type_can_infer_class_name_of_sibling_inside_module
old = ActiveRecord :: Base . store_full_sti_class
ActiveRecord :: Base . store_full_sti_class = true
assert_equal MyApplication :: Business :: Firm , MyApplication :: Business :: Client . send ( :compute_type , " Firm " )
ensure
ActiveRecord :: Base . store_full_sti_class = old
end
def test_nested_models_should_not_raise_exception_when_using_delete_all_dependency_on_association
old = ActiveRecord :: Base . store_full_sti_class
ActiveRecord :: Base . store_full_sti_class = true
collection = Shop :: Collection . find ( :first )
assert ! collection . products . empty? , " Collection should have products "
assert_nothing_raised { collection . destroy }
ensure
ActiveRecord :: Base . store_full_sti_class = old
end
def test_nested_models_should_not_raise_exception_when_using_nullify_dependency_on_association
old = ActiveRecord :: Base . store_full_sti_class
ActiveRecord :: Base . store_full_sti_class = true
product = Shop :: Product . find ( :first )
assert ! product . variants . empty? , " Product should have variants "
assert_nothing_raised { product . destroy }
ensure
ActiveRecord :: Base . store_full_sti_class = old
end
2005-06-10 14:58:02 +00:00
end