Files
nairobi/spec/features/admin/translatable_spec.rb
Javi Martín 7ca55c44e0 Apply Rails/SaveBang rubocop rule
Having exceptions is better than having silent bugs.

There are a few methods I've kept the same way they were.

The `RelatedContentScore#score_with_opposite` method is a bit peculiar:
it creates scores for both itself and the opposite related content,
which means the opposite related content will try to create the same
scores as well.

We've already got a test to check `Budget::Ballot#add_investment` when
creating a line fails ("Edge case voting a non-elegible investment").

Finally, the method `User#send_oauth_confirmation_instructions` doesn't
update the record when the email address isn't already present, leading
to the test "Try to register with the email of an already existing user,
when an unconfirmed email was provided by oauth" fo fail if we raise an
exception for an invalid user. That's because updating a user's email
doesn't update the database automatically, but instead a confirmation
email is sent.

There are also a few false positives for classes which don't have bang
methods (like the GraphQL classes) or destroying attachments.

For these reasons, I'm adding the rule with a "Refactor" severity,
meaning it's a rule we can break if necessary.
2019-10-23 14:39:31 +02:00

540 lines
16 KiB
Ruby

require "rails_helper"
describe "Admin edit translatable records" do
before do
translatable.update!(attributes)
login_as(create(:administrator).user)
end
let(:fields) { translatable.translated_attribute_names }
let(:attributes) do
fields.product(%i[en es]).map do |field, locale|
[:"#{field}_#{locale}", text_for(field, locale)]
end.to_h
end
context "Add a translation", :js do
context "Input fields" do
let(:translatable) { create(:budget_heading) }
let(:path) { edit_admin_budget_group_heading_path(*resource_hierarchy_for(translatable)) }
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"
visit path
expect(page).to have_field "Heading name", with: "Heading name in English"
select "Español", from: :select_language
expect(page).to have_field "Heading name", with: "Nombre de la partida en español"
select "Français", from: :select_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"
visit path
within_frame(0) { expect(page).to have_content "Content in English" }
select "Español", from: :select_language
within_frame(0) { expect(page).to have_content "Contenido en español" }
select "Français", from: :select_language
within_frame(0) { expect(page).to have_content "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"
visit path
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "Text in English"
click_link class: "fullscreen-toggle"
select "Español", from: :select_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: :select_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", :js 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"
visit path
select "Português brasileiro", from: "locale-switcher"
expect(page).to have_field "Questão", with: "Português"
end
end
end
context "Add an invalid translation", :js do
let(:translatable) { create(:budget_investment) }
context "Input field" do
let(:translatable) { create(:budget) }
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: :select_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: :select_language
within_frame(0) { expect(page.text).to be_empty }
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: :select_language
click_link class: "fullscreen-toggle"
expect(page).to have_field "Text", with: "", class: "is-invalid-input"
end
end
end
context "Update a translation", :js 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: :select_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"
visit path
expect(page).to have_field "Title", with: "Title in English"
select("Español", from: "locale-switcher")
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_answer) }
let(:path) { edit_admin_answer_path(translatable) }
scenario "Changes the existing translation" do
visit path
select "Español", from: :select_language
within(".translatable-fields") do
fill_in "Answer", with: "Respuesta corregida"
fill_in_ckeditor "Description", with: "Descripción corregida"
end
click_button "Save"
visit path
expect(page).to have_field "Answer", with: "Answer in English"
select("Español", from: "locale-switcher")
expect(page).to have_field "Respuesta", with: "Respuesta corregida"
within_frame(0) { expect(page).to have_content "Descripción corregida" }
end
end
context "Change value of a translated field to blank", :js do
let(:translatable) { create(:poll) }
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"
visit path
expect(page).to have_field "Summary", with: ""
end
end
end
context "Update a translation with invalid data", :js do
context "Input fields" do
let(:translatable) { create(:banner) }
scenario "Show validation errors" do
visit edit_admin_banner_path(translatable)
select "Español", from: :select_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: :select_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: :select_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: :select_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", :js 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).not_to have_css "#error_explanation"
visit edit_admin_legislation_process_path(translatable.reload)
expect_to_have_language_selected "Français"
expect_not_to_have_language "English"
end
end
context "Remove a translation", :js 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: :select_language
click_link "Remove language"
expect(page).not_to have_select :select_language, with_options: ["Español"]
click_button "Save group"
visit path
expect(page).not_to have_select :select_language, with_options: ["Español"]
expect(page).to have_select :select_language, with_options: ["English"]
end
end
context "Remove all translations", :js do
let(:translatable) { create(:milestone) }
scenario "Shows an error message" do
visit edit_tracking_budget_budget_investment_milestone_path(*resource_hierarchy_for(translatable))
click_link "Remove language"
click_link "Remove language"
click_button "Update milestone"
expect(page).to have_content "Is mandatory to provide one translation at least"
end
end
context "Remove a translation with invalid data", :js do
let(:translatable) { create(:poll_question) }
let(:path) { edit_admin_question_path(translatable) }
scenario "Doesn't remove the translation" do
visit path
select "Español", from: :select_language
click_link "Remove language"
select "English", from: :select_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: :select_language
expect(page).to have_field "Question", with: "Pregunta en español"
end
end
context "Current locale translation does not exist", :js 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: :select_language
click_link "Remove language"
select "Español", from: :select_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!({ description_fr: "Phase en Français", summary_fr: "Phase résumé" })
visit edit_admin_budget_budget_phase_path(translatable.budget, translatable)
select "English", from: :select_language
click_link "Remove language"
select "Español", from: :select_language
click_link "Remove language"
click_button "Save changes"
visit budgets_path
expect(page).to have_content "Phase résumé"
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: :select_language
click_link "Remove language"
select "Español", from: :select_language
click_link "Remove language"
click_button "Save"
visit polls_path
expect(page).to have_content "Sondage en Français"
end
end
end
context "Globalize javascript interface", :js 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: "locale-switcher")
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 "contents_content_#{content.key}values_value_en", with: "Value in English"
select "Español", from: :select_language
expect(page).to have_field "contents_content_#{content.key}values_value_es", 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_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