class BulkAlterTableMigrationsTest

Public Instance Methods

setup() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 752
def setup
  @connection = Person.connection
  @connection.create_table(:delete_me, force: true) { |t| }
  Person.reset_column_information
  Person.reset_sequence_name
end
test_adding_indexes() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 797
def test_adding_indexes
  with_bulk_change_table do |t|
    t.string :username
    t.string :name
    t.integer :age
  end

  # Adding an index fires a query every time to check if an index already exists or not
  assert_queries(3) do
    with_bulk_change_table do |t|
      t.index :username, unique: true, name: :awesome_username_index
      t.index [:name, :age]
    end
  end

  assert_equal 2, indexes.size

  name_age_index = index(:index_delete_me_on_name_and_age)
  assert_equal ["name", "age"].sort, name_age_index.columns.sort
  assert ! name_age_index.unique

  assert index(:awesome_username_index).unique
end
test_adding_multiple_columns() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 763
def test_adding_multiple_columns
  assert_queries(1) do
    with_bulk_change_table do |t|
      t.column :name, :string
      t.string :qualification, :experience
      t.integer :age, default: 0
      t.date :birthdate
      t.timestamps null: true
    end
  end

  assert_equal 8, columns.size
  [:name, :qualification, :experience].each { |s| assert_equal :string, column(s).type }
  assert_equal "0", column(:age).default
end
test_changing_columns() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 842
def test_changing_columns
  with_bulk_change_table do |t|
    t.string :name
    t.date :birthdate
  end

  assert ! column(:name).default
  assert_equal :date, column(:birthdate).type

  # One query for columns (delete_me table)
  # One query for primary key (delete_me table)
  # One query to do the bulk change
  assert_queries(3, ignore_none: true) do
    with_bulk_change_table do |t|
      t.change :name, :string, default: "NONAME"
      t.change :birthdate, :datetime
    end
  end

  assert_equal "NONAME", column(:name).default
  assert_equal :datetime, column(:birthdate).type
end
test_removing_columns() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 779
def test_removing_columns
  with_bulk_change_table do |t|
    t.string :qualification, :experience
  end

  [:qualification, :experience].each { |c| assert column(c) }

  assert_queries(1) do
    with_bulk_change_table do |t|
      t.remove :qualification, :experience
      t.string :qualification_experience
    end
  end

  [:qualification, :experience].each { |c| assert ! column(c) }
  assert column(:qualification_experience)
end
test_removing_index() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 821
def test_removing_index
  with_bulk_change_table do |t|
    t.string :name
    t.index :name
  end

  assert index(:index_delete_me_on_name)

  assert_queries(3) do
    with_bulk_change_table do |t|
      t.remove_index :name
      t.index :name, name: :new_name_index, unique: true
    end
  end

  assert ! index(:index_delete_me_on_name)

  new_name_index = index(:new_name_index)
  assert new_name_index.unique
end

Private Instance Methods

column(name) click to toggle source
# File activerecord/test/cases/migration_test.rb, line 876
def column(name)
  columns.detect { |c| c.name == name.to_s }
end
columns() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 880
def columns
  @columns ||= Person.connection.columns("delete_me")
end
index(name) click to toggle source
# File activerecord/test/cases/migration_test.rb, line 884
def index(name)
  indexes.detect { |i| i.name == name.to_s }
end
indexes() click to toggle source
# File activerecord/test/cases/migration_test.rb, line 888
def indexes
  @indexes ||= Person.connection.indexes("delete_me")
end
with_bulk_change_table() { |t| ... } click to toggle source
# File activerecord/test/cases/migration_test.rb, line 867
def with_bulk_change_table
  # Reset columns/indexes cache as we're changing the table
  @columns = @indexes = nil

  Person.connection.change_table(:delete_me, bulk: true) do |t|
    yield t
  end
end