Files
nairobi/spec/system/admin/translatable_spec.rb
Javi Martín f63be041c1 Add missing expectations to confirm the page has changed
After a `visit`, we were checking for content or filling in fields that
were already there before the `visit`, so we weren't 100% sure that the
request had finished before the test continued.

In the case of the verification tests, we were clicking the submit
buttons over and over without and then checking or interacting with
elements that were already there. Even though the button was disabled
between requests, meaning there wouldn't be simultaneous requests, it
was possible to interact with a form field before waiting for the
request to finish.

Some of these tests have recently failed on our CI, and it might be
because of that:

```
1) Admin budgets Edit Changing name for current locale will update the
   slug if budget is in draft phase
   Failure/Error: raise ex, cause: cause

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)

1) Budgets creation wizard Creation of a multiple-headings budget by
   steps
   Failure/Error: expect(page).to have_content "Heading created
   successfully!"

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)

1) Custom information texts Show custom texts instead of default ones
   Failure/Error: raise ex, cause: cause

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)

1) Users Regular authentication Sign in Avoid username-email collisions
   Failure/Error: raise ex, cause: cause

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)

2) Verify Letter Code verification 6 tries allowed
   Failure/Error: raise ex, cause: cause

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)

2) Valuation budget investments Valuate Finish valuation
   Failure/Error: raise ex, cause: cause

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)

1) Users Delete a level 2 user account from document verification page
   Failure/Error: raise ex, cause: cause

   Selenium::WebDriver::Error::UnknownError:
     unknown error: unhandled inspector error: {"code":-32000,
     "message":"Node with given id does not belong to the document"}
       (Session info: chrome=134.0.6998.35)
```
2025-03-26 16:27:08 +01:00

585 lines
18 KiB
Ruby

require "rails_helper"
describe "Admin edit translatable records", :admin do
before do
translatable.main_link_url = "https://consuldemocracy.org" if translatable.is_a?(Budget::Phase)
translatable.update!(attributes)
end
let(:fields) { translatable.translated_attribute_names }
let(:attributes) do
fields.product(%i[en es]).to_h do |field, locale|
[:"#{field}_#{locale}", text_for(field, locale)]
end
end
context "Add a translation" do
context "Input fields" do
let(:translatable) { create(:budget_heading) }
let(:path) { admin_polymorphic_path(translatable, action: :edit) }
scenario "Maintains existing translations" do
visit path
select "Français", from: "Add language"
fill_in "Heading name", with: "Nom en Français"
click_button "Save heading"
expect(page).to have_content "Heading updated successfully"
visit path
expect(page).to have_field "Heading name", with: "Heading name in English"
select "Español", from: "Current language"
expect(page).to have_field "Heading name", with: "Nombre de la partida en español"
select "Français", from: "Current language"
expect(page).to have_field "Heading name", with: "Nom en Français"
end
end
context "CKEditor fields" do
let(:translatable) { create(:site_customization_page) }
let(:path) { edit_admin_site_customization_page_path(translatable) }
scenario "Maintains existing translations" do
visit path
select "Français", from: "Add language"
fill_in "Title", with: "Titre en Français"
fill_in "Subtitle", with: "Sous-titres en Français"
fill_in_ckeditor "Content", with: "Contenu en Français"
click_button "Update Custom page"
expect(page).to have_content "Page updated successfully"
visit path
expect(page).to have_ckeditor "Content", with: "Content in English"
select "Español", from: "Current language"
expect(page).to have_ckeditor "Content", with: "Contenido en español"
select "Français", from: "Current language"
expect(page).to have_ckeditor "Content", with: "Contenu en Français"
end
end
context "Markdownit field" do
let(:translatable) { create(:legislation_draft_version) }
let(:path) { edit_admin_legislation_process_draft_version_path(translatable.process, translatable) }
scenario "Maintains existing translations" do
visit path
select "Français", from: "Add language"
fill_in "Version title", with: "Titre en Français"
click_link class: "fullscreen-toggle"
fill_in "Text", with: "Texte en Français"
click_link class: "fullscreen-toggle"
click_button "Save changes"
expect(page).to have_content "Draft updated successfully"
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "Text in English"
click_link class: "fullscreen-toggle"
select "Español", from: "Current language"
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "Texto en español"
click_link class: "fullscreen-toggle"
select "Français", from: "Current language"
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "Texte en Français"
end
end
context "Locale with non-underscored name" do
let(:translatable) { create(:legislation_question) }
let(:path) { edit_admin_legislation_process_question_path(translatable.process, translatable) }
scenario "Adds a translation for that locale" do
visit path
select "Português brasileiro", from: "Add language"
fill_in "Question", with: "Português"
click_button "Save changes"
expect(page).to have_content "Question updated successfully"
visit path
expect(page).not_to have_content "Question updated successfully"
select "Português brasileiro", from: "Language:"
expect(page).to have_field "Questão", with: "Português"
end
end
end
context "Add an invalid translation" do
let(:translatable) { create(:budget_investment) }
context "Input field" do
let(:translatable) { create(:budget, main_link_url: "https://consuldemocracy.org") }
scenario "Shows validation erros" do
visit edit_admin_budget_path(translatable)
select "Français", from: "Add language"
fill_in "Name", with: ""
click_button "Update Budget"
expect(page).to have_css "#error_explanation"
select "Français", from: "Current language"
expect(page).to have_field "Name", with: "", class: "is-invalid-input"
end
end
context "CKEditor field" do
let(:translatable) { create(:budget_investment) }
scenario "Shows validation errors" do
visit edit_admin_budget_budget_investment_path(translatable.budget, translatable)
select "Français", from: "Add language"
fill_in "Title", with: "Titre en Français"
fill_in_ckeditor "Description", with: ""
click_button "Update"
expect(page).to have_css "#error_explanation"
select "Français", from: "Current language"
expect(page).to have_ckeditor "Description", with: ""
end
end
context "Markdownit field" do
let(:translatable) { create(:legislation_draft_version) }
scenario "Shows validation errors" do
visit edit_admin_legislation_process_draft_version_path(translatable.process, translatable)
select "Français", from: "Add language"
fill_in "Version title", with: "Titre en Français"
click_link class: "fullscreen-toggle"
fill_in "Text", with: ""
click_link class: "fullscreen-toggle"
click_button "Save changes"
expect(page).to have_css "#error_explanation"
select "Français", from: "Current language"
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "", class: "is-invalid-input"
end
end
end
context "Update a translation" do
context "Input fields" do
let(:translatable) { create(:widget_card) }
let(:path) { edit_admin_widget_card_path(translatable) }
scenario "Changes the existing translation" do
visit path
select "Español", from: "Current language"
within(".translatable-fields") do
fill_in "Title", with: "Título corregido"
fill_in "Description", with: "Descripción corregida"
fill_in "Link text", with: "Texto del enlace corregido"
fill_in "Label (optional)", with: "Etiqueta corregida"
end
click_button "Save card"
expect(page).to have_content "Card updated successfully"
visit path
expect(page).to have_field "Title", with: "Title in English"
select "Español", from: "Language:"
expect(page).to have_field "Título", with: "Título corregido"
expect(page).to have_field "Descripción", with: "Descripción corregida"
expect(page).to have_field "Texto del enlace", with: "Texto del enlace corregido"
expect(page).to have_field "Etiqueta (opcional)", with: "Etiqueta corregida"
end
end
context "CKEditor fields" do
let(:translatable) { create(:poll_question_option, poll: create(:poll, :future)) }
let(:path) { edit_admin_question_option_path(translatable.question, translatable) }
scenario "Changes the existing translation" do
visit path
select "Español", from: "Current language"
within(".translatable-fields") do
fill_in "Answer", with: "Respuesta corregida"
fill_in_ckeditor "Description", with: "Descripción corregida"
end
click_button "Save"
expect(page).to have_content "Changes saved"
visit path
expect(page).to have_field "Answer", with: "Answer in English"
select "Español", from: "Language:"
expect(page).to have_field "Respuesta", with: "Respuesta corregida"
expect(page).to have_ckeditor "Descripción", with: "Descripción corregida"
end
end
context "Change value of a translated field to blank" do
let(:translatable) { create(:poll, :future) }
let(:path) { edit_admin_poll_path(translatable) }
scenario "Updates the field to a blank value" do
visit path
expect(page).to have_field "Summary", with: "Summary in English"
fill_in "Summary", with: ""
click_button "Update poll"
expect(page).to have_content "Poll updated successfully"
visit path
expect(page).to have_field "Summary", with: ""
end
end
end
context "Update a translation with invalid data" do
context "Input fields" do
let(:translatable) { create(:banner) }
scenario "Show validation errors" do
visit edit_admin_banner_path(translatable)
select "Español", from: "Current language"
expect(page).to have_field "Title", with: "Title en español"
fill_in "Title", with: ""
click_button "Save changes"
expect(page).to have_css "#error_explanation"
select "Español", from: "Current language"
expect(page).to have_field "Title", with: "", class: "is-invalid-input"
end
end
context "Markdownit field" do
let(:translatable) { create(:legislation_draft_version) }
scenario "Shows validation errors" do
visit edit_admin_legislation_process_draft_version_path(translatable.process, translatable)
select "Español", from: "Current language"
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "Texto en español"
fill_in "Text", with: ""
click_link class: "fullscreen-toggle"
click_button "Save changes"
expect(page).to have_css "#error_explanation"
select "Español", from: "Current language"
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: ""
end
end
end
context "Update a translation not having the current locale" do
let(:translatable) { create(:legislation_process) }
before do
translatable.translations.destroy_all
translatable.translations.create!(locale: :fr, title: "Titre en Français")
end
scenario "Does not add a translation for the current locale" do
visit edit_admin_legislation_process_path(translatable)
expect_to_have_language_selected "Français"
expect_not_to_have_language "English"
click_button "Save changes"
expect(page).to have_content "Process updated successfully"
expect_to_have_language_selected "Français"
expect_not_to_have_language "English"
end
end
context "Remove a translation" do
let(:translatable) { create(:budget_group) }
let(:path) { edit_admin_budget_group_path(translatable.budget, translatable) }
scenario "Keeps the other languages" do
visit path
select "Español", from: "Current language"
click_link "Remove language"
expect(page).not_to have_select "Current language", with_options: ["Español"]
click_button "Save group"
expect(page).to have_content "Group updated successfully"
visit path
expect(page).to have_select "Current language", with_options: ["English"]
expect(page).not_to have_select "Current language", with_options: ["Español"]
end
end
context "Remove all translations" do
let(:translatable) { create(:milestone) }
scenario "Shows an error message when there's a mandatory translatable field" do
translatable.update!(status: nil)
visit admin_polymorphic_path(translatable, action: :edit)
expect_to_have_language_selected "English"
click_link "Remove language"
expect_to_have_language_selected "Español"
click_link "Remove language"
expect_to_have_language_selected nil
click_button "Update milestone"
expect(page).to have_content "Is mandatory to provide one translation at least"
end
scenario "Is successful when there isn't a mandatory translatable field" do
translatable.update!(status: Milestone::Status.first)
visit admin_polymorphic_path(translatable, action: :edit)
expect_to_have_language_selected "English"
click_link "Remove language"
expect_to_have_language_selected "Español"
click_link "Remove language"
expect_to_have_language_selected nil
click_button "Update milestone"
expect(page).to have_content "Milestone updated successfully"
end
end
context "Remove a translation with invalid data" do
let(:translatable) { create(:poll_question, poll: create(:poll, :future)) }
let(:path) { edit_admin_question_path(translatable) }
scenario "Doesn't remove the translation" do
visit path
select "Español", from: "Current language"
click_link "Remove language"
select "English", from: "Current language"
fill_in "Question", with: ""
click_button "Save"
expect(page).to have_css "#error_explanation"
expect(page).to have_field "Question", with: "", class: "is-invalid-input"
expect_to_have_language_selected "English"
expect_not_to_have_language "Español"
visit path
select "Español", from: "Current language"
expect(page).to have_field "Question", with: "Pregunta en español"
end
end
context "Current locale translation does not exist" do
context "For all translatable except ActivePoll and Budget::Phase" do
let(:translatable) { create(:admin_notification, segment_recipient: "all_users") }
scenario "Shows first available fallback" do
translatable.update!({ title_fr: "Titre en Français", body_fr: "Texte en Français" })
visit edit_admin_admin_notification_path(translatable)
select "English", from: "Current language"
click_link "Remove language"
select "Español", from: "Current language"
click_link "Remove language"
click_button "Update notification"
expect(page).to have_content "Titre en Français"
end
end
context "For Budget::Phase" do
let(:translatable) { create(:budget).phases.last }
scenario "Shows first available fallback" do
translatable.update!({ name_fr: "Name en Français", description_fr: "Phase en Français" })
visit edit_admin_budget_budget_phase_path(translatable.budget, translatable)
select "English", from: "Current language"
click_link "Remove language"
select "Español", from: "Current language"
click_link "Remove language"
click_button "Save changes"
expect(page).to have_content "Changes saved"
visit budgets_path
click_link "Name en Français"
expect(page).to have_content "Phase en Français"
end
end
context "For ActivePoll" do
let(:translatable) { create(:active_poll) }
scenario "Shows first available fallback" do
translatable.update!({ description_fr: "Sondage en Français" })
visit edit_admin_active_polls_path(translatable)
select "English", from: "Current language"
click_link "Remove language"
select "Español", from: "Current language"
click_link "Remove language"
expect_to_have_language_selected "Français"
click_button "Save"
expect(page).to have_content "Polls description updated successfully"
visit polls_path
expect(page).to have_content "Sondage en Français"
end
end
end
context "Globalize javascript interface" do
let(:translatable) { create(:i18n_content) }
let(:content) { translatable }
let(:path) { admin_site_customization_information_texts_path }
scenario "Select current locale when its translation exists" do
visit path
expect_to_have_language_selected "English"
select "Español", from: "Language:"
expect_to_have_language_selected "Español"
end
scenario "Select first locale of existing translations when current locale translation does not exists" do
content.translations.where(locale: :en).destroy_all
visit path
expect_to_have_language_selected "Español"
end
scenario "Show selected locale form" do
visit path
expect(page).to have_field content.key, with: "Value in English"
select "Español", from: "Current language"
expect(page).to have_field content.key, with: "Value en español"
end
scenario "Select a locale and add it to the form" do
visit path
select "Français", from: "Add language"
expect_to_have_language_selected "Français"
expect(page).to have_select "Add language", selected: ""
expect(page).to have_field "contents_content_#{content.key}values_value_fr"
end
context "Languages in use" do
scenario "Show default description" do
visit path
expect(page).to have_content "2 languages in use"
end
scenario "Increase description count after add new language" do
visit path
select "Français", from: "Add language"
expect(page).to have_content "3 languages in use"
end
scenario "Decrease description count after remove a language" do
visit path
click_link "Remove language"
expect(page).to have_content "1 language in use"
end
end
context "When translation interface feature setting" do
scenario "Is enabled translation interface should be rendered" do
visit path
expect(page).to have_css ".globalize-languages"
end
scenario "Is disabled translation interface should be rendered" do
Setting["feature.translation_interface"] = nil
visit path
expect(page).to have_css ".globalize-languages"
end
end
end
end