ibm_db 0.10.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -3,6 +3,7 @@ require 'bigdecimal/util'
|
|
3
3
|
|
4
4
|
require 'models/person'
|
5
5
|
require 'models/topic'
|
6
|
+
require 'models/developer'
|
6
7
|
|
7
8
|
require MIGRATIONS_ROOT + "/valid/1_people_have_last_names"
|
8
9
|
require MIGRATIONS_ROOT + "/valid/2_we_need_reminders"
|
@@ -48,8 +49,8 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
48
49
|
Person.connection.remove_column('people', column) rescue nil
|
49
50
|
end
|
50
51
|
Person.connection.remove_column("people", "first_name") rescue nil
|
51
|
-
|
52
|
-
|
52
|
+
Person.connection.remove_column("people", "middle_name") rescue nil
|
53
|
+
Person.connection.add_column("people", "first_name", :string, :limit => 40)
|
53
54
|
Person.reset_column_information
|
54
55
|
end
|
55
56
|
|
@@ -124,7 +125,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
124
125
|
def test_create_table_with_defaults
|
125
126
|
# MySQL doesn't allow defaults on TEXT or BLOB columns.
|
126
127
|
mysql = current_adapter?(:MysqlAdapter)
|
127
|
-
|
128
|
+
ibm_ids_zOS = ActiveRecord::Base.connection.servertype.class.name.include?('::IBM_IDS')||
|
128
129
|
ActiveRecord::Base.connection.servertype.class.name.include?('::IBM_DB2_ZOS')
|
129
130
|
|
130
131
|
Person.connection.create_table :testings do |t|
|
@@ -153,39 +154,48 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
153
154
|
end
|
154
155
|
|
155
156
|
if current_adapter?(:IBM_DBAdapter)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
157
|
+
def test_no_limits_datatypes_IBM_DB
|
158
|
+
ibm_ids = ActiveRecord::Base.connection.servertype.class.name.include?('::IBM_IDS')
|
159
|
+
clasz = Class.new(ActiveRecord::Base)
|
160
|
+
clasz.table_name = 'test_no_limits_datatypes_IBM_DB'
|
161
|
+
assert_nothing_raised do
|
162
|
+
clasz.connection.create_table clasz.table_name do |t|
|
163
|
+
t.column "test_varchar", :string, :limit => 10
|
164
|
+
t.column "test_integer", :integer, :limit => 5
|
165
|
+
t.column "test_boolean", :boolean, :limit => 5
|
166
|
+
t.column "test_double", :double, :limit => 10
|
167
|
+
t.column "test_date", :date, :limit => 10
|
168
|
+
t.column "test_time", :time, :limit => 10
|
169
|
+
t.column "test_tstamp", :timestamp, :limit => 10
|
170
|
+
t.column "test_xml", :xml, :limit => 10 unless ibm_ids
|
171
|
+
t.column "test_clob", :text, :limit => 10000
|
171
172
|
end
|
172
|
-
ensure
|
173
|
-
clasz.connection.drop_table(clasz.table_name) rescue nil
|
174
173
|
end
|
174
|
+
ensure
|
175
|
+
clasz.connection.drop_table(clasz.table_name) rescue nil
|
176
|
+
end
|
175
177
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
178
|
+
#Sexy migration test for column of type xml and char
|
179
|
+
def test_short_hand_char_xml_migrations
|
180
|
+
ibm_ids = ActiveRecord::Base.connection.servertype.class.name.include?('::IBM_IDS')
|
181
|
+
clasz = Class.new(ActiveRecord::Base)
|
182
|
+
clasz.table_name = 'test_short_hand_migrations'
|
183
|
+
assert_nothing_raised do
|
184
|
+
clasz.connection.create_table clasz.table_name do |t|
|
185
|
+
t.xml :xml_col unless ibm_ids
|
186
|
+
t.char :char_col, :limit=>10
|
184
187
|
end
|
185
|
-
ensure
|
186
|
-
clasz.connection.drop_table(clasz.table_name) rescue nil
|
187
188
|
end
|
189
|
+
assert_nothing_raised do
|
190
|
+
clasz.connection.change_table clasz.table_name do |t|
|
191
|
+
t.xml :xml_col1 unless ibm_ids
|
192
|
+
t.char :char_col1, :limit=>50
|
193
|
+
end
|
194
|
+
end
|
195
|
+
ensure
|
196
|
+
clasz.connection.drop_table(clasz.table_name) rescue nil
|
188
197
|
end
|
198
|
+
end
|
189
199
|
|
190
200
|
def test_create_table_with_limits
|
191
201
|
assert_nothing_raised do
|
@@ -194,9 +204,10 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
194
204
|
|
195
205
|
t.column :default_int, :integer
|
196
206
|
|
197
|
-
t.column :one_int,
|
198
|
-
t.column :four_int,
|
199
|
-
t.column :eight_int,
|
207
|
+
t.column :one_int, :integer, :limit => 1
|
208
|
+
t.column :four_int, :integer, :limit => 4
|
209
|
+
t.column :eight_int, :integer, :limit => 8
|
210
|
+
t.column :eleven_int, :integer, :limit => 11
|
200
211
|
end
|
201
212
|
end
|
202
213
|
|
@@ -208,12 +219,20 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
208
219
|
one = columns.detect { |c| c.name == "one_int" }
|
209
220
|
four = columns.detect { |c| c.name == "four_int" }
|
210
221
|
eight = columns.detect { |c| c.name == "eight_int" }
|
222
|
+
eleven = columns.detect { |c| c.name == "eleven_int" }
|
211
223
|
|
212
224
|
if current_adapter?(:PostgreSQLAdapter)
|
213
225
|
assert_equal 'integer', default.sql_type
|
214
226
|
assert_equal 'smallint', one.sql_type
|
215
227
|
assert_equal 'integer', four.sql_type
|
216
228
|
assert_equal 'bigint', eight.sql_type
|
229
|
+
assert_equal 'integer', eleven.sql_type
|
230
|
+
elsif current_adapter?(:MysqlAdapter)
|
231
|
+
assert_match 'int(11)', default.sql_type
|
232
|
+
assert_match 'tinyint', one.sql_type
|
233
|
+
assert_match 'int', four.sql_type
|
234
|
+
assert_match 'bigint', eight.sql_type
|
235
|
+
assert_match 'int(11)', eleven.sql_type
|
217
236
|
elsif current_adapter?(:OracleAdapter)
|
218
237
|
assert_equal 'NUMBER(38)', default.sql_type
|
219
238
|
assert_equal 'NUMBER(1)', one.sql_type
|
@@ -268,6 +287,39 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
268
287
|
end
|
269
288
|
end
|
270
289
|
|
290
|
+
def test_create_table_with_timestamps_should_create_datetime_columns
|
291
|
+
table_name = :testings
|
292
|
+
|
293
|
+
Person.connection.create_table table_name do |t|
|
294
|
+
t.timestamps
|
295
|
+
end
|
296
|
+
created_columns = Person.connection.columns(table_name)
|
297
|
+
|
298
|
+
created_at_column = created_columns.detect {|c| c.name == 'created_at' }
|
299
|
+
updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
|
300
|
+
|
301
|
+
assert created_at_column.null
|
302
|
+
assert updated_at_column.null
|
303
|
+
ensure
|
304
|
+
Person.connection.drop_table table_name rescue nil
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_create_table_with_timestamps_should_create_datetime_columns_with_options
|
308
|
+
table_name = :testings
|
309
|
+
|
310
|
+
Person.connection.create_table table_name do |t|
|
311
|
+
t.timestamps :null => false
|
312
|
+
end
|
313
|
+
created_columns = Person.connection.columns(table_name)
|
314
|
+
|
315
|
+
created_at_column = created_columns.detect {|c| c.name == 'created_at' }
|
316
|
+
updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
|
317
|
+
|
318
|
+
assert !created_at_column.null
|
319
|
+
assert !updated_at_column.null
|
320
|
+
ensure
|
321
|
+
Person.connection.drop_table table_name rescue nil
|
322
|
+
end
|
271
323
|
|
272
324
|
# SQL Server, Sybase, and SQLite3 will not allow you to add a NOT NULL
|
273
325
|
# column to a table without a default value.
|
@@ -440,10 +492,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
440
492
|
|
441
493
|
ActiveRecord::Migration.add_column :people, :intelligence_quotient, :tinyint
|
442
494
|
Person.reset_column_information
|
443
|
-
Person.
|
444
|
-
jonnyg = Person.find(:first)
|
445
|
-
assert_equal 127, jonnyg.intelligence_quotient
|
446
|
-
jonnyg.destroy
|
495
|
+
assert_match /tinyint/, Person.columns_hash['intelligence_quotient'].sql_type
|
447
496
|
ensure
|
448
497
|
ActiveRecord::Migration.remove_column :people, :intelligence_quotient rescue nil
|
449
498
|
end
|
@@ -525,6 +574,37 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
525
574
|
end
|
526
575
|
end
|
527
576
|
|
577
|
+
def test_rename_column_preserves_default_value_not_null
|
578
|
+
begin
|
579
|
+
default_before = Developer.connection.columns("developers").find { |c| c.name == "salary" }.default
|
580
|
+
assert_equal 70000, default_before
|
581
|
+
Developer.connection.rename_column "developers", "salary", "anual_salary"
|
582
|
+
Developer.reset_column_information
|
583
|
+
assert Developer.column_names.include?("anual_salary")
|
584
|
+
default_after = Developer.connection.columns("developers").find { |c| c.name == "anual_salary" }.default
|
585
|
+
assert_equal 70000, default_after
|
586
|
+
ensure
|
587
|
+
Developer.connection.rename_column "developers", "anual_salary", "salary"
|
588
|
+
Developer.reset_column_information
|
589
|
+
end
|
590
|
+
end
|
591
|
+
|
592
|
+
def test_rename_nonexistent_column
|
593
|
+
ActiveRecord::Base.connection.create_table(:hats) do |table|
|
594
|
+
table.column :hat_name, :string, :default => nil
|
595
|
+
end
|
596
|
+
exception = if current_adapter?(:PostgreSQLAdapter)
|
597
|
+
ActiveRecord::StatementInvalid
|
598
|
+
else
|
599
|
+
ActiveRecord::ActiveRecordError
|
600
|
+
end
|
601
|
+
assert_raises(exception) do
|
602
|
+
Person.connection.rename_column "hats", "nonexistent", "should_fail"
|
603
|
+
end
|
604
|
+
ensure
|
605
|
+
ActiveRecord::Base.connection.drop_table(:hats)
|
606
|
+
end
|
607
|
+
|
528
608
|
def test_rename_column_with_sql_reserved_word
|
529
609
|
begin
|
530
610
|
assert_nothing_raised { Person.connection.rename_column "people", "first_name", "group" }
|
@@ -613,14 +693,14 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
613
693
|
Person.connection.add_column "people", "funny", :boolean
|
614
694
|
Person.reset_column_information
|
615
695
|
assert Person.columns_hash["funny"].null, "Column 'funny' must initially allow nulls"
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
696
|
+
unless current_adapter?(:IBM_DBAdapter) # incompatible types changes
|
697
|
+
Person.connection.change_column "people", "funny", :boolean, :null => false, :default => true
|
698
|
+
Person.reset_column_information
|
699
|
+
assert !Person.columns_hash["funny"].null, "Column 'funny' must *not* allow nulls at this point"
|
700
|
+
Person.connection.change_column "people", "funny", :boolean, :null => true
|
701
|
+
Person.reset_column_information
|
702
|
+
assert Person.columns_hash["funny"].null, "Column 'funny' must allow nulls again at this point"
|
703
|
+
end
|
624
704
|
end
|
625
705
|
|
626
706
|
def test_rename_table_with_an_index
|
@@ -705,7 +785,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
705
785
|
Person.connection.create_table :testings do |t|
|
706
786
|
t.column :select, :string
|
707
787
|
end
|
708
|
-
unless current_adapter?(:IBM_DBAdapter) # altering a string column to size
|
788
|
+
unless current_adapter?(:IBM_DBAdapter) # altering a string column to smaller size
|
709
789
|
assert_nothing_raised { Person.connection.change_column :testings, :select, :string, :limit => 10 }
|
710
790
|
end
|
711
791
|
|
@@ -714,6 +794,81 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
714
794
|
Person.connection.drop_table :testings rescue nil
|
715
795
|
end
|
716
796
|
|
797
|
+
def test_keeping_default_and_notnull_constaint_on_change
|
798
|
+
Person.connection.create_table :testings do |t|
|
799
|
+
t.column :title, :string
|
800
|
+
end
|
801
|
+
person_klass = Class.new(Person)
|
802
|
+
person_klass.set_table_name 'testings'
|
803
|
+
|
804
|
+
person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
|
805
|
+
person_klass.reset_column_information
|
806
|
+
assert_equal 99, person_klass.columns_hash["wealth"].default
|
807
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
808
|
+
assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
|
809
|
+
|
810
|
+
# change column default to see that column doesn't lose its not null definition
|
811
|
+
person_klass.connection.change_column_default "testings", "wealth", 100
|
812
|
+
person_klass.reset_column_information
|
813
|
+
assert_equal 100, person_klass.columns_hash["wealth"].default
|
814
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
815
|
+
|
816
|
+
# rename column to see that column doesn't lose its not null and/or default definition
|
817
|
+
unless current_adapter?(:IBM_DBAdapter) #rename_column is not implemented in IBM_DBAdapetr
|
818
|
+
person_klass.connection.rename_column "testings", "wealth", "money"
|
819
|
+
person_klass.reset_column_information
|
820
|
+
assert_nil person_klass.columns_hash["wealth"]
|
821
|
+
assert_equal 100, person_klass.columns_hash["money"].default
|
822
|
+
assert_equal false, person_klass.columns_hash["money"].null
|
823
|
+
end
|
824
|
+
|
825
|
+
# change column
|
826
|
+
unless current_adapter?(:IBM_DBAdapter)
|
827
|
+
person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
|
828
|
+
person_klass.reset_column_information
|
829
|
+
assert_equal 1000, person_klass.columns_hash["money"].default
|
830
|
+
assert_equal false, person_klass.columns_hash["money"].null
|
831
|
+
else
|
832
|
+
person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
|
833
|
+
person_klass.reset_column_information
|
834
|
+
assert_equal 1000, person_klass.columns_hash["wealth"].default
|
835
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
836
|
+
end
|
837
|
+
|
838
|
+
# change column, make it nullable and clear default
|
839
|
+
unless current_adapter?(:IBM_DBAdapter)
|
840
|
+
person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
|
841
|
+
person_klass.reset_column_information
|
842
|
+
assert_nil person_klass.columns_hash["money"].default
|
843
|
+
assert_equal true, person_klass.columns_hash["money"].null
|
844
|
+
else
|
845
|
+
person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
|
846
|
+
person_klass.reset_column_information
|
847
|
+
assert_nil person_klass.columns_hash["wealth"].default
|
848
|
+
assert_equal true, person_klass.columns_hash["wealth"].null
|
849
|
+
end
|
850
|
+
|
851
|
+
# change_column_null, make it not nullable and set null values to a default value
|
852
|
+
unless current_adapter?(:IBM_DBAdapter)
|
853
|
+
person_klass.connection.execute('UPDATE testings SET money = NULL')
|
854
|
+
person_klass.connection.change_column_null "testings", "money", false, 2000
|
855
|
+
person_klass.reset_column_information
|
856
|
+
assert_nil person_klass.columns_hash["money"].default
|
857
|
+
assert_equal false, person_klass.columns_hash["money"].null
|
858
|
+
assert_equal [2000], Person.connection.select_values("SELECT money FROM testings").map { |s| s.to_i }.sort
|
859
|
+
else
|
860
|
+
# Trying to set the value of the column wealth to NULL and
|
861
|
+
# in the next statement a not null constraint is being applied which is wrong.
|
862
|
+
#person_klass.connection.execute('UPDATE testings SET wealth = NULL')
|
863
|
+
person_klass.connection.change_column_null "testings", "wealth", false, 2000
|
864
|
+
person_klass.reset_column_information
|
865
|
+
assert_equal false, person_klass.columns_hash["wealth"].null
|
866
|
+
assert_equal 2000, person_klass.columns_hash["wealth"].default
|
867
|
+
end
|
868
|
+
ensure
|
869
|
+
Person.connection.drop_table :testings rescue nil
|
870
|
+
end
|
871
|
+
|
717
872
|
def test_change_column_default_to_null
|
718
873
|
Person.connection.change_column_default "people", "first_name", nil
|
719
874
|
Person.reset_column_information
|
@@ -863,6 +1018,21 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
863
1018
|
assert !Reminder.table_exists?
|
864
1019
|
end
|
865
1020
|
|
1021
|
+
def test_migrator_double_up
|
1022
|
+
assert_equal(0, ActiveRecord::Migrator.current_version)
|
1023
|
+
ActiveRecord::Migrator.run(:up, MIGRATIONS_ROOT + "/valid", 1)
|
1024
|
+
assert_nothing_raised { ActiveRecord::Migrator.run(:up, MIGRATIONS_ROOT + "/valid", 1) }
|
1025
|
+
assert_equal(1, ActiveRecord::Migrator.current_version)
|
1026
|
+
end
|
1027
|
+
|
1028
|
+
def test_migrator_double_down
|
1029
|
+
assert_equal(0, ActiveRecord::Migrator.current_version)
|
1030
|
+
ActiveRecord::Migrator.run(:up, MIGRATIONS_ROOT + "/valid", 1)
|
1031
|
+
ActiveRecord::Migrator.run(:down, MIGRATIONS_ROOT + "/valid", 1)
|
1032
|
+
assert_nothing_raised { ActiveRecord::Migrator.run(:down, MIGRATIONS_ROOT + "/valid", 1) }
|
1033
|
+
assert_equal(0, ActiveRecord::Migrator.current_version)
|
1034
|
+
end
|
1035
|
+
|
866
1036
|
def test_finds_migrations
|
867
1037
|
migrations = ActiveRecord::Migrator.new(:up, MIGRATIONS_ROOT + "/valid").migrations
|
868
1038
|
[['1', 'people_have_last_names'],
|
@@ -952,16 +1122,6 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
952
1122
|
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
953
1123
|
assert_equal(0, ActiveRecord::Migrator.current_version)
|
954
1124
|
end
|
955
|
-
|
956
|
-
def test_migrator_run
|
957
|
-
assert_equal(0, ActiveRecord::Migrator.current_version)
|
958
|
-
ActiveRecord::Migrator.run(:up, MIGRATIONS_ROOT + "/valid", 3)
|
959
|
-
assert_equal(0, ActiveRecord::Migrator.current_version)
|
960
|
-
|
961
|
-
assert_equal(0, ActiveRecord::Migrator.current_version)
|
962
|
-
ActiveRecord::Migrator.run(:down, MIGRATIONS_ROOT + "/valid", 3)
|
963
|
-
assert_equal(0, ActiveRecord::Migrator.current_version)
|
964
|
-
end
|
965
1125
|
|
966
1126
|
def test_schema_migrations_table_name
|
967
1127
|
ActiveRecord::Base.table_name_prefix = "prefix_"
|
@@ -1141,8 +1301,8 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1141
1301
|
|
1142
1302
|
def test_timestamps_creates_updated_at_and_created_at
|
1143
1303
|
with_new_table do |t|
|
1144
|
-
t.expects(:column).with(:created_at, :datetime)
|
1145
|
-
t.expects(:column).with(:updated_at, :datetime)
|
1304
|
+
t.expects(:column).with(:created_at, :datetime, kind_of(Hash))
|
1305
|
+
t.expects(:column).with(:updated_at, :datetime, kind_of(Hash))
|
1146
1306
|
t.timestamps
|
1147
1307
|
end
|
1148
1308
|
end
|
@@ -1270,10 +1430,10 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1270
1430
|
end
|
1271
1431
|
|
1272
1432
|
def integer_column
|
1273
|
-
if current_adapter?(:
|
1274
|
-
"integer"
|
1275
|
-
else
|
1433
|
+
if current_adapter?(:MysqlAdapter)
|
1276
1434
|
'int(11)'
|
1435
|
+
else
|
1436
|
+
'integer'
|
1277
1437
|
end
|
1278
1438
|
end
|
1279
1439
|
|
@@ -8,120 +8,121 @@ require 'models/post'
|
|
8
8
|
|
9
9
|
unless current_adapter?(:IBM_DBAdapter)
|
10
10
|
class QueryCacheTest < ActiveRecord::TestCase
|
11
|
-
|
11
|
+
fixtures :tasks, :topics, :categories, :posts, :categories_posts
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_find_queries_with_cache
|
18
|
-
Task.cache do
|
19
|
-
assert_queries(1) { Task.find(1); Task.find(1) }
|
13
|
+
def test_find_queries
|
14
|
+
assert_queries(2) { Task.find(1); Task.find(1) }
|
20
15
|
end
|
21
|
-
end
|
22
16
|
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
def test_find_queries_with_cache
|
18
|
+
Task.cache do
|
19
|
+
assert_queries(1) { Task.find(1); Task.find(1) }
|
20
|
+
end
|
26
21
|
end
|
27
|
-
end
|
28
22
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
assert_not_equal now, task.starting
|
34
|
-
task.starting = now
|
35
|
-
task.reload
|
36
|
-
assert_not_equal now, task.starting
|
23
|
+
def test_count_queries_with_cache
|
24
|
+
Task.cache do
|
25
|
+
assert_queries(1) { Task.count; Task.count }
|
26
|
+
end
|
37
27
|
end
|
38
|
-
end
|
39
28
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
29
|
+
def test_query_cache_dups_results_correctly
|
30
|
+
Task.cache do
|
31
|
+
now = Time.now.utc
|
32
|
+
task = Task.find 1
|
33
|
+
assert_not_equal now, task.starting
|
34
|
+
task.starting = now
|
35
|
+
task.reload
|
36
|
+
assert_not_equal now, task.starting
|
37
|
+
end
|
44
38
|
end
|
45
39
|
|
46
|
-
|
47
|
-
|
40
|
+
def test_cache_is_flat
|
41
|
+
Task.cache do
|
42
|
+
Topic.columns # don't count this query
|
43
|
+
assert_queries(1) { Topic.find(1); Topic.find(1); }
|
44
|
+
end
|
45
|
+
|
46
|
+
ActiveRecord::Base.cache do
|
47
|
+
assert_queries(1) { Task.find(1); Task.find(1) }
|
48
|
+
end
|
48
49
|
end
|
49
|
-
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
def test_cache_does_not_wrap_string_results_in_arrays
|
52
|
+
Task.cache do
|
53
|
+
assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
|
54
|
+
end
|
54
55
|
end
|
55
56
|
end
|
56
|
-
end
|
57
57
|
|
58
|
-
uses_mocha 'QueryCacheExpiryTest' do
|
58
|
+
uses_mocha 'QueryCacheExpiryTest' do
|
59
59
|
|
60
60
|
class QueryCacheExpiryTest < ActiveRecord::TestCase
|
61
|
-
fixtures :tasks
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
Task.find(1)
|
70
|
-
|
71
|
-
Task.uncached do
|
72
|
-
assert !Task.connection.query_cache_enabled
|
61
|
+
fixtures :tasks, :posts, :categories, :categories_posts
|
62
|
+
|
63
|
+
def test_find
|
64
|
+
Task.connection.expects(:clear_query_cache).times(1)
|
65
|
+
|
66
|
+
assert !Task.connection.query_cache_enabled
|
67
|
+
Task.cache do
|
68
|
+
assert Task.connection.query_cache_enabled
|
73
69
|
Task.find(1)
|
70
|
+
|
71
|
+
Task.uncached do
|
72
|
+
assert !Task.connection.query_cache_enabled
|
73
|
+
Task.find(1)
|
74
|
+
end
|
75
|
+
|
76
|
+
assert Task.connection.query_cache_enabled
|
74
77
|
end
|
75
|
-
|
76
|
-
assert Task.connection.query_cache_enabled
|
78
|
+
assert !Task.connection.query_cache_enabled
|
77
79
|
end
|
78
|
-
assert !Task.connection.query_cache_enabled
|
79
|
-
end
|
80
80
|
|
81
|
-
|
82
|
-
|
81
|
+
def test_update
|
82
|
+
Task.connection.expects(:clear_query_cache).times(2)
|
83
83
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
Task.cache do
|
85
|
+
task = Task.find(1)
|
86
|
+
task.starting = Time.now.utc
|
87
|
+
task.save!
|
88
|
+
end
|
88
89
|
end
|
89
|
-
end
|
90
90
|
|
91
|
-
|
92
|
-
|
91
|
+
def test_destroy
|
92
|
+
Task.connection.expects(:clear_query_cache).times(2)
|
93
93
|
|
94
|
-
|
95
|
-
|
94
|
+
Task.cache do
|
95
|
+
Task.find(1).destroy
|
96
|
+
end
|
96
97
|
end
|
97
|
-
end
|
98
98
|
|
99
|
-
|
100
|
-
|
99
|
+
def test_insert
|
100
|
+
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
101
101
|
|
102
|
-
|
103
|
-
|
102
|
+
Task.cache do
|
103
|
+
Task.create!
|
104
|
+
end
|
104
105
|
end
|
105
|
-
end
|
106
106
|
|
107
|
-
|
108
|
-
|
107
|
+
def test_cache_is_expired_by_habtm_update
|
108
|
+
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
109
109
|
ActiveRecord::Base.cache do
|
110
110
|
c = Category.find(:first)
|
111
111
|
p = Post.find(:first)
|
112
112
|
p.categories << c
|
113
113
|
end
|
114
|
-
|
114
|
+
end
|
115
115
|
|
116
|
-
|
117
|
-
|
116
|
+
def test_cache_is_expired_by_habtm_delete
|
117
|
+
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
118
118
|
ActiveRecord::Base.cache do
|
119
|
-
c = Category.find(
|
120
|
-
p = Post.find(
|
119
|
+
c = Category.find(1)
|
120
|
+
p = Post.find(1)
|
121
|
+
assert p.categories.any?
|
121
122
|
p.categories.delete_all
|
122
123
|
end
|
123
124
|
end
|
124
125
|
end
|
125
|
-
|
126
|
+
|
126
127
|
end
|
127
|
-
end
|
128
|
+
end
|