From 25e9c358ad37727fa2e95745de7784cd002a0450 Mon Sep 17 00:00:00 2001 From: taitus Date: Fri, 25 Jan 2019 14:51:30 +0100 Subject: [PATCH] Create RemotelyTranslatable concern controller - Create concern to reuse the logic of detection of non-existent translations in Controllers. - Add detect_remote_translation method: * This method will be called from controllers to recover resources without translation. * Receive arrays of resources. * Return an array with hashes of remote_translations values for every resources that have not translations. * This array will be the param that will be sent from view to RemoteTranslationController for create remote translations instances. --- .../concerns/remotely_translatable.rb | 29 ++++++++ .../concerns/remotely_translatable_spec.rb | 66 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 app/controllers/concerns/remotely_translatable.rb create mode 100644 spec/controllers/concerns/remotely_translatable_spec.rb diff --git a/app/controllers/concerns/remotely_translatable.rb b/app/controllers/concerns/remotely_translatable.rb new file mode 100644 index 000000000..600c8a86f --- /dev/null +++ b/app/controllers/concerns/remotely_translatable.rb @@ -0,0 +1,29 @@ +module RemotelyTranslatable + + private + + def detect_remote_translations(*args) + return [] unless Setting["feature.remote_translations"].present? + + resources_groups(*args).flatten.select { |resource| translation_empty?(resource) }.map do |resource| + remote_translation_for(resource) + end + end + + def remote_translation_for(resource) + { 'remote_translatable_id' => resource.id.to_s, + 'remote_translatable_type' => resource.class.to_s, + 'locale' => I18n.locale } + end + + def translation_empty?(resource) + resource.translations.where(locale: I18n.locale).empty? + end + + def resources_groups(*args) + feeds = args.detect { |arg| arg&.first.class == Widget::Feed } || [] + + args.compact - [feeds] + feeds.map(&:items) + end + +end diff --git a/spec/controllers/concerns/remotely_translatable_spec.rb b/spec/controllers/concerns/remotely_translatable_spec.rb new file mode 100644 index 000000000..92ab5c8f6 --- /dev/null +++ b/spec/controllers/concerns/remotely_translatable_spec.rb @@ -0,0 +1,66 @@ +require "rails_helper" +include RemotelyTranslatable + +describe RemotelyTranslatable do + + before do + Setting["feature.remote_translations"] = true + end + + after do + Setting["feature.remote_translations"] = nil + end + + describe "#detect_remote_translations" do + + describe "Should detect remote_translations" do + + it "When collections and featured_proposals are not defined in current locale" do + proposals = create_list(:proposal, 3) + featured_proposals = create_featured_proposals + + I18n.with_locale(:es) do + expect(detect_remote_translations(proposals, featured_proposals).count).to eq 6 + end + end + + it "When we have nil as argument and collections are not defined in current locale" do + proposals = create_list(:proposal, 3) + + I18n.with_locale(:es) do + expect(detect_remote_translations(proposals, nil).count).to eq 3 + end + end + + it "When we have [] as argument and collections are not defined in current locale" do + proposals = create_list(:proposal, 3) + + I18n.with_locale(:es) do + expect(detect_remote_translations(proposals, []).count).to eq 3 + end + end + + it "When widget feeds are not defined in current locale" do + create_list(:proposal, 3) + create_list(:debate, 3) + create_list(:legislation_process, 3) + create(:widget_feed, kind: "proposals") + create(:widget_feed, kind: "debates") + create(:widget_feed, kind: "processes") + widget_feeds = Widget::Feed.active + + I18n.with_locale(:es) do + expect(detect_remote_translations(widget_feeds).count).to eq 9 + end + end + + end + + it "When defined in current locale should not detect remote_translations" do + proposal = create(:proposal) + comment = create(:comment, commentable: proposal) + + expect(detect_remote_translations([proposal, comment])).to eq [] + end + end +end