Commit d1cfa79d authored by Grzegorz Bizon's avatar Grzegorz Bizon

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

Merge branch 'backstage/gb/migrations-tests-schema-version' into backstage/gb/migrate-stages-statuses

* backstage/gb/migrations-tests-schema-version:
  Migrate down before each migration unit test
  Disable db_cleaner tables caching in migrations tests
  Extend migrations testing documentation
  Make it possible to provide schema version in tests
  Migrate db schema for context in :migration specs
parents 1066d8ba 56d24bcf
...@@ -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,21 @@ module MigrationsHelpers ...@@ -31,6 +31,21 @@ module MigrationsHelpers
end end
end end
def migration_schema_version
self.class.metadata[:schema] || previous_migration.version
end
def schema_migrate_down!
ActiveRecord::Migrator
.migrate(migrations_paths, migration_schema_version)
reset_column_in_migration_models
end
def schema_migrate_up!
ActiveRecord::Migrator.migrate(migrations_paths)
reset_column_in_migration_models
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