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.
540 lines
16 KiB
Ruby
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
|