The test "request a translation of an already translated text" was failing sometimes on our CI since August 29, maybe due to a change in GitHub Actions since the test had been passing for a year and a half and we didn't change any code around that time (we were updating the documentation). While the root cause is unknown, debugging shows that sometimes (usually the first time this test is executed on our CI, and only the first time, since running it 600 tests in a row also resulted in only one failure) the request done by clicking on "Traducir página" is done with a user session where the locale is in English. This doesn't make much sense, since both user sessions are already in Spanish (and we had either explicit or implicit expectations to confirm that), and debugging shows that the session is indeed in Spanish during the previous request. In any case, we're solving it by never using English during the test, since it wasn't necessary; it was only done that way because all the tests on this file used the language selector to get to the Spanish pages. We're simplifying some of the other tests the same way. The test failure was: ``` Failure/Error: expect(page).to have_content "Se han solicitado correctamente las traducciones" expected to find text "Se han solicitado correctamente las traducciones" in "Idioma: \n \nEnglish\nDeutsch\nEspañol\nFrançais\nNederlands\nPortuguês brasileiro\n中文\n Entrar\nRegistrarse\nDebates\nPropuestas\nVotaciones\nLegislación colaborativa\nPresupuestos participativos\nODS\nAyuda\n×\nTranslations have been correctly requested.\nPropuestas más activas\nAhora mismo no hay propuestas\nDebates más activos\nndfrrqufrp\nVer todos los debates\nProcesos abiertos\nAhora mismo no hay procesos abiertos\nGobierno abierto\nEste portal usa la aplicación CONSUL DEMOCRACY que es software de código abierto.\nParticipación\nDecide cómo debe ser la ciudad que quieres.\nCONSUL DEMOCRACY, 2024 Política de privacidad Condiciones de uso Accesibilidad" ``` Note that most of the text is in Spanish (as expected) but the flash message itself is in English.
219 lines
7.4 KiB
Ruby
219 lines
7.4 KiB
Ruby
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
|