1414require 'models/comment'
1515require 'models/sponsor'
1616require 'models/member'
17+ require 'models/essay'
1718
1819class BelongsToAssociationsTest < ActiveRecord ::TestCase
1920 fixtures :accounts , :companies , :developers , :projects , :topics ,
@@ -25,6 +26,11 @@ def test_belongs_to
2526 assert !Client . find ( 3 ) . firm . nil? , "Microsoft should have a firm"
2627 end
2728
29+ def test_belongs_to_with_primary_key
30+ client = Client . create ( :name => "Primary key client" , :firm_name => companies ( :first_firm ) . name )
31+ assert_equal companies ( :first_firm ) . name , client . firm_with_primary_key . name
32+ end
33+
2834 def test_proxy_assignment
2935 account = Account . find ( 1 )
3036 assert_nothing_raised { account . firm = account . firm }
@@ -47,6 +53,13 @@ def test_natural_assignment
4753 assert_equal apple . id , citibank . firm_id
4854 end
4955
56+ def test_natural_assignment_with_primary_key
57+ apple = Firm . create ( "name" => "Apple" )
58+ citibank = Client . create ( "name" => "Primary key client" )
59+ citibank . firm_with_primary_key = apple
60+ assert_equal apple . name , citibank . firm_name
61+ end
62+
5063 def test_no_unexpected_aliasing
5164 first_firm = companies ( :first_firm )
5265 another_firm = companies ( :another_firm )
@@ -69,13 +82,29 @@ def test_creating_the_belonging_object
6982 assert_equal apple , citibank . firm
7083 end
7184
85+ def test_creating_the_belonging_object_with_primary_key
86+ client = Client . create ( :name => "Primary key client" )
87+ apple = client . create_firm_with_primary_key ( "name" => "Apple" )
88+ assert_equal apple , client . firm_with_primary_key
89+ client . save
90+ client . reload
91+ assert_equal apple , client . firm_with_primary_key
92+ end
93+
7294 def test_building_the_belonging_object
7395 citibank = Account . create ( "credit_limit" => 10 )
7496 apple = citibank . build_firm ( "name" => "Apple" )
7597 citibank . save
7698 assert_equal apple . id , citibank . firm_id
7799 end
78100
101+ def test_building_the_belonging_object_with_primary_key
102+ client = Client . create ( :name => "Primary key client" )
103+ apple = client . build_firm_with_primary_key ( "name" => "Apple" )
104+ client . save
105+ assert_equal apple . name , client . firm_name
106+ end
107+
79108 def test_natural_assignment_to_nil
80109 client = Client . find ( 3 )
81110 client . firm = nil
@@ -84,6 +113,14 @@ def test_natural_assignment_to_nil
84113 assert_nil client . client_of
85114 end
86115
116+ def test_natural_assignment_to_nil_with_primary_key
117+ client = Client . create ( :name => "Primary key client" , :firm_name => companies ( :first_firm ) . name )
118+ client . firm_with_primary_key = nil
119+ client . save
120+ assert_nil client . firm_with_primary_key ( true )
121+ assert_nil client . client_of
122+ end
123+
87124 def test_with_different_class_name
88125 assert_equal Company . find ( 1 ) . name , Company . find ( 3 ) . firm_with_other_name . name
89126 assert_not_nil Company . find ( 3 ) . firm_with_other_name , "Microsoft should have a firm"
@@ -110,6 +147,17 @@ def test_belongs_to_counter
110147 assert_equal 0 , Topic . find ( debate . id ) . send ( :read_attribute , "replies_count" ) , "First reply deleted"
111148 end
112149
150+ def test_belongs_to_with_primary_key_counter
151+ debate = Topic . create ( "title" => "debate" )
152+ assert_equal 0 , debate . send ( :read_attribute , "replies_count" ) , "No replies yet"
153+
154+ trash = debate . replies_with_primary_key . create ( "title" => "blah!" , "content" => "world around!" )
155+ assert_equal 1 , Topic . find ( debate . id ) . send ( :read_attribute , "replies_count" ) , "First reply created"
156+
157+ trash . destroy
158+ assert_equal 0 , Topic . find ( debate . id ) . send ( :read_attribute , "replies_count" ) , "First reply deleted"
159+ end
160+
113161 def test_belongs_to_counter_with_assigning_nil
114162 p = Post . find ( 1 )
115163 c = Comment . find ( 1 )
@@ -122,6 +170,18 @@ def test_belongs_to_counter_with_assigning_nil
122170 assert_equal 1 , Post . find ( p . id ) . comments . size
123171 end
124172
173+ def test_belongs_to_with_primary_key_counter_with_assigning_nil
174+ debate = Topic . create ( "title" => "debate" )
175+ reply = Reply . create ( "title" => "blah!" , "content" => "world around!" , "parent_title" => "debate" )
176+
177+ assert_equal debate . title , reply . parent_title
178+ assert_equal 1 , Topic . find ( debate . id ) . send ( :read_attribute , "replies_count" )
179+
180+ reply . topic_with_primary_key = nil
181+
182+ assert_equal 0 , Topic . find ( debate . id ) . send ( :read_attribute , "replies_count" )
183+ end
184+
125185 def test_belongs_to_counter_with_reassigning
126186 t1 = Topic . create ( "title" => "t1" )
127187 t2 = Topic . create ( "title" => "t2" )
@@ -219,6 +279,18 @@ def test_assignment_before_child_saved
219279 assert_equal firm , final_cut . firm ( true )
220280 end
221281
282+ def test_assignment_before_child_saved_with_primary_key
283+ final_cut = Client . new ( "name" => "Final Cut" )
284+ firm = Firm . find ( 1 )
285+ final_cut . firm_with_primary_key = firm
286+ assert final_cut . new_record?
287+ assert final_cut . save
288+ assert !final_cut . new_record?
289+ assert !firm . new_record?
290+ assert_equal firm , final_cut . firm_with_primary_key
291+ assert_equal firm , final_cut . firm_with_primary_key ( true )
292+ end
293+
222294 def test_new_record_with_foreign_key_but_no_object
223295 c = Client . new ( "firm_id" => 1 )
224296 assert_equal Firm . find ( :first ) , c . firm_with_basic_id
@@ -297,26 +369,52 @@ def test_polymorphic_assignment_foreign_type_field_updating
297369 member = Member . create
298370 sponsor . sponsorable = member
299371 assert_equal "Member" , sponsor . sponsorable_type
300-
372+
301373 # should update when assigning a new record
302374 sponsor = Sponsor . new
303375 member = Member . new
304376 sponsor . sponsorable = member
305377 assert_equal "Member" , sponsor . sponsorable_type
306378 end
307-
379+
380+ def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
381+ # should update when assigning a saved record
382+ essay = Essay . new
383+ writer = Author . create ( :name => "David" )
384+ essay . writer = writer
385+ assert_equal "Author" , essay . writer_type
386+
387+ # should update when assigning a new record
388+ essay = Essay . new
389+ writer = Author . new
390+ essay . writer = writer
391+ assert_equal "Author" , essay . writer_type
392+ end
393+
308394 def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
309395 sponsor = Sponsor . new
310396 saved_member = Member . create
311397 new_member = Member . new
312-
398+
313399 sponsor . sponsorable = saved_member
314400 assert_equal saved_member . id , sponsor . sponsorable_id
315-
401+
316402 sponsor . sponsorable = new_member
317403 assert_equal nil , sponsor . sponsorable_id
318404 end
319405
406+ def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
407+ essay = Essay . new
408+ saved_writer = Author . create ( :name => "David" )
409+ new_writer = Author . new
410+
411+ essay . writer = saved_writer
412+ assert_equal saved_writer . name , essay . writer_id
413+
414+ essay . writer = new_writer
415+ assert_equal nil , essay . writer_id
416+ end
417+
320418 def test_belongs_to_proxy_should_not_respond_to_private_methods
321419 assert_raise ( NoMethodError ) { companies ( :first_firm ) . private_method }
322420 assert_raise ( NoMethodError ) { companies ( :second_client ) . firm . private_method }
0 commit comments