ibm_db 2.5.27-x86-mingw32 → 2.6.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +5 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +264 -264
  8. data/ext/extconf_MacOS.rb +269 -0
  9. data/ext/ibm_db.c +1 -1
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/init.rb +41 -41
  12. data/lib/IBM_DB.rb +27 -3
  13. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3290 -3290
  14. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  15. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  16. data/lib/mswin32/ibm_db.rb +104 -20
  17. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  18. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  19. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/cases/adapter_test.rb +207 -207
  22. data/test/cases/associations/belongs_to_associations_test.rb +711 -711
  23. data/test/cases/associations/cascaded_eager_loading_test.rb +181 -181
  24. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +851 -851
  25. data/test/cases/associations/join_model_test.rb +743 -743
  26. data/test/cases/attribute_methods_test.rb +822 -822
  27. data/test/cases/base_test.rb +2133 -2133
  28. data/test/cases/calculations_test.rb +482 -482
  29. data/test/cases/migration_test.rb +2408 -2408
  30. data/test/cases/persistence_test.rb +642 -642
  31. data/test/cases/query_cache_test.rb +257 -257
  32. data/test/cases/relations_test.rb +1182 -1182
  33. data/test/cases/schema_dumper_test.rb +256 -256
  34. data/test/cases/transaction_callbacks_test.rb +300 -300
  35. data/test/cases/validations/uniqueness_validation_test.rb +299 -299
  36. data/test/cases/xml_serialization_test.rb +408 -408
  37. data/test/config.yml +154 -154
  38. data/test/connections/native_ibm_db/connection.rb +43 -43
  39. data/test/ibm_db_test.rb +24 -24
  40. data/test/models/warehouse_thing.rb +4 -4
  41. data/test/schema/schema.rb +751 -751
  42. metadata +31 -16
@@ -1,711 +1,711 @@
1
- require "cases/helper"
2
- require 'models/developer'
3
- require 'models/project'
4
- require 'models/company'
5
- require 'models/topic'
6
- require 'models/reply'
7
- require 'models/computer'
8
- require 'models/post'
9
- require 'models/author'
10
- require 'models/tag'
11
- require 'models/tagging'
12
- require 'models/comment'
13
- require 'models/sponsor'
14
- require 'models/member'
15
- require 'models/essay'
16
- require 'models/toy'
17
-
18
- class BelongsToAssociationsTest < ActiveRecord::TestCase
19
- fixtures :accounts, :companies, :developers, :projects, :topics,
20
- :developers_projects, :computers, :authors, :author_addresses,
21
- :posts, :tags, :taggings, :comments, :sponsors, :members
22
-
23
- def test_belongs_to
24
- Client.find(3).firm.name
25
- assert_equal companies(:first_firm).name, Client.find(3).firm.name
26
- assert_not_nil Client.find(3).firm, "Microsoft should have a firm"
27
- end
28
-
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
-
34
- def test_belongs_to_with_primary_key_joins_on_correct_column
35
- sql = Client.joins(:firm_with_primary_key).to_sql
36
- if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
37
- assert_no_match(/`firm_with_primary_keys_companies`\.`id`/, sql)
38
- assert_match(/`firm_with_primary_keys_companies`\.`name`/, sql)
39
- elsif current_adapter?(:OracleAdapter)
40
- # on Oracle aliases are truncated to 30 characters and are quoted in uppercase
41
- assert_no_match(/"firm_with_primary_keys_compani"\."id"/i, sql)
42
- assert_match(/"firm_with_primary_keys_compani"\."name"/i, sql)
43
- elsif current_adapter?(:IBM_DBAdapter)
44
- # Quoting of column names is not necessary for IBM_DB
45
- assert_no_match(/firm_with_primary_keys_companies\.id/i, sql)
46
- assert_match(/firm_with_primary_keys_companies\.name/i, sql)
47
- else
48
- assert_no_match(/"firm_with_primary_keys_companies"\."id"/, sql)
49
- assert_match(/"firm_with_primary_keys_companies"\."name"/, sql)
50
- end
51
- end
52
-
53
- def test_proxy_assignment
54
- account = Account.find(1)
55
- assert_nothing_raised { account.firm = account.firm }
56
- end
57
-
58
- def test_type_mismatch
59
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
60
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
61
- end
62
-
63
- def test_natural_assignment
64
- apple = Firm.create("name" => "Apple")
65
- citibank = Account.create("credit_limit" => 10)
66
- citibank.firm = apple
67
- assert_equal apple.id, citibank.firm_id
68
- end
69
-
70
- def test_natural_assignment_with_primary_key
71
- apple = Firm.create("name" => "Apple")
72
- citibank = Client.create("name" => "Primary key client")
73
- citibank.firm_with_primary_key = apple
74
- assert_equal apple.name, citibank.firm_name
75
- end
76
-
77
- def test_eager_loading_with_primary_key
78
- Firm.create("name" => "Apple")
79
- Client.create("name" => "Citibank", :firm_name => "Apple")
80
- citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
81
- assert citibank_result.association_cache.key?(:firm_with_primary_key)
82
- end
83
-
84
- def test_eager_loading_with_primary_key_as_symbol
85
- Firm.create("name" => "Apple")
86
- Client.create("name" => "Citibank", :firm_name => "Apple")
87
- citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key_symbols)
88
- assert citibank_result.association_cache.key?(:firm_with_primary_key_symbols)
89
- end
90
-
91
- def test_creating_the_belonging_object
92
- citibank = Account.create("credit_limit" => 10)
93
- apple = citibank.create_firm("name" => "Apple")
94
- assert_equal apple, citibank.firm
95
- citibank.save
96
- citibank.reload
97
- assert_equal apple, citibank.firm
98
- end
99
-
100
- def test_creating_the_belonging_object_with_primary_key
101
- client = Client.create(:name => "Primary key client")
102
- apple = client.create_firm_with_primary_key("name" => "Apple")
103
- assert_equal apple, client.firm_with_primary_key
104
- client.save
105
- client.reload
106
- assert_equal apple, client.firm_with_primary_key
107
- end
108
-
109
- def test_building_the_belonging_object
110
- citibank = Account.create("credit_limit" => 10)
111
- apple = citibank.build_firm("name" => "Apple")
112
- citibank.save
113
- assert_equal apple.id, citibank.firm_id
114
- end
115
-
116
- def test_building_the_belonging_object_with_primary_key
117
- client = Client.create(:name => "Primary key client")
118
- apple = client.build_firm_with_primary_key("name" => "Apple")
119
- client.save
120
- assert_equal apple.name, client.firm_name
121
- end
122
-
123
- def test_create!
124
- client = Client.create!(:name => "Jimmy")
125
- account = client.create_account!(:credit_limit => 10)
126
- assert_equal account, client.account
127
- assert account.persisted?
128
- client.save
129
- client.reload
130
- assert_equal account, client.account
131
- end
132
-
133
- def test_failing_create!
134
- client = Client.create!(:name => "Jimmy")
135
- assert_raise(ActiveRecord::RecordInvalid) { client.create_account! }
136
- assert_not_nil client.account
137
- assert client.account.new_record?
138
- end
139
-
140
- def test_natural_assignment_to_nil
141
- client = Client.find(3)
142
- client.firm = nil
143
- client.save
144
- assert_nil client.firm(true)
145
- assert_nil client.client_of
146
- end
147
-
148
- def test_natural_assignment_to_nil_with_primary_key
149
- client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
150
- client.firm_with_primary_key = nil
151
- client.save
152
- assert_nil client.firm_with_primary_key(true)
153
- assert_nil client.client_of
154
- end
155
-
156
- def test_with_different_class_name
157
- assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
158
- assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
159
- end
160
-
161
- def test_with_condition
162
- assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
163
- assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
164
- end
165
-
166
- def test_polymorphic_association_class
167
- sponsor = Sponsor.new
168
- assert_nil sponsor.association(:sponsorable).send(:klass)
169
-
170
- sponsor.sponsorable_type = '' # the column doesn't have to be declared NOT NULL
171
- assert_nil sponsor.association(:sponsorable).send(:klass)
172
-
173
- sponsor.sponsorable = Member.new :name => "Bert"
174
- assert_equal Member, sponsor.association(:sponsorable).send(:klass)
175
- end
176
-
177
- def test_with_polymorphic_and_condition
178
- sponsor = Sponsor.create
179
- member = Member.create :name => "Bert"
180
- sponsor.sponsorable = member
181
-
182
- assert_equal member, sponsor.sponsorable
183
- assert_nil sponsor.sponsorable_with_conditions
184
- end
185
-
186
- def test_with_select
187
- assert_equal Company.find(2).firm_with_select.attributes.size, 1
188
- assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
189
- end
190
-
191
- def test_belongs_to_counter
192
- debate = Topic.create("title" => "debate")
193
- assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
194
-
195
- trash = debate.replies.create("title" => "blah!", "content" => "world around!")
196
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
197
-
198
- trash.destroy
199
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
200
- end
201
-
202
- def test_belongs_to_counter_with_assigning_nil
203
- p = Post.find(1)
204
- c = Comment.find(1)
205
-
206
- assert_equal p.id, c.post_id
207
- assert_equal 2, Post.find(p.id).comments.size
208
-
209
- c.post = nil
210
-
211
- assert_equal 1, Post.find(p.id).comments.size
212
- end
213
-
214
- def test_belongs_to_with_primary_key_counter
215
- debate = Topic.create("title" => "debate")
216
- debate2 = Topic.create("title" => "debate2")
217
- reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
218
-
219
- assert_equal 1, debate.reload.replies_count
220
- assert_equal 0, debate2.reload.replies_count
221
-
222
- reply.topic_with_primary_key = debate2
223
-
224
- assert_equal 0, debate.reload.replies_count
225
- assert_equal 1, debate2.reload.replies_count
226
-
227
- reply.topic_with_primary_key = nil
228
-
229
- assert_equal 0, debate.reload.replies_count
230
- assert_equal 0, debate2.reload.replies_count
231
- end
232
-
233
- def test_belongs_to_counter_with_reassigning
234
- t1 = Topic.create("title" => "t1")
235
- t2 = Topic.create("title" => "t2")
236
- r1 = Reply.new("title" => "r1", "content" => "r1")
237
- r1.topic = t1
238
-
239
- assert r1.save
240
- assert_equal 1, Topic.find(t1.id).replies.size
241
- assert_equal 0, Topic.find(t2.id).replies.size
242
-
243
- r1.topic = Topic.find(t2.id)
244
-
245
- assert_no_queries do
246
- r1.topic = t2
247
- end
248
-
249
- assert r1.save
250
- assert_equal 0, Topic.find(t1.id).replies.size
251
- assert_equal 1, Topic.find(t2.id).replies.size
252
-
253
- r1.topic = nil
254
-
255
- assert_equal 0, Topic.find(t1.id).replies.size
256
- assert_equal 0, Topic.find(t2.id).replies.size
257
-
258
- r1.topic = t1
259
-
260
- assert_equal 1, Topic.find(t1.id).replies.size
261
- assert_equal 0, Topic.find(t2.id).replies.size
262
-
263
- r1.destroy
264
-
265
- assert_equal 0, Topic.find(t1.id).replies.size
266
- assert_equal 0, Topic.find(t2.id).replies.size
267
- end
268
-
269
- def test_belongs_to_reassign_with_namespaced_models_and_counters
270
- t1 = Web::Topic.create("title" => "t1")
271
- t2 = Web::Topic.create("title" => "t2")
272
- r1 = Web::Reply.new("title" => "r1", "content" => "r1")
273
- r1.topic = t1
274
-
275
- assert r1.save
276
- assert_equal 1, Web::Topic.find(t1.id).replies.size
277
- assert_equal 0, Web::Topic.find(t2.id).replies.size
278
-
279
- r1.topic = Web::Topic.find(t2.id)
280
-
281
- assert r1.save
282
- assert_equal 0, Web::Topic.find(t1.id).replies.size
283
- assert_equal 1, Web::Topic.find(t2.id).replies.size
284
- end
285
-
286
- def test_belongs_to_counter_after_save
287
- topic = Topic.create!(:title => "monday night")
288
- topic.replies.create!(:title => "re: monday night", :content => "football")
289
- assert_equal 1, Topic.find(topic.id)[:replies_count]
290
-
291
- topic.save!
292
- assert_equal 1, Topic.find(topic.id)[:replies_count]
293
- end
294
-
295
- def test_belongs_to_counter_after_update_attributes
296
- topic = Topic.create!(:title => "37s")
297
- topic.replies.create!(:title => "re: 37s", :content => "rails")
298
- assert_equal 1, Topic.find(topic.id)[:replies_count]
299
-
300
- topic.update_attributes(:title => "37signals")
301
- assert_equal 1, Topic.find(topic.id)[:replies_count]
302
- end
303
-
304
- def test_belongs_to_counter_when_update_column
305
- topic = Topic.create!(:title => "37s")
306
- topic.replies.create!(:title => "re: 37s", :content => "rails")
307
- assert_equal 1, Topic.find(topic.id)[:replies_count]
308
-
309
- topic.update_column(:content, "rails is wonderfull")
310
- assert_equal 1, Topic.find(topic.id)[:replies_count]
311
- end
312
-
313
- def test_assignment_before_child_saved
314
- final_cut = Client.new("name" => "Final Cut")
315
- firm = Firm.find(1)
316
- final_cut.firm = firm
317
- assert !final_cut.persisted?
318
- assert final_cut.save
319
- assert final_cut.persisted?
320
- assert firm.persisted?
321
- assert_equal firm, final_cut.firm
322
- assert_equal firm, final_cut.firm(true)
323
- end
324
-
325
- def test_assignment_before_child_saved_with_primary_key
326
- final_cut = Client.new("name" => "Final Cut")
327
- firm = Firm.find(1)
328
- final_cut.firm_with_primary_key = firm
329
- assert !final_cut.persisted?
330
- assert final_cut.save
331
- assert final_cut.persisted?
332
- assert firm.persisted?
333
- assert_equal firm, final_cut.firm_with_primary_key
334
- assert_equal firm, final_cut.firm_with_primary_key(true)
335
- end
336
-
337
- def test_new_record_with_foreign_key_but_no_object
338
- c = Client.new("firm_id" => 1)
339
- # sometimes tests on Oracle fail if ORDER BY is not provided therefore add always :order with :first
340
- assert_equal Firm.find(:first, :order => "id"), c.firm_with_basic_id
341
- end
342
-
343
- def test_setting_foreign_key_after_nil_target_loaded
344
- client = Client.new
345
- client.firm_with_basic_id
346
- client.firm_id = 1
347
-
348
- assert_equal companies(:first_firm), client.firm_with_basic_id
349
- end
350
-
351
- def test_polymorphic_setting_foreign_key_after_nil_target_loaded
352
- sponsor = Sponsor.new
353
- sponsor.sponsorable
354
- sponsor.sponsorable_id = 1
355
- sponsor.sponsorable_type = "Member"
356
-
357
- assert_equal members(:groucho), sponsor.sponsorable
358
- end
359
-
360
- def test_dont_find_target_when_foreign_key_is_null
361
- tagging = taggings(:thinking_general)
362
- queries = assert_sql { tagging.super_tag }
363
- assert_equal 0, queries.length
364
- end
365
-
366
- def test_field_name_same_as_foreign_key
367
- computer = Computer.find(1)
368
- assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
369
- end
370
-
371
- def test_counter_cache
372
- topic = Topic.create :title => "Zoom-zoom-zoom"
373
- assert_equal 0, topic[:replies_count]
374
-
375
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
376
- reply.topic = topic
377
-
378
- assert_equal 1, topic.reload[:replies_count]
379
- assert_equal 1, topic.replies.size
380
-
381
- topic[:replies_count] = 15
382
- assert_equal 15, topic.replies.size
383
- end
384
-
385
- def test_custom_counter_cache
386
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
387
- assert_equal 0, reply[:replies_count]
388
-
389
- silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
390
- silly.reply = reply
391
-
392
- assert_equal 1, reply.reload[:replies_count]
393
- assert_equal 1, reply.replies.size
394
-
395
- reply[:replies_count] = 17
396
- assert_equal 17, reply.replies.size
397
- end
398
-
399
- def test_association_assignment_sticks
400
- post = Post.find(:first)
401
-
402
- author1, author2 = Author.find(:all, :limit => 2)
403
- assert_not_nil author1
404
- assert_not_nil author2
405
-
406
- # make sure the association is loaded
407
- post.author
408
-
409
- # set the association by id, directly
410
- post.author_id = author2.id
411
-
412
- # save and reload
413
- post.save!
414
- post.reload
415
-
416
- # the author id of the post should be the id we set
417
- assert_equal post.author_id, author2.id
418
- end
419
-
420
- def test_cant_save_readonly_association
421
- assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
422
- assert companies(:first_client).readonly_firm.readonly?
423
- end
424
-
425
- def test_polymorphic_assignment_foreign_type_field_updating
426
- # should update when assigning a saved record
427
- sponsor = Sponsor.new
428
- member = Member.create
429
- sponsor.sponsorable = member
430
- assert_equal "Member", sponsor.sponsorable_type
431
-
432
- # should update when assigning a new record
433
- sponsor = Sponsor.new
434
- member = Member.new
435
- sponsor.sponsorable = member
436
- assert_equal "Member", sponsor.sponsorable_type
437
- end
438
-
439
- def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
440
- # should update when assigning a saved record
441
- essay = Essay.new
442
- writer = Author.create(:name => "David")
443
- essay.writer = writer
444
- assert_equal "Author", essay.writer_type
445
-
446
- # should update when assigning a new record
447
- essay = Essay.new
448
- writer = Author.new
449
- essay.writer = writer
450
- assert_equal "Author", essay.writer_type
451
- end
452
-
453
- def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
454
- sponsor = Sponsor.new
455
- saved_member = Member.create
456
- new_member = Member.new
457
-
458
- sponsor.sponsorable = saved_member
459
- assert_equal saved_member.id, sponsor.sponsorable_id
460
-
461
- sponsor.sponsorable = new_member
462
- assert_nil sponsor.sponsorable_id
463
- end
464
-
465
- def test_assignment_updates_foreign_id_field_for_new_and_saved_records
466
- client = Client.new
467
- saved_firm = Firm.create :name => "Saved"
468
- new_firm = Firm.new
469
-
470
- client.firm = saved_firm
471
- assert_equal saved_firm.id, client.client_of
472
-
473
- client.firm = new_firm
474
- assert_nil client.client_of
475
- end
476
-
477
- def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
478
- essay = Essay.new
479
- saved_writer = Author.create(:name => "David")
480
- new_writer = Author.new
481
-
482
- essay.writer = saved_writer
483
- assert_equal saved_writer.name, essay.writer_id
484
-
485
- essay.writer = new_writer
486
- assert_nil essay.writer_id
487
- end
488
-
489
- def test_belongs_to_proxy_should_not_respond_to_private_methods
490
- assert_raise(NoMethodError) { companies(:first_firm).private_method }
491
- assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
492
- end
493
-
494
- def test_belongs_to_proxy_should_respond_to_private_methods_via_send
495
- companies(:first_firm).send(:private_method)
496
- companies(:second_client).firm.send(:private_method)
497
- end
498
-
499
- def test_save_of_record_with_loaded_belongs_to
500
- @account = companies(:first_firm).account
501
-
502
- assert_nothing_raised do
503
- Account.find(@account.id).save!
504
- Account.find(@account.id, :include => :firm).save!
505
- end
506
-
507
- @account.firm.delete
508
-
509
- assert_nothing_raised do
510
- Account.find(@account.id).save!
511
- Account.find(@account.id, :include => :firm).save!
512
- end
513
- end
514
-
515
- def test_dependent_delete_and_destroy_with_belongs_to
516
- author_address = author_addresses(:david_address)
517
- author_address_extra = author_addresses(:david_address_extra)
518
- assert_equal [], AuthorAddress.destroyed_author_address_ids
519
-
520
- assert_difference "AuthorAddress.count", -2 do
521
- authors(:david).destroy
522
- end
523
-
524
- assert_equal [], AuthorAddress.find_all_by_id([author_address.id, author_address_extra.id])
525
- assert_equal [author_address.id], AuthorAddress.destroyed_author_address_ids
526
- end
527
-
528
- def test_invalid_belongs_to_dependent_option_nullify_raises_exception
529
- assert_raise ArgumentError do
530
- Author.belongs_to :special_author_address, :dependent => :nullify
531
- end
532
- end
533
-
534
- def test_invalid_belongs_to_dependent_option_restrict_raises_exception
535
- assert_raise ArgumentError do
536
- Author.belongs_to :special_author_address, :dependent => :restrict
537
- end
538
- end
539
-
540
- def test_attributes_are_being_set_when_initialized_from_belongs_to_association_with_where_clause
541
- new_firm = accounts(:signals37).build_firm(:name => 'Apple')
542
- assert_equal new_firm.name, "Apple"
543
- end
544
-
545
- def test_reassigning_the_parent_id_updates_the_object
546
- client = companies(:second_client)
547
-
548
- client.firm
549
- client.firm_with_condition
550
- firm_proxy = client.send(:association_instance_get, :firm)
551
- firm_with_condition_proxy = client.send(:association_instance_get, :firm_with_condition)
552
-
553
- assert !firm_proxy.stale_target?
554
- assert !firm_with_condition_proxy.stale_target?
555
- assert_equal companies(:first_firm), client.firm
556
- assert_equal companies(:first_firm), client.firm_with_condition
557
-
558
- client.client_of = companies(:another_firm).id
559
-
560
- assert firm_proxy.stale_target?
561
- assert firm_with_condition_proxy.stale_target?
562
- assert_equal companies(:another_firm), client.firm
563
- assert_equal companies(:another_firm), client.firm_with_condition
564
- end
565
-
566
- def test_polymorphic_reassignment_of_associated_id_updates_the_object
567
- sponsor = sponsors(:moustache_club_sponsor_for_groucho)
568
-
569
- sponsor.sponsorable
570
- proxy = sponsor.send(:association_instance_get, :sponsorable)
571
-
572
- assert !proxy.stale_target?
573
- assert_equal members(:groucho), sponsor.sponsorable
574
-
575
- sponsor.sponsorable_id = members(:some_other_guy).id
576
-
577
- assert proxy.stale_target?
578
- assert_equal members(:some_other_guy), sponsor.sponsorable
579
- end
580
-
581
- def test_polymorphic_reassignment_of_associated_type_updates_the_object
582
- sponsor = sponsors(:moustache_club_sponsor_for_groucho)
583
-
584
- sponsor.sponsorable
585
- proxy = sponsor.send(:association_instance_get, :sponsorable)
586
-
587
- assert !proxy.stale_target?
588
- assert_equal members(:groucho), sponsor.sponsorable
589
-
590
- sponsor.sponsorable_type = 'Firm'
591
-
592
- assert proxy.stale_target?
593
- assert_equal companies(:first_firm), sponsor.sponsorable
594
- end
595
-
596
- def test_reloading_association_with_key_change
597
- client = companies(:second_client)
598
- firm = client.association(:firm)
599
-
600
- client.firm = companies(:another_firm)
601
- firm.reload
602
- assert_equal companies(:another_firm), firm.target
603
-
604
- client.client_of = companies(:first_firm).id
605
- firm.reload
606
- assert_equal companies(:first_firm), firm.target
607
- end
608
-
609
- def test_polymorphic_counter_cache
610
- tagging = taggings(:welcome_general)
611
- post = posts(:welcome)
612
- comment = comments(:greetings)
613
-
614
- assert_difference lambda { post.reload.taggings_count }, -1 do
615
- assert_difference 'comment.reload.taggings_count', +1 do
616
- tagging.taggable = comment
617
- end
618
- end
619
- end
620
-
621
- def test_polymorphic_with_custom_foreign_type
622
- sponsor = sponsors(:moustache_club_sponsor_for_groucho)
623
- groucho = members(:groucho)
624
- other = members(:some_other_guy)
625
-
626
- assert_equal groucho, sponsor.sponsorable
627
- assert_equal groucho, sponsor.thing
628
-
629
- sponsor.thing = other
630
-
631
- assert_equal other, sponsor.sponsorable
632
- assert_equal other, sponsor.thing
633
-
634
- sponsor.sponsorable = groucho
635
-
636
- assert_equal groucho, sponsor.sponsorable
637
- assert_equal groucho, sponsor.thing
638
- end
639
-
640
- def test_build_with_conditions
641
- client = companies(:second_client)
642
- firm = client.build_bob_firm
643
-
644
- assert_equal "Bob", firm.name
645
- end
646
-
647
- def test_create_with_conditions
648
- client = companies(:second_client)
649
- firm = client.create_bob_firm
650
-
651
- assert_equal "Bob", firm.name
652
- end
653
-
654
- def test_create_bang_with_conditions
655
- client = companies(:second_client)
656
- firm = client.create_bob_firm!
657
-
658
- assert_equal "Bob", firm.name
659
- end
660
-
661
- def test_build_with_block
662
- client = Client.create(:name => 'Client Company')
663
-
664
- firm = client.build_firm{ |f| f.name = 'Agency Company' }
665
- assert_equal 'Agency Company', firm.name
666
- end
667
-
668
- def test_create_with_block
669
- client = Client.create(:name => 'Client Company')
670
-
671
- firm = client.create_firm{ |f| f.name = 'Agency Company' }
672
- assert_equal 'Agency Company', firm.name
673
- end
674
-
675
- def test_create_bang_with_block
676
- client = Client.create(:name => 'Client Company')
677
-
678
- firm = client.create_firm!{ |f| f.name = 'Agency Company' }
679
- assert_equal 'Agency Company', firm.name
680
- end
681
-
682
- def test_should_set_foreign_key_on_create_association
683
- client = Client.create! :name => "fuu"
684
-
685
- firm = client.create_firm :name => "baa"
686
- assert_equal firm.id, client.client_of
687
- end
688
-
689
- def test_should_set_foreign_key_on_create_association!
690
- client = Client.create! :name => "fuu"
691
-
692
- firm = client.create_firm! :name => "baa"
693
- assert_equal firm.id, client.client_of
694
- end
695
-
696
- def test_self_referential_belongs_to_with_counter_cache_assigning_nil
697
- comment = Comment.create! :post => posts(:thinking), :body => "fuu"
698
- comment.parent = nil
699
- comment.save!
700
-
701
- assert_equal nil, comment.reload.parent
702
- assert_equal 0, comments(:greetings).reload.children_count
703
- end
704
-
705
- def test_polymorphic_with_custom_primary_key
706
- toy = Toy.create!
707
- sponsor = Sponsor.create!(:sponsorable => toy)
708
-
709
- assert_equal toy, sponsor.reload.sponsorable
710
- end
711
- end
1
+ require "cases/helper"
2
+ require 'models/developer'
3
+ require 'models/project'
4
+ require 'models/company'
5
+ require 'models/topic'
6
+ require 'models/reply'
7
+ require 'models/computer'
8
+ require 'models/post'
9
+ require 'models/author'
10
+ require 'models/tag'
11
+ require 'models/tagging'
12
+ require 'models/comment'
13
+ require 'models/sponsor'
14
+ require 'models/member'
15
+ require 'models/essay'
16
+ require 'models/toy'
17
+
18
+ class BelongsToAssociationsTest < ActiveRecord::TestCase
19
+ fixtures :accounts, :companies, :developers, :projects, :topics,
20
+ :developers_projects, :computers, :authors, :author_addresses,
21
+ :posts, :tags, :taggings, :comments, :sponsors, :members
22
+
23
+ def test_belongs_to
24
+ Client.find(3).firm.name
25
+ assert_equal companies(:first_firm).name, Client.find(3).firm.name
26
+ assert_not_nil Client.find(3).firm, "Microsoft should have a firm"
27
+ end
28
+
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
+
34
+ def test_belongs_to_with_primary_key_joins_on_correct_column
35
+ sql = Client.joins(:firm_with_primary_key).to_sql
36
+ if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
37
+ assert_no_match(/`firm_with_primary_keys_companies`\.`id`/, sql)
38
+ assert_match(/`firm_with_primary_keys_companies`\.`name`/, sql)
39
+ elsif current_adapter?(:OracleAdapter)
40
+ # on Oracle aliases are truncated to 30 characters and are quoted in uppercase
41
+ assert_no_match(/"firm_with_primary_keys_compani"\."id"/i, sql)
42
+ assert_match(/"firm_with_primary_keys_compani"\."name"/i, sql)
43
+ elsif current_adapter?(:IBM_DBAdapter)
44
+ # Quoting of column names is not necessary for IBM_DB
45
+ assert_no_match(/firm_with_primary_keys_companies\.id/i, sql)
46
+ assert_match(/firm_with_primary_keys_companies\.name/i, sql)
47
+ else
48
+ assert_no_match(/"firm_with_primary_keys_companies"\."id"/, sql)
49
+ assert_match(/"firm_with_primary_keys_companies"\."name"/, sql)
50
+ end
51
+ end
52
+
53
+ def test_proxy_assignment
54
+ account = Account.find(1)
55
+ assert_nothing_raised { account.firm = account.firm }
56
+ end
57
+
58
+ def test_type_mismatch
59
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
60
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
61
+ end
62
+
63
+ def test_natural_assignment
64
+ apple = Firm.create("name" => "Apple")
65
+ citibank = Account.create("credit_limit" => 10)
66
+ citibank.firm = apple
67
+ assert_equal apple.id, citibank.firm_id
68
+ end
69
+
70
+ def test_natural_assignment_with_primary_key
71
+ apple = Firm.create("name" => "Apple")
72
+ citibank = Client.create("name" => "Primary key client")
73
+ citibank.firm_with_primary_key = apple
74
+ assert_equal apple.name, citibank.firm_name
75
+ end
76
+
77
+ def test_eager_loading_with_primary_key
78
+ Firm.create("name" => "Apple")
79
+ Client.create("name" => "Citibank", :firm_name => "Apple")
80
+ citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
81
+ assert citibank_result.association_cache.key?(:firm_with_primary_key)
82
+ end
83
+
84
+ def test_eager_loading_with_primary_key_as_symbol
85
+ Firm.create("name" => "Apple")
86
+ Client.create("name" => "Citibank", :firm_name => "Apple")
87
+ citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key_symbols)
88
+ assert citibank_result.association_cache.key?(:firm_with_primary_key_symbols)
89
+ end
90
+
91
+ def test_creating_the_belonging_object
92
+ citibank = Account.create("credit_limit" => 10)
93
+ apple = citibank.create_firm("name" => "Apple")
94
+ assert_equal apple, citibank.firm
95
+ citibank.save
96
+ citibank.reload
97
+ assert_equal apple, citibank.firm
98
+ end
99
+
100
+ def test_creating_the_belonging_object_with_primary_key
101
+ client = Client.create(:name => "Primary key client")
102
+ apple = client.create_firm_with_primary_key("name" => "Apple")
103
+ assert_equal apple, client.firm_with_primary_key
104
+ client.save
105
+ client.reload
106
+ assert_equal apple, client.firm_with_primary_key
107
+ end
108
+
109
+ def test_building_the_belonging_object
110
+ citibank = Account.create("credit_limit" => 10)
111
+ apple = citibank.build_firm("name" => "Apple")
112
+ citibank.save
113
+ assert_equal apple.id, citibank.firm_id
114
+ end
115
+
116
+ def test_building_the_belonging_object_with_primary_key
117
+ client = Client.create(:name => "Primary key client")
118
+ apple = client.build_firm_with_primary_key("name" => "Apple")
119
+ client.save
120
+ assert_equal apple.name, client.firm_name
121
+ end
122
+
123
+ def test_create!
124
+ client = Client.create!(:name => "Jimmy")
125
+ account = client.create_account!(:credit_limit => 10)
126
+ assert_equal account, client.account
127
+ assert account.persisted?
128
+ client.save
129
+ client.reload
130
+ assert_equal account, client.account
131
+ end
132
+
133
+ def test_failing_create!
134
+ client = Client.create!(:name => "Jimmy")
135
+ assert_raise(ActiveRecord::RecordInvalid) { client.create_account! }
136
+ assert_not_nil client.account
137
+ assert client.account.new_record?
138
+ end
139
+
140
+ def test_natural_assignment_to_nil
141
+ client = Client.find(3)
142
+ client.firm = nil
143
+ client.save
144
+ assert_nil client.firm(true)
145
+ assert_nil client.client_of
146
+ end
147
+
148
+ def test_natural_assignment_to_nil_with_primary_key
149
+ client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
150
+ client.firm_with_primary_key = nil
151
+ client.save
152
+ assert_nil client.firm_with_primary_key(true)
153
+ assert_nil client.client_of
154
+ end
155
+
156
+ def test_with_different_class_name
157
+ assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
158
+ assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
159
+ end
160
+
161
+ def test_with_condition
162
+ assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
163
+ assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
164
+ end
165
+
166
+ def test_polymorphic_association_class
167
+ sponsor = Sponsor.new
168
+ assert_nil sponsor.association(:sponsorable).send(:klass)
169
+
170
+ sponsor.sponsorable_type = '' # the column doesn't have to be declared NOT NULL
171
+ assert_nil sponsor.association(:sponsorable).send(:klass)
172
+
173
+ sponsor.sponsorable = Member.new :name => "Bert"
174
+ assert_equal Member, sponsor.association(:sponsorable).send(:klass)
175
+ end
176
+
177
+ def test_with_polymorphic_and_condition
178
+ sponsor = Sponsor.create
179
+ member = Member.create :name => "Bert"
180
+ sponsor.sponsorable = member
181
+
182
+ assert_equal member, sponsor.sponsorable
183
+ assert_nil sponsor.sponsorable_with_conditions
184
+ end
185
+
186
+ def test_with_select
187
+ assert_equal Company.find(2).firm_with_select.attributes.size, 1
188
+ assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
189
+ end
190
+
191
+ def test_belongs_to_counter
192
+ debate = Topic.create("title" => "debate")
193
+ assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
194
+
195
+ trash = debate.replies.create("title" => "blah!", "content" => "world around!")
196
+ assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
197
+
198
+ trash.destroy
199
+ assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
200
+ end
201
+
202
+ def test_belongs_to_counter_with_assigning_nil
203
+ p = Post.find(1)
204
+ c = Comment.find(1)
205
+
206
+ assert_equal p.id, c.post_id
207
+ assert_equal 2, Post.find(p.id).comments.size
208
+
209
+ c.post = nil
210
+
211
+ assert_equal 1, Post.find(p.id).comments.size
212
+ end
213
+
214
+ def test_belongs_to_with_primary_key_counter
215
+ debate = Topic.create("title" => "debate")
216
+ debate2 = Topic.create("title" => "debate2")
217
+ reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
218
+
219
+ assert_equal 1, debate.reload.replies_count
220
+ assert_equal 0, debate2.reload.replies_count
221
+
222
+ reply.topic_with_primary_key = debate2
223
+
224
+ assert_equal 0, debate.reload.replies_count
225
+ assert_equal 1, debate2.reload.replies_count
226
+
227
+ reply.topic_with_primary_key = nil
228
+
229
+ assert_equal 0, debate.reload.replies_count
230
+ assert_equal 0, debate2.reload.replies_count
231
+ end
232
+
233
+ def test_belongs_to_counter_with_reassigning
234
+ t1 = Topic.create("title" => "t1")
235
+ t2 = Topic.create("title" => "t2")
236
+ r1 = Reply.new("title" => "r1", "content" => "r1")
237
+ r1.topic = t1
238
+
239
+ assert r1.save
240
+ assert_equal 1, Topic.find(t1.id).replies.size
241
+ assert_equal 0, Topic.find(t2.id).replies.size
242
+
243
+ r1.topic = Topic.find(t2.id)
244
+
245
+ assert_no_queries do
246
+ r1.topic = t2
247
+ end
248
+
249
+ assert r1.save
250
+ assert_equal 0, Topic.find(t1.id).replies.size
251
+ assert_equal 1, Topic.find(t2.id).replies.size
252
+
253
+ r1.topic = nil
254
+
255
+ assert_equal 0, Topic.find(t1.id).replies.size
256
+ assert_equal 0, Topic.find(t2.id).replies.size
257
+
258
+ r1.topic = t1
259
+
260
+ assert_equal 1, Topic.find(t1.id).replies.size
261
+ assert_equal 0, Topic.find(t2.id).replies.size
262
+
263
+ r1.destroy
264
+
265
+ assert_equal 0, Topic.find(t1.id).replies.size
266
+ assert_equal 0, Topic.find(t2.id).replies.size
267
+ end
268
+
269
+ def test_belongs_to_reassign_with_namespaced_models_and_counters
270
+ t1 = Web::Topic.create("title" => "t1")
271
+ t2 = Web::Topic.create("title" => "t2")
272
+ r1 = Web::Reply.new("title" => "r1", "content" => "r1")
273
+ r1.topic = t1
274
+
275
+ assert r1.save
276
+ assert_equal 1, Web::Topic.find(t1.id).replies.size
277
+ assert_equal 0, Web::Topic.find(t2.id).replies.size
278
+
279
+ r1.topic = Web::Topic.find(t2.id)
280
+
281
+ assert r1.save
282
+ assert_equal 0, Web::Topic.find(t1.id).replies.size
283
+ assert_equal 1, Web::Topic.find(t2.id).replies.size
284
+ end
285
+
286
+ def test_belongs_to_counter_after_save
287
+ topic = Topic.create!(:title => "monday night")
288
+ topic.replies.create!(:title => "re: monday night", :content => "football")
289
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
290
+
291
+ topic.save!
292
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
293
+ end
294
+
295
+ def test_belongs_to_counter_after_update_attributes
296
+ topic = Topic.create!(:title => "37s")
297
+ topic.replies.create!(:title => "re: 37s", :content => "rails")
298
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
299
+
300
+ topic.update_attributes(:title => "37signals")
301
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
302
+ end
303
+
304
+ def test_belongs_to_counter_when_update_column
305
+ topic = Topic.create!(:title => "37s")
306
+ topic.replies.create!(:title => "re: 37s", :content => "rails")
307
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
308
+
309
+ topic.update_column(:content, "rails is wonderfull")
310
+ assert_equal 1, Topic.find(topic.id)[:replies_count]
311
+ end
312
+
313
+ def test_assignment_before_child_saved
314
+ final_cut = Client.new("name" => "Final Cut")
315
+ firm = Firm.find(1)
316
+ final_cut.firm = firm
317
+ assert !final_cut.persisted?
318
+ assert final_cut.save
319
+ assert final_cut.persisted?
320
+ assert firm.persisted?
321
+ assert_equal firm, final_cut.firm
322
+ assert_equal firm, final_cut.firm(true)
323
+ end
324
+
325
+ def test_assignment_before_child_saved_with_primary_key
326
+ final_cut = Client.new("name" => "Final Cut")
327
+ firm = Firm.find(1)
328
+ final_cut.firm_with_primary_key = firm
329
+ assert !final_cut.persisted?
330
+ assert final_cut.save
331
+ assert final_cut.persisted?
332
+ assert firm.persisted?
333
+ assert_equal firm, final_cut.firm_with_primary_key
334
+ assert_equal firm, final_cut.firm_with_primary_key(true)
335
+ end
336
+
337
+ def test_new_record_with_foreign_key_but_no_object
338
+ c = Client.new("firm_id" => 1)
339
+ # sometimes tests on Oracle fail if ORDER BY is not provided therefore add always :order with :first
340
+ assert_equal Firm.find(:first, :order => "id"), c.firm_with_basic_id
341
+ end
342
+
343
+ def test_setting_foreign_key_after_nil_target_loaded
344
+ client = Client.new
345
+ client.firm_with_basic_id
346
+ client.firm_id = 1
347
+
348
+ assert_equal companies(:first_firm), client.firm_with_basic_id
349
+ end
350
+
351
+ def test_polymorphic_setting_foreign_key_after_nil_target_loaded
352
+ sponsor = Sponsor.new
353
+ sponsor.sponsorable
354
+ sponsor.sponsorable_id = 1
355
+ sponsor.sponsorable_type = "Member"
356
+
357
+ assert_equal members(:groucho), sponsor.sponsorable
358
+ end
359
+
360
+ def test_dont_find_target_when_foreign_key_is_null
361
+ tagging = taggings(:thinking_general)
362
+ queries = assert_sql { tagging.super_tag }
363
+ assert_equal 0, queries.length
364
+ end
365
+
366
+ def test_field_name_same_as_foreign_key
367
+ computer = Computer.find(1)
368
+ assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
369
+ end
370
+
371
+ def test_counter_cache
372
+ topic = Topic.create :title => "Zoom-zoom-zoom"
373
+ assert_equal 0, topic[:replies_count]
374
+
375
+ reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
376
+ reply.topic = topic
377
+
378
+ assert_equal 1, topic.reload[:replies_count]
379
+ assert_equal 1, topic.replies.size
380
+
381
+ topic[:replies_count] = 15
382
+ assert_equal 15, topic.replies.size
383
+ end
384
+
385
+ def test_custom_counter_cache
386
+ reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
387
+ assert_equal 0, reply[:replies_count]
388
+
389
+ silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
390
+ silly.reply = reply
391
+
392
+ assert_equal 1, reply.reload[:replies_count]
393
+ assert_equal 1, reply.replies.size
394
+
395
+ reply[:replies_count] = 17
396
+ assert_equal 17, reply.replies.size
397
+ end
398
+
399
+ def test_association_assignment_sticks
400
+ post = Post.find(:first)
401
+
402
+ author1, author2 = Author.find(:all, :limit => 2)
403
+ assert_not_nil author1
404
+ assert_not_nil author2
405
+
406
+ # make sure the association is loaded
407
+ post.author
408
+
409
+ # set the association by id, directly
410
+ post.author_id = author2.id
411
+
412
+ # save and reload
413
+ post.save!
414
+ post.reload
415
+
416
+ # the author id of the post should be the id we set
417
+ assert_equal post.author_id, author2.id
418
+ end
419
+
420
+ def test_cant_save_readonly_association
421
+ assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
422
+ assert companies(:first_client).readonly_firm.readonly?
423
+ end
424
+
425
+ def test_polymorphic_assignment_foreign_type_field_updating
426
+ # should update when assigning a saved record
427
+ sponsor = Sponsor.new
428
+ member = Member.create
429
+ sponsor.sponsorable = member
430
+ assert_equal "Member", sponsor.sponsorable_type
431
+
432
+ # should update when assigning a new record
433
+ sponsor = Sponsor.new
434
+ member = Member.new
435
+ sponsor.sponsorable = member
436
+ assert_equal "Member", sponsor.sponsorable_type
437
+ end
438
+
439
+ def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
440
+ # should update when assigning a saved record
441
+ essay = Essay.new
442
+ writer = Author.create(:name => "David")
443
+ essay.writer = writer
444
+ assert_equal "Author", essay.writer_type
445
+
446
+ # should update when assigning a new record
447
+ essay = Essay.new
448
+ writer = Author.new
449
+ essay.writer = writer
450
+ assert_equal "Author", essay.writer_type
451
+ end
452
+
453
+ def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
454
+ sponsor = Sponsor.new
455
+ saved_member = Member.create
456
+ new_member = Member.new
457
+
458
+ sponsor.sponsorable = saved_member
459
+ assert_equal saved_member.id, sponsor.sponsorable_id
460
+
461
+ sponsor.sponsorable = new_member
462
+ assert_nil sponsor.sponsorable_id
463
+ end
464
+
465
+ def test_assignment_updates_foreign_id_field_for_new_and_saved_records
466
+ client = Client.new
467
+ saved_firm = Firm.create :name => "Saved"
468
+ new_firm = Firm.new
469
+
470
+ client.firm = saved_firm
471
+ assert_equal saved_firm.id, client.client_of
472
+
473
+ client.firm = new_firm
474
+ assert_nil client.client_of
475
+ end
476
+
477
+ def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
478
+ essay = Essay.new
479
+ saved_writer = Author.create(:name => "David")
480
+ new_writer = Author.new
481
+
482
+ essay.writer = saved_writer
483
+ assert_equal saved_writer.name, essay.writer_id
484
+
485
+ essay.writer = new_writer
486
+ assert_nil essay.writer_id
487
+ end
488
+
489
+ def test_belongs_to_proxy_should_not_respond_to_private_methods
490
+ assert_raise(NoMethodError) { companies(:first_firm).private_method }
491
+ assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
492
+ end
493
+
494
+ def test_belongs_to_proxy_should_respond_to_private_methods_via_send
495
+ companies(:first_firm).send(:private_method)
496
+ companies(:second_client).firm.send(:private_method)
497
+ end
498
+
499
+ def test_save_of_record_with_loaded_belongs_to
500
+ @account = companies(:first_firm).account
501
+
502
+ assert_nothing_raised do
503
+ Account.find(@account.id).save!
504
+ Account.find(@account.id, :include => :firm).save!
505
+ end
506
+
507
+ @account.firm.delete
508
+
509
+ assert_nothing_raised do
510
+ Account.find(@account.id).save!
511
+ Account.find(@account.id, :include => :firm).save!
512
+ end
513
+ end
514
+
515
+ def test_dependent_delete_and_destroy_with_belongs_to
516
+ author_address = author_addresses(:david_address)
517
+ author_address_extra = author_addresses(:david_address_extra)
518
+ assert_equal [], AuthorAddress.destroyed_author_address_ids
519
+
520
+ assert_difference "AuthorAddress.count", -2 do
521
+ authors(:david).destroy
522
+ end
523
+
524
+ assert_equal [], AuthorAddress.find_all_by_id([author_address.id, author_address_extra.id])
525
+ assert_equal [author_address.id], AuthorAddress.destroyed_author_address_ids
526
+ end
527
+
528
+ def test_invalid_belongs_to_dependent_option_nullify_raises_exception
529
+ assert_raise ArgumentError do
530
+ Author.belongs_to :special_author_address, :dependent => :nullify
531
+ end
532
+ end
533
+
534
+ def test_invalid_belongs_to_dependent_option_restrict_raises_exception
535
+ assert_raise ArgumentError do
536
+ Author.belongs_to :special_author_address, :dependent => :restrict
537
+ end
538
+ end
539
+
540
+ def test_attributes_are_being_set_when_initialized_from_belongs_to_association_with_where_clause
541
+ new_firm = accounts(:signals37).build_firm(:name => 'Apple')
542
+ assert_equal new_firm.name, "Apple"
543
+ end
544
+
545
+ def test_reassigning_the_parent_id_updates_the_object
546
+ client = companies(:second_client)
547
+
548
+ client.firm
549
+ client.firm_with_condition
550
+ firm_proxy = client.send(:association_instance_get, :firm)
551
+ firm_with_condition_proxy = client.send(:association_instance_get, :firm_with_condition)
552
+
553
+ assert !firm_proxy.stale_target?
554
+ assert !firm_with_condition_proxy.stale_target?
555
+ assert_equal companies(:first_firm), client.firm
556
+ assert_equal companies(:first_firm), client.firm_with_condition
557
+
558
+ client.client_of = companies(:another_firm).id
559
+
560
+ assert firm_proxy.stale_target?
561
+ assert firm_with_condition_proxy.stale_target?
562
+ assert_equal companies(:another_firm), client.firm
563
+ assert_equal companies(:another_firm), client.firm_with_condition
564
+ end
565
+
566
+ def test_polymorphic_reassignment_of_associated_id_updates_the_object
567
+ sponsor = sponsors(:moustache_club_sponsor_for_groucho)
568
+
569
+ sponsor.sponsorable
570
+ proxy = sponsor.send(:association_instance_get, :sponsorable)
571
+
572
+ assert !proxy.stale_target?
573
+ assert_equal members(:groucho), sponsor.sponsorable
574
+
575
+ sponsor.sponsorable_id = members(:some_other_guy).id
576
+
577
+ assert proxy.stale_target?
578
+ assert_equal members(:some_other_guy), sponsor.sponsorable
579
+ end
580
+
581
+ def test_polymorphic_reassignment_of_associated_type_updates_the_object
582
+ sponsor = sponsors(:moustache_club_sponsor_for_groucho)
583
+
584
+ sponsor.sponsorable
585
+ proxy = sponsor.send(:association_instance_get, :sponsorable)
586
+
587
+ assert !proxy.stale_target?
588
+ assert_equal members(:groucho), sponsor.sponsorable
589
+
590
+ sponsor.sponsorable_type = 'Firm'
591
+
592
+ assert proxy.stale_target?
593
+ assert_equal companies(:first_firm), sponsor.sponsorable
594
+ end
595
+
596
+ def test_reloading_association_with_key_change
597
+ client = companies(:second_client)
598
+ firm = client.association(:firm)
599
+
600
+ client.firm = companies(:another_firm)
601
+ firm.reload
602
+ assert_equal companies(:another_firm), firm.target
603
+
604
+ client.client_of = companies(:first_firm).id
605
+ firm.reload
606
+ assert_equal companies(:first_firm), firm.target
607
+ end
608
+
609
+ def test_polymorphic_counter_cache
610
+ tagging = taggings(:welcome_general)
611
+ post = posts(:welcome)
612
+ comment = comments(:greetings)
613
+
614
+ assert_difference lambda { post.reload.taggings_count }, -1 do
615
+ assert_difference 'comment.reload.taggings_count', +1 do
616
+ tagging.taggable = comment
617
+ end
618
+ end
619
+ end
620
+
621
+ def test_polymorphic_with_custom_foreign_type
622
+ sponsor = sponsors(:moustache_club_sponsor_for_groucho)
623
+ groucho = members(:groucho)
624
+ other = members(:some_other_guy)
625
+
626
+ assert_equal groucho, sponsor.sponsorable
627
+ assert_equal groucho, sponsor.thing
628
+
629
+ sponsor.thing = other
630
+
631
+ assert_equal other, sponsor.sponsorable
632
+ assert_equal other, sponsor.thing
633
+
634
+ sponsor.sponsorable = groucho
635
+
636
+ assert_equal groucho, sponsor.sponsorable
637
+ assert_equal groucho, sponsor.thing
638
+ end
639
+
640
+ def test_build_with_conditions
641
+ client = companies(:second_client)
642
+ firm = client.build_bob_firm
643
+
644
+ assert_equal "Bob", firm.name
645
+ end
646
+
647
+ def test_create_with_conditions
648
+ client = companies(:second_client)
649
+ firm = client.create_bob_firm
650
+
651
+ assert_equal "Bob", firm.name
652
+ end
653
+
654
+ def test_create_bang_with_conditions
655
+ client = companies(:second_client)
656
+ firm = client.create_bob_firm!
657
+
658
+ assert_equal "Bob", firm.name
659
+ end
660
+
661
+ def test_build_with_block
662
+ client = Client.create(:name => 'Client Company')
663
+
664
+ firm = client.build_firm{ |f| f.name = 'Agency Company' }
665
+ assert_equal 'Agency Company', firm.name
666
+ end
667
+
668
+ def test_create_with_block
669
+ client = Client.create(:name => 'Client Company')
670
+
671
+ firm = client.create_firm{ |f| f.name = 'Agency Company' }
672
+ assert_equal 'Agency Company', firm.name
673
+ end
674
+
675
+ def test_create_bang_with_block
676
+ client = Client.create(:name => 'Client Company')
677
+
678
+ firm = client.create_firm!{ |f| f.name = 'Agency Company' }
679
+ assert_equal 'Agency Company', firm.name
680
+ end
681
+
682
+ def test_should_set_foreign_key_on_create_association
683
+ client = Client.create! :name => "fuu"
684
+
685
+ firm = client.create_firm :name => "baa"
686
+ assert_equal firm.id, client.client_of
687
+ end
688
+
689
+ def test_should_set_foreign_key_on_create_association!
690
+ client = Client.create! :name => "fuu"
691
+
692
+ firm = client.create_firm! :name => "baa"
693
+ assert_equal firm.id, client.client_of
694
+ end
695
+
696
+ def test_self_referential_belongs_to_with_counter_cache_assigning_nil
697
+ comment = Comment.create! :post => posts(:thinking), :body => "fuu"
698
+ comment.parent = nil
699
+ comment.save!
700
+
701
+ assert_equal nil, comment.reload.parent
702
+ assert_equal 0, comments(:greetings).reload.children_count
703
+ end
704
+
705
+ def test_polymorphic_with_custom_primary_key
706
+ toy = Toy.create!
707
+ sponsor = Sponsor.create!(:sponsorable => toy)
708
+
709
+ assert_equal toy, sponsor.reload.sponsorable
710
+ end
711
+ end