spec/shared/system/remotely_translatable.rb
require "sessions_helper"
shared_examples "remotely_translatable" do |factory_name, path_name, path_arguments|
let(:arguments) do
path_arguments.transform_values { |path_to_value| resource.send(path_to_value) }
end
let(:path) { send(path_name, arguments) }
let(:path_in_spanish) { send(path_name, arguments.merge(locale: :es)) }
let!(:resource) { create(factory_name) }
before do
Setting["feature.remote_translations"] = true
available_locales_response = %w[de en es fr pt zh-Hans]
expect(RemoteTranslations::Microsoft::AvailableLocales)
.to receive(:locales).at_most(4).times
.and_return(available_locales_response)
allow(Rails.application.secrets).to receive(:microsoft_api_key).and_return("123")
end
context "Button to request remote translation" do
scenario "should not be present when current locale translation exists" do
visit path
expect(page).not_to have_button "Translate page"
end
scenario "should be present when current locale translation does not exists" do
visit path_in_spanish
expect(page).to have_button "Traducir página"
end
scenario "should not be present when new current locale translation exists" do
add_translations(resource, :es)
visit path
expect(page).not_to have_button "Translate page"
select "Español", from: "Language:"
expect(page).to have_select "Idioma:"
expect(page).not_to have_button "Traducir página"
end
scenario "should not be present when there are no resources to translate", if: index_path?(path_name) do
resource.destroy!
visit path_in_spanish
expect(page).not_to have_button "Traducir página"
end
describe "with delayed job active", :delay_jobs do
scenario "should not be present when an equal RemoteTranslation is enqueued" do
create(:remote_translation, remote_translatable: resource, locale: :es)
visit path_in_spanish
expect(page).to have_content "En un breve periodo de tiempo refrescando la página " \
"podrá ver todo el contenido en su idioma"
expect(page).not_to have_button "Traducir página"
end
end
describe "should ignore missing translations on resource comments",
if: index_path?(path_name) && commentable?(factory_name) do
scenario "is not present when a resource translation exists but its comment has not tanslations" do
add_translations(resource, :es)
create(:comment, commentable: resource)
visit path
expect(page).not_to have_button "Translate page"
select "Español", from: "Language:"
expect(page).to have_select "Idioma:"
expect(page).not_to have_button "Traducir página"
end
end
describe "should evaluate missing translations on resource comments", if: show_path?(path_name) do
scenario "display when exists resource translations but the comment does not have a translation" do
add_translations(resource, :es)
create(:comment, commentable: resource)
visit path
expect(page).not_to have_button "Translate page"
select "Español", from: "Language:"
expect(page).to have_button "Traducir página"
end
scenario "not display when exists resource translations but his comment has tanslations" do
add_translations(resource, :es)
create_comment_with_translations(resource, :es)
visit path
expect(page).not_to have_button "Translate page"
select "Español", from: "Language:"
expect(page).to have_select "Idioma:"
expect(page).not_to have_button "Traducir página"
end
end
describe "should evaluate missing translations on featured_debates", if: path_name == "debates_path" do
scenario "display when exists featured_debates without tanslations" do
add_translations(resource, :es)
create_featured_debates
visit path
expect(page).not_to have_button "Translate page"
select "Español", from: "Language:"
expect(page).to have_button "Traducir página"
end
end
describe "should evaluate missing translations on featured_proposals",
if: path_name == "proposals_path" do
scenario "display when exists featured_proposals without tanslations" do
add_translations(resource, :es)
create_featured_proposals
visit path
expect(page).not_to have_button "Translate page"
select "Español", from: "Language:"
expect(page).to have_button "Traducir página"
end
end
end
context "After click remote translations button" do
describe "with delayed jobs", :delay_jobs do
scenario "shows informative text when content is enqueued" do
visit path_in_spanish
click_button "Traducir página"
expect(page).not_to have_button "Traducir página"
expect(page).to have_content "Se han solicitado correctamente las traducciones."
expect(page).to have_content "En un breve periodo de tiempo refrescando la página " \
"podrá ver todo el contenido en su idioma"
refresh
expect(page).not_to have_content "Se han solicitado correctamente las traducciones."
expect(page).not_to have_button "Traducir página"
expect(page).to have_content "En un breve periodo de tiempo refrescando la página " \
"podrá ver todo el contenido en su idioma"
end
end
describe "without delayed jobs" do
scenario "content is immediately translated" do
response = generate_response(resource)
expect_any_instance_of(RemoteTranslations::Microsoft::Client).to receive(:call).and_return(response)
visit path_in_spanish
expect(page).not_to have_content response.first
click_button "Traducir página"
expect(page).not_to have_button "Traducir página"
expect(page).to have_content response.first
end
scenario "request a translation of an already translated text" do
response = generate_response(resource)
expect_any_instance_of(RemoteTranslations::Microsoft::Client).to receive(:call).and_return(response)
in_browser(:one) do
visit path_in_spanish
expect(page).to have_button "Traducir página"
end
in_browser(:two) do
visit path_in_spanish
click_button "Traducir página"
expect(page).to have_content "Se han solicitado correctamente las traducciones"
end
in_browser(:one) do
click_button "Traducir página"
expect(page).not_to have_button "Traducir página"
end
end
end
end
end
def add_translations(resource, locale)
new_translation = resource.translations.first.dup
new_translation.update!(locale: locale)
resource
end
def create_comment_with_translations(resource, locale)
comment = create(:comment, commentable: resource)
add_translations(comment, locale)
end
def index_path?(path)
["debates_path", "proposals_path", "root_path", "budget_investments_path"].include?(path)
end
def show_path?(path)
!index_path?(path)
end
def commentable?(factory_name)
Comment::COMMENTABLE_TYPES.include?(FactoryBot.factories[factory_name].build_class.to_s)
end
def generate_response(resource)
field_text = Faker::Lorem.characters(number: 10)
resource.translated_attribute_names.map { field_text }
end