Commit c3e0f31d authored by Sean McGivern's avatar Sean McGivern

Merge branch 'backstage/gb/migrations-tests-schema-version' into 'master'

Improve migrations / background migrations testing strategy

Closes #36303

See merge request !13589
parents fe0ffcc7 3a29646d
...@@ -210,7 +210,11 @@ describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads::Event do ...@@ -210,7 +210,11 @@ describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads::Event do
end end
end end
describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads do ##
# The background migration relies on a temporary table, hence we're migrating
# to a specific version of the database where said table is still present.
#
describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads, :migration, schema: 20170608152748 do
let(:migration) { described_class.new } let(:migration) { described_class.new }
let(:project) { create(:project_empty_repo) } let(:project) { create(:project_empty_repo) }
let(:author) { create(:user) } let(:author) { create(:user) }
...@@ -229,21 +233,6 @@ describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads do ...@@ -229,21 +233,6 @@ describe Gitlab::BackgroundMigration::MigrateEventsToPushEventPayloads do
) )
end end
# The background migration relies on a temporary table, hence we're migrating
# to a specific version of the database where said table is still present.
before :all do
ActiveRecord::Migration.verbose = false
ActiveRecord::Migrator
.migrate(ActiveRecord::Migrator.migrations_paths, 20170608152748)
end
after :all do
ActiveRecord::Migrator.migrate(ActiveRecord::Migrator.migrations_paths)
ActiveRecord::Migration.verbose = true
end
describe '#perform' do describe '#perform' do
it 'returns if data should not be migrated' do it 'returns if data should not be migrated' do
allow(migration).to receive(:migrate?).and_return(false) allow(migration).to receive(:migrate?).and_return(false)
......
...@@ -28,6 +28,14 @@ The `after` hook will migrate the database **up** and reinstitutes the latest ...@@ -28,6 +28,14 @@ The `after` hook will migrate the database **up** and reinstitutes the latest
schema version, so that the process does not affect subsequent specs and schema version, so that the process does not affect subsequent specs and
ensures proper isolation. ensures proper isolation.
## Testing a class that is not an ActiveRecord::Migration
In order to test a class that is not a migration itself, you will need to
manually provide a required schema version. Please add a `schema` tag to a
context that you want to switch the database schema within.
Example: `describe SomeClass, :migration, schema: 20170608152748`.
## Available helpers ## Available helpers
Use `table` helper to create a temporary `ActiveRecord::Base` derived model Use `table` helper to create a temporary `ActiveRecord::Base` derived model
...@@ -80,8 +88,6 @@ end ...@@ -80,8 +88,6 @@ end
## Best practices ## Best practices
1. Use only one test example per migration unless there is a good reason to
use more.
1. Note that this type of tests do not run within the transaction, we use 1. Note that this type of tests do not run within the transaction, we use
a truncation database cleanup strategy. Do not depend on transaction being a truncation database cleanup strategy. Do not depend on transaction being
present. present.
...@@ -132,17 +132,12 @@ RSpec.configure do |config| ...@@ -132,17 +132,12 @@ RSpec.configure do |config|
Sidekiq.redis(&:flushall) Sidekiq.redis(&:flushall)
end end
config.before(:example, :migration) do config.before(:each, :migration) do
ActiveRecord::Migrator schema_migrate_down!
.migrate(migrations_paths, previous_migration.version)
reset_column_in_migration_models
end end
config.after(:example, :migration) do config.after(:context, :migration) do
ActiveRecord::Migrator.migrate(migrations_paths) schema_migrate_up!
reset_column_in_migration_models
end end
config.around(:each, :nested_groups) do |example| config.around(:each, :nested_groups) do |example|
......
...@@ -20,7 +20,7 @@ RSpec.configure do |config| ...@@ -20,7 +20,7 @@ RSpec.configure do |config|
end end
config.before(:each, :migration) do config.before(:each, :migration) do
DatabaseCleaner.strategy = :truncation DatabaseCleaner.strategy = :truncation, { cache_tables: false }
end end
config.before(:each) do config.before(:each) do
......
...@@ -31,6 +31,35 @@ module MigrationsHelpers ...@@ -31,6 +31,35 @@ module MigrationsHelpers
end end
end end
def migration_schema_version
self.class.metadata[:schema] || previous_migration.version
end
def schema_migrate_down!
disable_migrations_output do
ActiveRecord::Migrator.migrate(migrations_paths,
migration_schema_version)
end
reset_column_in_migration_models
end
def schema_migrate_up!
disable_migrations_output do
ActiveRecord::Migrator.migrate(migrations_paths)
end
reset_column_in_migration_models
end
def disable_migrations_output
ActiveRecord::Migration.verbose = false
yield
ensure
ActiveRecord::Migration.verbose = true
end
def migrate! def migrate!
ActiveRecord::Migrator.up(migrations_paths) do |migration| ActiveRecord::Migrator.up(migrations_paths) do |migration|
migration.name == described_class.name migration.name == described_class.name
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment