1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
# frozen_string_literal: true
require "cases/helper"
require "support/schema_dumping_helper"
module ActiveRecord
class Migration
class CompatibilityTest < ActiveRecord::TestCase
attr_reader :connection
self.use_transactional_tests = false
def setup
super
@connection = ActiveRecord::Base.connection
@verbose_was = ActiveRecord::Migration.verbose
ActiveRecord::Migration.verbose = false
connection.create_table :testings do |t|
t.column :foo, :string, limit: 100
t.column :bar, :string, limit: 100
end
end
teardown do
connection.drop_table :testings rescue nil
ActiveRecord::Migration.verbose = @verbose_was
ActiveRecord::SchemaMigration.delete_all rescue nil
end
def test_migration_doesnt_remove_named_index
connection.add_index :testings, :foo, name: "custom_index_name"
migration = Class.new(ActiveRecord::Migration[4.2]) {
def version; 101 end
def migrate(x)
remove_index :testings, :foo
end
}.new
assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
assert_raise(StandardError) { ActiveRecord::Migrator.new(:up, [migration]).migrate }
assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
end
def test_migration_does_remove_unnamed_index
connection.add_index :testings, :bar
migration = Class.new(ActiveRecord::Migration[4.2]) {
def version; 101 end
def migrate(x)
remove_index :testings, :bar
end
}.new
assert connection.index_exists?(:testings, :bar)
ActiveRecord::Migrator.new(:up, [migration]).migrate
assert_not connection.index_exists?(:testings, :bar)
end
def test_references_does_not_add_index_by_default
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
create_table :more_testings do |t|
t.references :foo
t.belongs_to :bar, index: false
end
end
}.new
ActiveRecord::Migrator.new(:up, [migration]).migrate
assert_not connection.index_exists?(:more_testings, :foo_id)
assert_not connection.index_exists?(:more_testings, :bar_id)
ensure
connection.drop_table :more_testings rescue nil
end
def test_timestamps_have_null_constraints_if_not_present_in_migration_of_create_table
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
create_table :more_testings do |t|
t.timestamps
end
end
}.new
ActiveRecord::Migrator.new(:up, [migration]).migrate
assert connection.columns(:more_testings).find { |c| c.name == "created_at" }.null
assert connection.columns(:more_testings).find { |c| c.name == "updated_at" }.null
ensure
connection.drop_table :more_testings rescue nil
end
def test_timestamps_have_null_constraints_if_not_present_in_migration_of_change_table
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
change_table :testings do |t|
t.timestamps
end
end
}.new
ActiveRecord::Migrator.new(:up, [migration]).migrate
assert connection.columns(:testings).find { |c| c.name == "created_at" }.null
assert connection.columns(:testings).find { |c| c.name == "updated_at" }.null
end
def test_timestamps_have_null_constraints_if_not_present_in_migration_for_adding_timestamps_to_existing_table
migration = Class.new(ActiveRecord::Migration[4.2]) {
def migrate(x)
add_timestamps :testings
end
}.new
ActiveRecord::Migrator.new(:up, [migration]).migrate
assert connection.columns(:testings).find { |c| c.name == "created_at" }.null
assert connection.columns(:testings).find { |c| c.name == "updated_at" }.null
end
def test_legacy_migrations_raises_exception_when_inherited
e = assert_raises(StandardError) do
class_eval("class LegacyMigration < ActiveRecord::Migration; end")
end
assert_match(/LegacyMigration < ActiveRecord::Migration\[4\.2\]/, e.message)
end
end
end
end
class LegacyPrimaryKeyTest < ActiveRecord::TestCase
include SchemaDumpingHelper
self.use_transactional_tests = false
class LegacyPrimaryKey < ActiveRecord::Base
end
def setup
@migration = nil
@verbose_was = ActiveRecord::Migration.verbose
ActiveRecord::Migration.verbose = false
end
def teardown
@migration.migrate(:down) if @migration
ActiveRecord::Migration.verbose = @verbose_was
ActiveRecord::SchemaMigration.delete_all rescue nil
LegacyPrimaryKey.reset_column_information
end
def test_legacy_primary_key_should_be_auto_incremented
@migration = Class.new(ActiveRecord::Migration[5.0]) {
def change
create_table :legacy_primary_keys do |t|
t.references :legacy_ref
end
end
}.new
@migration.migrate(:up)
legacy_pk = LegacyPrimaryKey.columns_hash["id"]
assert_not legacy_pk.bigint?
assert_not legacy_pk.null
legacy_ref = LegacyPrimaryKey.columns_hash["legacy_ref_id"]
assert_not legacy_ref.bigint?
record1 = LegacyPrimaryKey.create!
assert_not_nil record1.id
record1.destroy
record2 = LegacyPrimaryKey.create!
assert_not_nil record2.id
assert_operator record2.id, :>, record1.id
end
def test_legacy_integer_primary_key_should_not_be_auto_incremented
skip if current_adapter?(:SQLite3Adapter)
@migration = Class.new(ActiveRecord::Migration[5.0]) {
def change
create_table :legacy_primary_keys, id: :integer do |t|
end
end
}.new
@migration.migrate(:up)
assert_raises(ActiveRecord::NotNullViolation) do
LegacyPrimaryKey.create!
end
schema = dump_table_schema "legacy_primary_keys"
assert_match %r{create_table "legacy_primary_keys", id: :integer, default: nil}, schema
end
if current_adapter?(:Mysql2Adapter)
def test_legacy_bigint_primary_key_should_be_auto_incremented
@migration = Class.new(ActiveRecord::Migration[5.0]) {
def change
create_table :legacy_primary_keys, id: :bigint
end
}.new
@migration.migrate(:up)
legacy_pk = LegacyPrimaryKey.columns_hash["id"]
assert legacy_pk.bigint?
assert legacy_pk.auto_increment?
schema = dump_table_schema "legacy_primary_keys"
assert_match %r{create_table "legacy_primary_keys", (?!id: :bigint, default: nil)}, schema
end
else
def test_legacy_bigint_primary_key_should_not_be_auto_incremented
@migration = Class.new(ActiveRecord::Migration[5.0]) {
def change
create_table :legacy_primary_keys, id: :bigint do |t|
end
end
}.new
@migration.migrate(:up)
assert_raises(ActiveRecord::NotNullViolation) do
LegacyPrimaryKey.create!
end
schema = dump_table_schema "legacy_primary_keys"
assert_match %r{create_table "legacy_primary_keys", id: :bigint, default: nil}, schema
end
end
end
|