schema_plus_foreign_keys 0.1.6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/prs.yml +134 -0
  3. data/.gitignore +1 -0
  4. data/.simplecov +20 -0
  5. data/Gemfile +4 -1
  6. data/README.md +49 -35
  7. data/Rakefile +3 -1
  8. data/gemfiles/Gemfile.base +1 -1
  9. data/gemfiles/activerecord-5.2/Gemfile.base +4 -0
  10. data/gemfiles/activerecord-5.2/Gemfile.mysql2 +10 -0
  11. data/gemfiles/activerecord-5.2/Gemfile.postgresql +10 -0
  12. data/gemfiles/{activerecord-4.2.0 → activerecord-5.2}/Gemfile.sqlite3 +3 -3
  13. data/gemfiles/activerecord-6.0/Gemfile.base +4 -0
  14. data/gemfiles/activerecord-6.0/Gemfile.mysql2 +10 -0
  15. data/gemfiles/activerecord-6.0/Gemfile.postgresql +10 -0
  16. data/gemfiles/{activerecord-4.2.6 → activerecord-6.0}/Gemfile.sqlite3 +3 -3
  17. data/lib/schema_plus/foreign_keys/active_record/base.rb +2 -0
  18. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract/schema_creation.rb +20 -0
  19. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/abstract_adapter.rb +9 -47
  20. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/foreign_key_definition.rb +4 -35
  21. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/mysql2_adapter.rb +15 -16
  22. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/postgresql_adapter.rb +8 -6
  23. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/sqlite3_adapter.rb +14 -6
  24. data/lib/schema_plus/foreign_keys/active_record/connection_adapters/table_definition.rb +10 -49
  25. data/lib/schema_plus/foreign_keys/active_record/migration/command_recorder.rb +4 -2
  26. data/lib/schema_plus/foreign_keys/middleware/dumper.rb +5 -3
  27. data/lib/schema_plus/foreign_keys/middleware/migration.rb +13 -5
  28. data/lib/schema_plus/foreign_keys/middleware/model.rb +2 -0
  29. data/lib/schema_plus/foreign_keys/middleware/mysql.rb +3 -1
  30. data/lib/schema_plus/foreign_keys/middleware/sql.rb +2 -15
  31. data/lib/schema_plus/foreign_keys/version.rb +3 -1
  32. data/lib/schema_plus/foreign_keys.rb +3 -1
  33. data/lib/schema_plus_foreign_keys.rb +2 -0
  34. data/schema_dev.yml +5 -4
  35. data/schema_plus_foreign_keys.gemspec +10 -8
  36. data/spec/deprecation_spec.rb +15 -112
  37. data/spec/foreign_key_definition_spec.rb +5 -3
  38. data/spec/foreign_key_spec.rb +26 -24
  39. data/spec/migration_spec.rb +73 -91
  40. data/spec/named_schemas_spec.rb +16 -14
  41. data/spec/schema_dumper_spec.rb +36 -35
  42. data/spec/spec_helper.rb +6 -4
  43. data/spec/support/reference.rb +3 -2
  44. metadata +48 -73
  45. data/.travis.yml +0 -24
  46. data/gemfiles/activerecord-4.2.0/Gemfile.base +0 -3
  47. data/gemfiles/activerecord-4.2.0/Gemfile.mysql2 +0 -10
  48. data/gemfiles/activerecord-4.2.0/Gemfile.postgresql +0 -10
  49. data/gemfiles/activerecord-4.2.1/Gemfile.base +0 -3
  50. data/gemfiles/activerecord-4.2.1/Gemfile.mysql2 +0 -10
  51. data/gemfiles/activerecord-4.2.1/Gemfile.postgresql +0 -10
  52. data/gemfiles/activerecord-4.2.1/Gemfile.sqlite3 +0 -10
  53. data/gemfiles/activerecord-4.2.6/Gemfile.base +0 -3
  54. data/gemfiles/activerecord-4.2.6/Gemfile.mysql2 +0 -10
  55. data/gemfiles/activerecord-4.2.6/Gemfile.postgresql +0 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe "Foreign Key" do
@@ -7,12 +9,12 @@ describe "Foreign Key" do
7
9
  context "created with table" do
8
10
  before(:each) do
9
11
  define_schema do
10
- create_table :users, :force => true do |t|
12
+ create_table :users, force: true do |t|
11
13
  t.string :login
12
14
  end
13
- create_table :comments, :force => true do |t|
14
- t.integer :user_id
15
- t.foreign_key :user_id, :users
15
+ create_table :comments, force: true do |t|
16
+ t.references :user
17
+ t.foreign_key :users, column: :user_id
16
18
  end
17
19
  end
18
20
  class User < ::ActiveRecord::Base ; end
@@ -34,21 +36,21 @@ describe "Foreign Key" do
34
36
 
35
37
  before(:each) do
36
38
  define_schema do
37
- create_table :users, :force => true do |t|
39
+ create_table :users, force: true do |t|
38
40
  t.string :login
39
41
  t.datetime :deleted_at
40
42
  end
41
43
 
42
- create_table :posts, :force => true do |t|
44
+ create_table :posts, force: true do |t|
43
45
  t.text :body
44
- t.integer :user_id
45
- t.integer :author_id
46
+ t.references :user
47
+ t.references :author
46
48
  end
47
49
 
48
- create_table :comments, :force => true do |t|
50
+ create_table :comments, force: true do |t|
49
51
  t.text :body
50
- t.integer :post_id
51
- t.foreign_key :post_id, :posts
52
+ t.references :post
53
+ t.foreign_key :posts, column: :post_id
52
54
  end
53
55
  end
54
56
  class User < ::ActiveRecord::Base ; end
@@ -58,12 +60,12 @@ describe "Foreign Key" do
58
60
  end
59
61
 
60
62
 
61
- context "works", :sqlite3 => :skip do
63
+ context "works", sqlite3: :skip do
62
64
 
63
65
  context "when is added", "posts(author_id)" do
64
66
 
65
67
  before(:each) do
66
- add_foreign_key(:posts, :users, :column => :author_id, :on_update => :cascade, :on_delete => :restrict)
68
+ add_foreign_key(:posts, :users, column: :author_id, on_update: :cascade, on_delete: :restrict)
67
69
  end
68
70
 
69
71
  it "references users(id)" do
@@ -90,7 +92,7 @@ describe "Foreign Key" do
90
92
 
91
93
  context "when is dropped", "comments(post_id)" do
92
94
 
93
- let(:foreign_key_name) { fk = Comment.foreign_keys.detect(&its.column == 'post_id') and fk.name }
95
+ let(:foreign_key_name) { fk = Comment.foreign_keys.detect { |it| it.column == 'post_id' } and fk.name }
94
96
 
95
97
  before(:each) do
96
98
  remove_foreign_key(:comments, name: foreign_key_name)
@@ -112,7 +114,7 @@ describe "Foreign Key" do
112
114
 
113
115
  context "when drop using hash", "comments(post_id)" do
114
116
 
115
- let(:foreign_key_name) { fk = Comment.foreign_keys.detect(&its.column == 'post_id') and fk.name }
117
+ let(:foreign_key_name) { fk = Comment.foreign_keys.detect { |it| it.column == 'post_id' } and fk.name }
116
118
 
117
119
  it "finds by name" do
118
120
  remove_foreign_key(:comments, name: foreign_key_name)
@@ -131,7 +133,7 @@ describe "Foreign Key" do
131
133
  end
132
134
 
133
135
  it "does not error with :if_exists" do
134
- expect{remove_foreign_key(:comments, "posts", column: "nonesuch", :if_exists => true)}.to_not raise_error
136
+ expect{remove_foreign_key(:comments, "posts", column: "nonesuch", if_exists: true)}.to_not raise_error
135
137
  end
136
138
  end
137
139
 
@@ -149,8 +151,8 @@ describe "Foreign Key" do
149
151
  context "when table name is a reserved word" do
150
152
  before(:each) do
151
153
  migration.suppress_messages do
152
- migration.create_table :references, :force => true do |t|
153
- t.integer :post_id, :foreign_key => false
154
+ migration.create_table :references, force: true do |t|
155
+ t.references :post, foreign_key: false
154
156
  end
155
157
  end
156
158
  end
@@ -168,11 +170,11 @@ describe "Foreign Key" do
168
170
 
169
171
  end
170
172
 
171
- context "raises an exception", :sqlite3 => :only do
173
+ context "raises an exception", sqlite3: :only do
172
174
 
173
175
  it "when attempting to add" do
174
176
  expect {
175
- add_foreign_key(:posts, :users, :column => :author_id, :on_update => :cascade, :on_delete => :restrict)
177
+ add_foreign_key(:posts, :users, column: :author_id, on_update: :cascade, on_delete: :restrict)
176
178
  }.to raise_error(NotImplementedError)
177
179
  end
178
180
 
@@ -186,18 +188,18 @@ describe "Foreign Key" do
186
188
  end
187
189
 
188
190
  protected
189
- def add_foreign_key(*args)
191
+ def add_foreign_key(*args, **kwargs)
190
192
  migration.suppress_messages do
191
- migration.add_foreign_key(*args)
193
+ migration.add_foreign_key(*args, **kwargs)
192
194
  end
193
195
  User.reset_column_information
194
196
  Post.reset_column_information
195
197
  Comment.reset_column_information
196
198
  end
197
199
 
198
- def remove_foreign_key(*args)
200
+ def remove_foreign_key(*args, **kwargs)
199
201
  migration.suppress_messages do
200
- migration.remove_foreign_key(*args)
202
+ migration.remove_foreign_key(*args, **kwargs)
201
203
  end
202
204
  User.reset_column_information
203
205
  Post.reset_column_information
@@ -1,27 +1,28 @@
1
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
2
4
  require 'spec_helper'
3
5
 
4
6
  describe ActiveRecord::Migration do
5
-
6
7
  before(:each) do
7
8
  define_schema do
8
9
 
9
- create_table :users, :force => true do |t|
10
- t.string :login, :index => { :unique => true }
10
+ create_table :users, force: true do |t|
11
+ t.string :login, index: { unique: true }
11
12
  end
12
13
 
13
- create_table :members, :force => true do |t|
14
+ create_table :members, force: true do |t|
14
15
  t.string :login
15
16
  end
16
17
 
17
- create_table :comments, :force => true do |t|
18
+ create_table :comments, force: true do |t|
18
19
  t.string :content
19
20
  t.integer :user
20
- t.integer :user_id
21
- t.foreign_key :user_id, :users, :primary_key => :id
21
+ t.references :user
22
+ t.foreign_key :users, column: :user_id, primary_key: :id
22
23
  end
23
24
 
24
- create_table :posts, :force => true do |t|
25
+ create_table :posts, force: true do |t|
25
26
  t.string :content
26
27
  end
27
28
  end
@@ -36,25 +37,25 @@ describe ActiveRecord::Migration do
36
37
  @model = Post
37
38
  end
38
39
 
39
- it "should enable foreign keys", :sqlite3 => :only do
40
+ it "should enable foreign keys", sqlite3: :only do
40
41
  sql = []
41
42
  allow(@model.connection).to receive(:execute) { |str| sql << str }
42
43
  recreate_table(@model) do |t|
43
- t.integer :user, :foreign_key => true
44
+ t.send :bigint, :user, foreign_key: true
44
45
  end
45
46
  expect(sql.join('; ')).to match(/PRAGMA FOREIGN_KEYS = ON.*CREATE TABLE "posts"/)
46
47
  end
47
48
 
48
49
  it "should create foreign key with default reference" do
49
50
  recreate_table(@model) do |t|
50
- t.integer :user, :foreign_key => true
51
+ t.send :bigint, :user, foreign_key: true
51
52
  end
52
53
  expect(@model).to reference(:users, :id).on(:user)
53
54
  end
54
55
 
55
56
  it "should create foreign key with default column" do
56
57
  recreate_table(@model) do |t|
57
- t.integer :user_id
58
+ t.references :user
58
59
  t.foreign_key :users
59
60
  end
60
61
  expect(@model).to reference(:users, :id).on(:user_id)
@@ -62,16 +63,16 @@ describe ActiveRecord::Migration do
62
63
 
63
64
  it "should create foreign key with different reference" do
64
65
  recreate_table(@model) do |t|
65
- t.integer :author_id, :foreign_key => { :references => :users }
66
+ t.references :author, foreign_key: { references: :users }
66
67
  end
67
68
  expect(@model).to reference(:users, :id).on(:author_id)
68
69
  end
69
70
 
70
71
  it "should create foreign key without modifying input hash" do
71
- hash = { :references => :users }
72
+ hash = { references: :users }
72
73
  hash_original = hash.dup
73
74
  recreate_table(@model) do |t|
74
- t.integer :author_id, :foreign_key => hash
75
+ t.references :author, foreign_key: hash
75
76
  end
76
77
  expect(hash).to eq(hash_original)
77
78
  end
@@ -87,40 +88,40 @@ describe ActiveRecord::Migration do
87
88
 
88
89
  it "should create foreign key with different reference using shortcut" do
89
90
  recreate_table(@model) do |t|
90
- t.integer :author_id, :references => :users
91
+ t.references :author, :references => :users
91
92
  end
92
93
  expect(@model).to reference(:users, :id).on(:author_id)
93
94
  end
94
95
 
95
96
  it "should create foreign key with default name" do
96
97
  recreate_table @model do |t|
97
- t.integer :user_id, :foreign_key => true
98
+ t.references :user, :foreign_key => true
98
99
  end
99
- expect(@model).to reference(:users, :id).with_name("fk_#{@model.table_name}_user_id")
100
+ expect(@model).to reference(:users, :id).with_name(/fk_rails_\w+/)
100
101
  end
101
102
 
102
103
  it "should create foreign key with specified name" do
103
104
  recreate_table @model do |t|
104
- t.integer :user_id, :foreign_key => { :name => "wugga" }
105
+ t.references :user, :foreign_key => { :name => "wugga" }
105
106
  end
106
107
  expect(@model).to reference(:users, :id).with_name("wugga")
107
108
  end
108
109
 
109
110
  it "handles very long names" do
110
111
  table = ("ta"*15)
111
- column = ("co"*15 + "_id")
112
+ column = ("co"*15)
112
113
  expect {
113
114
  ActiveRecord::Migration.create_table table do |t|
114
- t.integer column, references: :members
115
+ t.references column, references: :members, index: false
115
116
  end
116
117
  }.not_to raise_error
117
- expect(ActiveRecord::Base.connection.foreign_keys(table).first.column).to eq(column)
118
+ expect(ActiveRecord::Base.connection.foreign_keys(table).first.column).to eq(column + "_id")
118
119
  end
119
120
 
120
121
  it "should allow multiple foreign keys to be made" do
121
122
  recreate_table(@model) do |t|
122
- t.integer :user_id, :references => :users
123
- t.integer :updater_id, :references => :users
123
+ t.references :user, :references => :users
124
+ t.references :updater, :references => :users
124
125
  end
125
126
  expect(@model).to reference(:users, :id).on(:user_id)
126
127
  expect(@model).to reference(:users, :id).on(:updater_id)
@@ -128,14 +129,14 @@ describe ActiveRecord::Migration do
128
129
 
129
130
  it "should suppress foreign key" do
130
131
  recreate_table(@model) do |t|
131
- t.integer :member_id, :foreign_key => false
132
+ t.references :member, :foreign_key => false
132
133
  end
133
134
  expect(@model).not_to reference.on(:member_id)
134
135
  end
135
136
 
136
137
  it "should suppress foreign key using shortcut" do
137
138
  recreate_table(@model) do |t|
138
- t.integer :member_id, :references => nil
139
+ t.references :member, :references => nil
139
140
  end
140
141
  expect(@model).not_to reference.on(:member_id)
141
142
  end
@@ -177,7 +178,7 @@ describe ActiveRecord::Migration do
177
178
 
178
179
  it "should create foreign key to the same table on parent_id" do
179
180
  recreate_table(@model) do |t|
180
- t.integer :parent_id, foreign_key: true
181
+ t.references :parent, foreign_key: true
181
182
  end
182
183
  expect(@model).to reference(@model.table_name, :id).on(:parent_id)
183
184
  end
@@ -195,14 +196,14 @@ describe ActiveRecord::Migration do
195
196
 
196
197
  it "should create and detect on_update #{action.inspect}", if_action_supported do
197
198
  recreate_table @model do |t|
198
- t.integer :user_id, :foreign_key => { :on_update => action }
199
+ t.references :user, :foreign_key => { :on_update => action }
199
200
  end
200
201
  expect(@model).to reference.on(:user_id).on_update(action)
201
202
  end
202
203
 
203
204
  it "should create and detect on_update #{action.inspect} using shortcut", if_action_supported do
204
205
  recreate_table @model do |t|
205
- t.integer :user_id, :on_update => action
206
+ t.references :user, :on_update => action
206
207
  end
207
208
  expect(@model).to reference.on(:user_id).on_update(action)
208
209
  end
@@ -210,21 +211,21 @@ describe ActiveRecord::Migration do
210
211
  it "should raise a not-implemented error for on_update => #{action}", if_action_unsupported do
211
212
  expect {
212
213
  recreate_table @model do |t|
213
- t.integer :user_id, :foreign_key => { :on_update => action }
214
+ t.references :user, :foreign_key => { :on_update => action }
214
215
  end
215
216
  }.to raise_error(NotImplementedError)
216
217
  end
217
218
 
218
219
  it "should create and detect on_delete #{action.inspect}", if_action_supported do
219
220
  recreate_table @model do |t|
220
- t.integer :user_id, :foreign_key => { :on_delete => action }
221
+ t.references :user, :foreign_key => { :on_delete => action }
221
222
  end
222
223
  expect(@model).to reference.on(:user_id).on_delete(action)
223
224
  end
224
225
 
225
226
  it "should create and detect on_delete #{action.inspect} using shortcut", if_action_supported do
226
227
  recreate_table @model do |t|
227
- t.integer :user_id, :on_delete => action
228
+ t.references :user, :on_delete => action
228
229
  end
229
230
  expect(@model).to reference.on(:user_id).on_delete(action)
230
231
  end
@@ -232,7 +233,7 @@ describe ActiveRecord::Migration do
232
233
  it "should raise a not-implemented error for on_delete => #{action}", if_action_unsupported do
233
234
  expect {
234
235
  recreate_table @model do |t|
235
- t.integer :user_id, :foreign_key => { :on_delete => action }
236
+ t.references :user, :foreign_key => { :on_delete => action }
236
237
  end
237
238
  }.to raise_error(NotImplementedError)
238
239
  end
@@ -242,7 +243,7 @@ describe ActiveRecord::Migration do
242
243
  [false, true, :initially_deferred].each do |status|
243
244
  it "should create and detect deferrable #{status.inspect}", :mysql => :skip do
244
245
  recreate_table @model do |t|
245
- t.integer :user_id, :on_delete => :cascade, :deferrable => status
246
+ t.references :user, :on_delete => :cascade, :deferrable => status
246
247
  end
247
248
  expect(@model).to reference.on(:user_id).deferrable(status)
248
249
  end
@@ -251,7 +252,7 @@ describe ActiveRecord::Migration do
251
252
  it "should use default on_delete action" do
252
253
  with_fk_config(:on_delete => :cascade) do
253
254
  recreate_table @model do |t|
254
- t.integer :user_id, foreign_key: true
255
+ t.references :user, foreign_key: true
255
256
  end
256
257
  expect(@model).to reference.on(:user_id).on_delete(:cascade)
257
258
  end
@@ -260,7 +261,7 @@ describe ActiveRecord::Migration do
260
261
  it "should override on_update action per table" do
261
262
  with_fk_config(:on_update => :cascade) do
262
263
  recreate_table @model, :foreign_keys => {:on_update => :restrict} do |t|
263
- t.integer :user_id, foreign_key: true
264
+ t.references :user, foreign_key: true
264
265
  end
265
266
  expect(@model).to reference.on(:user_id).on_update(:restrict)
266
267
  end
@@ -269,7 +270,7 @@ describe ActiveRecord::Migration do
269
270
  it "should override on_delete action per table" do
270
271
  with_fk_config(:on_delete => :cascade) do
271
272
  recreate_table @model, :foreign_keys => {:on_delete => :restrict} do |t|
272
- t.integer :user_id, foreign_key: true
273
+ t.references :user, foreign_key: true
273
274
  end
274
275
  expect(@model).to reference.on(:user_id).on_delete(:restrict)
275
276
  end
@@ -278,7 +279,7 @@ describe ActiveRecord::Migration do
278
279
  it "should override on_update action per column" do
279
280
  with_fk_config(:on_update => :cascade) do
280
281
  recreate_table @model, :foreign_keys => {:on_update => :restrict} do |t|
281
- t.integer :user_id, :foreign_key => { :on_update => :nullify }
282
+ t.references :user, :foreign_key => { :on_update => :nullify }
282
283
  end
283
284
  expect(@model).to reference.on(:user_id).on_update(:nullify)
284
285
  end
@@ -287,7 +288,7 @@ describe ActiveRecord::Migration do
287
288
  it "should override on_delete action per column" do
288
289
  with_fk_config(:on_delete => :cascade) do
289
290
  recreate_table @model, :foreign_keys => {:on_delete => :restrict} do |t|
290
- t.integer :user_id, :foreign_key => { :on_delete => :nullify }
291
+ t.references :user, :foreign_key => { :on_delete => :nullify }
291
292
  end
292
293
  expect(@model).to reference.on(:user_id).on_delete(:nullify)
293
294
  end
@@ -296,7 +297,7 @@ describe ActiveRecord::Migration do
296
297
  it "should raise an error for an invalid on_update action" do
297
298
  expect {
298
299
  recreate_table @model do |t|
299
- t.integer :user_id, :foreign_key => { :on_update => :invalid }
300
+ t.references :user, :foreign_key => { :on_update => :invalid }
300
301
  end
301
302
  }.to raise_error(ArgumentError)
302
303
  end
@@ -304,7 +305,7 @@ describe ActiveRecord::Migration do
304
305
  it "should raise an error for an invalid on_delete action" do
305
306
  expect {
306
307
  recreate_table @model do |t|
307
- t.integer :user_id, :foreign_key => { :on_delete => :invalid }
308
+ t.references :user, :foreign_key => { :on_delete => :invalid }
308
309
  end
309
310
  }.to raise_error(ArgumentError)
310
311
  end
@@ -315,12 +316,15 @@ describe ActiveRecord::Migration do
315
316
  before(:each) do
316
317
  @model = Post
317
318
  end
318
- [false, true].each do |bulk|
319
+ # Disabling bulk tests on mysql since the mysql adapter does not implement it for add_foreign_key in rails 5.1+
320
+ bulk_tests = RSpec.configuration.exclusion_filter[:mysql] == :skip ? [false] : [true, false]
321
+
322
+ bulk_tests.each do |bulk|
319
323
  suffix = bulk ? ' with :bulk option' : ""
320
324
 
321
325
  it "should create a foreign key constraint"+suffix, :sqlite3 => :skip do
322
326
  change_table(@model, :bulk => bulk) do |t|
323
- t.integer :user_id, foreign_key: true
327
+ t.references :user, foreign_key: true
324
328
  end
325
329
  expect(@model).to reference(:users, :id).on(:user_id)
326
330
  end
@@ -329,10 +333,10 @@ describe ActiveRecord::Migration do
329
333
  it "should remove a foreign key constraint"+suffix, :sqlite3 => :skip do
330
334
  Comment.reset_column_information
331
335
  expect(Comment).to reference(:users, :id).on(:user_id)
332
- migration = Class.new ::ActiveRecord::Migration do
336
+ migration = Class.new ::ActiveRecord::Migration.latest_version do
333
337
  define_method(:change) {
334
338
  change_table("comments", :bulk => bulk) do |t|
335
- t.integer :user_id, foreign_key: true
339
+ t.references :user, foreign_key: true
336
340
  end
337
341
  }
338
342
  end
@@ -346,7 +350,7 @@ describe ActiveRecord::Migration do
346
350
 
347
351
  it "should create a foreign key constraint using :references"+suffix, :sqlite3 => :skip do
348
352
  change_table(@model, :bulk => bulk) do |t|
349
- t.references :user, foreign_key: true
353
+ t.send :bigint, :user_id, foreign_key: true
350
354
  end
351
355
  expect(@model).to reference(:users, :id).on(:user_id)
352
356
  end
@@ -367,19 +371,19 @@ describe ActiveRecord::Migration do
367
371
  end
368
372
 
369
373
  it "should create foreign key" do
370
- add_column(:post_id, :integer, foreign_key: true) do
374
+ add_column(:post_id, :bigint, foreign_key: true) do
371
375
  expect(@model).to reference(:posts, :id).on(:post_id)
372
376
  end
373
377
  end
374
378
 
375
379
  it "should create foreign key to explicitly given table" do
376
- add_column(:author_id, :integer, :foreign_key => { :references => :users }) do
380
+ add_column(:author_id, :bigint, :foreign_key => { :references => :users }) do
377
381
  expect(@model).to reference(:users, :id).on(:author_id)
378
382
  end
379
383
  end
380
384
 
381
385
  it "should create foreign key to explicitly given table using shortcut" do
382
- add_column(:author_id, :integer, :references => :users) do
386
+ add_column(:author_id, :bigint, :references => :users) do
383
387
  expect(@model).to reference(:users, :id).on(:author_id)
384
388
  end
385
389
  end
@@ -391,14 +395,14 @@ describe ActiveRecord::Migration do
391
395
  end
392
396
 
393
397
  it "should create foreign key to the same table on parent_id" do
394
- add_column(:parent_id, :integer, foreign_key: true) do
398
+ add_column(:parent_id, :bigint, foreign_key: true) do
395
399
  expect(@model).to reference(@model.table_name, :id).on(:parent_id)
396
400
  end
397
401
  end
398
402
 
399
403
  it "should use default on_update action" do
400
404
  SchemaPlus::ForeignKeys.config.on_update = :cascade
401
- add_column(:post_id, :integer, foreign_key: true) do
405
+ add_column(:post_id, :bigint, foreign_key: true) do
402
406
  expect(@model).to reference.on(:post_id).on_update(:cascade)
403
407
  end
404
408
  SchemaPlus::ForeignKeys.config.on_update = nil
@@ -406,7 +410,7 @@ describe ActiveRecord::Migration do
406
410
 
407
411
  it "should use default on_delete action" do
408
412
  SchemaPlus::ForeignKeys.config.on_delete = :cascade
409
- add_column(:post_id, :integer, foreign_key: true) do
413
+ add_column(:post_id, :bigint, foreign_key: true) do
410
414
  expect(@model).to reference.on(:post_id).on_delete(:cascade)
411
415
  end
412
416
  SchemaPlus::ForeignKeys.config.on_delete = nil
@@ -415,22 +419,22 @@ describe ActiveRecord::Migration do
415
419
  it "should allow to overwrite default actions" do
416
420
  SchemaPlus::ForeignKeys.config.on_delete = :cascade
417
421
  SchemaPlus::ForeignKeys.config.on_update = :restrict
418
- add_column(:post_id, :integer, :foreign_key => { :on_update => :nullify, :on_delete => :nullify}) do
422
+ add_column(:post_id, :bigint, :foreign_key => { :on_update => :nullify, :on_delete => :nullify}) do
419
423
  expect(@model).to reference.on(:post_id).on_delete(:nullify).on_update(:nullify)
420
424
  end
421
425
  SchemaPlus::ForeignKeys.config.on_delete = nil
422
426
  end
423
427
 
424
428
  it "should create foreign key with default name" do
425
- add_column(:post_id, :integer, foreign_key: true) do
426
- expect(@model).to reference(:posts, :id).with_name("fk_#{@model.table_name}_post_id")
429
+ add_column(:post_id, :bigint, foreign_key: true) do
430
+ expect(@model).to reference(:posts, :id).with_name(/fk_rails_\w+/)
427
431
  end
428
432
  end
429
433
 
430
434
  protected
431
- def add_column(column_name, *args)
435
+ def add_column(column_name, type, **options)
432
436
  table = @model.table_name
433
- ActiveRecord::Migration.add_column(table, column_name, *args)
437
+ ActiveRecord::Migration.add_column(table, column_name, type, **options)
434
438
  @model.reset_column_information
435
439
  yield if block_given?
436
440
  ActiveRecord::Migration.remove_column(table, column_name)
@@ -456,7 +460,7 @@ describe ActiveRecord::Migration do
456
460
 
457
461
  before(:each) do
458
462
  recreate_table @model do |t|
459
- t.integer :user_id, foreign_key: true
463
+ t.references :user, foreign_key: true
460
464
  end
461
465
  end
462
466
 
@@ -465,22 +469,22 @@ describe ActiveRecord::Migration do
465
469
  end
466
470
 
467
471
  it "should drop foreign key if it is no longer valid" do
468
- change_column :user_id, :integer, :foreign_key => { :references => :members }
472
+ change_column :user_id, :bigint, :foreign_key => { :references => :members }
469
473
  expect(@model).not_to reference(:users)
470
474
  end
471
475
 
472
476
  it "should drop foreign key if requested to do so" do
473
- change_column :user_id, :integer, :foreign_key => { :references => nil }
477
+ change_column :user_id, :bigint, :foreign_key => { :references => nil }
474
478
  expect(@model).not_to reference(:users)
475
479
  end
476
480
 
477
481
  it "should reference pointed table afterwards if new one is created" do
478
- change_column :user_id, :integer, :foreign_key => { :references => :members }
482
+ change_column :user_id, :bigint, :foreign_key => { :references => :members }
479
483
  expect(@model).to reference(:members)
480
484
  end
481
485
 
482
486
  it "should maintain foreign key if it's unaffected by change" do
483
- change_column :user_id, :integer, :default => 0
487
+ change_column :user_id, :bigint, :default => 0
484
488
  expect(@model).to reference(:users)
485
489
  end
486
490
 
@@ -489,10 +493,10 @@ describe ActiveRecord::Migration do
489
493
  end
490
494
 
491
495
  protected
492
- def change_column(column_name, *args)
496
+ def change_column(column_name, type, **options)
493
497
  table = @model.table_name
494
498
  ActiveRecord::Migration.suppress_messages do
495
- ActiveRecord::Migration.change_column(table, column_name, *args)
499
+ ActiveRecord::Migration.change_column(table, column_name, type, **options)
496
500
  @model.reset_column_information
497
501
  end
498
502
  end
@@ -503,7 +507,7 @@ describe ActiveRecord::Migration do
503
507
  before(:each) do
504
508
  @model = Comment
505
509
  recreate_table @model do |t|
506
- t.integer :post_id, foreign_key: true
510
+ t.references :post, foreign_key: true
507
511
  end
508
512
  end
509
513
 
@@ -523,34 +527,13 @@ describe ActiveRecord::Migration do
523
527
  end
524
528
  end
525
529
 
526
-
527
- context "when table is renamed" do
528
-
529
- before(:each) do
530
- @model = Comment
531
- recreate_table @model do |t|
532
- t.integer :user_id, foreign_key: true
533
- t.integer :xyz, :index => true
534
- end
535
- ActiveRecord::Migration.suppress_messages do
536
- ActiveRecord::Migration.rename_table @model.table_name, :newname
537
- end
538
- end
539
-
540
- it "should rename foreign key constraints", :sqlite3 => :skip do
541
- expect(ActiveRecord::Base.connection.foreign_keys(:newname).first.name).to match(/newname/)
542
- end
543
-
544
- end
545
-
546
-
547
530
  context "when table with more than one fk constraint is renamed", :sqlite3 => :skip do
548
531
 
549
532
  before(:each) do
550
533
  @model = Comment
551
534
  recreate_table @model do |t|
552
- t.integer :user_id
553
- t.integer :member_id
535
+ t.references :user
536
+ t.references :member
554
537
  end
555
538
  ActiveRecord::Migration.suppress_messages do
556
539
  ActiveRecord::Migration.rename_table @model.table_name, :newname
@@ -565,17 +548,16 @@ describe ActiveRecord::Migration do
565
548
 
566
549
  def recreate_table(model, opts={}, &block)
567
550
  ActiveRecord::Migration.suppress_messages do
568
- ActiveRecord::Migration.create_table model.table_name, opts.merge(:force => true), &block
551
+ ActiveRecord::Migration.create_table model.table_name, **opts.merge(:force => true), &block
569
552
  end
570
553
  model.reset_column_information
571
554
  end
572
555
 
573
556
  def change_table(model, opts={}, &block)
574
557
  ActiveRecord::Migration.suppress_messages do
575
- ActiveRecord::Migration.change_table model.table_name, opts, &block
558
+ ActiveRecord::Migration.change_table model.table_name, **opts, &block
576
559
  end
577
560
  model.reset_column_information
578
561
  end
579
562
 
580
563
  end
581
-