class ActiveRecord::Migration::ForeignKeyTest

Public Instance Methods

test_add_foreign_key_inferes_column() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 68
def test_add_foreign_key_inferes_column
  @connection.add_foreign_key :astronauts, :rockets

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal "astronauts", fk.from_table
  assert_equal "rockets", fk.to_table
  assert_equal "rocket_id", fk.column
  assert_equal "id", fk.primary_key
  assert_equal("fk_quails_78146ddd2e", fk.name)
end
test_add_foreign_key_is_reversible() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 263
def test_add_foreign_key_is_reversible
  migration = CreateCitiesAndHousesMigration.new
  silence_stream($stdout) { migration.migrate(:up) }
  assert_equal 1, @connection.foreign_keys("houses").size
ensure
  silence_stream($stdout) { migration.migrate(:down) }
end
test_add_foreign_key_with_column() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 82
def test_add_foreign_key_with_column
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal "astronauts", fk.from_table
  assert_equal "rockets", fk.to_table
  assert_equal "rocket_id", fk.column
  assert_equal "id", fk.primary_key
  assert_equal("fk_quails_78146ddd2e", fk.name)
end
test_add_foreign_key_with_non_standard_primary_key() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 96
def test_add_foreign_key_with_non_standard_primary_key
  @connection.create_table :space_shuttles, id: false, force: true do |t|
    t.bigint :pk, primary_key: true
  end

  @connection.add_foreign_key(:astronauts, :space_shuttles,
    column: "rocket_id", primary_key: "pk", name: "custom_pk")

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal "astronauts", fk.from_table
  assert_equal "space_shuttles", fk.to_table
  assert_equal "pk", fk.primary_key
ensure
  @connection.remove_foreign_key :astronauts, name: "custom_pk"
  @connection.drop_table :space_shuttles
end
test_add_foreign_key_with_on_update() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 161
def test_add_foreign_key_with_on_update
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :nullify

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal :nullify, fk.on_update
end
test_add_foreign_key_with_prefix() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 291
def test_add_foreign_key_with_prefix
  ActiveRecord::Base.table_name_prefix = "p_"
  migration = CreateSchoolsAndClassesMigration.new
  silence_stream($stdout) { migration.migrate(:up) }
  assert_equal 1, @connection.foreign_keys("p_classes").size
ensure
  silence_stream($stdout) { migration.migrate(:down) }
  ActiveRecord::Base.table_name_prefix = nil
end
test_add_foreign_key_with_suffix() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 301
def test_add_foreign_key_with_suffix
  ActiveRecord::Base.table_name_suffix = "_s"
  migration = CreateSchoolsAndClassesMigration.new
  silence_stream($stdout) { migration.migrate(:up) }
  assert_equal 1, @connection.foreign_keys("classes_s").size
ensure
  silence_stream($stdout) { migration.migrate(:down) }
  ActiveRecord::Base.table_name_suffix = nil
end
test_add_on_delete_cascade_foreign_key() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 131
def test_add_on_delete_cascade_foreign_key
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal :cascade, fk.on_delete
end
test_add_on_delete_nullify_foreign_key() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 141
def test_add_on_delete_nullify_foreign_key
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal :nullify, fk.on_delete
end
test_add_on_delete_restrict_foreign_key() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 116
def test_add_on_delete_restrict_foreign_key
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :restrict

  foreign_keys = @connection.foreign_keys("astronauts")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  if current_adapter?(:Mysql2Adapter)
    # ON DELETE RESTRICT is the default on MySQL
    assert_nil fk.on_delete
  else
    assert_equal :restrict, fk.on_delete
  end
end
test_foreign_key_constraint_is_not_cached_incorrectly() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 271
def test_foreign_key_constraint_is_not_cached_incorrectly
  migration = CreateCitiesAndHousesMigration.new
  silence_stream($stdout) { migration.migrate(:up) }
  output = dump_table_schema "houses"
  assert_match %r{\s+add_foreign_key "houses",.+on_delete: :cascade$}, output
ensure
  silence_stream($stdout) { migration.migrate(:down) }
end
test_foreign_key_exists() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 171
def test_foreign_key_exists
  @connection.add_foreign_key :astronauts, :rockets

  assert @connection.foreign_key_exists?(:astronauts, :rockets)
  assert_not @connection.foreign_key_exists?(:astronauts, :stars)
end
test_foreign_key_exists_by_column() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 178
def test_foreign_key_exists_by_column
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"

  assert @connection.foreign_key_exists?(:astronauts, column: "rocket_id")
  assert_not @connection.foreign_key_exists?(:astronauts, column: "star_id")
end
test_foreign_key_exists_by_name() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 185
def test_foreign_key_exists_by_name
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"

  assert @connection.foreign_key_exists?(:astronauts, name: "fancy_named_fk")
  assert_not @connection.foreign_key_exists?(:astronauts, name: "other_fancy_named_fk")
end
test_foreign_keys() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 56
def test_foreign_keys
  foreign_keys = @connection.foreign_keys("fk_test_has_fk")
  assert_equal 1, foreign_keys.size

  fk = foreign_keys.first
  assert_equal "fk_test_has_fk", fk.from_table
  assert_equal "fk_test_has_pk", fk.to_table
  assert_equal "fk_id", fk.column
  assert_equal "pk_id", fk.primary_key
  assert_equal "fk_name", fk.name
end
test_on_update_and_on_delete_raises_with_invalid_values() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 151
def test_on_update_and_on_delete_raises_with_invalid_values
  assert_raises ArgumentError do
    @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :invalid
  end

  assert_raises ArgumentError do
    @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :invalid
  end
end
test_remove_foreign_key_by_column() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 200
def test_remove_foreign_key_by_column
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"

  assert_equal 1, @connection.foreign_keys("astronauts").size
  @connection.remove_foreign_key :astronauts, column: "rocket_id"
  assert_equal [], @connection.foreign_keys("astronauts")
end
test_remove_foreign_key_by_name() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 216
def test_remove_foreign_key_by_name
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"

  assert_equal 1, @connection.foreign_keys("astronauts").size
  @connection.remove_foreign_key :astronauts, name: "fancy_named_fk"
  assert_equal [], @connection.foreign_keys("astronauts")
end
test_remove_foreign_key_by_symbol_column() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 208
def test_remove_foreign_key_by_symbol_column
  @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id

  assert_equal 1, @connection.foreign_keys("astronauts").size
  @connection.remove_foreign_key :astronauts, column: :rocket_id
  assert_equal [], @connection.foreign_keys("astronauts")
end
test_remove_foreign_key_inferes_column() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 192
def test_remove_foreign_key_inferes_column
  @connection.add_foreign_key :astronauts, :rockets

  assert_equal 1, @connection.foreign_keys("astronauts").size
  @connection.remove_foreign_key :astronauts, :rockets
  assert_equal [], @connection.foreign_keys("astronauts")
end
test_remove_foreign_non_existing_foreign_key_raises() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 224
def test_remove_foreign_non_existing_foreign_key_raises
  assert_raises ArgumentError do
    @connection.remove_foreign_key :astronauts, :rockets
  end
end
test_schema_dumping() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 230
def test_schema_dumping
  @connection.add_foreign_key :astronauts, :rockets
  output = dump_table_schema "astronauts"
  assert_match %r{\s+add_foreign_key "astronauts", "rockets"$}, output
end
test_schema_dumping_on_delete_and_on_update_options() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 241
def test_schema_dumping_on_delete_and_on_update_options
  @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :cascade

  output = dump_table_schema "astronauts"
  assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :cascade,.+on_delete: :nullify$}, output
end
test_schema_dumping_with_options() click to toggle source
# File activerecord/test/cases/migration/foreign_key_test.rb, line 236
def test_schema_dumping_with_options
  output = dump_table_schema "fk_test_has_fk"
  assert_match %r{\s+add_foreign_key "fk_test_has_fk", "fk_test_has_pk", column: "fk_id", primary_key: "pk_id", name: "fk_name"$}, output
end