diff options
Diffstat (limited to 'spec/support/migrations_helpers/schema_version_finder.rb')
-rw-r--r-- | spec/support/migrations_helpers/schema_version_finder.rb | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/spec/support/migrations_helpers/schema_version_finder.rb b/spec/support/migrations_helpers/schema_version_finder.rb new file mode 100644 index 00000000000..b677db7ea26 --- /dev/null +++ b/spec/support/migrations_helpers/schema_version_finder.rb @@ -0,0 +1,34 @@ +# 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 |