diff --git a/test/dummy_app/db/schema.rb b/test/dummy_app/db/schema.rb index 2deffcd..52a1883 100644 --- a/test/dummy_app/db/schema.rb +++ b/test/dummy_app/db/schema.rb @@ -10,5 +10,5 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2013_09_06_111512) do +ActiveRecord::Schema[7.0].define(version: 2013_09_06_111513) do end diff --git a/test/rake_task_test.rb b/test/rake_task_test.rb index dff554a..2ab805d 100644 --- a/test/rake_task_test.rb +++ b/test/rake_task_test.rb @@ -29,11 +29,6 @@ def run_migrations Rake::Task["db:rollback_branches"].reenable end -def dump_schema - Rake::Task["db:schema:dump"].invoke - Rake::Task["db:schema:dump"].reenable -end - def run_sql(sql) ActiveRecord::Base.connection.execute(sql) end @@ -54,12 +49,16 @@ def delete_migrations_files end end +def define_migration_file(filename, content) + File.write(app_file("db/migrate/#{filename}"), content, mode: "w") +end + def define_migrations { first: "20130906111511_first.rb", second: "20130906111512_second.rb" }.each do |key, file_name| - File.write(app_file("db/migrate/#{file_name}"), %( + define_migration_file(file_name, <<~RUBY) class #{key.to_s.camelize} < ActiveRecord::Migration[7.0] def up TestingState.up << :#{key} @@ -69,10 +68,15 @@ def down TestingState.down << :#{key} end end - ), mode: "w") + RUBY end end +def prepare_phantom_migrations + run_migrations + delete_migrations_files # simulate switching branches +end + describe "db:rollback_branches" do let(:migrated_files) do Dir.glob(app_file("tmp/migrated/*.rb")).map { |f| File.basename(f) }.sort @@ -106,10 +110,33 @@ def down end it "rolls back the migrations in the reversed order" do - run_migrations + prepare_phantom_migrations assert_empty TestingState.down - delete_migrations_files # simulate switching branches run_migrations assert_equal %i[second first], TestingState.down end + + describe "with irreversible migration" do + before do + define_migration_file("20130906111513_irreversible.rb", <<~RUBY) + class Irreversible < ActiveRecord::Migration[7.0] + def up + TestingState.up << :irreversible + end + + def down + raise ActiveRecord::IrreversibleMigration + end + end + RUBY + end + + it "keeps track of the irreversible migrations" do + prepare_phantom_migrations + assert_equal %i[first second irreversible], TestingState.up + assert_empty ActualDbSchema.failed + run_migrations + assert_equal(%w[20130906111513_irreversible.rb], ActualDbSchema.failed.map { |m| File.basename(m.filename) }) + end + end end