ibm_db 0.10.0 → 1.0.0
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 +15 -0
- data/README +3 -3
- data/lib/active_record/connection_adapters/ibm_db_adapter.rb +287 -125
- data/test/cases/associations/cascaded_eager_loading_test.rb +13 -1
- data/test/cases/associations/eager_test.rb +34 -1
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +29 -5
- data/test/cases/associations/has_many_through_associations_test.rb +202 -0
- data/test/cases/associations/join_model_test.rb +6 -0
- data/test/cases/base_test.rb +89 -48
- data/test/cases/calculations_test.rb +55 -3
- data/test/cases/finder_test.rb +483 -468
- data/test/cases/migration_test.rb +221 -61
- data/test/cases/query_cache_test.rb +77 -76
- data/test/cases/schema_dumper_test.rb +186 -0
- data/test/cases/validations_test.rb +37 -5
- data/test/schema/schema.rb +8 -0
- metadata +35 -32
@@ -9,7 +9,7 @@ require 'models/topic'
|
|
9
9
|
require 'models/reply'
|
10
10
|
|
11
11
|
class CascadedEagerLoadingTest < ActiveRecord::TestCase
|
12
|
-
fixtures :authors, :mixins, :companies, :posts, :topics
|
12
|
+
fixtures :authors, :mixins, :companies, :posts, :topics, :accounts, :comments, :categorizations
|
13
13
|
|
14
14
|
def test_eager_association_loading_with_cascaded_two_levels
|
15
15
|
authors = Author.find(:all, :include=>{:posts=>:comments}, :order=>"authors.id")
|
@@ -68,6 +68,18 @@ class CascadedEagerLoadingTest < ActiveRecord::TestCase
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
+
def test_eager_association_loading_with_has_many_sti_and_subclasses
|
72
|
+
silly = SillyReply.new(:title => "gaga", :content => "boo-boo", :parent_id => 1)
|
73
|
+
silly.parent_id = 1
|
74
|
+
assert silly.save
|
75
|
+
|
76
|
+
topics = Topic.find(:all, :include => :replies, :order => 'topics.id, replies_topics.id')
|
77
|
+
assert_no_queries do
|
78
|
+
assert_equal 2, topics[0].replies.size
|
79
|
+
assert_equal 0, topics[1].replies.size
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
71
83
|
def test_eager_association_loading_with_belongs_to_sti
|
72
84
|
replies = Reply.find(:all, :include => :topic, :order => 'topics.id')
|
73
85
|
assert replies.include?(topics(:second))
|
@@ -14,11 +14,14 @@ require 'models/job'
|
|
14
14
|
require 'models/subscriber'
|
15
15
|
require 'models/subscription'
|
16
16
|
require 'models/book'
|
17
|
+
require 'models/developer'
|
18
|
+
require 'models/project'
|
17
19
|
|
18
20
|
class EagerAssociationTest < ActiveRecord::TestCase
|
19
21
|
fixtures :posts, :comments, :authors, :categories, :categories_posts,
|
20
22
|
:companies, :accounts, :tags, :taggings, :people, :readers,
|
21
|
-
:owners, :pets, :author_favorites, :jobs, :references, :subscribers, :subscriptions, :books
|
23
|
+
:owners, :pets, :author_favorites, :jobs, :references, :subscribers, :subscriptions, :books,
|
24
|
+
:developers, :projects, :developers_projects
|
22
25
|
|
23
26
|
def test_loading_with_one_association
|
24
27
|
posts = Post.find(:all, :include => :comments)
|
@@ -35,6 +38,12 @@ class EagerAssociationTest < ActiveRecord::TestCase
|
|
35
38
|
assert_equal Post.find(1).last_comment, post.last_comment
|
36
39
|
end
|
37
40
|
|
41
|
+
def test_loading_with_one_association_with_non_preload
|
42
|
+
posts = Post.find(:all, :include => :last_comment, :order => 'comments.id DESC')
|
43
|
+
post = posts.find { |p| p.id == 1 }
|
44
|
+
assert_equal Post.find(1).last_comment, post.last_comment
|
45
|
+
end
|
46
|
+
|
38
47
|
def test_loading_conditions_with_or
|
39
48
|
posts = authors(:david).posts.find(:all, :include => :comments, :conditions => "comments.body like 'Normal%' OR comments.#{QUOTED_TYPE} = 'SpecialComment'")
|
40
49
|
assert_nil posts.detect { |p| p.author_id != authors(:david).id },
|
@@ -107,6 +116,13 @@ class EagerAssociationTest < ActiveRecord::TestCase
|
|
107
116
|
assert_equal 2, posts.first.comments.size
|
108
117
|
end
|
109
118
|
|
119
|
+
def test_loading_from_an_association_that_has_a_hash_of_conditions
|
120
|
+
assert_nothing_raised do
|
121
|
+
Author.find(:all, :include => :hello_posts_with_hash_conditions)
|
122
|
+
end
|
123
|
+
assert !Author.find(authors(:david).id, :include => :hello_posts_with_hash_conditions).hello_posts.empty?
|
124
|
+
end
|
125
|
+
|
110
126
|
def test_loading_with_no_associations
|
111
127
|
assert_nil Post.find(posts(:authorless).id, :include => :author).author
|
112
128
|
end
|
@@ -560,6 +576,13 @@ class EagerAssociationTest < ActiveRecord::TestCase
|
|
560
576
|
assert_nothing_raised { Post.find(:all, :include => 'comments') }
|
561
577
|
end
|
562
578
|
|
579
|
+
def test_eager_with_floating_point_numbers
|
580
|
+
assert_queries(2) do
|
581
|
+
# Before changes, the floating point numbers will be interpreted as table names and will cause this to run in one query
|
582
|
+
Comment.find :all, :conditions => "123.456 = 123.456", :include => :post
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
563
586
|
def test_preconfigured_includes_with_belongs_to
|
564
587
|
author = posts(:welcome).author_with_posts
|
565
588
|
assert_no_queries {assert_equal 5, author.posts.size}
|
@@ -613,4 +636,14 @@ class EagerAssociationTest < ActiveRecord::TestCase
|
|
613
636
|
Comment.find :all, :include => :post
|
614
637
|
end
|
615
638
|
end
|
639
|
+
|
640
|
+
def test_conditions_on_join_table_with_include_and_limit
|
641
|
+
assert_equal 3, Developer.find(:all, :include => 'projects', :conditions => 'developers_projects.access_level = 1', :limit => 5).size
|
642
|
+
end
|
643
|
+
|
644
|
+
unless current_adapter?(:IBM_DBAdapter) #refer db2 ? SQL0214N
|
645
|
+
def test_order_on_join_table_with_include_and_limit
|
646
|
+
assert_equal 5, Developer.find(:all, :include => 'projects', :order => 'developers_projects.joined_on DESC', :limit => 5).size
|
647
|
+
end
|
648
|
+
end
|
616
649
|
end
|
@@ -70,7 +70,7 @@ end
|
|
70
70
|
|
71
71
|
class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
72
72
|
fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
|
73
|
-
:parrots, :pirates, :treasures, :price_estimates
|
73
|
+
:parrots, :pirates, :treasures, :price_estimates, :tags, :taggings
|
74
74
|
|
75
75
|
def test_has_and_belongs_to_many
|
76
76
|
david = Developer.find(1)
|
@@ -299,6 +299,17 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
299
299
|
assert_equal 3, projects(:active_record, :reload).developers.size
|
300
300
|
end
|
301
301
|
|
302
|
+
def test_uniq_option_prevents_duplicate_push
|
303
|
+
project = projects(:active_record)
|
304
|
+
project.developers << developers(:jamis)
|
305
|
+
project.developers << developers(:david)
|
306
|
+
assert_equal 3, project.developers.size
|
307
|
+
|
308
|
+
project.developers << developers(:david)
|
309
|
+
project.developers << developers(:jamis)
|
310
|
+
assert_equal 3, project.developers.size
|
311
|
+
end
|
312
|
+
|
302
313
|
def test_deleting
|
303
314
|
david = Developer.find(1)
|
304
315
|
active_record = Project.find(1)
|
@@ -439,6 +450,13 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
439
450
|
assert_equal developers(:david), active_record.developers_with_finder_sql.find(developers(:david).id), "Ruby find"
|
440
451
|
end
|
441
452
|
|
453
|
+
def test_find_in_association_with_custom_finder_sql_and_multiple_interpolations
|
454
|
+
# interpolate once:
|
455
|
+
assert_equal [developers(:david), developers(:jamis), developers(:poor_jamis)], projects(:active_record).developers_with_finder_sql, "first interpolation"
|
456
|
+
# interpolate again, for a different project id
|
457
|
+
assert_equal [developers(:david)], projects(:action_controller).developers_with_finder_sql, "second interpolation"
|
458
|
+
end
|
459
|
+
|
442
460
|
def test_find_in_association_with_custom_finder_sql_and_string_id
|
443
461
|
assert_equal developers(:david), projects(:active_record).developers_with_finder_sql.find(developers(:david).id.to_s), "SQL find"
|
444
462
|
end
|
@@ -629,8 +647,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
629
647
|
developer.save
|
630
648
|
developer.reload
|
631
649
|
assert_equal 2, developer.projects.length
|
632
|
-
assert_equal projects(:active_record), developer.
|
633
|
-
assert_equal projects(:action_controller), developer.projects[1]
|
650
|
+
assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
|
634
651
|
end
|
635
652
|
|
636
653
|
def test_assign_ids_ignoring_blanks
|
@@ -639,8 +656,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
639
656
|
developer.save
|
640
657
|
developer.reload
|
641
658
|
assert_equal 2, developer.projects.length
|
642
|
-
assert_equal projects(:active_record), developer.
|
643
|
-
assert_equal projects(:action_controller), developer.projects[1]
|
659
|
+
assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
|
644
660
|
end
|
645
661
|
|
646
662
|
unless current_adapter?(:IBM_DBAdapter)
|
@@ -683,4 +699,12 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|
683
699
|
assert_equal developer, project.developers.find(:first)
|
684
700
|
assert_equal project, developer.projects.find(:first)
|
685
701
|
end
|
702
|
+
|
703
|
+
unless current_adapter?(:IBM_DBAdapter)#refer SQL0214N
|
704
|
+
def test_dynamic_find_should_respect_association_include
|
705
|
+
# SQL error in sort clause if :include is not included
|
706
|
+
# due to Unknown column 'authors.id'
|
707
|
+
assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title('Welcome to the weblog')
|
708
|
+
end
|
709
|
+
end
|
686
710
|
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require "cases/helper"
|
2
|
+
require 'models/post'
|
3
|
+
require 'models/person'
|
4
|
+
require 'models/reader'
|
5
|
+
|
6
|
+
class HasManyThroughAssociationsTest < ActiveRecord::TestCase
|
7
|
+
fixtures :posts, :readers, :people
|
8
|
+
|
9
|
+
def test_associate_existing
|
10
|
+
assert_queries(2) { posts(:thinking);people(:david) }
|
11
|
+
|
12
|
+
assert_queries(1) do
|
13
|
+
posts(:thinking).people << people(:david)
|
14
|
+
end
|
15
|
+
|
16
|
+
assert_queries(1) do
|
17
|
+
assert posts(:thinking).people.include?(people(:david))
|
18
|
+
end
|
19
|
+
|
20
|
+
assert posts(:thinking).reload.people(true).include?(people(:david))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_associating_new
|
24
|
+
assert_queries(1) { posts(:thinking) }
|
25
|
+
new_person = nil # so block binding catches it
|
26
|
+
|
27
|
+
assert_queries(0) do
|
28
|
+
new_person = Person.new :first_name => 'bob'
|
29
|
+
end
|
30
|
+
|
31
|
+
# Associating new records always saves them
|
32
|
+
# Thus, 1 query for the new person record, 1 query for the new join table record
|
33
|
+
assert_queries(2) do
|
34
|
+
posts(:thinking).people << new_person
|
35
|
+
end
|
36
|
+
|
37
|
+
assert_queries(1) do
|
38
|
+
assert posts(:thinking).people.include?(new_person)
|
39
|
+
end
|
40
|
+
|
41
|
+
assert posts(:thinking).reload.people(true).include?(new_person)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_associate_new_by_building
|
45
|
+
assert_queries(1) { posts(:thinking) }
|
46
|
+
|
47
|
+
assert_queries(0) do
|
48
|
+
posts(:thinking).people.build(:first_name=>"Bob")
|
49
|
+
posts(:thinking).people.new(:first_name=>"Ted")
|
50
|
+
end
|
51
|
+
|
52
|
+
# Should only need to load the association once
|
53
|
+
assert_queries(1) do
|
54
|
+
assert posts(:thinking).people.collect(&:first_name).include?("Bob")
|
55
|
+
assert posts(:thinking).people.collect(&:first_name).include?("Ted")
|
56
|
+
end
|
57
|
+
|
58
|
+
# 2 queries for each new record (1 to save the record itself, 1 for the join model)
|
59
|
+
# * 2 new records = 4
|
60
|
+
# + 1 query to save the actual post = 5
|
61
|
+
assert_queries(5) do
|
62
|
+
posts(:thinking).body += '-changed'
|
63
|
+
posts(:thinking).save
|
64
|
+
end
|
65
|
+
|
66
|
+
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Bob")
|
67
|
+
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Ted")
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_delete_association
|
71
|
+
assert_queries(2){posts(:welcome);people(:michael); }
|
72
|
+
|
73
|
+
assert_queries(1) do
|
74
|
+
posts(:welcome).people.delete(people(:michael))
|
75
|
+
end
|
76
|
+
|
77
|
+
assert_queries(1) do
|
78
|
+
assert posts(:welcome).people.empty?
|
79
|
+
end
|
80
|
+
|
81
|
+
assert posts(:welcome).reload.people(true).empty?
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_replace_association
|
85
|
+
assert_queries(4){posts(:welcome);people(:david);people(:michael); posts(:welcome).people(true)}
|
86
|
+
|
87
|
+
# 1 query to delete the existing reader (michael)
|
88
|
+
# 1 query to associate the new reader (david)
|
89
|
+
assert_queries(2) do
|
90
|
+
posts(:welcome).people = [people(:david)]
|
91
|
+
end
|
92
|
+
|
93
|
+
assert_queries(0){
|
94
|
+
assert posts(:welcome).people.include?(people(:david))
|
95
|
+
assert !posts(:welcome).people.include?(people(:michael))
|
96
|
+
}
|
97
|
+
|
98
|
+
assert posts(:welcome).reload.people(true).include?(people(:david))
|
99
|
+
assert !posts(:welcome).reload.people(true).include?(people(:michael))
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_associate_with_create
|
103
|
+
assert_queries(1) { posts(:thinking) }
|
104
|
+
|
105
|
+
# 1 query for the new record, 1 for the join table record
|
106
|
+
# No need to update the actual collection yet!
|
107
|
+
assert_queries(2) do
|
108
|
+
posts(:thinking).people.create(:first_name=>"Jeb")
|
109
|
+
end
|
110
|
+
|
111
|
+
# *Now* we actually need the collection so it's loaded
|
112
|
+
assert_queries(1) do
|
113
|
+
assert posts(:thinking).people.collect(&:first_name).include?("Jeb")
|
114
|
+
end
|
115
|
+
|
116
|
+
assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Jeb")
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_associate_with_create_and_no_options
|
120
|
+
peeps = posts(:thinking).people.count
|
121
|
+
posts(:thinking).people.create(:first_name => 'foo')
|
122
|
+
assert_equal peeps + 1, posts(:thinking).people.count
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_associate_with_create_exclamation_and_no_options
|
126
|
+
peeps = posts(:thinking).people.count
|
127
|
+
posts(:thinking).people.create!(:first_name => 'foo')
|
128
|
+
assert_equal peeps + 1, posts(:thinking).people.count
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_clear_associations
|
132
|
+
assert_queries(2) { posts(:welcome);posts(:welcome).people(true) }
|
133
|
+
|
134
|
+
assert_queries(1) do
|
135
|
+
posts(:welcome).people.clear
|
136
|
+
end
|
137
|
+
|
138
|
+
assert_queries(0) do
|
139
|
+
assert posts(:welcome).people.empty?
|
140
|
+
end
|
141
|
+
|
142
|
+
assert posts(:welcome).reload.people(true).empty?
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_association_callback_ordering
|
146
|
+
Post.reset_log
|
147
|
+
log = Post.log
|
148
|
+
post = posts(:thinking)
|
149
|
+
|
150
|
+
post.people_with_callbacks << people(:michael)
|
151
|
+
assert_equal [
|
152
|
+
[:added, :before, "Michael"],
|
153
|
+
[:added, :after, "Michael"]
|
154
|
+
], log.last(2)
|
155
|
+
|
156
|
+
post.people_with_callbacks.push(people(:david), Person.create!(:first_name => "Bob"), Person.new(:first_name => "Lary"))
|
157
|
+
assert_equal [
|
158
|
+
[:added, :before, "David"],
|
159
|
+
[:added, :after, "David"],
|
160
|
+
[:added, :before, "Bob"],
|
161
|
+
[:added, :after, "Bob"],
|
162
|
+
[:added, :before, "Lary"],
|
163
|
+
[:added, :after, "Lary"]
|
164
|
+
],log.last(6)
|
165
|
+
|
166
|
+
post.people_with_callbacks.build(:first_name => "Ted")
|
167
|
+
assert_equal [
|
168
|
+
[:added, :before, "Ted"],
|
169
|
+
[:added, :after, "Ted"]
|
170
|
+
], log.last(2)
|
171
|
+
|
172
|
+
post.people_with_callbacks.create(:first_name => "Sam")
|
173
|
+
assert_equal [
|
174
|
+
[:added, :before, "Sam"],
|
175
|
+
[:added, :after, "Sam"]
|
176
|
+
], log.last(2)
|
177
|
+
|
178
|
+
post.people_with_callbacks = [people(:michael),people(:david), Person.new(:first_name => "Julian"), Person.create!(:first_name => "Roger")]
|
179
|
+
assert_equal (%w(Ted Bob Sam Lary) * 2).sort, log[-12..-5].collect(&:last).sort
|
180
|
+
assert_equal [
|
181
|
+
[:added, :before, "Julian"],
|
182
|
+
[:added, :after, "Julian"],
|
183
|
+
[:added, :before, "Roger"],
|
184
|
+
[:added, :after, "Roger"]
|
185
|
+
], log.last(4)
|
186
|
+
|
187
|
+
post.people_with_callbacks.clear
|
188
|
+
assert_equal (%w(Michael David Julian Roger) * 2).sort, log.last(8).collect(&:last).sort
|
189
|
+
end
|
190
|
+
|
191
|
+
unless current_adapter?(:IBM_DBAdapter) #refer db2 ? SQL0214N
|
192
|
+
def test_dynamic_find_should_respect_association_include
|
193
|
+
# SQL error in sort clause if :include is not included
|
194
|
+
# due to Unknown column 'comments.id'
|
195
|
+
assert Person.find(1).posts_with_comments_sorted_by_comment_id.find_by_title('Welcome to the weblog')
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_count_with_include_should_alias_join_table
|
200
|
+
assert_equal 2, people(:michael).posts.count(:include => :readers)
|
201
|
+
end
|
202
|
+
end
|
@@ -783,6 +783,12 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|
783
783
|
assert ! david.categories.include?(category)
|
784
784
|
end
|
785
785
|
end
|
786
|
+
def test_has_many_through_goes_through_all_sti_classes
|
787
|
+
sub_sti_post = SubStiPost.create!(:title => 'test', :body => 'test', :author_id => 1)
|
788
|
+
new_comment = sub_sti_post.comments.create(:body => 'test')
|
789
|
+
|
790
|
+
assert_equal [9, 10, new_comment.id], authors(:david).sti_post_comments.map(&:id).sort
|
791
|
+
end
|
786
792
|
|
787
793
|
private
|
788
794
|
# create dynamic Post models to allow different dependency options
|
data/test/cases/base_test.rb
CHANGED
@@ -19,6 +19,7 @@ require 'models/warehouse_thing'
|
|
19
19
|
require 'rexml/document'
|
20
20
|
|
21
21
|
class Category < ActiveRecord::Base; end
|
22
|
+
class Categorization < ActiveRecord::Base; end
|
22
23
|
class Smarts < ActiveRecord::Base; end
|
23
24
|
class CreditCard < ActiveRecord::Base
|
24
25
|
class PinNumber < ActiveRecord::Base
|
@@ -75,8 +76,8 @@ class TopicWithProtectedContentAndAccessibleAuthorName < ActiveRecord::Base
|
|
75
76
|
end
|
76
77
|
|
77
78
|
class BasicsTest < ActiveRecord::TestCase
|
78
|
-
fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, :warehouse_things, :authors
|
79
|
-
|
79
|
+
fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, :warehouse_things, :authors, :categorizations, :categories
|
80
|
+
|
80
81
|
def test_table_exists
|
81
82
|
assert !NonExistentTable.table_exists?
|
82
83
|
assert Topic.table_exists?
|
@@ -130,7 +131,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
130
131
|
|
131
132
|
def test_read_attributes_before_type_cast
|
132
133
|
category = Category.new({:name=>"Test categoty", :type => nil})
|
133
|
-
category_attrs = {"name"=>"Test categoty", "type" => nil}
|
134
|
+
category_attrs = {"name"=>"Test categoty", "type" => nil, "categorizations_count" => nil}
|
134
135
|
assert_equal category_attrs , category.attributes_before_type_cast
|
135
136
|
end
|
136
137
|
|
@@ -434,12 +435,12 @@ class BasicsTest < ActiveRecord::TestCase
|
|
434
435
|
# Sybase ctlib does not (yet?) support the date type; use datetime instead.
|
435
436
|
# Oracle treats all dates/times as Time.
|
436
437
|
assert_kind_of(
|
437
|
-
|
438
|
+
Time, Topic.find(1).last_read,
|
438
439
|
"The last_read attribute should be of the Time class"
|
439
440
|
)
|
440
441
|
else
|
441
442
|
assert_kind_of(
|
442
|
-
|
443
|
+
Date, Topic.find(1).last_read,
|
443
444
|
"The last_read attribute should be of the Date class"
|
444
445
|
)
|
445
446
|
end
|
@@ -447,12 +448,12 @@ class BasicsTest < ActiveRecord::TestCase
|
|
447
448
|
|
448
449
|
def test_preserving_time_objects
|
449
450
|
assert_kind_of(
|
450
|
-
|
451
|
+
Time, Topic.find(1).bonus_time,
|
451
452
|
"The bonus_time attribute should be of the Time class"
|
452
453
|
)
|
453
454
|
|
454
455
|
assert_kind_of(
|
455
|
-
|
456
|
+
Time, Topic.find(1).written_on,
|
456
457
|
"The written_on attribute should be of the Time class"
|
457
458
|
)
|
458
459
|
|
@@ -613,7 +614,23 @@ class BasicsTest < ActiveRecord::TestCase
|
|
613
614
|
Topic.decrement_counter("replies_count", 2)
|
614
615
|
assert_equal -2, Topic.find(2).replies_count
|
615
616
|
end
|
616
|
-
|
617
|
+
|
618
|
+
def test_update_counter
|
619
|
+
category = categories(:general)
|
620
|
+
assert_nil category.categorizations_count
|
621
|
+
assert_equal 2, category.categorizations.count
|
622
|
+
|
623
|
+
Category.update_counters(category.id, "categorizations_count" => category.categorizations.count)
|
624
|
+
category.reload
|
625
|
+
assert_not_nil category.categorizations_count
|
626
|
+
assert_equal 2, category.categorizations_count
|
627
|
+
|
628
|
+
Category.update_counters(category.id, "categorizations_count" => category.categorizations.count)
|
629
|
+
category.reload
|
630
|
+
assert_not_nil category.categorizations_count
|
631
|
+
assert_equal 4, category.categorizations_count
|
632
|
+
end
|
633
|
+
|
617
634
|
def test_update_all
|
618
635
|
assert_equal Topic.count, Topic.update_all("content = 'bulk updated!'")
|
619
636
|
assert_equal "bulk updated!", Topic.find(1).content
|
@@ -863,7 +880,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
863
880
|
|
864
881
|
def test_mass_assignment_protection_against_class_attribute_writers
|
865
882
|
[:logger, :configurations, :primary_key_prefix_type, :table_name_prefix, :table_name_suffix, :pluralize_table_names, :colorize_logging,
|
866
|
-
|
883
|
+
:default_timezone, :allow_concurrency, :schema_format, :verification_timeout, :lock_optimistically, :record_timestamps].each do |method|
|
867
884
|
assert Task.respond_to?(method)
|
868
885
|
assert Task.respond_to?("#{method}=")
|
869
886
|
assert Task.new.respond_to?(method)
|
@@ -998,7 +1015,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
998
1015
|
def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes
|
999
1016
|
ActiveRecord::Base.time_zone_aware_attributes = true
|
1000
1017
|
ActiveRecord::Base.default_timezone = :utc
|
1001
|
-
Time.zone = TimeZone[-28800]
|
1018
|
+
Time.zone = ActiveSupport::TimeZone[-28800]
|
1002
1019
|
attributes = {
|
1003
1020
|
"written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
|
1004
1021
|
"written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
|
@@ -1016,7 +1033,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1016
1033
|
|
1017
1034
|
def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes_false
|
1018
1035
|
ActiveRecord::Base.time_zone_aware_attributes = false
|
1019
|
-
Time.zone = TimeZone[-28800]
|
1036
|
+
Time.zone = ActiveSupport::TimeZone[-28800]
|
1020
1037
|
attributes = {
|
1021
1038
|
"written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
|
1022
1039
|
"written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
|
@@ -1032,7 +1049,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1032
1049
|
def test_multiparameter_attributes_on_time_with_skip_time_zone_conversion_for_attributes
|
1033
1050
|
ActiveRecord::Base.time_zone_aware_attributes = true
|
1034
1051
|
ActiveRecord::Base.default_timezone = :utc
|
1035
|
-
Time.zone = TimeZone[-28800]
|
1052
|
+
Time.zone = ActiveSupport::TimeZone[-28800]
|
1036
1053
|
Topic.skip_time_zone_conversion_for_attributes = [:written_on]
|
1037
1054
|
attributes = {
|
1038
1055
|
"written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
|
@@ -1049,6 +1066,24 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1049
1066
|
Topic.skip_time_zone_conversion_for_attributes = []
|
1050
1067
|
end
|
1051
1068
|
|
1069
|
+
def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
|
1070
|
+
ActiveRecord::Base.time_zone_aware_attributes = true
|
1071
|
+
ActiveRecord::Base.default_timezone = :utc
|
1072
|
+
Time.zone = ActiveSupport::TimeZone[-28800]
|
1073
|
+
attributes = {
|
1074
|
+
"bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
|
1075
|
+
"bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
|
1076
|
+
}
|
1077
|
+
topic = Topic.find(1)
|
1078
|
+
topic.attributes = attributes
|
1079
|
+
assert_equal Time.utc(2000, 1, 1, 16, 24, 0), topic.bonus_time
|
1080
|
+
assert topic.bonus_time.utc?
|
1081
|
+
ensure
|
1082
|
+
ActiveRecord::Base.time_zone_aware_attributes = false
|
1083
|
+
ActiveRecord::Base.default_timezone = :local
|
1084
|
+
Time.zone = nil
|
1085
|
+
end
|
1086
|
+
|
1052
1087
|
def test_multiparameter_attributes_on_time_with_empty_seconds
|
1053
1088
|
attributes = {
|
1054
1089
|
"written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
|
@@ -1197,13 +1232,13 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1197
1232
|
# values can be a mix of float or integer
|
1198
1233
|
|
1199
1234
|
g = Geometric.new(
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
-
|
1206
|
-
|
1235
|
+
:a_point => '(5.0, 6.1)',
|
1236
|
+
#:a_line => '((2.0, 3), (5.5, 7.0))' # line type is currently unsupported in postgresql
|
1237
|
+
:a_line_segment => '(2.0, 3), (5.5, 7.0)',
|
1238
|
+
:a_box => '2.0, 3, 5.5, 7.0',
|
1239
|
+
:a_path => '[(2.0, 3), (5.5, 7.0), (8.5, 11.0)]', # [ ] is an open path
|
1240
|
+
:a_polygon => '((2.0, 3), (5.5, 7.0), (8.5, 11.0))',
|
1241
|
+
:a_circle => '<(5.3, 10.4), 2>'
|
1207
1242
|
)
|
1208
1243
|
|
1209
1244
|
assert g.save
|
@@ -1225,13 +1260,13 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1225
1260
|
# test alternate formats when defining the geometric types
|
1226
1261
|
|
1227
1262
|
g = Geometric.new(
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1231
|
-
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1263
|
+
:a_point => '5.0, 6.1',
|
1264
|
+
#:a_line => '((2.0, 3), (5.5, 7.0))' # line type is currently unsupported in postgresql
|
1265
|
+
:a_line_segment => '((2.0, 3), (5.5, 7.0))',
|
1266
|
+
:a_box => '(2.0, 3), (5.5, 7.0)',
|
1267
|
+
:a_path => '((2.0, 3), (5.5, 7.0), (8.5, 11.0))', # ( ) is a closed path
|
1268
|
+
:a_polygon => '2.0, 3, 5.5, 7.0, 8.5, 11.0',
|
1269
|
+
:a_circle => '((5.3, 10.4), 2)'
|
1235
1270
|
)
|
1236
1271
|
|
1237
1272
|
assert g.save
|
@@ -1258,10 +1293,10 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1258
1293
|
|
1259
1294
|
def test_numeric_fields
|
1260
1295
|
m = NumericData.new(
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1296
|
+
:bank_balance => 1586.43,
|
1297
|
+
:big_bank_balance => BigDecimal("1000234000567.95"),
|
1298
|
+
:world_population => 6000000000,
|
1299
|
+
:my_house_population => 3
|
1265
1300
|
)
|
1266
1301
|
assert m.save
|
1267
1302
|
|
@@ -1342,7 +1377,13 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1342
1377
|
Topic.serialize("content", MyObject)
|
1343
1378
|
assert_equal(myobj, topic.content)
|
1344
1379
|
end
|
1345
|
-
|
1380
|
+
|
1381
|
+
def test_serialized_time_attribute
|
1382
|
+
myobj = Time.local(2008,1,1,1,0)
|
1383
|
+
topic = Topic.create("content" => myobj).reload
|
1384
|
+
assert_equal(myobj, topic.content)
|
1385
|
+
end
|
1386
|
+
|
1346
1387
|
def test_nil_serialized_attribute_with_class_constraint
|
1347
1388
|
myobj = MyObject.new('value1', 'value2')
|
1348
1389
|
topic = Topic.new
|
@@ -1533,7 +1574,7 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1533
1574
|
res3 = nil
|
1534
1575
|
assert_nothing_raised do
|
1535
1576
|
res3 = Post.count(:conditions => "posts.#{QUOTED_TYPE} = 'Post'",
|
1536
|
-
|
1577
|
+
:joins => "LEFT JOIN comments ON posts.id=comments.post_id")
|
1537
1578
|
end
|
1538
1579
|
assert_equal res, res3
|
1539
1580
|
|
@@ -1552,9 +1593,9 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1552
1593
|
res7 = nil
|
1553
1594
|
assert_nothing_raised do
|
1554
1595
|
res7 = Post.count(:conditions => "p.#{QUOTED_TYPE} = 'Post' AND p.id=co.post_id",
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1596
|
+
:joins => "p, comments co",
|
1597
|
+
:select => "p.id",
|
1598
|
+
:distinct => true)
|
1558
1599
|
end
|
1559
1600
|
assert_equal res6, res7
|
1560
1601
|
end
|
@@ -1569,17 +1610,17 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1569
1610
|
end
|
1570
1611
|
|
1571
1612
|
def test_clear_association_cache_new_record
|
1572
|
-
|
1573
|
-
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
|
1581
|
-
|
1582
|
-
|
1613
|
+
firm = Firm.new
|
1614
|
+
client_stored = Client.find(3)
|
1615
|
+
client_new = Client.new
|
1616
|
+
client_new.name = "The Joneses"
|
1617
|
+
clients = [ client_stored, client_new ]
|
1618
|
+
|
1619
|
+
firm.clients << clients
|
1620
|
+
assert_equal clients.map(&:name).to_set, firm.clients.map(&:name).to_set
|
1621
|
+
|
1622
|
+
firm.clear_association_cache
|
1623
|
+
assert_equal clients.map(&:name).to_set, firm.clients.map(&:name).to_set
|
1583
1624
|
end
|
1584
1625
|
|
1585
1626
|
def test_interpolate_sql
|
@@ -1856,8 +1897,8 @@ class BasicsTest < ActiveRecord::TestCase
|
|
1856
1897
|
|
1857
1898
|
def test_to_xml_including_multiple_associations_with_options
|
1858
1899
|
xml = companies(:first_firm).to_xml(
|
1859
|
-
|
1860
|
-
|
1900
|
+
:indent => 0, :skip_instruct => true,
|
1901
|
+
:include => { :clients => { :only => :name } }
|
1861
1902
|
)
|
1862
1903
|
|
1863
1904
|
assert_equal "<firm>", xml.first(6)
|