ibm_db 2.5.5 → 2.5.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/test/cases/fixtures_test.rb
CHANGED
@@ -16,6 +16,9 @@ require 'models/treasure'
|
|
16
16
|
require 'models/matey'
|
17
17
|
require 'models/ship'
|
18
18
|
require 'models/book'
|
19
|
+
require 'models/admin'
|
20
|
+
require 'models/admin/account'
|
21
|
+
require 'models/admin/user'
|
19
22
|
|
20
23
|
class FixturesTest < ActiveRecord::TestCase
|
21
24
|
self.use_instantiated_fixtures = true
|
@@ -26,14 +29,14 @@ class FixturesTest < ActiveRecord::TestCase
|
|
26
29
|
FIXTURES = %w( accounts binaries companies customers
|
27
30
|
developers developers_projects entrants
|
28
31
|
movies projects subscribers topics tasks )
|
29
|
-
MATCH_ATTRIBUTE_NAME = /[a-zA-Z][
|
32
|
+
MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-\w]*/
|
30
33
|
|
31
34
|
def test_clean_fixtures
|
32
35
|
FIXTURES.each do |name|
|
33
36
|
fixtures = nil
|
34
37
|
assert_nothing_raised { fixtures = create_fixtures(name) }
|
35
38
|
assert_kind_of(Fixtures, fixtures)
|
36
|
-
fixtures.each { |
|
39
|
+
fixtures.each { |_name, fixture|
|
37
40
|
fixture.each { |key, value|
|
38
41
|
assert_match(MATCH_ATTRIBUTE_NAME, key)
|
39
42
|
}
|
@@ -98,7 +101,7 @@ class FixturesTest < ActiveRecord::TestCase
|
|
98
101
|
second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'Mary'")
|
99
102
|
assert_nil(second_row["author_email_address"])
|
100
103
|
|
101
|
-
# This checks for a caching problem which causes a bug in the fixtures
|
104
|
+
# This checks for a caching problem which causes a bug in the fixtures
|
102
105
|
# class-level configuration helper.
|
103
106
|
assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
|
104
107
|
ensure
|
@@ -150,6 +153,17 @@ class FixturesTest < ActiveRecord::TestCase
|
|
150
153
|
assert_not_nil Fixtures.new( Account.connection, "companies", 'Company', FIXTURES_ROOT + "/naked/yml/companies")
|
151
154
|
end
|
152
155
|
|
156
|
+
def test_nonexistent_fixture_file
|
157
|
+
nonexistent_fixture_path = FIXTURES_ROOT + "/imnothere"
|
158
|
+
|
159
|
+
#sanity check to make sure that this file never exists
|
160
|
+
assert Dir[nonexistent_fixture_path+"*"].empty?
|
161
|
+
|
162
|
+
assert_raise(FixturesFileNotFound) do
|
163
|
+
Fixtures.new( Account.connection, "companies", 'Company', nonexistent_fixture_path)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
153
167
|
def test_dirty_dirty_yaml_file
|
154
168
|
assert_raise(Fixture::FormatError) do
|
155
169
|
Fixtures.new( Account.connection, "courses", 'Course', FIXTURES_ROOT + "/naked/yml/courses")
|
@@ -230,9 +244,9 @@ if Account.connection.respond_to?(:reset_pk_sequence!)
|
|
230
244
|
|
231
245
|
def test_create_fixtures_resets_sequences_when_not_cached
|
232
246
|
@instances.each do |instance|
|
233
|
-
max_id = create_fixtures(instance.class.table_name).inject(0) do |
|
247
|
+
max_id = create_fixtures(instance.class.table_name).inject(0) do |_max_id, (name, fixture)|
|
234
248
|
fixture_id = fixture['id'].to_i
|
235
|
-
fixture_id >
|
249
|
+
fixture_id > _max_id ? fixture_id : _max_id
|
236
250
|
end
|
237
251
|
|
238
252
|
# Clone the last fixture to check that it gets the next greatest id.
|
@@ -248,14 +262,19 @@ class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
|
|
248
262
|
fixtures :topics, :developers, :accounts
|
249
263
|
|
250
264
|
def test_without_complete_instantiation
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
265
|
+
assert !defined?(@first)
|
266
|
+
assert !defined?(@topics)
|
267
|
+
assert !defined?(@developers)
|
268
|
+
assert !defined?(@accounts)
|
255
269
|
end
|
256
270
|
|
257
271
|
def test_fixtures_from_root_yml_without_instantiation
|
258
|
-
|
272
|
+
assert !defined?(@unknown), "@unknown is not defined"
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_visibility_of_accessor_method
|
276
|
+
assert_equal false, respond_to?(:topics, false), "should be private method"
|
277
|
+
assert_equal true, respond_to?(:topics, true), "confirm to respond surely"
|
259
278
|
end
|
260
279
|
|
261
280
|
def test_accessor_methods
|
@@ -283,7 +302,7 @@ class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
|
|
283
302
|
fixtures :topics, :developers, :accounts
|
284
303
|
|
285
304
|
def test_without_instance_instantiation
|
286
|
-
|
305
|
+
assert !defined?(@first), "@first is not defined"
|
287
306
|
assert_not_nil @topics
|
288
307
|
assert_not_nil @developers
|
289
308
|
assert_not_nil @accounts
|
@@ -367,7 +386,7 @@ end
|
|
367
386
|
class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
|
368
387
|
set_fixture_class :funny_jokes => 'Joke'
|
369
388
|
fixtures :funny_jokes
|
370
|
-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
389
|
+
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
371
390
|
# and thus takes into account our set_fixture_class
|
372
391
|
self.use_transactional_fixtures = false
|
373
392
|
|
@@ -379,7 +398,7 @@ end
|
|
379
398
|
class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
|
380
399
|
set_fixture_class :items => Book
|
381
400
|
fixtures :items
|
382
|
-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
401
|
+
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
383
402
|
# and thus takes into account our set_fixture_class
|
384
403
|
self.use_transactional_fixtures = false
|
385
404
|
|
@@ -391,7 +410,7 @@ end
|
|
391
410
|
class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
|
392
411
|
set_fixture_class :items => Book, :funny_jokes => Joke
|
393
412
|
fixtures :items, :funny_jokes
|
394
|
-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
413
|
+
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
395
414
|
# and thus takes into account our set_fixture_class
|
396
415
|
self.use_transactional_fixtures = false
|
397
416
|
|
@@ -407,7 +426,7 @@ end
|
|
407
426
|
class CustomConnectionFixturesTest < ActiveRecord::TestCase
|
408
427
|
set_fixture_class :courses => Course
|
409
428
|
fixtures :courses
|
410
|
-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
429
|
+
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
411
430
|
# and thus takes into account our set_fixture_class
|
412
431
|
self.use_transactional_fixtures = false
|
413
432
|
|
@@ -419,7 +438,7 @@ end
|
|
419
438
|
|
420
439
|
class InvalidTableNameFixturesTest < ActiveRecord::TestCase
|
421
440
|
fixtures :funny_jokes
|
422
|
-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
441
|
+
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
423
442
|
# and thus takes into account our lack of set_fixture_class
|
424
443
|
self.use_transactional_fixtures = false
|
425
444
|
|
@@ -433,7 +452,7 @@ end
|
|
433
452
|
class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
|
434
453
|
set_fixture_class :funny_jokes => 'Joke'
|
435
454
|
fixtures :funny_jokes
|
436
|
-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
455
|
+
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
|
437
456
|
# and thus takes into account our set_fixture_class
|
438
457
|
self.use_transactional_fixtures = false
|
439
458
|
|
@@ -511,7 +530,7 @@ class FasterFixturesTest < ActiveRecord::TestCase
|
|
511
530
|
end
|
512
531
|
|
513
532
|
class FoxyFixturesTest < ActiveRecord::TestCase
|
514
|
-
fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers
|
533
|
+
fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers, :"admin/accounts", :"admin/users"
|
515
534
|
|
516
535
|
def test_identifies_strings
|
517
536
|
assert_equal(Fixtures.identify("foo"), Fixtures.identify("foo"))
|
@@ -523,8 +542,8 @@ class FoxyFixturesTest < ActiveRecord::TestCase
|
|
523
542
|
end
|
524
543
|
|
525
544
|
def test_identifies_consistently
|
526
|
-
assert_equal
|
527
|
-
assert_equal
|
545
|
+
assert_equal 207281424, Fixtures.identify(:ruby)
|
546
|
+
assert_equal 1066363776, Fixtures.identify(:sapphire_2)
|
528
547
|
end
|
529
548
|
|
530
549
|
TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
|
@@ -633,6 +652,11 @@ class FoxyFixturesTest < ActiveRecord::TestCase
|
|
633
652
|
assert_kind_of DeadParrot, parrots(:polly)
|
634
653
|
assert_equal pirates(:blackbeard), parrots(:polly).killer
|
635
654
|
end
|
655
|
+
|
656
|
+
def test_namespaced_models
|
657
|
+
assert admin_accounts(:signals37).users.include?(admin_users(:david))
|
658
|
+
assert_equal 2, admin_accounts(:signals37).users.size
|
659
|
+
end
|
636
660
|
end
|
637
661
|
|
638
662
|
class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require "cases/helper"
|
2
2
|
require 'bigdecimal/util'
|
3
|
-
require 'mocha'
|
4
3
|
|
5
4
|
require 'models/person'
|
6
5
|
require 'models/topic'
|
@@ -13,9 +12,9 @@ require MIGRATIONS_ROOT + "/interleaved/pass_3/2_i_raise_on_down"
|
|
13
12
|
|
14
13
|
if ActiveRecord::Base.connection.supports_migrations?
|
15
14
|
class BigNumber < ActiveRecord::Base; end
|
16
|
-
|
15
|
+
|
17
16
|
class Reminder < ActiveRecord::Base; end
|
18
|
-
|
17
|
+
|
19
18
|
class ActiveRecord::Migration
|
20
19
|
class <<self
|
21
20
|
attr_accessor :message_count
|
@@ -26,9 +25,27 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
26
25
|
end
|
27
26
|
end
|
28
27
|
|
28
|
+
class MigrationTableAndIndexTest < ActiveRecord::TestCase
|
29
|
+
def test_add_schema_info_respects_prefix_and_suffix
|
30
|
+
conn = ActiveRecord::Base.connection
|
31
|
+
|
32
|
+
conn.drop_table(ActiveRecord::Migrator.schema_migrations_table_name) if conn.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
|
33
|
+
# Use shorter prefix and suffix as in Oracle database identifier cannot be larger than 30 characters
|
34
|
+
ActiveRecord::Base.table_name_prefix = 'p_'
|
35
|
+
ActiveRecord::Base.table_name_suffix = '_s'
|
36
|
+
conn.drop_table(ActiveRecord::Migrator.schema_migrations_table_name) if conn.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
|
37
|
+
|
38
|
+
conn.initialize_schema_migrations_table
|
39
|
+
|
40
|
+
assert_equal "p_unique_schema_migrations_s", conn.indexes(ActiveRecord::Migrator.schema_migrations_table_name)[0][:name]
|
41
|
+
ensure
|
42
|
+
ActiveRecord::Base.table_name_prefix = ""
|
43
|
+
ActiveRecord::Base.table_name_suffix = ""
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
29
47
|
class MigrationTest < ActiveRecord::TestCase
|
30
48
|
self.use_transactional_fixtures = false
|
31
|
-
|
32
49
|
if (current_adapter?(:IBM_DBAdapter))
|
33
50
|
#Rename is supported only for server zOS 9 , DB2 COBRA and Informix
|
34
51
|
server_type = ActiveRecord::Base.connection.servertype.class.name
|
@@ -74,26 +91,38 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
74
91
|
|
75
92
|
# Orcl nds shrt indx nms. Sybs 2.
|
76
93
|
# OpenBase does not have named indexes. You must specify a single column name
|
77
|
-
unless current_adapter?(:
|
94
|
+
unless current_adapter?(:SybaseAdapter, :OpenBaseAdapter)
|
78
95
|
assert_nothing_raised { Person.connection.add_index("people", ["last_name", "first_name"]) }
|
79
96
|
assert_nothing_raised { Person.connection.remove_index("people", :column => ["last_name", "first_name"]) }
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
97
|
+
# Oracle adapter cannot have specified index name larger than 30 characters
|
98
|
+
# Oracle adapter is shortening index name when just column list is given
|
99
|
+
unless current_adapter?(:OracleAdapter)
|
100
|
+
assert_nothing_raised { Person.connection.add_index("people", ["last_name", "first_name"]) }
|
101
|
+
assert_nothing_raised { Person.connection.remove_index("people", :name => :index_people_on_last_name_and_first_name) }
|
102
|
+
assert_nothing_raised { Person.connection.add_index("people", ["last_name", "first_name"]) }
|
103
|
+
assert_nothing_raised { Person.connection.remove_index("people", "last_name_and_first_name") }
|
104
|
+
end
|
84
105
|
assert_nothing_raised { Person.connection.add_index("people", ["last_name", "first_name"]) }
|
85
106
|
assert_nothing_raised { Person.connection.remove_index("people", ["last_name", "first_name"]) }
|
107
|
+
assert_nothing_raised { Person.connection.add_index("people", ["last_name"], :length => 10) }
|
108
|
+
assert_nothing_raised { Person.connection.remove_index("people", "last_name") }
|
109
|
+
assert_nothing_raised { Person.connection.add_index("people", ["last_name"], :length => {:last_name => 10}) }
|
110
|
+
assert_nothing_raised { Person.connection.remove_index("people", ["last_name"]) }
|
111
|
+
assert_nothing_raised { Person.connection.add_index("people", ["last_name", "first_name"], :length => 10) }
|
112
|
+
assert_nothing_raised { Person.connection.remove_index("people", ["last_name", "first_name"]) }
|
113
|
+
assert_nothing_raised { Person.connection.add_index("people", ["last_name", "first_name"], :length => {:last_name => 10, :first_name => 20}) }
|
114
|
+
assert_nothing_raised { Person.connection.remove_index("people", ["last_name", "first_name"]) }
|
86
115
|
end
|
87
116
|
|
88
117
|
# quoting
|
89
118
|
# Note: changed index name from "key" to "key_idx" since "key" is a Firebird reserved word
|
90
119
|
# OpenBase does not have named indexes. You must specify a single column name
|
91
120
|
unless current_adapter?(:OpenBaseAdapter)
|
92
|
-
|
121
|
+
unless current_adapter?(:IBM_DBAdapter) #cannot assign a integer value to string column
|
93
122
|
Person.update_all "#{Person.connection.quote_column_name 'key'}=#{Person.connection.quote_column_name 'id'}" #some databases (including sqlite2 won't add a unique index if existing data non unique)
|
94
123
|
else
|
95
|
-
Person.update_all "#{Person.connection.quote_column_name 'key'}=#{Person.connection.quote_column_name 'first_name'}"
|
96
|
-
end
|
124
|
+
Person.update_all "#{Person.connection.quote_column_name 'key'}=#{Person.connection.quote_column_name 'first_name'}"
|
125
|
+
end
|
97
126
|
assert_nothing_raised { Person.connection.add_index("people", ["key"], :name => "key_idx", :unique => true) }
|
98
127
|
assert_nothing_raised { Person.connection.remove_index("people", :name => "key_idx", :unique => true) }
|
99
128
|
end
|
@@ -106,6 +135,95 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
106
135
|
end
|
107
136
|
end
|
108
137
|
|
138
|
+
def test_index_symbol_names
|
139
|
+
assert_nothing_raised { Person.connection.add_index :people, :primary_contact_id, :name => :symbol_index_name }
|
140
|
+
assert Person.connection.index_exists?(:people, :primary_contact_id, :name => :symbol_index_name)
|
141
|
+
assert_nothing_raised { Person.connection.remove_index :people, :name => :symbol_index_name }
|
142
|
+
assert !Person.connection.index_exists?(:people, :primary_contact_id, :name => :symbol_index_name)
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_add_index_length_limit
|
146
|
+
good_index_name = 'x' * Person.connection.index_name_length
|
147
|
+
too_long_index_name = good_index_name + 'x'
|
148
|
+
assert_raise(ArgumentError) { Person.connection.add_index("people", "first_name", :name => too_long_index_name) }
|
149
|
+
assert !Person.connection.index_name_exists?("people", too_long_index_name, false)
|
150
|
+
assert_nothing_raised { Person.connection.add_index("people", "first_name", :name => good_index_name) }
|
151
|
+
assert Person.connection.index_name_exists?("people", good_index_name, false)
|
152
|
+
Person.connection.remove_index("people", :name => good_index_name)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_remove_nonexistent_index
|
156
|
+
# we do this by name, so OpenBase is a wash as noted above
|
157
|
+
unless current_adapter?(:OpenBaseAdapter)
|
158
|
+
assert_raise(ArgumentError) { Person.connection.remove_index("people", "no_such_index") }
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_rename_index
|
163
|
+
unless current_adapter?(:OpenBaseAdapter)
|
164
|
+
# keep the names short to make Oracle and similar behave
|
165
|
+
Person.connection.add_index('people', [:first_name], :name => 'old_idx')
|
166
|
+
assert_nothing_raised { Person.connection.rename_index('people', 'old_idx', 'new_idx') }
|
167
|
+
# if the adapter doesn't support the indexes call, pick defaults that let the test pass
|
168
|
+
assert !Person.connection.index_name_exists?('people', 'old_idx', false)
|
169
|
+
assert Person.connection.index_name_exists?('people', 'new_idx', true)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_double_add_index
|
174
|
+
unless current_adapter?(:OpenBaseAdapter)
|
175
|
+
Person.connection.add_index('people', [:first_name], :name => 'some_idx')
|
176
|
+
assert_raise(ArgumentError) { Person.connection.add_index('people', [:first_name], :name => 'some_idx') }
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def test_index_exists
|
181
|
+
Person.connection.create_table :testings do |t|
|
182
|
+
t.column :foo, :string, :limit => 100
|
183
|
+
t.column :bar, :string, :limit => 100
|
184
|
+
end
|
185
|
+
Person.connection.add_index :testings, :foo
|
186
|
+
|
187
|
+
assert Person.connection.index_exists?(:testings, :foo)
|
188
|
+
assert !Person.connection.index_exists?(:testings, :bar)
|
189
|
+
ensure
|
190
|
+
Person.connection.drop_table :testings rescue nil
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_index_exists_on_multiple_columns
|
194
|
+
Person.connection.create_table :testings do |t|
|
195
|
+
t.column :foo, :string, :limit => 100
|
196
|
+
t.column :bar, :string, :limit => 100
|
197
|
+
end
|
198
|
+
Person.connection.add_index :testings, [:foo, :bar]
|
199
|
+
|
200
|
+
assert Person.connection.index_exists?(:testings, [:foo, :bar])
|
201
|
+
ensure
|
202
|
+
Person.connection.drop_table :testings rescue nil
|
203
|
+
end
|
204
|
+
|
205
|
+
def test_unique_index_exists
|
206
|
+
Person.connection.create_table :testings do |t|
|
207
|
+
t.column :foo, :string, :limit => 100
|
208
|
+
end
|
209
|
+
Person.connection.add_index :testings, :foo, :unique => true
|
210
|
+
|
211
|
+
assert Person.connection.index_exists?(:testings, :foo, :unique => true)
|
212
|
+
ensure
|
213
|
+
Person.connection.drop_table :testings rescue nil
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_named_index_exists
|
217
|
+
Person.connection.create_table :testings do |t|
|
218
|
+
t.column :foo, :string, :limit => 100
|
219
|
+
end
|
220
|
+
Person.connection.add_index :testings, :foo, :name => "custom_index_name"
|
221
|
+
|
222
|
+
assert Person.connection.index_exists?(:testings, :foo, :name => "custom_index_name")
|
223
|
+
ensure
|
224
|
+
Person.connection.drop_table :testings rescue nil
|
225
|
+
end
|
226
|
+
|
109
227
|
def testing_table_with_only_foo_attribute
|
110
228
|
Person.connection.create_table :testings, :id => false do |t|
|
111
229
|
t.column :foo, :string
|
@@ -268,7 +386,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
268
386
|
assert_equal 'integer', four.sql_type
|
269
387
|
assert_equal 'bigint', eight.sql_type
|
270
388
|
assert_equal 'integer', eleven.sql_type
|
271
|
-
elsif current_adapter?(:MysqlAdapter)
|
389
|
+
elsif current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
|
272
390
|
assert_match 'int(11)', default.sql_type
|
273
391
|
assert_match 'tinyint', one.sql_type
|
274
392
|
assert_match 'int', four.sql_type
|
@@ -291,7 +409,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
291
409
|
t.column :foo, :string
|
292
410
|
end
|
293
411
|
|
294
|
-
assert_equal %w(foo
|
412
|
+
assert_equal %w(foo testing_id), Person.connection.columns(:testings).map { |c| c.name }.sort
|
295
413
|
ensure
|
296
414
|
Person.connection.drop_table :testings rescue nil
|
297
415
|
ActiveRecord::Base.primary_key_prefix_type = nil
|
@@ -304,7 +422,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
304
422
|
t.column :foo, :string
|
305
423
|
end
|
306
424
|
|
307
|
-
assert_equal %w(foo
|
425
|
+
assert_equal %w(foo testingid), Person.connection.columns(:testings).map { |c| c.name }.sort
|
308
426
|
ensure
|
309
427
|
Person.connection.drop_table :testings rescue nil
|
310
428
|
ActiveRecord::Base.primary_key_prefix_type = nil
|
@@ -360,6 +478,13 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
360
478
|
Person.connection.drop_table table_name rescue nil
|
361
479
|
end
|
362
480
|
|
481
|
+
def test_create_table_without_a_block
|
482
|
+
table_name = :testings
|
483
|
+
Person.connection.create_table table_name
|
484
|
+
ensure
|
485
|
+
Person.connection.drop_table table_name rescue nil
|
486
|
+
end
|
487
|
+
|
363
488
|
# Sybase, and SQLite3 will not allow you to add a NOT NULL
|
364
489
|
# column to a table without a default value.
|
365
490
|
unless current_adapter?(:SybaseAdapter, :SQLiteAdapter, :IBM_DBAdapter)
|
@@ -456,7 +581,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
456
581
|
assert_equal 9, wealth_column.precision
|
457
582
|
assert_equal 7, wealth_column.scale
|
458
583
|
end
|
459
|
-
|
584
|
+
|
460
585
|
def test_native_types
|
461
586
|
Person.delete_all
|
462
587
|
Person.connection.add_column "people", "last_name", :string
|
@@ -506,32 +631,37 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
506
631
|
assert_equal Date, bob.favorite_day.class
|
507
632
|
end
|
508
633
|
|
509
|
-
#
|
510
|
-
#
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
634
|
+
# Oracle adapter stores Time or DateTime with timezone value already in _before_type_cast column
|
635
|
+
# therefore no timezone change is done afterwards when default timezone is changed
|
636
|
+
unless current_adapter?(:OracleAdapter)
|
637
|
+
# Test DateTime column and defaults, including timezone.
|
638
|
+
# FIXME: moment of truth may be Time on 64-bit platforms.
|
639
|
+
if bob.moment_of_truth.is_a?(DateTime)
|
640
|
+
|
641
|
+
with_env_tz 'US/Eastern' do
|
642
|
+
bob.reload
|
643
|
+
assert_equal DateTime.local_offset, bob.moment_of_truth.offset
|
644
|
+
assert_not_equal 0, bob.moment_of_truth.offset
|
645
|
+
assert_not_equal "Z", bob.moment_of_truth.zone
|
646
|
+
# US/Eastern is -5 hours from GMT
|
647
|
+
assert_equal Rational(-5, 24), bob.moment_of_truth.offset
|
648
|
+
assert_match(/\A-05:?00\Z/, bob.moment_of_truth.zone) #ruby 1.8.6 uses HH:MM, prior versions use HHMM
|
649
|
+
assert_equal DateTime::ITALY, bob.moment_of_truth.start
|
650
|
+
end
|
521
651
|
end
|
522
652
|
end
|
523
653
|
|
524
|
-
|
654
|
+
assert_instance_of TrueClass, bob.male?
|
525
655
|
assert_kind_of BigDecimal, bob.wealth
|
526
656
|
end
|
527
657
|
|
528
|
-
if current_adapter?(:MysqlAdapter)
|
658
|
+
if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
|
529
659
|
def test_unabstracted_database_dependent_types
|
530
660
|
Person.delete_all
|
531
661
|
|
532
662
|
ActiveRecord::Migration.add_column :people, :intelligence_quotient, :tinyint
|
533
663
|
Person.reset_column_information
|
534
|
-
assert_match
|
664
|
+
assert_match(/tinyint/, Person.columns_hash['intelligence_quotient'].sql_type)
|
535
665
|
ensure
|
536
666
|
ActiveRecord::Migration.remove_column :people, :intelligence_quotient rescue nil
|
537
667
|
end
|
@@ -565,6 +695,53 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
565
695
|
assert !Person.column_methods_hash.include?(:last_name)
|
566
696
|
end
|
567
697
|
|
698
|
+
if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
|
699
|
+
def testing_table_for_positioning
|
700
|
+
Person.connection.create_table :testings, :id => false do |t|
|
701
|
+
t.column :first, :integer
|
702
|
+
t.column :second, :integer
|
703
|
+
t.column :third, :integer
|
704
|
+
end
|
705
|
+
|
706
|
+
yield Person.connection
|
707
|
+
ensure
|
708
|
+
Person.connection.drop_table :testings rescue nil
|
709
|
+
end
|
710
|
+
protected :testing_table_for_positioning
|
711
|
+
|
712
|
+
def test_column_positioning
|
713
|
+
testing_table_for_positioning do |conn|
|
714
|
+
assert_equal %w(first second third), conn.columns(:testings).map {|c| c.name }
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
718
|
+
def test_add_column_with_positioning
|
719
|
+
testing_table_for_positioning do |conn|
|
720
|
+
conn.add_column :testings, :new_col, :integer
|
721
|
+
assert_equal %w(first second third new_col), conn.columns(:testings).map {|c| c.name }
|
722
|
+
end
|
723
|
+
testing_table_for_positioning do |conn|
|
724
|
+
conn.add_column :testings, :new_col, :integer, :first => true
|
725
|
+
assert_equal %w(new_col first second third), conn.columns(:testings).map {|c| c.name }
|
726
|
+
end
|
727
|
+
testing_table_for_positioning do |conn|
|
728
|
+
conn.add_column :testings, :new_col, :integer, :after => :first
|
729
|
+
assert_equal %w(first new_col second third), conn.columns(:testings).map {|c| c.name }
|
730
|
+
end
|
731
|
+
end
|
732
|
+
|
733
|
+
def test_change_column_with_positioning
|
734
|
+
testing_table_for_positioning do |conn|
|
735
|
+
conn.change_column :testings, :second, :integer, :first => true
|
736
|
+
assert_equal %w(second first third), conn.columns(:testings).map {|c| c.name }
|
737
|
+
end
|
738
|
+
testing_table_for_positioning do |conn|
|
739
|
+
conn.change_column :testings, :second, :integer, :after => :third
|
740
|
+
assert_equal %w(first third second), conn.columns(:testings).map {|c| c.name }
|
741
|
+
end
|
742
|
+
end
|
743
|
+
end
|
744
|
+
|
568
745
|
if (!current_adapter?(:IBM_DBAdapter) || @ibm_db_rename_supported)
|
569
746
|
def test_add_rename
|
570
747
|
Person.delete_all
|
@@ -669,7 +846,20 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
669
846
|
ensure
|
670
847
|
ActiveRecord::Base.connection.drop_table(:hats)
|
671
848
|
end
|
672
|
-
end
|
849
|
+
end
|
850
|
+
|
851
|
+
def test_rename_column_with_an_index
|
852
|
+
ActiveRecord::Base.connection.create_table(:hats) do |table|
|
853
|
+
table.column :hat_name, :string, :limit => 100
|
854
|
+
table.column :hat_size, :integer
|
855
|
+
end
|
856
|
+
Person.connection.add_index :hats, :hat_name
|
857
|
+
assert_nothing_raised do
|
858
|
+
Person.connection.rename_column "hats", "hat_name", "name"
|
859
|
+
end
|
860
|
+
ensure
|
861
|
+
ActiveRecord::Base.connection.drop_table(:hats)
|
862
|
+
end
|
673
863
|
|
674
864
|
def test_remove_column_with_index
|
675
865
|
ActiveRecord::Base.connection.create_table(:hats) do |table|
|
@@ -710,6 +900,32 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
710
900
|
end
|
711
901
|
end
|
712
902
|
|
903
|
+
if current_adapter?(:SQLiteAdapter)
|
904
|
+
def test_rename_table_for_sqlite_should_work_with_reserved_words
|
905
|
+
begin
|
906
|
+
assert_nothing_raised do
|
907
|
+
ActiveRecord::Base.connection.rename_table :references, :old_references
|
908
|
+
ActiveRecord::Base.connection.create_table :octopuses do |t|
|
909
|
+
t.column :url, :string
|
910
|
+
end
|
911
|
+
end
|
912
|
+
|
913
|
+
assert_nothing_raised { ActiveRecord::Base.connection.rename_table :octopuses, :references }
|
914
|
+
|
915
|
+
# Using explicit id in insert for compatibility across all databases
|
916
|
+
con = ActiveRecord::Base.connection
|
917
|
+
assert_nothing_raised do
|
918
|
+
con.execute "INSERT INTO 'references' (#{con.quote_column_name('id')}, #{con.quote_column_name('url')}) VALUES (1, 'http://rubyonrails.com')"
|
919
|
+
end
|
920
|
+
assert_equal 'http://rubyonrails.com', ActiveRecord::Base.connection.select_value("SELECT url FROM 'references' WHERE id=1")
|
921
|
+
|
922
|
+
ensure
|
923
|
+
ActiveRecord::Base.connection.drop_table :references
|
924
|
+
ActiveRecord::Base.connection.rename_table :old_references, :references
|
925
|
+
end
|
926
|
+
end
|
927
|
+
end
|
928
|
+
|
713
929
|
def test_rename_table
|
714
930
|
begin
|
715
931
|
ActiveRecord::Base.connection.create_table :octopuses do |t|
|
@@ -772,19 +988,20 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
772
988
|
unless current_adapter?(:IBM_DBAdapter) # incompatible types changes
|
773
989
|
def test_change_column
|
774
990
|
Person.connection.add_column 'people', 'age', :integer
|
775
|
-
|
991
|
+
label = "test_change_column Columns"
|
992
|
+
old_columns = Person.connection.columns(Person.table_name, label)
|
776
993
|
assert old_columns.find { |c| c.name == 'age' and c.type == :integer }
|
777
|
-
|
994
|
+
|
778
995
|
assert_nothing_raised { Person.connection.change_column "people", "age", :string }
|
779
|
-
|
780
|
-
new_columns = Person.connection.columns(Person.table_name,
|
996
|
+
|
997
|
+
new_columns = Person.connection.columns(Person.table_name, label)
|
781
998
|
assert_nil new_columns.find { |c| c.name == 'age' and c.type == :integer }
|
782
999
|
assert new_columns.find { |c| c.name == 'age' and c.type == :string }
|
783
1000
|
|
784
|
-
old_columns = Topic.connection.columns(Topic.table_name,
|
1001
|
+
old_columns = Topic.connection.columns(Topic.table_name, label)
|
785
1002
|
assert old_columns.find { |c| c.name == 'approved' and c.type == :boolean and c.default == true }
|
786
1003
|
assert_nothing_raised { Topic.connection.change_column :topics, :approved, :boolean, :default => false }
|
787
|
-
new_columns = Topic.connection.columns(Topic.table_name,
|
1004
|
+
new_columns = Topic.connection.columns(Topic.table_name, label)
|
788
1005
|
assert_nil new_columns.find { |c| c.name == 'approved' and c.type == :boolean and c.default == true }
|
789
1006
|
assert new_columns.find { |c| c.name == 'approved' and c.type == :boolean and c.default == false }
|
790
1007
|
assert_nothing_raised { Topic.connection.change_column :topics, :approved, :boolean, :default => true }
|
@@ -826,13 +1043,21 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
826
1043
|
|
827
1044
|
def test_change_column_quotes_column_names
|
828
1045
|
Person.connection.create_table :testings do |t|
|
829
|
-
|
1046
|
+
if current_adapter?(:IBM_DBAdapter)
|
1047
|
+
t.column :select, :string, :limit => 5
|
1048
|
+
else
|
1049
|
+
t.column :select, :string
|
1050
|
+
end
|
830
1051
|
end
|
831
|
-
unless current_adapter?(:IBM_DBAdapter) # altering a string column to smaller size
|
832
|
-
assert_nothing_raised { Person.connection.change_column :testings, :select, :string, :limit => 10 }
|
833
|
-
end
|
834
1052
|
|
835
|
-
assert_nothing_raised { Person.connection.
|
1053
|
+
assert_nothing_raised { Person.connection.change_column :testings, :select, :string, :limit => 10 }
|
1054
|
+
|
1055
|
+
# Oracle needs primary key value from sequence
|
1056
|
+
if current_adapter?(:OracleAdapter)
|
1057
|
+
assert_nothing_raised { Person.connection.execute "insert into testings (id, #{Person.connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')" }
|
1058
|
+
else
|
1059
|
+
assert_nothing_raised { Person.connection.execute "insert into testings (#{Person.connection.quote_column_name('select')}) values ('7 chars')" }
|
1060
|
+
end
|
836
1061
|
ensure
|
837
1062
|
Person.connection.drop_table :testings rescue nil
|
838
1063
|
end
|
@@ -848,7 +1073,12 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
848
1073
|
person_klass.reset_column_information
|
849
1074
|
assert_equal 99, person_klass.columns_hash["wealth"].default
|
850
1075
|
assert_equal false, person_klass.columns_hash["wealth"].null
|
851
|
-
|
1076
|
+
# Oracle needs primary key value from sequence
|
1077
|
+
if current_adapter?(:OracleAdapter)
|
1078
|
+
assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
|
1079
|
+
else
|
1080
|
+
assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
|
1081
|
+
end
|
852
1082
|
|
853
1083
|
# change column default to see that column doesn't lose its not null definition
|
854
1084
|
person_klass.connection.change_column_default "testings", "wealth", 100
|
@@ -913,15 +1143,50 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
913
1143
|
end
|
914
1144
|
|
915
1145
|
def test_change_column_default_to_null
|
916
|
-
if current_adapter?(:IBM_DBAdapter)
|
917
|
-
#Ensure that first_name had some default value else an error is thrown saying operation not valid
|
918
|
-
Person.connection.change_column_default "people", "first_name", "foo"
|
919
|
-
end
|
920
1146
|
Person.connection.change_column_default "people", "first_name", nil
|
921
1147
|
Person.reset_column_information
|
922
1148
|
assert_nil Person.new.first_name
|
923
1149
|
end
|
924
1150
|
|
1151
|
+
def test_column_exists
|
1152
|
+
Person.connection.create_table :testings do |t|
|
1153
|
+
t.column :foo, :string
|
1154
|
+
end
|
1155
|
+
|
1156
|
+
assert Person.connection.column_exists?(:testings, :foo)
|
1157
|
+
assert !Person.connection.column_exists?(:testings, :bar)
|
1158
|
+
ensure
|
1159
|
+
Person.connection.drop_table :testings rescue nil
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
def test_column_exists_with_type
|
1163
|
+
Person.connection.create_table :testings do |t|
|
1164
|
+
t.column :foo, :string
|
1165
|
+
t.column :bar, :decimal, :precision => 8, :scale => 2
|
1166
|
+
end
|
1167
|
+
|
1168
|
+
assert Person.connection.column_exists?(:testings, :foo, :string)
|
1169
|
+
assert !Person.connection.column_exists?(:testings, :foo, :integer)
|
1170
|
+
assert Person.connection.column_exists?(:testings, :bar, :decimal)
|
1171
|
+
assert !Person.connection.column_exists?(:testings, :bar, :integer)
|
1172
|
+
ensure
|
1173
|
+
Person.connection.drop_table :testings rescue nil
|
1174
|
+
end
|
1175
|
+
|
1176
|
+
def test_column_exists_with_definition
|
1177
|
+
Person.connection.create_table :testings do |t|
|
1178
|
+
t.column :foo, :string, :limit => 100
|
1179
|
+
t.column :bar, :decimal, :precision => 8, :scale => 2
|
1180
|
+
end
|
1181
|
+
|
1182
|
+
assert Person.connection.column_exists?(:testings, :foo, :string, :limit => 100)
|
1183
|
+
assert !Person.connection.column_exists?(:testings, :foo, :string, :limit => 50)
|
1184
|
+
assert Person.connection.column_exists?(:testings, :bar, :decimal, :precision => 8, :scale => 2)
|
1185
|
+
assert !Person.connection.column_exists?(:testings, :bar, :decimal, :precision => 10, :scale => 2)
|
1186
|
+
ensure
|
1187
|
+
Person.connection.drop_table :testings rescue nil
|
1188
|
+
end
|
1189
|
+
|
925
1190
|
def test_add_table
|
926
1191
|
assert !Reminder.table_exists?
|
927
1192
|
|
@@ -979,7 +1244,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
979
1244
|
# This one is fun. The 'value_of_e' field is defined as 'DECIMAL' with
|
980
1245
|
# precision/scale explicitly left out. By the SQL standard, numbers
|
981
1246
|
# assigned to this field should be truncated but that's seldom respected.
|
982
|
-
if current_adapter?(:PostgreSQLAdapter
|
1247
|
+
if current_adapter?(:PostgreSQLAdapter)
|
983
1248
|
# - PostgreSQL changes the SQL spec on columns declared simply as
|
984
1249
|
# "decimal" to something more useful: instead of being given a scale
|
985
1250
|
# of 0, they take on the compile-time limit for precision and scale,
|
@@ -992,7 +1257,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
992
1257
|
elsif current_adapter?(:SQLiteAdapter)
|
993
1258
|
# - SQLite3 stores a float, in violation of SQL
|
994
1259
|
assert_kind_of BigDecimal, b.value_of_e
|
995
|
-
|
1260
|
+
assert_in_delta BigDecimal("2.71828182845905"), b.value_of_e, 0.00000000000001
|
996
1261
|
else
|
997
1262
|
# - SQL standard is an integer
|
998
1263
|
unless current_adapter?(:IBM_DBAdapter) # incompatible types retrieved
|
@@ -1045,9 +1310,9 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1045
1310
|
|
1046
1311
|
def test_migrator_one_down
|
1047
1312
|
ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/valid")
|
1048
|
-
|
1313
|
+
|
1049
1314
|
ActiveRecord::Migrator.down(MIGRATIONS_ROOT + "/valid", 1)
|
1050
|
-
|
1315
|
+
|
1051
1316
|
Person.reset_column_information
|
1052
1317
|
assert Person.column_methods_hash.include?(:last_name)
|
1053
1318
|
assert !Reminder.table_exists?
|
@@ -1103,18 +1368,31 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1103
1368
|
def test_finds_pending_migrations
|
1104
1369
|
ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/interleaved/pass_2", 1)
|
1105
1370
|
migrations = ActiveRecord::Migrator.new(:up, MIGRATIONS_ROOT + "/interleaved/pass_2").pending_migrations
|
1371
|
+
|
1106
1372
|
assert_equal 1, migrations.size
|
1107
1373
|
assert_equal migrations[0].version, 3
|
1108
1374
|
assert_equal migrations[0].name, 'InnocentJointable'
|
1109
1375
|
end
|
1110
1376
|
|
1377
|
+
def test_relative_migrations
|
1378
|
+
$".delete_if do |fname|
|
1379
|
+
fname == (MIGRATIONS_ROOT + "/valid/1_people_have_last_names.rb")
|
1380
|
+
end
|
1381
|
+
Object.send(:remove_const, :PeopleHaveLastNames)
|
1382
|
+
|
1383
|
+
Dir.chdir(MIGRATIONS_ROOT) do
|
1384
|
+
ActiveRecord::Migrator.up("valid/", 1)
|
1385
|
+
end
|
1386
|
+
|
1387
|
+
assert defined?(PeopleHaveLastNames)
|
1388
|
+
end
|
1389
|
+
|
1111
1390
|
def test_only_loads_pending_migrations
|
1112
1391
|
# migrate up to 1
|
1113
1392
|
ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/valid", 1)
|
1114
1393
|
|
1115
1394
|
# now unload the migrations that have been defined
|
1116
|
-
PeopleHaveLastNames
|
1117
|
-
ActiveSupport::Dependencies.remove_unloadable_constants!
|
1395
|
+
Object.send(:remove_const, :PeopleHaveLastNames)
|
1118
1396
|
|
1119
1397
|
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid", nil)
|
1120
1398
|
|
@@ -1128,23 +1406,32 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1128
1406
|
load(MIGRATIONS_ROOT + "/valid/1_people_have_last_names.rb")
|
1129
1407
|
end
|
1130
1408
|
|
1131
|
-
def
|
1132
|
-
|
1409
|
+
def test_target_version_zero_should_run_only_once
|
1410
|
+
# migrate up to 1
|
1411
|
+
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid", 1)
|
1133
1412
|
|
1134
|
-
|
1135
|
-
|
1136
|
-
end
|
1413
|
+
# migrate down to 0
|
1414
|
+
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid", 0)
|
1137
1415
|
|
1138
|
-
|
1139
|
-
|
1416
|
+
# now unload the migrations that have been defined
|
1417
|
+
PeopleHaveLastNames.unloadable
|
1418
|
+
ActiveSupport::Dependencies.remove_unloadable_constants!
|
1140
1419
|
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1420
|
+
# migrate down to 0 again
|
1421
|
+
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid", 0)
|
1422
|
+
|
1423
|
+
assert !defined? PeopleHaveLastNames
|
1424
|
+
ensure
|
1425
|
+
load(MIGRATIONS_ROOT + "/valid/1_people_have_last_names.rb")
|
1144
1426
|
end
|
1145
1427
|
|
1146
1428
|
def test_migrator_db_has_no_schema_migrations_table
|
1147
|
-
|
1429
|
+
# Oracle adapter raises error if semicolon is present as last character
|
1430
|
+
if current_adapter?(:OracleAdapter)
|
1431
|
+
ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")
|
1432
|
+
else
|
1433
|
+
ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations;")
|
1434
|
+
end
|
1148
1435
|
assert_nothing_raised do
|
1149
1436
|
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid", 1)
|
1150
1437
|
end
|
@@ -1182,24 +1469,49 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1182
1469
|
assert Reminder.create("content" => "hello world", "remind_at" => Time.now)
|
1183
1470
|
assert_equal "hello world", Reminder.find(:first).content
|
1184
1471
|
end
|
1185
|
-
|
1472
|
+
|
1186
1473
|
def test_migrator_rollback
|
1187
1474
|
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid")
|
1188
1475
|
assert_equal(3, ActiveRecord::Migrator.current_version)
|
1189
|
-
|
1476
|
+
|
1190
1477
|
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1191
1478
|
assert_equal(2, ActiveRecord::Migrator.current_version)
|
1192
|
-
|
1479
|
+
|
1193
1480
|
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1194
1481
|
assert_equal(1, ActiveRecord::Migrator.current_version)
|
1195
|
-
|
1482
|
+
|
1196
1483
|
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1197
1484
|
assert_equal(0, ActiveRecord::Migrator.current_version)
|
1198
|
-
|
1485
|
+
|
1199
1486
|
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1200
1487
|
assert_equal(0, ActiveRecord::Migrator.current_version)
|
1201
1488
|
end
|
1202
1489
|
|
1490
|
+
def test_migrator_forward
|
1491
|
+
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid", 1)
|
1492
|
+
assert_equal(1, ActiveRecord::Migrator.current_version)
|
1493
|
+
|
1494
|
+
ActiveRecord::Migrator.forward(MIGRATIONS_ROOT + "/valid", 2)
|
1495
|
+
assert_equal(3, ActiveRecord::Migrator.current_version)
|
1496
|
+
|
1497
|
+
ActiveRecord::Migrator.forward(MIGRATIONS_ROOT + "/valid")
|
1498
|
+
assert_equal(3, ActiveRecord::Migrator.current_version)
|
1499
|
+
end
|
1500
|
+
|
1501
|
+
def test_get_all_versions
|
1502
|
+
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid")
|
1503
|
+
assert_equal([1,2,3], ActiveRecord::Migrator.get_all_versions)
|
1504
|
+
|
1505
|
+
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1506
|
+
assert_equal([1,2], ActiveRecord::Migrator.get_all_versions)
|
1507
|
+
|
1508
|
+
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1509
|
+
assert_equal([1], ActiveRecord::Migrator.get_all_versions)
|
1510
|
+
|
1511
|
+
ActiveRecord::Migrator.rollback(MIGRATIONS_ROOT + "/valid")
|
1512
|
+
assert_equal([], ActiveRecord::Migrator.get_all_versions)
|
1513
|
+
end
|
1514
|
+
|
1203
1515
|
def test_schema_migrations_table_name
|
1204
1516
|
ActiveRecord::Base.table_name_prefix = "prefix_"
|
1205
1517
|
ActiveRecord::Base.table_name_suffix = "_suffix"
|
@@ -1274,7 +1586,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1274
1586
|
columns = Person.connection.columns(:binary_testings)
|
1275
1587
|
data_column = columns.detect { |c| c.name == "data" }
|
1276
1588
|
|
1277
|
-
if current_adapter?(:MysqlAdapter)
|
1589
|
+
if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
|
1278
1590
|
assert_equal '', data_column.default
|
1279
1591
|
else
|
1280
1592
|
assert_nil data_column.default
|
@@ -1305,8 +1617,8 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1305
1617
|
return unless current_adapter? :OracleAdapter
|
1306
1618
|
|
1307
1619
|
# table name is 29 chars, the standard sequence name will
|
1308
|
-
# be 33 chars and
|
1309
|
-
|
1620
|
+
# be 33 chars and should be shortened
|
1621
|
+
assert_nothing_raised do
|
1310
1622
|
begin
|
1311
1623
|
Person.connection.create_table :table_with_name_thats_just_ok do |t|
|
1312
1624
|
t.column :foo, :string, :null => false
|
@@ -1347,7 +1659,7 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1347
1659
|
end
|
1348
1660
|
|
1349
1661
|
end
|
1350
|
-
|
1662
|
+
|
1351
1663
|
class SexyMigrationsTest < ActiveRecord::TestCase
|
1352
1664
|
def test_references_column_type_adds_id
|
1353
1665
|
with_new_table do |t|
|
@@ -1372,48 +1684,113 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1372
1684
|
end
|
1373
1685
|
end
|
1374
1686
|
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1378
|
-
|
1379
|
-
end
|
1687
|
+
def test_belongs_to_works_like_references
|
1688
|
+
with_new_table do |t|
|
1689
|
+
t.expects(:column).with('customer_id', :integer, {})
|
1690
|
+
t.belongs_to :customer
|
1380
1691
|
end
|
1692
|
+
end
|
1381
1693
|
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1386
|
-
|
1387
|
-
end
|
1694
|
+
def test_timestamps_creates_updated_at_and_created_at
|
1695
|
+
with_new_table do |t|
|
1696
|
+
t.expects(:column).with(:created_at, :datetime, kind_of(Hash))
|
1697
|
+
t.expects(:column).with(:updated_at, :datetime, kind_of(Hash))
|
1698
|
+
t.timestamps
|
1388
1699
|
end
|
1700
|
+
end
|
1389
1701
|
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1393
|
-
|
1394
|
-
|
1395
|
-
end
|
1702
|
+
def test_integer_creates_integer_column
|
1703
|
+
with_new_table do |t|
|
1704
|
+
t.expects(:column).with(:foo, 'integer', {})
|
1705
|
+
t.expects(:column).with(:bar, 'integer', {})
|
1706
|
+
t.integer :foo, :bar
|
1396
1707
|
end
|
1708
|
+
end
|
1709
|
+
|
1710
|
+
def test_string_creates_string_column
|
1711
|
+
with_new_table do |t|
|
1712
|
+
t.expects(:column).with(:foo, 'string', {})
|
1713
|
+
t.expects(:column).with(:bar, 'string', {})
|
1714
|
+
t.string :foo, :bar
|
1715
|
+
end
|
1716
|
+
end
|
1397
1717
|
|
1398
|
-
|
1718
|
+
if current_adapter?(:PostgreSQLAdapter)
|
1719
|
+
def test_xml_creates_xml_column
|
1399
1720
|
with_new_table do |t|
|
1400
|
-
t.expects(:column).with(:
|
1401
|
-
t.
|
1402
|
-
t.string :foo, :bar
|
1721
|
+
t.expects(:column).with(:data, 'xml', {})
|
1722
|
+
t.xml :data
|
1403
1723
|
end
|
1404
1724
|
end
|
1725
|
+
end
|
1405
1726
|
|
1406
|
-
|
1407
|
-
|
1408
|
-
|
1409
|
-
|
1410
|
-
end
|
1411
|
-
ensure
|
1412
|
-
Person.connection.drop_table :delete_me rescue nil
|
1727
|
+
protected
|
1728
|
+
def with_new_table
|
1729
|
+
Person.connection.create_table :delete_me, :force => true do |t|
|
1730
|
+
yield t
|
1413
1731
|
end
|
1732
|
+
ensure
|
1733
|
+
Person.connection.drop_table :delete_me rescue nil
|
1734
|
+
end
|
1414
1735
|
|
1415
1736
|
end # SexyMigrationsTest
|
1416
1737
|
|
1738
|
+
class MigrationLoggerTest < ActiveRecord::TestCase
|
1739
|
+
def setup
|
1740
|
+
Object.send(:remove_const, :InnocentJointable)
|
1741
|
+
end
|
1742
|
+
|
1743
|
+
def test_migration_should_be_run_without_logger
|
1744
|
+
previous_logger = ActiveRecord::Base.logger
|
1745
|
+
ActiveRecord::Base.logger = nil
|
1746
|
+
assert_nothing_raised do
|
1747
|
+
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/valid")
|
1748
|
+
end
|
1749
|
+
ensure
|
1750
|
+
ActiveRecord::Base.logger = previous_logger
|
1751
|
+
end
|
1752
|
+
end
|
1753
|
+
|
1754
|
+
class InterleavedMigrationsTest < ActiveRecord::TestCase
|
1755
|
+
def setup
|
1756
|
+
Object.send(:remove_const, :PeopleHaveLastNames)
|
1757
|
+
end
|
1758
|
+
|
1759
|
+
def test_migrator_interleaved_migrations
|
1760
|
+
ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/interleaved/pass_1")
|
1761
|
+
|
1762
|
+
assert_nothing_raised do
|
1763
|
+
ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/interleaved/pass_2")
|
1764
|
+
end
|
1765
|
+
|
1766
|
+
Person.reset_column_information
|
1767
|
+
assert Person.column_methods_hash.include?(:last_name)
|
1768
|
+
|
1769
|
+
Object.send(:remove_const, :PeopleHaveLastNames)
|
1770
|
+
Object.send(:remove_const, :InnocentJointable)
|
1771
|
+
assert_nothing_raised do
|
1772
|
+
ActiveRecord::Migrator.down(MIGRATIONS_ROOT + "/interleaved/pass_3")
|
1773
|
+
end
|
1774
|
+
end
|
1775
|
+
end
|
1776
|
+
|
1777
|
+
class ReservedWordsMigrationTest < ActiveRecord::TestCase
|
1778
|
+
def test_drop_index_from_table_named_values
|
1779
|
+
connection = Person.connection
|
1780
|
+
connection.create_table :values, :force => true do |t|
|
1781
|
+
t.integer :value
|
1782
|
+
end
|
1783
|
+
|
1784
|
+
assert_nothing_raised do
|
1785
|
+
connection.add_index :values, :value
|
1786
|
+
connection.remove_index :values, :column => :value
|
1787
|
+
end
|
1788
|
+
|
1789
|
+
connection.drop_table :values rescue nil
|
1790
|
+
end
|
1791
|
+
end
|
1792
|
+
|
1793
|
+
|
1417
1794
|
class ChangeTableMigrationsTest < ActiveRecord::TestCase
|
1418
1795
|
def setup
|
1419
1796
|
@connection = Person.connection
|
@@ -1421,198 +1798,217 @@ if ActiveRecord::Base.connection.supports_migrations?
|
|
1421
1798
|
end
|
1422
1799
|
end
|
1423
1800
|
|
1424
|
-
|
1425
|
-
|
1801
|
+
def teardown
|
1802
|
+
Person.connection.drop_table :delete_me rescue nil
|
1803
|
+
end
|
1804
|
+
|
1805
|
+
def test_references_column_type_adds_id
|
1806
|
+
with_change_table do |t|
|
1807
|
+
@connection.expects(:add_column).with(:delete_me, 'customer_id', :integer, {})
|
1808
|
+
t.references :customer
|
1426
1809
|
end
|
1810
|
+
end
|
1427
1811
|
|
1428
|
-
|
1429
|
-
|
1430
|
-
|
1431
|
-
|
1432
|
-
end
|
1812
|
+
def test_remove_references_column_type_removes_id
|
1813
|
+
with_change_table do |t|
|
1814
|
+
@connection.expects(:remove_column).with(:delete_me, 'customer_id')
|
1815
|
+
t.remove_references :customer
|
1433
1816
|
end
|
1817
|
+
end
|
1434
1818
|
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
end
|
1819
|
+
def test_add_belongs_to_works_like_add_references
|
1820
|
+
with_change_table do |t|
|
1821
|
+
@connection.expects(:add_column).with(:delete_me, 'customer_id', :integer, {})
|
1822
|
+
t.belongs_to :customer
|
1440
1823
|
end
|
1824
|
+
end
|
1441
1825
|
|
1442
|
-
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
end
|
1826
|
+
def test_remove_belongs_to_works_like_remove_references
|
1827
|
+
with_change_table do |t|
|
1828
|
+
@connection.expects(:remove_column).with(:delete_me, 'customer_id')
|
1829
|
+
t.remove_belongs_to :customer
|
1447
1830
|
end
|
1831
|
+
end
|
1448
1832
|
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1452
|
-
|
1453
|
-
|
1833
|
+
def test_references_column_type_with_polymorphic_adds_type
|
1834
|
+
with_change_table do |t|
|
1835
|
+
@connection.expects(:add_column).with(:delete_me, 'taggable_type', :string, {})
|
1836
|
+
@connection.expects(:add_column).with(:delete_me, 'taggable_id', :integer, {})
|
1837
|
+
t.references :taggable, :polymorphic => true
|
1454
1838
|
end
|
1839
|
+
end
|
1455
1840
|
|
1456
|
-
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
1460
|
-
|
1461
|
-
end
|
1841
|
+
def test_remove_references_column_type_with_polymorphic_removes_type
|
1842
|
+
with_change_table do |t|
|
1843
|
+
@connection.expects(:remove_column).with(:delete_me, 'taggable_type')
|
1844
|
+
@connection.expects(:remove_column).with(:delete_me, 'taggable_id')
|
1845
|
+
t.remove_references :taggable, :polymorphic => true
|
1462
1846
|
end
|
1847
|
+
end
|
1463
1848
|
|
1464
|
-
|
1465
|
-
|
1466
|
-
|
1467
|
-
|
1468
|
-
|
1469
|
-
end
|
1849
|
+
def test_references_column_type_with_polymorphic_and_options_null_is_false_adds_table_flag
|
1850
|
+
with_change_table do |t|
|
1851
|
+
@connection.expects(:add_column).with(:delete_me, 'taggable_type', :string, {:null => false})
|
1852
|
+
@connection.expects(:add_column).with(:delete_me, 'taggable_id', :integer, {:null => false})
|
1853
|
+
t.references :taggable, :polymorphic => true, :null => false
|
1470
1854
|
end
|
1855
|
+
end
|
1471
1856
|
|
1472
|
-
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1476
|
-
|
1477
|
-
end
|
1857
|
+
def test_remove_references_column_type_with_polymorphic_and_options_null_is_false_removes_table_flag
|
1858
|
+
with_change_table do |t|
|
1859
|
+
@connection.expects(:remove_column).with(:delete_me, 'taggable_type')
|
1860
|
+
@connection.expects(:remove_column).with(:delete_me, 'taggable_id')
|
1861
|
+
t.remove_references :taggable, :polymorphic => true, :null => false
|
1478
1862
|
end
|
1863
|
+
end
|
1479
1864
|
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
t.remove_references :taggable, :polymorphic => true, :null => false
|
1485
|
-
end
|
1865
|
+
def test_timestamps_creates_updated_at_and_created_at
|
1866
|
+
with_change_table do |t|
|
1867
|
+
@connection.expects(:add_timestamps).with(:delete_me)
|
1868
|
+
t.timestamps
|
1486
1869
|
end
|
1870
|
+
end
|
1487
1871
|
|
1488
|
-
|
1489
|
-
|
1490
|
-
|
1491
|
-
|
1492
|
-
end
|
1872
|
+
def test_remove_timestamps_creates_updated_at_and_created_at
|
1873
|
+
with_change_table do |t|
|
1874
|
+
@connection.expects(:remove_timestamps).with(:delete_me)
|
1875
|
+
t.remove_timestamps
|
1493
1876
|
end
|
1877
|
+
end
|
1494
1878
|
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1499
|
-
|
1879
|
+
def string_column
|
1880
|
+
if current_adapter?(:PostgreSQLAdapter)
|
1881
|
+
"character varying(255)"
|
1882
|
+
elsif current_adapter?(:OracleAdapter)
|
1883
|
+
'VARCHAR2(255)'
|
1884
|
+
else
|
1885
|
+
'varchar(255)'
|
1500
1886
|
end
|
1887
|
+
end
|
1501
1888
|
|
1502
|
-
|
1503
|
-
|
1504
|
-
|
1505
|
-
|
1506
|
-
|
1507
|
-
|
1889
|
+
def integer_column
|
1890
|
+
if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
|
1891
|
+
'int(11)'
|
1892
|
+
elsif current_adapter?(:OracleAdapter)
|
1893
|
+
'NUMBER(38)'
|
1894
|
+
else
|
1895
|
+
'integer'
|
1508
1896
|
end
|
1897
|
+
end
|
1509
1898
|
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1513
|
-
|
1514
|
-
|
1515
|
-
end
|
1899
|
+
def test_integer_creates_integer_column
|
1900
|
+
with_change_table do |t|
|
1901
|
+
@connection.expects(:add_column).with(:delete_me, :foo, integer_column, {})
|
1902
|
+
@connection.expects(:add_column).with(:delete_me, :bar, integer_column, {})
|
1903
|
+
t.integer :foo, :bar
|
1516
1904
|
end
|
1905
|
+
end
|
1517
1906
|
|
1518
|
-
|
1519
|
-
|
1520
|
-
|
1521
|
-
|
1522
|
-
|
1523
|
-
end
|
1907
|
+
def test_string_creates_string_column
|
1908
|
+
with_change_table do |t|
|
1909
|
+
@connection.expects(:add_column).with(:delete_me, :foo, string_column, {})
|
1910
|
+
@connection.expects(:add_column).with(:delete_me, :bar, string_column, {})
|
1911
|
+
t.string :foo, :bar
|
1524
1912
|
end
|
1913
|
+
end
|
1525
1914
|
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
t.string :foo, :bar
|
1531
|
-
end
|
1915
|
+
def test_column_creates_column
|
1916
|
+
with_change_table do |t|
|
1917
|
+
@connection.expects(:add_column).with(:delete_me, :bar, :integer, {})
|
1918
|
+
t.column :bar, :integer
|
1532
1919
|
end
|
1920
|
+
end
|
1533
1921
|
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1538
|
-
end
|
1922
|
+
def test_column_creates_column_with_options
|
1923
|
+
with_change_table do |t|
|
1924
|
+
@connection.expects(:add_column).with(:delete_me, :bar, :integer, {:null => false})
|
1925
|
+
t.column :bar, :integer, :null => false
|
1539
1926
|
end
|
1927
|
+
end
|
1540
1928
|
|
1541
|
-
|
1542
|
-
|
1543
|
-
|
1544
|
-
|
1545
|
-
end
|
1929
|
+
def test_index_creates_index
|
1930
|
+
with_change_table do |t|
|
1931
|
+
@connection.expects(:add_index).with(:delete_me, :bar, {})
|
1932
|
+
t.index :bar
|
1546
1933
|
end
|
1934
|
+
end
|
1547
1935
|
|
1548
|
-
|
1549
|
-
|
1550
|
-
|
1551
|
-
|
1552
|
-
|
1936
|
+
def test_index_creates_index_with_options
|
1937
|
+
with_change_table do |t|
|
1938
|
+
@connection.expects(:add_index).with(:delete_me, :bar, {:unique => true})
|
1939
|
+
t.index :bar, :unique => true
|
1940
|
+
end
|
1941
|
+
end
|
1942
|
+
|
1943
|
+
def test_index_exists
|
1944
|
+
with_change_table do |t|
|
1945
|
+
@connection.expects(:index_exists?).with(:delete_me, :bar, {})
|
1946
|
+
t.index_exists?(:bar)
|
1553
1947
|
end
|
1948
|
+
end
|
1554
1949
|
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1559
|
-
end
|
1950
|
+
def test_index_exists_with_options
|
1951
|
+
with_change_table do |t|
|
1952
|
+
@connection.expects(:index_exists?).with(:delete_me, :bar, {:unique => true})
|
1953
|
+
t.index_exists?(:bar, :unique => true)
|
1560
1954
|
end
|
1955
|
+
end
|
1561
1956
|
|
1562
|
-
|
1563
|
-
|
1564
|
-
|
1565
|
-
|
1566
|
-
end
|
1957
|
+
def test_change_changes_column
|
1958
|
+
with_change_table do |t|
|
1959
|
+
@connection.expects(:change_column).with(:delete_me, :bar, :string, {})
|
1960
|
+
t.change :bar, :string
|
1567
1961
|
end
|
1962
|
+
end
|
1568
1963
|
|
1569
|
-
|
1570
|
-
|
1571
|
-
|
1572
|
-
|
1573
|
-
end
|
1964
|
+
def test_change_changes_column_with_options
|
1965
|
+
with_change_table do |t|
|
1966
|
+
@connection.expects(:change_column).with(:delete_me, :bar, :string, {:null => true})
|
1967
|
+
t.change :bar, :string, :null => true
|
1574
1968
|
end
|
1969
|
+
end
|
1575
1970
|
|
1576
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
end
|
1971
|
+
def test_change_default_changes_column
|
1972
|
+
with_change_table do |t|
|
1973
|
+
@connection.expects(:change_column_default).with(:delete_me, :bar, :string)
|
1974
|
+
t.change_default :bar, :string
|
1581
1975
|
end
|
1976
|
+
end
|
1582
1977
|
|
1583
|
-
|
1584
|
-
|
1585
|
-
|
1586
|
-
|
1587
|
-
end
|
1978
|
+
def test_remove_drops_single_column
|
1979
|
+
with_change_table do |t|
|
1980
|
+
@connection.expects(:remove_column).with(:delete_me, [:bar])
|
1981
|
+
t.remove :bar
|
1588
1982
|
end
|
1983
|
+
end
|
1589
1984
|
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
|
1594
|
-
end
|
1985
|
+
def test_remove_drops_multiple_columns
|
1986
|
+
with_change_table do |t|
|
1987
|
+
@connection.expects(:remove_column).with(:delete_me, [:bar, :baz])
|
1988
|
+
t.remove :bar, :baz
|
1595
1989
|
end
|
1990
|
+
end
|
1596
1991
|
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
end
|
1992
|
+
def test_remove_index_removes_index_with_options
|
1993
|
+
with_change_table do |t|
|
1994
|
+
@connection.expects(:remove_index).with(:delete_me, {:unique => true})
|
1995
|
+
t.remove_index :unique => true
|
1602
1996
|
end
|
1997
|
+
end
|
1603
1998
|
|
1604
|
-
|
1605
|
-
|
1606
|
-
|
1607
|
-
|
1608
|
-
end
|
1999
|
+
def test_rename_renames_column
|
2000
|
+
with_change_table do |t|
|
2001
|
+
@connection.expects(:rename_column).with(:delete_me, :bar, :baz)
|
2002
|
+
t.rename :bar, :baz
|
1609
2003
|
end
|
2004
|
+
end
|
1610
2005
|
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1615
|
-
end
|
2006
|
+
protected
|
2007
|
+
def with_change_table
|
2008
|
+
Person.connection.change_table :delete_me do |t|
|
2009
|
+
yield t
|
1616
2010
|
end
|
1617
2011
|
end
|
1618
2012
|
end
|
2013
|
+
end
|
2014
|
+
|