Add task to simulate data migration

This way we can check everything is OK before actually migrating the
data to the translations tables.
This commit is contained in:
Javi Martín
2018-10-17 13:41:14 +02:00
parent 3c48059f07
commit 7fff57a25f
2 changed files with 73 additions and 6 deletions

View File

@@ -1,9 +1,5 @@
namespace :globalize do namespace :globalize do
desc "Migrates existing data to translation tables" def translatable_classes
task migrate_data: :environment do
logger = Logger.new(STDOUT)
logger.formatter = proc { |severity, _datetime, _progname, msg| "#{severity} #{msg}\n" }
[ [
AdminNotification, AdminNotification,
Banner, Banner,
@@ -18,7 +14,13 @@ namespace :globalize do
Poll::Question::Answer, Poll::Question::Answer,
SiteCustomization::Page, SiteCustomization::Page,
Widget::Card Widget::Card
].each do |model_class| ]
end
def migrate_data
@errored = false
translatable_classes.each do |model_class|
logger.info "Migrating #{model_class} data" logger.info "Migrating #{model_class} data"
fields = model_class.translated_attribute_names fields = model_class.translated_attribute_names
@@ -40,8 +42,43 @@ namespace :globalize do
record.save! record.save!
rescue ActiveRecord::RecordInvalid rescue ActiveRecord::RecordInvalid
logger.error "Failed to save #{model_class} with id #{record.id}" logger.error "Failed to save #{model_class} with id #{record.id}"
@errored = true
end end
end end
end end
end end
def logger
@logger ||= Logger.new(STDOUT).tap do |logger|
logger.formatter = proc { |severity, _datetime, _progname, msg| "#{severity} #{msg}\n" }
end
end
def errored?
@errored
end
desc "Simulates migrating existing data to translation tables"
task simulate_migrate_data: :environment do
logger.info "Starting migrate data simulation"
ActiveRecord::Base.transaction do
migrate_data
raise ActiveRecord::Rollback
end
if errored?
logger.error "Simulation failed! Please check the errors and solve them before proceeding."
raise "Simulation failed!"
else
logger.info "Migrate data simulation ended successfully"
end
end
desc "Migrates existing data to translation tables"
task migrate_data: :simulate_migrate_data do
logger.info "Starting data migration"
migrate_data
logger.info "Finished data migration"
end
end end

View File

@@ -11,6 +11,7 @@ describe "Globalize tasks" do
end end
let :run_rake_task do let :run_rake_task do
Rake::Task["globalize:simulate_migrate_data"].reenable
Rake::Task["globalize:migrate_data"].reenable Rake::Task["globalize:migrate_data"].reenable
Rake.application.invoke_task "globalize:migrate_data" Rake.application.invoke_task "globalize:migrate_data"
end end
@@ -115,5 +116,34 @@ describe "Globalize tasks" do
expect(page.send(:"title_#{I18n.locale}")).to eq("In English") expect(page.send(:"title_#{I18n.locale}")).to eq("In English")
end end
end end
context "Invalid data" do
let!(:valid_process) do
create(:legislation_process).tap do |process|
process.translations.delete_all
process.update_column(:title, "Title")
process.reload
end
end
let!(:invalid_process) do
create(:legislation_process).tap do |process|
process.translations.delete_all
process.update_column(:title, "")
process.reload
end
end
it "simulates the task and aborts without creating any translations" do
expect(valid_process).to be_valid
expect(invalid_process).not_to be_valid
expect { run_rake_task }.to raise_exception("Simulation failed!")
expect(Legislation::Process::Translation.count).to eq 0
expect(valid_process.reload.title).to eq "Title"
expect(invalid_process.reload.title).to eq ""
end
end
end end
end end