From ef7be4fc5521ae439b076c446a9686c3ec4a93fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Fri, 5 Oct 2018 14:15:24 +0200 Subject: [PATCH] Add task to migrate data to translation tables We forgot to do it when we created the translation tables, and so now we need to make sure we don't overwrite existing translations. --- lib/tasks/globalize.rake | 34 ++++++++++++++ spec/lib/tasks/globalize_spec.rb | 76 ++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 lib/tasks/globalize.rake create mode 100644 spec/lib/tasks/globalize_spec.rb diff --git a/lib/tasks/globalize.rake b/lib/tasks/globalize.rake new file mode 100644 index 000000000..37acb06cb --- /dev/null +++ b/lib/tasks/globalize.rake @@ -0,0 +1,34 @@ +namespace :globalize do + desc "Migrates existing data to translation tables" + task migrate_data: :environment do + [ + AdminNotification, + Banner, + Budget::Investment::Milestone, + I18nContent, + Legislation::DraftVersion, + Legislation::Process, + Legislation::Question, + Legislation::QuestionOption, + Poll, + Poll::Question, + Poll::Question::Answer, + SiteCustomization::Page, + Widget::Card + ].each do |model_class| + Logger.new(STDOUT).info "Migrating #{model_class} data" + + fields = model_class.translated_attribute_names + + model_class.find_each do |record| + fields.each do |field| + if record.send(:"#{field}_#{I18n.locale}").blank? + record.send(:"#{field}_#{I18n.locale}=", record.untranslated_attributes[field.to_s]) + end + end + + record.save! + end + end + end +end diff --git a/spec/lib/tasks/globalize_spec.rb b/spec/lib/tasks/globalize_spec.rb new file mode 100644 index 000000000..2b00353d3 --- /dev/null +++ b/spec/lib/tasks/globalize_spec.rb @@ -0,0 +1,76 @@ +require "rails_helper" +require "rake" + +describe "Globalize tasks" do + + describe "#migrate_data" do + + before do + Rake.application.rake_require "tasks/globalize" + Rake::Task.define_task(:environment) + end + + let :run_rake_task do + Rake::Task["globalize:migrate_data"].reenable + Rake.application.invoke_task "globalize:migrate_data" + end + + context "Original data with no translated data" do + let(:poll) do + create(:poll).tap do |poll| + poll.translations.delete_all + poll.update_column(:name, "Original") + poll.reload + end + end + + it "copies the original data" do + expect(poll.send(:"name_#{I18n.locale}")).to be nil + expect(poll.name).to eq("Original") + + run_rake_task + poll.reload + + expect(poll.name).to eq("Original") + expect(poll.send(:"name_#{I18n.locale}")).to eq("Original") + end + end + + context "Original data with blank translated data" do + let(:banner) do + create(:banner).tap do |banner| + banner.update_column(:title, "Original") + banner.translations.first.update_column(:title, "") + end + end + + it "copies the original data" do + expect(banner.title).to eq("") + + run_rake_task + banner.reload + + expect(banner.title).to eq("Original") + expect(banner.send(:"title_#{I18n.locale}")).to eq("Original") + end + end + + context "Original data with translated data" do + let(:notification) do + create(:admin_notification, title: "Translated").tap do |notification| + notification.update_column(:title, "Original") + end + end + + it "maintains the translated data" do + expect(notification.title).to eq("Translated") + + run_rake_task + notification.reload + + expect(notification.title).to eq("Translated") + expect(notification.send(:"title_#{I18n.locale}")).to eq("Translated") + end + end + end +end