35 lines
1.3 KiB
Ruby
35 lines
1.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
# Sometimes data migration specs require adding invalid test data in order to test
|
||
|
# the migration (e.g. adding a row with null foreign key). Certain db migrations that
|
||
|
# add constraints (e.g. NOT NULL constraint) prevent invalid records from being added
|
||
|
# and data migration from being tested. For this reason, SchemaVersionFinder can be used
|
||
|
# to find and use schema prior to specified one.
|
||
|
#
|
||
|
# @example
|
||
|
# RSpec.describe CleanupThings, :migration, schema: MigrationHelpers::SchemaVersionFinder.migration_prior(AddNotNullConstraint) do ...
|
||
|
#
|
||
|
# SchemaVersionFinder returns schema version prior to the one specified, which allows to then add
|
||
|
# invalid records to the database, which in return allows to properly test data migration.
|
||
|
module MigrationHelpers
|
||
|
class SchemaVersionFinder
|
||
|
def self.migrations_paths
|
||
|
ActiveRecord::Migrator.migrations_paths
|
||
|
end
|
||
|
|
||
|
def self.migration_context
|
||
|
ActiveRecord::MigrationContext.new(migrations_paths, ActiveRecord::SchemaMigration)
|
||
|
end
|
||
|
|
||
|
def self.migrations
|
||
|
migration_context.migrations
|
||
|
end
|
||
|
|
||
|
def self.migration_prior(migration_klass)
|
||
|
migrations.each_cons(2) do |previous, migration|
|
||
|
break previous.version if migration.name == migration_klass.name
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|