ibm_db 2.5.5 → 2.5.6
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.
- data/CHANGES +5 -0
- data/README +4 -2
- data/ext/ibm_db.c +144 -12
- data/ext/ruby_ibm_db_cli.h +1 -0
- data/lib/IBM_DB.rb +1 -1
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +62 -1
- data/test/cases/adapter_test.rb +41 -19
- data/test/cases/associations/belongs_to_associations_test.rb +486 -0
- data/test/cases/associations/cascaded_eager_loading_test.rb +53 -3
- data/test/cases/associations/eager_test.rb +42 -22
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +114 -71
- data/test/cases/associations/has_many_through_associations_test.rb +214 -34
- data/test/cases/associations/join_model_test.rb +26 -34
- data/test/cases/attribute_methods_test.rb +387 -78
- data/test/cases/base_test.rb +555 -1183
- data/test/cases/calculations_test.rb +55 -43
- data/test/cases/finder_test.rb +218 -222
- data/test/cases/fixtures_test.rb +44 -20
- data/test/cases/migration_test.rb +638 -242
- data/test/cases/schema_dumper_test.rb +38 -3
- data/test/cases/validations/uniqueness_validation_test.rb +283 -0
- data/test/schema/i5/ibm_db_specific_schema.rb +1 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +1 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +2 -1
- data/test/schema/schema.rb +157 -10
- data/test/schema/zOS/ibm_db_specific_schema.rb +1 -0
- metadata +5 -5
- data/test/cases/helper.rb +0 -75
- data/test/cases/validations_test.rb +0 -1604
@@ -11,61 +11,73 @@ require 'models/author'
|
|
11
11
|
require 'models/owner'
|
12
12
|
require 'models/pet'
|
13
13
|
require 'models/toy'
|
14
|
+
require 'models/contract'
|
15
|
+
require 'models/company'
|
16
|
+
require 'models/developer'
|
17
|
+
require 'models/subscriber'
|
18
|
+
require 'models/book'
|
19
|
+
require 'models/subscription'
|
14
20
|
|
15
21
|
class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
16
|
-
fixtures :posts, :readers, :people, :comments, :authors,
|
22
|
+
fixtures :posts, :readers, :people, :comments, :authors,
|
23
|
+
:owners, :pets, :toys, :jobs, :references, :companies,
|
24
|
+
:subscribers, :books, :subscriptions, :developers
|
25
|
+
|
26
|
+
# Dummies to force column loads so query counts are clean.
|
27
|
+
def setup
|
28
|
+
Person.create :first_name => 'gummy'
|
29
|
+
Reader.create :person_id => 0, :post_id => 0
|
30
|
+
end
|
17
31
|
|
18
32
|
def test_associate_existing
|
19
|
-
assert_queries(2) { posts(:thinking);people(:david) }
|
20
|
-
|
21
|
-
posts(:thinking).people
|
33
|
+
assert_queries(2) { posts(:thinking); people(:david) }
|
22
34
|
|
23
35
|
assert_queries(1) do
|
24
36
|
posts(:thinking).people << people(:david)
|
25
37
|
end
|
26
|
-
|
38
|
+
|
27
39
|
assert_queries(1) do
|
28
40
|
assert posts(:thinking).people.include?(people(:david))
|
29
41
|
end
|
30
|
-
|
42
|
+
|
31
43
|
assert posts(:thinking).reload.people(true).include?(people(:david))
|
32
44
|
end
|
33
45
|
|
34
46
|
def test_associating_new
|
35
47
|
assert_queries(1) { posts(:thinking) }
|
36
48
|
new_person = nil # so block binding catches it
|
37
|
-
|
49
|
+
|
38
50
|
assert_queries(0) do
|
39
51
|
new_person = Person.new :first_name => 'bob'
|
40
52
|
end
|
41
|
-
|
53
|
+
|
42
54
|
# Associating new records always saves them
|
43
55
|
# Thus, 1 query for the new person record, 1 query for the new join table record
|
44
56
|
assert_queries(2) do
|
45
57
|
posts(:thinking).people << new_person
|
46
58
|
end
|
47
|
-
|
59
|
+
|
48
60
|
assert_queries(1) do
|
49
61
|
assert posts(:thinking).people.include?(new_person)
|
50
62
|
end
|
51
|
-
|
63
|
+
|
52
64
|
assert posts(:thinking).reload.people(true).include?(new_person)
|
53
65
|
end
|
54
66
|
|
55
67
|
def test_associate_new_by_building
|
56
68
|
assert_queries(1) { posts(:thinking) }
|
57
|
-
|
69
|
+
|
58
70
|
assert_queries(0) do
|
59
|
-
posts(:thinking).people.build(:first_name=>"Bob")
|
60
|
-
posts(:thinking).people.new(:first_name=>"Ted")
|
71
|
+
posts(:thinking).people.build(:first_name => "Bob")
|
72
|
+
posts(:thinking).people.new(:first_name => "Ted")
|
61
73
|
end
|
62
|
-
|
74
|
+
|
63
75
|
# Should only need to load the association once
|
64
76
|
assert_queries(1) do
|
65
77
|
assert posts(:thinking).people.collect(&:first_name).include?("Bob")
|
66
78
|
assert posts(:thinking).people.collect(&:first_name).include?("Ted")
|
67
79
|
end
|
68
|
-
|
80
|
+
|
69
81
|
# 2 queries for each new record (1 to save the record itself, 1 for the join model)
|
70
82
|
# * 2 new records = 4
|
71
83
|
# + 1 query to save the actual post = 5
|
@@ -73,27 +85,27 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
73
85
|
posts(:thinking).body += '-changed'
|
74
86
|
posts(:thinking).save
|
75
87
|
end
|
76
|
-
|
88
|
+
|
77
89
|
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Bob")
|
78
90
|
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Ted")
|
79
91
|
end
|
80
92
|
|
81
93
|
def test_delete_association
|
82
94
|
assert_queries(2){posts(:welcome);people(:michael); }
|
83
|
-
|
95
|
+
|
84
96
|
assert_queries(1) do
|
85
97
|
posts(:welcome).people.delete(people(:michael))
|
86
98
|
end
|
87
|
-
|
99
|
+
|
88
100
|
assert_queries(1) do
|
89
101
|
assert posts(:welcome).people.empty?
|
90
102
|
end
|
91
|
-
|
103
|
+
|
92
104
|
assert posts(:welcome).reload.people(true).empty?
|
93
105
|
end
|
94
106
|
|
95
107
|
def test_destroy_association
|
96
|
-
assert_difference "Person.count", -1 do
|
108
|
+
assert_difference ["Person.count", "Reader.count"], -1 do
|
97
109
|
posts(:welcome).people.destroy(people(:michael))
|
98
110
|
end
|
99
111
|
|
@@ -102,7 +114,7 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
102
114
|
end
|
103
115
|
|
104
116
|
def test_destroy_all
|
105
|
-
assert_difference "Person.count", -1 do
|
117
|
+
assert_difference ["Person.count", "Reader.count"], -1 do
|
106
118
|
posts(:welcome).people.destroy_all
|
107
119
|
end
|
108
120
|
|
@@ -110,38 +122,66 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
110
122
|
assert posts(:welcome).people(true).empty?
|
111
123
|
end
|
112
124
|
|
125
|
+
def test_should_raise_exception_for_destroying_mismatching_records
|
126
|
+
assert_no_difference ["Person.count", "Reader.count"] do
|
127
|
+
assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:welcome).people.destroy(posts(:thinking)) }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
113
131
|
def test_replace_association
|
114
132
|
assert_queries(4){posts(:welcome);people(:david);people(:michael); posts(:welcome).people(true)}
|
115
|
-
|
133
|
+
|
116
134
|
# 1 query to delete the existing reader (michael)
|
117
135
|
# 1 query to associate the new reader (david)
|
118
136
|
assert_queries(2) do
|
119
137
|
posts(:welcome).people = [people(:david)]
|
120
138
|
end
|
121
|
-
|
139
|
+
|
122
140
|
assert_queries(0){
|
123
141
|
assert posts(:welcome).people.include?(people(:david))
|
124
142
|
assert !posts(:welcome).people.include?(people(:michael))
|
125
143
|
}
|
126
|
-
|
144
|
+
|
127
145
|
assert posts(:welcome).reload.people(true).include?(people(:david))
|
128
146
|
assert !posts(:welcome).reload.people(true).include?(people(:michael))
|
129
147
|
end
|
130
148
|
|
149
|
+
def test_replace_order_is_preserved
|
150
|
+
posts(:welcome).people.clear
|
151
|
+
posts(:welcome).people = [people(:david), people(:michael)]
|
152
|
+
assert_equal [people(:david).id, people(:michael).id], posts(:welcome).readers.order('id').map(&:person_id)
|
153
|
+
|
154
|
+
# Test the inverse order in case the first success was a coincidence
|
155
|
+
posts(:welcome).people.clear
|
156
|
+
posts(:welcome).people = [people(:michael), people(:david)]
|
157
|
+
assert_equal [people(:michael).id, people(:david).id], posts(:welcome).readers.order('id').map(&:person_id)
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_replace_by_id_order_is_preserved
|
161
|
+
posts(:welcome).people.clear
|
162
|
+
posts(:welcome).person_ids = [people(:david).id, people(:michael).id]
|
163
|
+
assert_equal [people(:david).id, people(:michael).id], posts(:welcome).readers.order('id').map(&:person_id)
|
164
|
+
|
165
|
+
# Test the inverse order in case the first success was a coincidence
|
166
|
+
posts(:welcome).people.clear
|
167
|
+
posts(:welcome).person_ids = [people(:michael).id, people(:david).id]
|
168
|
+
assert_equal [people(:michael).id, people(:david).id], posts(:welcome).readers.order('id').map(&:person_id)
|
169
|
+
end
|
170
|
+
|
131
171
|
def test_associate_with_create
|
132
172
|
assert_queries(1) { posts(:thinking) }
|
133
|
-
|
173
|
+
|
134
174
|
# 1 query for the new record, 1 for the join table record
|
135
175
|
# No need to update the actual collection yet!
|
136
176
|
assert_queries(2) do
|
137
177
|
posts(:thinking).people.create(:first_name=>"Jeb")
|
138
178
|
end
|
139
|
-
|
179
|
+
|
140
180
|
# *Now* we actually need the collection so it's loaded
|
141
181
|
assert_queries(1) do
|
142
182
|
assert posts(:thinking).people.collect(&:first_name).include?("Jeb")
|
143
183
|
end
|
144
|
-
|
184
|
+
|
145
185
|
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Jeb")
|
146
186
|
end
|
147
187
|
|
@@ -151,23 +191,74 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
151
191
|
assert_equal peeps + 1, posts(:thinking).people.count
|
152
192
|
end
|
153
193
|
|
194
|
+
def test_associate_with_create_with_through_having_conditions
|
195
|
+
impatient_people = posts(:thinking).impatient_people.count
|
196
|
+
posts(:thinking).impatient_people.create!(:first_name => 'foo')
|
197
|
+
assert_equal impatient_people + 1, posts(:thinking).impatient_people.count
|
198
|
+
end
|
199
|
+
|
154
200
|
def test_associate_with_create_exclamation_and_no_options
|
155
201
|
peeps = posts(:thinking).people.count
|
156
202
|
posts(:thinking).people.create!(:first_name => 'foo')
|
157
203
|
assert_equal peeps + 1, posts(:thinking).people.count
|
158
204
|
end
|
159
205
|
|
206
|
+
def test_create_on_new_record
|
207
|
+
p = Post.new
|
208
|
+
|
209
|
+
assert_raises(ActiveRecord::RecordNotSaved) { p.people.create(:first_name => "mew") }
|
210
|
+
assert_raises(ActiveRecord::RecordNotSaved) { p.people.create!(:first_name => "snow") }
|
211
|
+
end
|
212
|
+
|
213
|
+
def test_associate_with_create_and_invalid_options
|
214
|
+
firm = companies(:first_firm)
|
215
|
+
assert_no_difference('firm.developers.count') { assert_nothing_raised { firm.developers.create(:name => '0') } }
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_associate_with_create_and_valid_options
|
219
|
+
firm = companies(:first_firm)
|
220
|
+
assert_difference('firm.developers.count', 1) { firm.developers.create(:name => 'developer') }
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_associate_with_create_bang_and_invalid_options
|
224
|
+
firm = companies(:first_firm)
|
225
|
+
assert_no_difference('firm.developers.count') { assert_raises(ActiveRecord::RecordInvalid) { firm.developers.create!(:name => '0') } }
|
226
|
+
end
|
227
|
+
|
228
|
+
def test_associate_with_create_bang_and_valid_options
|
229
|
+
firm = companies(:first_firm)
|
230
|
+
assert_difference('firm.developers.count', 1) { firm.developers.create!(:name => 'developer') }
|
231
|
+
end
|
232
|
+
|
233
|
+
def test_push_with_invalid_record
|
234
|
+
firm = companies(:first_firm)
|
235
|
+
assert_raises(ActiveRecord::RecordInvalid) { firm.developers << Developer.new(:name => '0') }
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_push_with_invalid_join_record
|
239
|
+
repair_validations(Contract) do
|
240
|
+
Contract.validate {|r| r.errors[:base] << 'Invalid Contract' }
|
241
|
+
|
242
|
+
firm = companies(:first_firm)
|
243
|
+
lifo = Developer.new(:name => 'lifo')
|
244
|
+
assert_raises(ActiveRecord::RecordInvalid) { firm.developers << lifo }
|
245
|
+
|
246
|
+
lifo = Developer.create!(:name => 'lifo')
|
247
|
+
assert_raises(ActiveRecord::RecordInvalid) { firm.developers << lifo }
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
160
251
|
def test_clear_associations
|
161
252
|
assert_queries(2) { posts(:welcome);posts(:welcome).people(true) }
|
162
|
-
|
253
|
+
|
163
254
|
assert_queries(1) do
|
164
255
|
posts(:welcome).people.clear
|
165
256
|
end
|
166
|
-
|
257
|
+
|
167
258
|
assert_queries(0) do
|
168
259
|
assert posts(:welcome).people.empty?
|
169
260
|
end
|
170
|
-
|
261
|
+
|
171
262
|
assert posts(:welcome).reload.people(true).empty?
|
172
263
|
end
|
173
264
|
|
@@ -205,7 +296,7 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
205
296
|
], log.last(2)
|
206
297
|
|
207
298
|
post.people_with_callbacks = [people(:michael),people(:david), Person.new(:first_name => "Julian"), Person.create!(:first_name => "Roger")]
|
208
|
-
assert_equal
|
299
|
+
assert_equal((%w(Ted Bob Sam Lary) * 2).sort, log[-12..-5].collect(&:last).sort)
|
209
300
|
assert_equal [
|
210
301
|
[:added, :before, "Julian"],
|
211
302
|
[:added, :after, "Julian"],
|
@@ -214,7 +305,7 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
214
305
|
], log.last(4)
|
215
306
|
|
216
307
|
post.people_with_callbacks.clear
|
217
|
-
assert_equal
|
308
|
+
assert_equal((%w(Michael David Julian Roger) * 2).sort, log.last(8).collect(&:last).sort)
|
218
309
|
end
|
219
310
|
|
220
311
|
unless current_adapter?(:IBM_DBAdapter) #refer db2 ? SQL0214N
|
@@ -233,8 +324,12 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
233
324
|
assert_equal 2, people(:michael).jobs.size
|
234
325
|
end
|
235
326
|
|
236
|
-
def
|
237
|
-
assert_equal [posts(:welcome).id, posts(:authorless).id].sort, people(:michael).post_ids.sort
|
327
|
+
def test_get_ids_for_belongs_to_source
|
328
|
+
assert_sql(/DISTINCT/) { assert_equal [posts(:welcome).id, posts(:authorless).id].sort, people(:michael).post_ids.sort }
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_get_ids_for_has_many_source
|
332
|
+
assert_equal [comments(:eager_other_comment1).id], authors(:mary).comment_ids
|
238
333
|
end
|
239
334
|
|
240
335
|
def test_get_ids_for_loaded_associations
|
@@ -278,4 +373,89 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
|
278
373
|
def test_has_many_association_through_a_has_many_association_with_nonstandard_primary_keys
|
279
374
|
assert_equal 1, owners(:blackbeard).toys.count
|
280
375
|
end
|
376
|
+
|
377
|
+
def test_find_on_has_many_association_collection_with_include_and_conditions
|
378
|
+
post_with_no_comments = people(:michael).posts_with_no_comments.first
|
379
|
+
assert_equal post_with_no_comments, posts(:authorless)
|
380
|
+
end
|
381
|
+
|
382
|
+
def test_has_many_through_has_one_reflection
|
383
|
+
assert_equal [comments(:eager_sti_on_associations_vs_comment)], authors(:david).very_special_comments
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_modifying_has_many_through_has_one_reflection_should_raise
|
387
|
+
[
|
388
|
+
lambda { authors(:david).very_special_comments = [VerySpecialComment.create!(:body => "Gorp!", :post_id => 1011), VerySpecialComment.create!(:body => "Eep!", :post_id => 1012)] },
|
389
|
+
lambda { authors(:david).very_special_comments << VerySpecialComment.create!(:body => "Hoohah!", :post_id => 1013) },
|
390
|
+
lambda { authors(:david).very_special_comments.delete(authors(:david).very_special_comments.first) },
|
391
|
+
].each {|block| assert_raise(ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection, &block) }
|
392
|
+
end
|
393
|
+
|
394
|
+
def test_collection_singular_ids_getter_with_string_primary_keys
|
395
|
+
book = books(:awdr)
|
396
|
+
assert_equal 2, book.subscriber_ids.size
|
397
|
+
assert_equal [subscribers(:first).nick, subscribers(:second).nick].sort, book.subscriber_ids.sort
|
398
|
+
end
|
399
|
+
|
400
|
+
def test_collection_singular_ids_setter
|
401
|
+
company = companies(:rails_core)
|
402
|
+
dev = Developer.find(:first)
|
403
|
+
|
404
|
+
company.developer_ids = [dev.id]
|
405
|
+
assert_equal [dev], company.developers
|
406
|
+
end
|
407
|
+
|
408
|
+
def test_collection_singular_ids_setter_with_string_primary_keys
|
409
|
+
assert_nothing_raised do
|
410
|
+
book = books(:awdr)
|
411
|
+
book.subscriber_ids = [subscribers(:second).nick]
|
412
|
+
assert_equal [subscribers(:second)], book.subscribers(true)
|
413
|
+
|
414
|
+
book.subscriber_ids = []
|
415
|
+
assert_equal [], book.subscribers(true)
|
416
|
+
end
|
417
|
+
|
418
|
+
end
|
419
|
+
|
420
|
+
def test_collection_singular_ids_setter_raises_exception_when_invalid_ids_set
|
421
|
+
company = companies(:rails_core)
|
422
|
+
ids = [Developer.find(:first).id, -9999]
|
423
|
+
assert_raises(ActiveRecord::RecordNotFound) {company.developer_ids= ids}
|
424
|
+
end
|
425
|
+
|
426
|
+
def test_build_a_model_from_hm_through_association_with_where_clause
|
427
|
+
assert_nothing_raised { books(:awdr).subscribers.where(:nick => "marklazz").build }
|
428
|
+
end
|
429
|
+
|
430
|
+
def test_attributes_are_being_set_when_initialized_from_hm_through_association_with_where_clause
|
431
|
+
new_subscriber = books(:awdr).subscribers.where(:nick => "marklazz").build
|
432
|
+
assert_equal new_subscriber.nick, "marklazz"
|
433
|
+
end
|
434
|
+
|
435
|
+
def test_attributes_are_being_set_when_initialized_from_hm_through_association_with_multiple_where_clauses
|
436
|
+
new_subscriber = books(:awdr).subscribers.where(:nick => "marklazz").where(:name => 'Marcelo Giorgi').build
|
437
|
+
assert_equal new_subscriber.nick, "marklazz"
|
438
|
+
assert_equal new_subscriber.name, "Marcelo Giorgi"
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_include_method_in_association_through_should_return_true_for_instance_added_with_build
|
442
|
+
person = Person.new
|
443
|
+
reference = person.references.build
|
444
|
+
job = reference.build_job
|
445
|
+
assert person.jobs.include?(job)
|
446
|
+
end
|
447
|
+
|
448
|
+
def test_include_method_in_association_through_should_return_true_for_instance_added_with_nested_builds
|
449
|
+
author = Author.new
|
450
|
+
post = author.posts.build
|
451
|
+
comment = post.comments.build
|
452
|
+
assert author.comments.include?(comment)
|
453
|
+
end
|
454
|
+
|
455
|
+
def test_size_of_through_association_should_increase_correctly_when_has_many_association_is_added
|
456
|
+
post = posts(:thinking)
|
457
|
+
readers = post.readers.size
|
458
|
+
post.people << people(:michael)
|
459
|
+
assert_equal readers + 1, post.readers.size
|
460
|
+
end
|
281
461
|
end
|
@@ -14,7 +14,9 @@ require 'models/citation'
|
|
14
14
|
|
15
15
|
class AssociationsJoinModelTest < ActiveRecord::TestCase
|
16
16
|
self.use_transactional_fixtures = false
|
17
|
-
fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books
|
17
|
+
fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books,
|
18
|
+
# Reload edges table from fixtures as otherwise repeated test was failing
|
19
|
+
:edges
|
18
20
|
|
19
21
|
def test_has_many
|
20
22
|
assert authors(:david).categories.include?(categories(:general))
|
@@ -79,18 +81,6 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
79
81
|
#
|
80
82
|
end
|
81
83
|
|
82
|
-
def test_polymorphic_has_many
|
83
|
-
assert posts(:welcome).taggings.include?(taggings(:welcome_general))
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_polymorphic_has_one
|
87
|
-
assert_equal taggings(:welcome_general), posts(:welcome).tagging
|
88
|
-
end
|
89
|
-
|
90
|
-
def test_polymorphic_belongs_to
|
91
|
-
assert_equal posts(:welcome), posts(:welcome).taggings.first.taggable
|
92
|
-
end
|
93
|
-
|
94
84
|
def test_polymorphic_has_many_going_through_join_model
|
95
85
|
assert_equal tags(:general), tag = posts(:welcome).tags.first
|
96
86
|
assert_no_queries do
|
@@ -319,16 +309,16 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
319
309
|
|
320
310
|
def test_has_many_find_conditions
|
321
311
|
assert_equal categories(:general), authors(:david).categories.find(:first, :conditions => "categories.name = 'General'")
|
322
|
-
|
312
|
+
assert_nil authors(:david).categories.find(:first, :conditions => "categories.name = 'Technology'")
|
323
313
|
end
|
324
314
|
|
325
315
|
def test_has_many_class_methods_called_by_method_missing
|
326
316
|
assert_equal categories(:general), authors(:david).categories.find_all_by_name('General').first
|
327
|
-
|
317
|
+
assert_nil authors(:david).categories.find_by_name('Technology')
|
328
318
|
end
|
329
319
|
|
330
320
|
def test_has_many_array_methods_called_by_method_missing
|
331
|
-
assert
|
321
|
+
assert authors(:david).categories.any? { |category| category.name == 'General' }
|
332
322
|
assert_nothing_raised { authors(:david).categories.sort }
|
333
323
|
end
|
334
324
|
|
@@ -336,7 +326,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
336
326
|
assert_equal [], posts(:thinking).authors
|
337
327
|
assert_equal [authors(:mary)], posts(:authorless).authors
|
338
328
|
end
|
339
|
-
|
329
|
+
|
340
330
|
def test_both_scoped_and_explicit_joins_should_be_respected
|
341
331
|
assert_nothing_raised do
|
342
332
|
Post.send(:with_scope, :find => {:joins => "left outer join comments on comments.id = posts.id"}) do
|
@@ -346,11 +336,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
346
336
|
end
|
347
337
|
|
348
338
|
def test_belongs_to_polymorphic_with_counter_cache
|
349
|
-
assert_equal
|
339
|
+
assert_equal 1, posts(:welcome)[:taggings_count]
|
350
340
|
tagging = posts(:welcome).taggings.create(:tag => tags(:general))
|
351
|
-
assert_equal
|
341
|
+
assert_equal 2, posts(:welcome, :reload)[:taggings_count]
|
352
342
|
tagging.destroy
|
353
|
-
|
343
|
+
assert_equal 1, posts(:welcome, :reload)[:taggings_count]
|
354
344
|
end
|
355
345
|
|
356
346
|
def test_unavailable_through_reflection
|
@@ -372,14 +362,16 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
372
362
|
end
|
373
363
|
|
374
364
|
def test_has_many_polymorphic_with_source_type
|
375
|
-
|
365
|
+
# added sort by ID as otherwise Oracle select sometimes returned rows in different order
|
366
|
+
assert_equal posts(:welcome, :thinking).sort_by(&:id), tags(:general).tagged_posts.sort_by(&:id)
|
376
367
|
end
|
377
368
|
|
378
369
|
def test_eager_has_many_polymorphic_with_source_type
|
379
370
|
tag_with_include = Tag.find(tags(:general).id, :include => :tagged_posts)
|
380
371
|
desired = posts(:welcome, :thinking)
|
381
372
|
assert_no_queries do
|
382
|
-
|
373
|
+
# added sort by ID as otherwise test using JRuby was failing as array elements were in different order
|
374
|
+
assert_equal desired.sort_by(&:id), tag_with_include.tagged_posts.sort_by(&:id)
|
383
375
|
end
|
384
376
|
assert_equal 5, tag_with_include.taggings.length
|
385
377
|
end
|
@@ -406,7 +398,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
406
398
|
end
|
407
399
|
|
408
400
|
def test_has_many_through_polymorphic_has_one
|
409
|
-
|
401
|
+
assert_equal Tagging.find(1,2).sort_by { |t| t.id }, authors(:david).tagging
|
410
402
|
end
|
411
403
|
|
412
404
|
def test_has_many_through_polymorphic_has_many
|
@@ -493,8 +485,8 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
493
485
|
|
494
486
|
def test_has_many_through_uses_conditions_specified_on_the_has_many_association
|
495
487
|
author = Author.find(:first)
|
496
|
-
|
497
|
-
|
488
|
+
assert_present author.comments
|
489
|
+
assert_blank author.nonexistant_comments
|
498
490
|
end
|
499
491
|
|
500
492
|
def test_has_many_through_uses_correct_attributes
|
@@ -506,11 +498,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
506
498
|
new_tag = Tag.new(:name => "new")
|
507
499
|
|
508
500
|
saved_post.tags << new_tag
|
509
|
-
assert
|
510
|
-
assert
|
501
|
+
assert new_tag.persisted? #consistent with habtm!
|
502
|
+
assert saved_post.persisted?
|
511
503
|
assert saved_post.tags.include?(new_tag)
|
512
504
|
|
513
|
-
assert
|
505
|
+
assert new_tag.persisted?
|
514
506
|
assert saved_post.reload.tags(true).include?(new_tag)
|
515
507
|
|
516
508
|
|
@@ -518,16 +510,16 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
518
510
|
saved_tag = tags(:general)
|
519
511
|
|
520
512
|
new_post.tags << saved_tag
|
521
|
-
assert new_post.
|
522
|
-
assert
|
513
|
+
assert !new_post.persisted?
|
514
|
+
assert saved_tag.persisted?
|
523
515
|
assert new_post.tags.include?(saved_tag)
|
524
516
|
|
525
517
|
new_post.save!
|
526
|
-
assert
|
518
|
+
assert new_post.persisted?
|
527
519
|
assert new_post.reload.tags(true).include?(saved_tag)
|
528
520
|
|
529
|
-
assert posts(:thinking).tags.build.
|
530
|
-
assert posts(:thinking).tags.new.
|
521
|
+
assert !posts(:thinking).tags.build.persisted?
|
522
|
+
assert !posts(:thinking).tags.new.persisted?
|
531
523
|
end
|
532
524
|
|
533
525
|
def test_create_associate_when_adding_to_has_many_through
|
@@ -641,7 +633,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
641
633
|
def test_calculations_on_has_many_through_should_disambiguate_fields
|
642
634
|
assert_nothing_raised { authors(:david).categories.maximum(:id) }
|
643
635
|
end
|
644
|
-
|
636
|
+
|
645
637
|
def test_calculations_on_has_many_through_should_not_disambiguate_fields_unless_necessary
|
646
638
|
assert_nothing_raised { authors(:david).categories.maximum("categories.id") }
|
647
639
|
end
|