ibm_db 2.5.6-x86-mingw32 → 2.5.7-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +6 -0
- data/README +1 -1
- data/ext/Makefile.nt32 +3 -3
- data/ext/Makefile.nt32.191 +212 -0
- data/ext/ibm_db.c +30 -5
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +300 -108
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1 -1
- data/lib/mswin32/rb18x/ibm_db.so +0 -0
- data/lib/mswin32/rb19x/ibm_db.so +0 -0
- data/test/cases/adapter_test.rb +25 -22
- data/test/cases/associations/belongs_to_associations_test.rb +245 -43
- data/test/cases/associations/cascaded_eager_loading_test.rb +28 -26
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +60 -156
- data/test/cases/associations/join_model_test.rb +96 -146
- data/test/cases/attribute_methods_test.rb +98 -33
- data/test/cases/base_test.rb +525 -103
- data/test/cases/calculations_test.rb +92 -8
- data/test/cases/migration_test.rb +533 -207
- data/test/cases/persistence_test.rb +636 -0
- data/test/cases/query_cache_test.rb +242 -0
- data/test/cases/relations_test.rb +1019 -0
- data/test/cases/schema_dumper_test.rb +37 -17
- data/test/cases/transaction_callbacks_test.rb +300 -0
- data/test/cases/validations/uniqueness_validation_test.rb +38 -22
- data/test/cases/xml_serialization_test.rb +276 -0
- data/test/config.yml +154 -0
- data/test/connections/native_ibm_db/connection.rb +2 -0
- data/test/models/warehouse_thing.rb +4 -4
- data/test/schema/i5/ibm_db_specific_schema.rb +3 -1
- data/test/schema/ids/ibm_db_specific_schema.rb +3 -1
- data/test/schema/luw/ibm_db_specific_schema.rb +2 -0
- data/test/schema/schema.rb +174 -89
- data/test/schema/zOS/ibm_db_specific_schema.rb +3 -1
- metadata +10 -7
- data/test/cases/associations/eager_test.rb +0 -862
- data/test/cases/associations/has_many_through_associations_test.rb +0 -461
- data/test/cases/finder_test.rb +0 -1088
- data/test/cases/fixtures_test.rb +0 -684
@@ -1,7 +1,9 @@
|
|
1
1
|
require "cases/helper"
|
2
|
+
require 'active_support/core_ext/object/inclusion'
|
2
3
|
require 'models/tag'
|
3
4
|
require 'models/tagging'
|
4
5
|
require 'models/post'
|
6
|
+
require 'models/rating'
|
5
7
|
require 'models/item'
|
6
8
|
require 'models/comment'
|
7
9
|
require 'models/author'
|
@@ -11,9 +13,13 @@ require 'models/vertex'
|
|
11
13
|
require 'models/edge'
|
12
14
|
require 'models/book'
|
13
15
|
require 'models/citation'
|
16
|
+
require 'models/aircraft'
|
17
|
+
require 'models/engine'
|
18
|
+
require 'models/car'
|
14
19
|
|
15
20
|
class AssociationsJoinModelTest < ActiveRecord::TestCase
|
16
|
-
self.use_transactional_fixtures = false
|
21
|
+
self.use_transactional_fixtures = false unless supports_savepoints?
|
22
|
+
|
17
23
|
fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books,
|
18
24
|
# Reload edges table from fixtures as otherwise repeated test was failing
|
19
25
|
:edges
|
@@ -43,43 +49,14 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
43
49
|
assert_queries(1) { assert_equal 0, author.unique_categorized_posts.count(:title, :conditions => "title is NULL") }
|
44
50
|
assert !authors(:mary).unique_categorized_posts.loaded?
|
45
51
|
end
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
55
|
-
# LUW: [IBM][CLI Driver][DB2/LINUX] SQL0214N
|
56
|
-
# An expression in the ORDER BY clause in the following position,
|
57
|
-
# or starting with "DEVELOPERS" in the "ORDER BY" clause is not valid.
|
58
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
59
|
-
# SELECT DISTINCT projects.id FROM projects
|
60
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
61
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
62
|
-
# ORDER BY developers.created_at
|
63
|
-
#
|
64
|
-
# i5: [IBM][CLI Driver][AS] SQL0214N
|
65
|
-
# An expression in the ORDER BY clause in the following position,
|
66
|
-
# or starting with "1" in the "CREATED_AT" clause is not valid.
|
67
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
68
|
-
# SELECT DISTINCT projects.id FROM projects
|
69
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
70
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
71
|
-
# ORDER BY developers.created_at
|
72
|
-
#
|
73
|
-
# zOS 9:[IBM][CLI Driver][DB2] SQL0214N
|
74
|
-
# An expression in the ORDER BY clause in the following position,
|
75
|
-
# or starting with "CREATED_AT" in the "ORDER BY" clause is not valid.
|
76
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
77
|
-
# SELECT DISTINCT projects.id FROM projects
|
78
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
79
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
80
|
-
# ORDER BY developers.created_at
|
81
|
-
#
|
82
|
-
end
|
52
|
+
|
53
|
+
def test_has_many_uniq_through_find
|
54
|
+
assert_equal 1, authors(:mary).unique_categorized_posts.find(:all).size
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_has_many_uniq_through_dynamic_find
|
58
|
+
assert_equal 1, authors(:mary).unique_categorized_posts.find_all_by_title("So I was thinking").size
|
59
|
+
end
|
83
60
|
|
84
61
|
def test_polymorphic_has_many_going_through_join_model
|
85
62
|
assert_equal tags(:general), tag = posts(:welcome).tags.first
|
@@ -114,16 +91,9 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
114
91
|
end
|
115
92
|
end
|
116
93
|
|
117
|
-
def test_polymorphic_has_many_going_through_join_model_with_disabled_include
|
118
|
-
assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
|
119
|
-
assert_queries 1 do
|
120
|
-
tag.tagging
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
94
|
def test_polymorphic_has_many_going_through_join_model_with_custom_select_and_joins
|
125
95
|
assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
|
126
|
-
tag.author_id
|
96
|
+
assert_nothing_raised(NoMethodError) { tag.author_id }
|
127
97
|
end
|
128
98
|
|
129
99
|
def test_polymorphic_has_many_going_through_join_model_with_custom_foreign_key
|
@@ -169,7 +139,21 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
169
139
|
def test_set_polymorphic_has_one
|
170
140
|
tagging = tags(:misc).taggings.create
|
171
141
|
posts(:thinking).tagging = tagging
|
172
|
-
|
142
|
+
|
143
|
+
assert_equal "Post", tagging.taggable_type
|
144
|
+
assert_equal posts(:thinking).id, tagging.taggable_id
|
145
|
+
assert_equal posts(:thinking), tagging.taggable
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_set_polymorphic_has_one_on_new_record
|
149
|
+
tagging = tags(:misc).taggings.create
|
150
|
+
post = Post.new :title => "foo", :body => "bar"
|
151
|
+
post.tagging = tagging
|
152
|
+
post.save!
|
153
|
+
|
154
|
+
assert_equal "Post", tagging.taggable_type
|
155
|
+
assert_equal post.id, tagging.taggable_id
|
156
|
+
assert_equal post, tagging.taggable
|
173
157
|
end
|
174
158
|
|
175
159
|
def test_create_polymorphic_has_many_with_scope
|
@@ -188,14 +172,14 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
188
172
|
|
189
173
|
def test_create_polymorphic_has_one_with_scope
|
190
174
|
old_count = Tagging.count
|
191
|
-
tagging = posts(:welcome).
|
175
|
+
tagging = posts(:welcome).create_tagging(:tag => tags(:misc))
|
192
176
|
assert_equal "Post", tagging.taggable_type
|
193
177
|
assert_equal old_count+1, Tagging.count
|
194
178
|
end
|
195
179
|
|
196
180
|
def test_delete_polymorphic_has_many_with_delete_all
|
197
181
|
assert_equal 1, posts(:welcome).taggings.count
|
198
|
-
posts(:welcome).taggings.first.
|
182
|
+
posts(:welcome).taggings.first.update_column :taggable_type, 'PostWithHasManyDeleteAll'
|
199
183
|
post = find_post_with_dependency(1, :has_many, :taggings, :delete_all)
|
200
184
|
|
201
185
|
old_count = Tagging.count
|
@@ -206,7 +190,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
206
190
|
|
207
191
|
def test_delete_polymorphic_has_many_with_destroy
|
208
192
|
assert_equal 1, posts(:welcome).taggings.count
|
209
|
-
posts(:welcome).taggings.first.
|
193
|
+
posts(:welcome).taggings.first.update_column :taggable_type, 'PostWithHasManyDestroy'
|
210
194
|
post = find_post_with_dependency(1, :has_many, :taggings, :destroy)
|
211
195
|
|
212
196
|
old_count = Tagging.count
|
@@ -217,7 +201,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
217
201
|
|
218
202
|
def test_delete_polymorphic_has_many_with_nullify
|
219
203
|
assert_equal 1, posts(:welcome).taggings.count
|
220
|
-
posts(:welcome).taggings.first.
|
204
|
+
posts(:welcome).taggings.first.update_column :taggable_type, 'PostWithHasManyNullify'
|
221
205
|
post = find_post_with_dependency(1, :has_many, :taggings, :nullify)
|
222
206
|
|
223
207
|
old_count = Tagging.count
|
@@ -228,7 +212,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
228
212
|
|
229
213
|
def test_delete_polymorphic_has_one_with_destroy
|
230
214
|
assert posts(:welcome).tagging
|
231
|
-
posts(:welcome).tagging.
|
215
|
+
posts(:welcome).tagging.update_column :taggable_type, 'PostWithHasOneDestroy'
|
232
216
|
post = find_post_with_dependency(1, :has_one, :tagging, :destroy)
|
233
217
|
|
234
218
|
old_count = Tagging.count
|
@@ -239,7 +223,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
239
223
|
|
240
224
|
def test_delete_polymorphic_has_one_with_nullify
|
241
225
|
assert posts(:welcome).tagging
|
242
|
-
posts(:welcome).tagging.
|
226
|
+
posts(:welcome).tagging.update_column :taggable_type, 'PostWithHasOneNullify'
|
243
227
|
post = find_post_with_dependency(1, :has_one, :tagging, :nullify)
|
244
228
|
|
245
229
|
old_count = Tagging.count
|
@@ -249,7 +233,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
249
233
|
end
|
250
234
|
|
251
235
|
def test_has_many_with_piggyback
|
252
|
-
assert_equal "2", categories(:sti_test).
|
236
|
+
assert_equal "2", categories(:sti_test).authors_with_select.first.post_id.to_s
|
253
237
|
end
|
254
238
|
|
255
239
|
def test_include_has_many_through
|
@@ -323,10 +307,26 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
323
307
|
end
|
324
308
|
|
325
309
|
def test_has_many_going_through_join_model_with_custom_foreign_key
|
326
|
-
assert_equal [], posts(:thinking).authors
|
310
|
+
assert_equal [authors(:bob)], posts(:thinking).authors
|
327
311
|
assert_equal [authors(:mary)], posts(:authorless).authors
|
328
312
|
end
|
329
313
|
|
314
|
+
def test_has_many_going_through_join_model_with_custom_primary_key
|
315
|
+
assert_equal [authors(:david)], posts(:thinking).authors_using_author_id
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_has_many_going_through_polymorphic_join_model_with_custom_primary_key
|
319
|
+
assert_equal [tags(:general)], posts(:eager_other).tags_using_author_id
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_has_many_through_with_custom_primary_key_on_belongs_to_source
|
323
|
+
assert_equal [authors(:david), authors(:david)], posts(:thinking).author_using_custom_pk
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_has_many_through_with_custom_primary_key_on_has_many_source
|
327
|
+
assert_equal [authors(:david), authors(:bob)], posts(:thinking).authors_using_custom_pk.order('authors.id')
|
328
|
+
end
|
329
|
+
|
330
330
|
def test_both_scoped_and_explicit_joins_should_be_respected
|
331
331
|
assert_nothing_raised do
|
332
332
|
Post.send(:with_scope, :find => {:joins => "left outer join comments on comments.id = posts.id"}) do
|
@@ -353,11 +353,16 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
353
353
|
end
|
354
354
|
|
355
355
|
def test_has_many_polymorphic
|
356
|
-
assert_raise ActiveRecord::
|
357
|
-
|
356
|
+
assert_raise ActiveRecord::HasManyThroughAssociationPolymorphicSourceError do
|
357
|
+
tags(:general).taggables
|
358
|
+
end
|
359
|
+
|
360
|
+
assert_raise ActiveRecord::HasManyThroughAssociationPolymorphicThroughError do
|
361
|
+
taggings(:welcome_general).things
|
358
362
|
end
|
363
|
+
|
359
364
|
assert_raise ActiveRecord::EagerLoadPolymorphicError do
|
360
|
-
|
365
|
+
tags(:general).taggings.find(:all, :include => :taggable, :conditions => 'bogus_table.column = 1')
|
361
366
|
end
|
362
367
|
end
|
363
368
|
|
@@ -413,50 +418,16 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
413
418
|
end
|
414
419
|
end
|
415
420
|
|
416
|
-
|
417
|
-
|
418
|
-
end
|
419
|
-
|
420
|
-
def test_has_many_through_habtm
|
421
|
-
assert_raise(ActiveRecord::HasManyThroughSourceAssociationMacroError) { authors(:david).post_categories }
|
422
|
-
end
|
423
|
-
|
424
|
-
unless current_adapter?(:IBM_DBAdapter)
|
421
|
+
unless current_adapter?(:IBM_DBAdapter)
|
422
|
+
# DB2 throws SQL0214N
|
425
423
|
def test_eager_load_has_many_through_has_many
|
426
424
|
author = Author.find :first, :conditions => ['name = ?', 'David'], :include => :comments, :order => 'comments.id'
|
427
425
|
SpecialComment.new; VerySpecialComment.new
|
428
426
|
assert_no_queries do
|
429
|
-
assert_equal [1,2,3,5,6,7,8,9,10], author.comments.collect(&:id)
|
427
|
+
assert_equal [1,2,3,5,6,7,8,9,10,12], author.comments.collect(&:id)
|
430
428
|
end
|
431
429
|
end
|
432
|
-
|
433
|
-
# An expression in the ORDER BY clause in the following position,
|
434
|
-
# or starting with "DEVELOPERS" in the "ORDER BY" clause is not valid.
|
435
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
436
|
-
# SELECT DISTINCT projects.id FROM projects
|
437
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
438
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
439
|
-
# ORDER BY developers.created_at
|
440
|
-
#
|
441
|
-
# i5: [IBM][CLI Driver][AS] SQL0214N
|
442
|
-
# An expression in the ORDER BY clause in the following position,
|
443
|
-
# or starting with "1" in the "CREATED_AT" clause is not valid.
|
444
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
445
|
-
# SELECT DISTINCT projects.id FROM projects
|
446
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
447
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
448
|
-
# ORDER BY developers.created_at
|
449
|
-
#
|
450
|
-
# zOS 9:[IBM][CLI Driver][DB2] SQL0214N
|
451
|
-
# An expression in the ORDER BY clause in the following position,
|
452
|
-
# or starting with "CREATED_AT" in the "ORDER BY" clause is not valid.
|
453
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
454
|
-
# SELECT DISTINCT projects.id FROM projects
|
455
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
456
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
457
|
-
# ORDER BY developers.created_at
|
458
|
-
#
|
459
|
-
end
|
430
|
+
end
|
460
431
|
|
461
432
|
def test_eager_load_has_many_through_has_many_with_conditions
|
462
433
|
post = Post.find(:first, :include => :invalid_tags)
|
@@ -503,7 +474,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
503
474
|
assert saved_post.tags.include?(new_tag)
|
504
475
|
|
505
476
|
assert new_tag.persisted?
|
506
|
-
assert saved_post.reload.tags(true)
|
477
|
+
assert new_tag.in?(saved_post.reload.tags(true))
|
507
478
|
|
508
479
|
|
509
480
|
new_post = Post.new(:title => "Association replacmenet works!", :body => "You best believe it.")
|
@@ -516,7 +487,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
516
487
|
|
517
488
|
new_post.save!
|
518
489
|
assert new_post.persisted?
|
519
|
-
assert new_post.reload.tags(true)
|
490
|
+
assert saved_tag.in?(new_post.reload.tags(true))
|
520
491
|
|
521
492
|
assert !posts(:thinking).tags.build.persisted?
|
522
493
|
assert !posts(:thinking).tags.new.persisted?
|
@@ -554,17 +525,21 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
554
525
|
assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
|
555
526
|
end
|
556
527
|
|
528
|
+
def test_add_to_join_table_with_no_id
|
529
|
+
assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
|
530
|
+
end
|
531
|
+
|
557
532
|
def test_has_many_through_collection_size_doesnt_load_target_if_not_loaded
|
558
533
|
author = authors(:david)
|
559
|
-
assert_equal
|
534
|
+
assert_equal 10, author.comments.size
|
560
535
|
assert !author.comments.loaded?
|
561
536
|
end
|
562
537
|
|
563
538
|
def test_has_many_through_collection_size_uses_counter_cache_if_it_exists
|
564
|
-
|
565
|
-
|
566
|
-
assert_equal 100,
|
567
|
-
assert !
|
539
|
+
c = categories(:general)
|
540
|
+
c.categorizations_count = 100
|
541
|
+
assert_equal 100, c.categorizations.size
|
542
|
+
assert !c.categorizations.loaded?
|
568
543
|
end
|
569
544
|
|
570
545
|
def test_adding_junk_to_has_many_through_should_raise_type_mismatch
|
@@ -645,37 +620,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
645
620
|
def test_uniq_has_many_through_should_retain_order
|
646
621
|
comment_ids = authors(:david).comments.map(&:id)
|
647
622
|
assert_equal comment_ids.sort, authors(:david).ordered_uniq_comments.map(&:id)
|
648
|
-
|
649
|
-
unless current_adapter?(:IBM_DBAdapter)
|
650
|
-
assert_equal comment_ids.sort.reverse, authors(:david).ordered_uniq_comments_desc.map(&:id)
|
651
|
-
# LUW: [IBM][CLI Driver][DB2/LINUX] SQL0214N
|
652
|
-
# An expression in the ORDER BY clause in the following position,
|
653
|
-
# or starting with "DEVELOPERS" in the "ORDER BY" clause is not valid.
|
654
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
655
|
-
# SELECT DISTINCT projects.id FROM projects
|
656
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
657
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
658
|
-
# ORDER BY developers.created_at
|
659
|
-
#
|
660
|
-
# i5: [IBM][CLI Driver][AS] SQL0214N
|
661
|
-
# An expression in the ORDER BY clause in the following position,
|
662
|
-
# or starting with "1" in the "CREATED_AT" clause is not valid.
|
663
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
664
|
-
# SELECT DISTINCT projects.id FROM projects
|
665
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
666
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
667
|
-
# ORDER BY developers.created_at
|
668
|
-
#
|
669
|
-
# zOS 9:[IBM][CLI Driver][DB2] SQL0214N
|
670
|
-
# An expression in the ORDER BY clause in the following position,
|
671
|
-
# or starting with "CREATED_AT" in the "ORDER BY" clause is not valid.
|
672
|
-
# Reason code = "2". SQLSTATE=42822 SQLCODE=-214:
|
673
|
-
# SELECT DISTINCT projects.id FROM projects
|
674
|
-
# LEFT OUTER JOIN developers_projects ON developers_projects.project_id = projects.id
|
675
|
-
# LEFT OUTER JOIN developers ON developers.id = developers_projects.developer_id
|
676
|
-
# ORDER BY developers.created_at
|
677
|
-
#
|
678
|
-
end
|
623
|
+
assert_equal comment_ids.sort.reverse, authors(:david).ordered_uniq_comments_desc.map(&:id)
|
679
624
|
end
|
680
625
|
|
681
626
|
def test_polymorphic_has_many
|
@@ -720,7 +665,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
720
665
|
|
721
666
|
def test_preload_nil_polymorphic_belongs_to
|
722
667
|
assert_nothing_raised do
|
723
|
-
|
668
|
+
Tagging.find(:all, :include => :taggable, :conditions => ['taggable_type IS NULL'])
|
724
669
|
end
|
725
670
|
end
|
726
671
|
|
@@ -763,16 +708,15 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
763
708
|
end
|
764
709
|
assert ! david.categories.loaded?
|
765
710
|
end
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
end
|
711
|
+
|
712
|
+
def test_has_many_through_include_returns_false_for_non_matching_record_to_verify_scoping
|
713
|
+
david = authors(:david)
|
714
|
+
category = Category.create!(:name => 'Not Associated')
|
715
|
+
|
716
|
+
assert ! david.categories.loaded?
|
717
|
+
assert ! david.categories.include?(category)
|
718
|
+
end
|
719
|
+
|
776
720
|
def test_has_many_through_goes_through_all_sti_classes
|
777
721
|
sub_sti_post = SubStiPost.create!(:title => 'test', :body => 'test', :author_id => 1)
|
778
722
|
new_comment = sub_sti_post.comments.create(:body => 'test')
|
@@ -780,11 +724,17 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
780
724
|
assert_equal [9, 10, new_comment.id], authors(:david).sti_post_comments.map(&:id).sort
|
781
725
|
end
|
782
726
|
|
727
|
+
def test_has_many_with_pluralize_table_names_false
|
728
|
+
aircraft = Aircraft.create!(:name => "Airbus 380")
|
729
|
+
engine = Engine.create!(:car_id => aircraft.id)
|
730
|
+
assert_equal aircraft.engines, [engine]
|
731
|
+
end
|
732
|
+
|
783
733
|
private
|
784
734
|
# create dynamic Post models to allow different dependency options
|
785
735
|
def find_post_with_dependency(post_id, association, association_name, dependency)
|
786
736
|
class_name = "PostWith#{association.to_s.classify}#{dependency.to_s.classify}"
|
787
|
-
Post.find(post_id).
|
737
|
+
Post.find(post_id).update_column :type, class_name
|
788
738
|
klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
|
789
739
|
klass.set_table_name 'posts'
|
790
740
|
klass.send(association, association_name, :as => :taggable, :dependent => dependency)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "cases/helper"
|
2
|
+
require 'active_support/core_ext/object/inclusion'
|
2
3
|
require 'models/minimalistic'
|
3
4
|
require 'models/developer'
|
4
5
|
require 'models/auto_id'
|
@@ -8,6 +9,8 @@ require 'models/topic'
|
|
8
9
|
require 'models/company'
|
9
10
|
require 'models/category'
|
10
11
|
require 'models/reply'
|
12
|
+
require 'models/contact'
|
13
|
+
require 'models/keyboard'
|
11
14
|
|
12
15
|
class AttributeMethodsTest < ActiveRecord::TestCase
|
13
16
|
fixtures :topics, :developers, :companies, :computers
|
@@ -75,6 +78,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
75
78
|
def test_respond_to?
|
76
79
|
topic = Topic.find(1)
|
77
80
|
assert_respond_to topic, "title"
|
81
|
+
assert_respond_to topic, "_title"
|
78
82
|
assert_respond_to topic, "title?"
|
79
83
|
assert_respond_to topic, "title="
|
80
84
|
assert_respond_to topic, :title
|
@@ -86,6 +90,25 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
86
90
|
assert !topic.respond_to?(:nothingness)
|
87
91
|
end
|
88
92
|
|
93
|
+
def test_respond_to_with_custom_primary_key
|
94
|
+
keyboard = Keyboard.create
|
95
|
+
assert_not_nil keyboard.key_number
|
96
|
+
assert_equal keyboard.key_number, keyboard.id
|
97
|
+
assert keyboard.respond_to?('key_number')
|
98
|
+
assert keyboard.respond_to?('_key_number')
|
99
|
+
assert keyboard.respond_to?('id')
|
100
|
+
assert keyboard.respond_to?('_id')
|
101
|
+
end
|
102
|
+
|
103
|
+
# Syck calls respond_to? before actually calling initialize
|
104
|
+
def test_respond_to_with_allocated_object
|
105
|
+
topic = Topic.allocate
|
106
|
+
assert !topic.respond_to?("nothingness")
|
107
|
+
assert !topic.respond_to?(:nothingness)
|
108
|
+
assert_respond_to topic, "title"
|
109
|
+
assert_respond_to topic, :title
|
110
|
+
end
|
111
|
+
|
89
112
|
def test_array_content
|
90
113
|
topic = Topic.new
|
91
114
|
topic.content = %w( one two three )
|
@@ -96,34 +119,55 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
96
119
|
|
97
120
|
def test_read_attributes_before_type_cast
|
98
121
|
category = Category.new({:name=>"Test categoty", :type => nil})
|
99
|
-
category_attrs = {"name"=>"Test categoty", "type" => nil, "categorizations_count" => nil}
|
122
|
+
category_attrs = {"name"=>"Test categoty", "id" => nil, "type" => nil, "categorizations_count" => nil}
|
100
123
|
assert_equal category_attrs , category.attributes_before_type_cast
|
101
124
|
end
|
102
125
|
|
103
126
|
if current_adapter?(:MysqlAdapter)
|
104
127
|
def test_read_attributes_before_type_cast_on_boolean
|
105
128
|
bool = Boolean.create({ "value" => false })
|
106
|
-
|
129
|
+
if RUBY_PLATFORM =~ /java/
|
130
|
+
# JRuby will return the value before typecast as string
|
131
|
+
assert_equal "0", bool.reload.attributes_before_type_cast["value"]
|
132
|
+
else
|
133
|
+
assert_equal 0, bool.reload.attributes_before_type_cast["value"]
|
134
|
+
end
|
107
135
|
end
|
108
136
|
end
|
109
137
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
# Oracle adapter returns Time before type cast
|
114
|
-
unless current_adapter?(:OracleAdapter)
|
115
|
-
assert_equal developer.created_at.to_s(:db) , developer.attributes_before_type_cast["created_at"]
|
116
|
-
else
|
117
|
-
assert_equal developer.created_at.to_s(:db) , developer.attributes_before_type_cast["created_at"].to_s(:db)
|
138
|
+
def test_read_attributes_before_type_cast_on_datetime
|
139
|
+
in_time_zone "Pacific Time (US & Canada)" do
|
140
|
+
record = @target.new
|
118
141
|
|
119
|
-
|
120
|
-
|
121
|
-
|
142
|
+
record.written_on = "345643456"
|
143
|
+
assert_equal "345643456", record.written_on_before_type_cast
|
144
|
+
assert_equal nil, record.written_on
|
122
145
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
146
|
+
record.written_on = "2009-10-11 12:13:14"
|
147
|
+
assert_equal "2009-10-11 12:13:14", record.written_on_before_type_cast
|
148
|
+
assert_equal Time.zone.parse("2009-10-11 12:13:14"), record.written_on
|
149
|
+
assert_equal ActiveSupport::TimeZone["Pacific Time (US & Canada)"], record.written_on.time_zone
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_read_attributes_after_type_cast_on_datetime
|
154
|
+
tz = "Pacific Time (US & Canada)"
|
155
|
+
|
156
|
+
in_time_zone tz do
|
157
|
+
record = @target.new
|
158
|
+
|
159
|
+
date_string = "2011-03-24"
|
160
|
+
time = Time.zone.parse date_string
|
161
|
+
|
162
|
+
record.written_on = date_string
|
163
|
+
assert_equal date_string, record.written_on_before_type_cast
|
164
|
+
assert_equal time, record.written_on
|
165
|
+
assert_equal ActiveSupport::TimeZone[tz], record.written_on.time_zone
|
166
|
+
|
167
|
+
record.save
|
168
|
+
record.reload
|
169
|
+
|
170
|
+
assert_equal time, record.written_on
|
127
171
|
end
|
128
172
|
end
|
129
173
|
|
@@ -157,7 +201,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
157
201
|
|
158
202
|
def test_case_sensitive_attributes_hash
|
159
203
|
# DB2 is not case-sensitive
|
160
|
-
return true if current_adapter?(:DB2Adapter)
|
204
|
+
return true if current_adapter?(:DB2Adapter,:IBM_DBAdapter)
|
161
205
|
|
162
206
|
assert_equal @loaded_fixtures['computers']['workstation'].to_hash, Computer.find(:first).attributes
|
163
207
|
end
|
@@ -238,6 +282,12 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
238
282
|
# puts ""
|
239
283
|
end
|
240
284
|
|
285
|
+
def test_read_overridden_attribute
|
286
|
+
topic = Topic.new(:title => 'a')
|
287
|
+
def topic.title() 'b' end
|
288
|
+
assert_equal 'a', topic[:title]
|
289
|
+
end
|
290
|
+
|
241
291
|
def test_query_attribute_string
|
242
292
|
[nil, "", " "].each do |value|
|
243
293
|
assert_equal false, Topic.new(:author_name => value).author_name?
|
@@ -352,7 +402,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
352
402
|
|
353
403
|
def test_typecast_attribute_from_select_to_false
|
354
404
|
topic = Topic.create(:title => 'Budget')
|
355
|
-
# Oracle does not support boolean expressions in SELECT
|
405
|
+
# Oracle and DB2 does not support boolean expressions in SELECT
|
356
406
|
if current_adapter?(:OracleAdapter) || current_adapter?(:IBM_DBAdapter)
|
357
407
|
topic = Topic.find(:first, :select => "topics.*, 0 as is_test")
|
358
408
|
else
|
@@ -363,7 +413,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
363
413
|
|
364
414
|
def test_typecast_attribute_from_select_to_true
|
365
415
|
topic = Topic.create(:title => 'Budget')
|
366
|
-
# Oracle does not support boolean expressions in SELECT
|
416
|
+
# Oracle and DB2 does not support boolean expressions in SELECT
|
367
417
|
if current_adapter?(:OracleAdapter) || current_adapter?(:IBM_DBAdapter)
|
368
418
|
topic = Topic.find(:first, :select => "topics.*, 1 as is_test")
|
369
419
|
else
|
@@ -419,12 +469,8 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
419
469
|
Topic.instance_variable_set "@cached_attributes", nil
|
420
470
|
end
|
421
471
|
|
422
|
-
def
|
423
|
-
|
424
|
-
column_names = Topic.columns.select{|c| column_types.include?(c.type) }.map(&:name)
|
425
|
-
|
426
|
-
assert_equal column_names.sort, Topic.cached_attributes.sort
|
427
|
-
assert_equal time_related_columns_on_topic.sort, Topic.cached_attributes.sort
|
472
|
+
def test_cacheable_columns_are_actually_cached
|
473
|
+
assert_equal cached_columns.sort, Topic.cached_attributes.sort
|
428
474
|
end
|
429
475
|
|
430
476
|
def test_accessing_cached_attributes_caches_the_converted_values_and_nothing_else
|
@@ -435,8 +481,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
435
481
|
assert cache.empty?
|
436
482
|
|
437
483
|
all_columns = Topic.columns.map(&:name)
|
438
|
-
|
439
|
-
uncached_columns = all_columns - cached_columns
|
484
|
+
uncached_columns = all_columns - cached_columns
|
440
485
|
|
441
486
|
all_columns.each do |attr_name|
|
442
487
|
attribute_gets_cached = Topic.cache_attribute?(attr_name)
|
@@ -451,6 +496,14 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
451
496
|
end
|
452
497
|
end
|
453
498
|
|
499
|
+
def test_write_nil_to_time_attributes
|
500
|
+
in_time_zone "Pacific Time (US & Canada)" do
|
501
|
+
record = @target.new
|
502
|
+
record.written_on = nil
|
503
|
+
assert_nil record.written_on
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
454
507
|
def test_time_attributes_are_retrieved_in_current_time_zone
|
455
508
|
in_time_zone "Pacific Time (US & Canada)" do
|
456
509
|
utc_time = Time.utc(2008, 1, 1)
|
@@ -546,7 +599,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
546
599
|
topic = @target.new(:title => "The pros and cons of programming naked.")
|
547
600
|
assert !topic.respond_to?(:title)
|
548
601
|
exception = assert_raise(NoMethodError) { topic.title }
|
549
|
-
|
602
|
+
assert_match %r(^Attempt to call private method), exception.message
|
550
603
|
assert_equal "I'm private", topic.send(:title)
|
551
604
|
end
|
552
605
|
|
@@ -556,7 +609,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
556
609
|
topic = @target.new
|
557
610
|
assert !topic.respond_to?(:title=)
|
558
611
|
exception = assert_raise(NoMethodError) { topic.title = "Pants"}
|
559
|
-
|
612
|
+
assert_match %r(^Attempt to call private method), exception.message
|
560
613
|
topic.send(:title=, "Very large pants")
|
561
614
|
end
|
562
615
|
|
@@ -566,14 +619,14 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
566
619
|
topic = @target.new(:title => "Isaac Newton's pants")
|
567
620
|
assert !topic.respond_to?(:title?)
|
568
621
|
exception = assert_raise(NoMethodError) { topic.title? }
|
569
|
-
|
622
|
+
assert_match %r(^Attempt to call private method), exception.message
|
570
623
|
assert topic.send(:title?)
|
571
624
|
end
|
572
625
|
|
573
626
|
def test_bulk_update_respects_access_control
|
574
627
|
privatize("title=(value)")
|
575
628
|
|
576
|
-
assert_raise(ActiveRecord::UnknownAttributeError) {
|
629
|
+
assert_raise(ActiveRecord::UnknownAttributeError) { @target.new(:title => "Rants about pants") }
|
577
630
|
assert_raise(ActiveRecord::UnknownAttributeError) { @target.new.attributes = { :title => "Ants in pants" } }
|
578
631
|
end
|
579
632
|
|
@@ -592,10 +645,22 @@ class AttributeMethodsTest < ActiveRecord::TestCase
|
|
592
645
|
Object.send(:undef_method, :title) # remove test method from object
|
593
646
|
end
|
594
647
|
|
648
|
+
def test_list_of_serialized_attributes
|
649
|
+
assert_equal %w(content), Topic.serialized_attributes.keys
|
650
|
+
assert_equal %w(preferences), Contact.serialized_attributes.keys
|
651
|
+
end
|
595
652
|
|
596
653
|
private
|
654
|
+
def cached_columns
|
655
|
+
@cached_columns ||= (time_related_columns_on_topic + serialized_columns_on_topic).map(&:name)
|
656
|
+
end
|
657
|
+
|
597
658
|
def time_related_columns_on_topic
|
598
|
-
Topic.columns.select{|c| [:time, :date, :datetime, :timestamp]
|
659
|
+
Topic.columns.select { |c| c.type.in?([:time, :date, :datetime, :timestamp]) }
|
660
|
+
end
|
661
|
+
|
662
|
+
def serialized_columns_on_topic
|
663
|
+
Topic.columns.select { |c| Topic.serialized_attributes.include?(c.name) }
|
599
664
|
end
|
600
665
|
|
601
666
|
def in_time_zone(zone)
|