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