ibm_db 2.5.5 → 2.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +5 -0
- data/README +4 -2
- data/ext/ibm_db.c +144 -12
- data/ext/ruby_ibm_db_cli.h +1 -0
- data/lib/IBM_DB.rb +1 -1
- data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +62 -1
- data/test/cases/adapter_test.rb +41 -19
- data/test/cases/associations/belongs_to_associations_test.rb +486 -0
- data/test/cases/associations/cascaded_eager_loading_test.rb +53 -3
- data/test/cases/associations/eager_test.rb +42 -22
- data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +114 -71
- data/test/cases/associations/has_many_through_associations_test.rb +214 -34
- data/test/cases/associations/join_model_test.rb +26 -34
- data/test/cases/attribute_methods_test.rb +387 -78
- data/test/cases/base_test.rb +555 -1183
- data/test/cases/calculations_test.rb +55 -43
- data/test/cases/finder_test.rb +218 -222
- data/test/cases/fixtures_test.rb +44 -20
- data/test/cases/migration_test.rb +638 -242
- data/test/cases/schema_dumper_test.rb +38 -3
- data/test/cases/validations/uniqueness_validation_test.rb +283 -0
- data/test/schema/i5/ibm_db_specific_schema.rb +1 -0
- data/test/schema/ids/ibm_db_specific_schema.rb +1 -0
- data/test/schema/luw/ibm_db_specific_schema.rb +2 -1
- data/test/schema/schema.rb +157 -10
- data/test/schema/zOS/ibm_db_specific_schema.rb +1 -0
- metadata +5 -5
- data/test/cases/helper.rb +0 -75
- data/test/cases/validations_test.rb +0 -1604
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
|
+
|