moving migrator tests to a migrator test class

This commit is contained in:
Aaron Patterson 2012-01-12 15:29:16 -08:00
parent 5baa66cbad
commit 01f86cd8ea
3 changed files with 66 additions and 55 deletions

@ -342,9 +342,9 @@ def self.migrate(direction)
attr_accessor :name, :version
def initialize
@name = self.class.name
@version = nil
def initialize(name = self.class.name, version = nil)
@name = name
@version = version
@connection = nil
@reverting = false
end
@ -619,8 +619,6 @@ def migrations(paths)
files = Dir[*paths.map { |p| "#{p}/**/[0-9]*_*.rb" }]
seen = Hash.new false
migrations = files.map do |file|
version, name, scope = file.scan(/([0-9]+)_([_a-z0-9]*)\.?([_a-z0-9]*)?.rb/).first
@ -628,11 +626,6 @@ def migrations(paths)
version = version.to_i
name = name.camelize
raise DuplicateMigrationVersionError.new(version) if seen[version]
raise DuplicateMigrationNameError.new(name) if seen[name]
seen[version] = seen[name] = true
MigrationProxy.new(name, version, file, scope)
end
@ -655,9 +648,9 @@ def move(direction, migrations_paths, steps)
def initialize(direction, migrations, target_version = nil)
raise StandardError.new("This database does not yet support migrations") unless Base.connection.supports_migrations?
Base.connection.initialize_schema_migrations_table
@direction = direction
@target_version = target_version
if Array(migrations).grep(String).empty?
@migrations = migrations
@ -666,7 +659,9 @@ def initialize(direction, migrations, target_version = nil)
@migrations = self.class.migrations(migrations)
end
@target_version = target_version
validate(@migrations)
Base.connection.initialize_schema_migrations_table
end
def current_version
@ -748,36 +743,44 @@ def migrated
end
private
def record_version_state_after_migrating(version)
table = Arel::Table.new(self.class.schema_migrations_table_name)
def validate(migrations)
name ,= migrations.group_by(&:name).find { |_,v| v.length > 1 }
raise DuplicateMigrationNameError.new(name) if name
@migrated_versions ||= []
if down?
@migrated_versions.delete(version)
stmt = table.where(table["version"].eq(version.to_s)).compile_delete
Base.connection.delete stmt
else
@migrated_versions.push(version).sort!
stmt = table.compile_insert table["version"] => version.to_s
Base.connection.insert stmt
end
end
version ,= migrations.group_by(&:version).find { |_,v| v.length > 1 }
raise DuplicateMigrationVersionError.new(version) if version
end
def up?
@direction == :up
end
def record_version_state_after_migrating(version)
table = Arel::Table.new(self.class.schema_migrations_table_name)
def down?
@direction == :down
@migrated_versions ||= []
if down?
@migrated_versions.delete(version)
stmt = table.where(table["version"].eq(version.to_s)).compile_delete
Base.connection.delete stmt
else
@migrated_versions.push(version).sort!
stmt = table.compile_insert table["version"] => version.to_s
Base.connection.insert stmt
end
end
# Wrap the migration in a transaction only if supported by the adapter.
def ddl_transaction(&block)
if Base.connection.supports_ddl_transactions?
Base.transaction { block.call }
else
block.call
end
def up?
@direction == :up
end
def down?
@direction == :down
end
# Wrap the migration in a transaction only if supported by the adapter.
def ddl_transaction(&block)
if Base.connection.supports_ddl_transactions?
Base.transaction { block.call }
else
block.call
end
end
end
end

@ -601,24 +601,6 @@ def test_create_table_with_binary_column
Person.connection.drop_table :binary_testings rescue nil
end
def test_migrator_with_duplicates
assert_raise(ActiveRecord::DuplicateMigrationVersionError) do
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/duplicate", nil)
end
end
def test_migrator_with_duplicate_names
assert_raise(ActiveRecord::DuplicateMigrationNameError, "Multiple migrations have the name Chunky") do
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/duplicate_names", nil)
end
end
def test_migrator_with_missing_version_numbers
assert_raise(ActiveRecord::UnknownMigrationVersionError) do
ActiveRecord::Migrator.migrate(MIGRATIONS_ROOT + "/missing", 500)
end
end
def test_create_table_with_custom_sequence_name
skip "not supported" unless current_adapter? :OracleAdapter

@ -0,0 +1,26 @@
require "cases/helper"
module ActiveRecord
class MigratorTest < ActiveRecord::TestCase
def test_migrator_with_duplicate_names
assert_raises(ActiveRecord::DuplicateMigrationNameError, "Multiple migrations have the name Chunky") do
list = [Migration.new('Chunky'), Migration.new('Chunky')]
ActiveRecord::Migrator.new(:up, list)
end
end
def test_migrator_with_duplicate_versions
assert_raises(ActiveRecord::DuplicateMigrationVersionError) do
list = [Migration.new('Foo', 1), Migration.new('Bar', 1)]
ActiveRecord::Migrator.new(:up, list)
end
end
def test_migrator_with_missing_version_numbers
assert_raises(ActiveRecord::UnknownMigrationVersionError) do
list = [Migration.new('Foo', 1), Migration.new('Bar', 2)]
ActiveRecord::Migrator.new(:up, list, 3).run
end
end
end
end