From 9cf8a883c69f7273539da914f2068b059c816858 Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Tue, 27 Feb 2024 13:11:33 +0200 Subject: [PATCH 1/7] Backport 'Standardize the way resources are being listed in application' to v0.27 --- .../lib/decidim/assemblies/test/factories.rb | 3 + .../app/helpers/decidim/sanitize_helper.rb | 9 + .../lib/decidim/core/test/factories.rb | 346 +++++++++++++----- decidim-dev/lib/decidim/dev/test/factories.rb | 4 + .../participatory_processes/test/factories.rb | 3 + 5 files changed, 272 insertions(+), 93 deletions(-) diff --git a/decidim-assemblies/lib/decidim/assemblies/test/factories.rb b/decidim-assemblies/lib/decidim/assemblies/test/factories.rb index 81ccb2eefd28..d902430c2acf 100644 --- a/decidim-assemblies/lib/decidim/assemblies/test/factories.rb +++ b/decidim-assemblies/lib/decidim/assemblies/test/factories.rb @@ -19,6 +19,9 @@ end factory :assembly, class: "Decidim::Assembly" do + transient do + skip_injection { false } + end title { generate_localized_title } slug { generate(:assembly_slug) } subtitle { generate_localized_title } diff --git a/decidim-core/app/helpers/decidim/sanitize_helper.rb b/decidim-core/app/helpers/decidim/sanitize_helper.rb index 0b3b0c6571b1..f8fea9e40e94 100644 --- a/decidim-core/app/helpers/decidim/sanitize_helper.rb +++ b/decidim-core/app/helpers/decidim/sanitize_helper.rb @@ -6,6 +6,7 @@ module SanitizeHelper def self.included(base) base.include ActionView::Helpers::SanitizeHelper base.include ActionView::Helpers::TagHelper + base.include Decidim::TranslatableAttributes end # Public: It sanitizes a user-inputted string with the @@ -53,6 +54,14 @@ def decidim_url_escape(text) decidim_html_escape(text).sub(/^javascript:/, "") end + def decidim_sanitize_translated(text) + decidim_sanitize(translated_attribute(text)) + end + + def decidim_escape_translated(text) + decidim_html_escape(translated_attribute(text)) + end + private # Maintains the paragraphs and lists separations with their bullet points and diff --git a/decidim-core/lib/decidim/core/test/factories.rb b/decidim-core/lib/decidim/core/test/factories.rb index f039022a1492..b11f3599b2e2 100644 --- a/decidim-core/lib/decidim/core/test/factories.rb +++ b/decidim-core/lib/decidim/core/test/factories.rb @@ -8,8 +8,39 @@ require "decidim/assemblies/test/factories" require "decidim/comments/test/factories" -def generate_localized_title - Decidim::Faker::Localized.localized { generate(:title) } +def generate_component_name(locales, manifest_name, skip_injection: false) + prepend = skip_injection ? "" : "" + + Decidim::Components::Namer.new(locales, manifest_name).i18n_name.transform_values { |v| [prepend, v].compact_blank.join(" ") } +end + +def generate_localized_description(field = nil, skip_injection: false, before: "

", after: "

") + Decidim::Faker::Localized.wrapped(before, after) do + generate_localized_title(field, skip_injection: skip_injection) + end +end + +def generate_localized_word(field = nil, skip_injection: false) + skip_injection = true if field.nil? + Decidim::Faker::Localized.localized do + if skip_injection + Faker::Lorem.word + else + " #{Faker::Lorem.word}" + end + end +end + +def generate_localized_title(field = nil, skip_injection: false) + skip_injection = true if field.nil? + + Decidim::Faker::Localized.localized do + if skip_injection + generate(:title) + else + " #{generate(:title)}" + end + end end FactoryBot.define do @@ -58,27 +89,25 @@ def generate_localized_title skip_injection { false } end - name do - if skip_injection - Decidim::Faker::Localized.localized { generate(:title) } - else - Decidim::Faker::Localized.localized { " #{generate(:title)}" } - end - end - description { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } + name { generate_localized_title(:category_name, skip_injection: skip_injection) } + description { generate_localized_description(:category_description, skip_injection: skip_injection) } weight { 0 } association :participatory_space, factory: :participatory_process end factory :subcategory, parent: :category do - parent { build(:category) } + transient do + skip_injection { false } + end + parent { build(:category, skip_injection: skip_injection) } participatory_space { parent.participatory_space } end factory :organization, class: "Decidim::Organization" do transient do + skip_injection { false } create_static_pages { true } end @@ -91,7 +120,7 @@ def generate_localized_title youtube_handler { Faker::Hipster.word } github_handler { Faker::Hipster.word } sequence(:host) { |n| "#{n}.lvh.me" } - description { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } + description { generate_localized_description(:organization_description, skip_injection: skip_injection) } favicon { Decidim::Dev.test_file("icon.png", "image/png") } default_locale { Decidim.default_locale } available_locales { Decidim.available_locales } @@ -105,7 +134,7 @@ def generate_localized_title user_groups_enabled { true } send_welcome_notification { true } comments_max_length { 1000 } - admin_terms_of_use_body { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } + admin_terms_of_use_body { generate_localized_description(:admin_terms_of_service_body, skip_injection: skip_injection) } force_users_to_authenticate_before_access_organization { false } machine_translation_display_priority { "original" } external_domain_whitelist { ["example.org", "twitter.com", "facebook.com", "youtube.com", "github.com", "mytesturl.me"] } @@ -128,12 +157,15 @@ def generate_localized_title after(:create) do |organization, evaluator| if evaluator.create_static_pages tos_page = Decidim::StaticPage.find_by(slug: "terms-and-conditions", organization: organization) - create(:static_page, :tos, organization: organization) if tos_page.nil? + create(:static_page, :tos, organization: organization, skip_injection: evaluator.skip_injection) if tos_page.nil? end end end factory :user, class: "Decidim::User" do + transient do + skip_injection { false } + end email { generate(:email) } name { generate(:name) } nickname { generate(:nickname) } @@ -142,7 +174,7 @@ def generate_localized_title tos_agreement { "1" } avatar { Decidim::Dev.test_file("avatar.jpg", "image/jpeg") } personal_url { Faker::Internet.url } - about { "#{Faker::Lorem.paragraph(sentence_count: 2)}" } + about { generate_localized_title(:user_about, skip_injection: skip_injection) } confirmation_sent_at { Time.current } accepted_tos_version { organization.tos_version } notifications_sending_frequency { "real_time" } @@ -191,7 +223,7 @@ def generate_localized_title trait :officialized do officialized_at { Time.current } - officialized_as { generate_localized_title } + officialized_as { generate_localized_title(:officialized_as, skip_injection: skip_injection) } end after(:build) do |user, evaluator| @@ -204,17 +236,24 @@ def generate_localized_title end factory :participatory_space_private_user, class: "Decidim::ParticipatorySpacePrivateUser" do + transient do + skip_injection { false } + end user - privatable_to { create :participatory_process, organization: user.organization } + privatable_to { create(:participatory_process, organization: user.organization, skip_injection: skip_injection) } end factory :assembly_private_user, class: "Decidim::ParticipatorySpacePrivateUser" do + transient do + skip_injection { false } + end user - privatable_to { create :assembly, organization: user.organization } + privatable_to { create(:assembly, organization: user.organization, skip_injection: skip_injection) } end factory :user_group, class: "Decidim::UserGroup" do transient do + skip_injection { false } document_number { "#{Faker::Number.number(digits: 8)}X" } phone { Faker::PhoneNumber.phone_number } rejected_at { nil } @@ -224,7 +263,7 @@ def generate_localized_title sequence(:name) { |n| "#{Faker::Company.name} #{n}" } email { generate(:user_group_email) } nickname { generate(:nickname) } - about { "#{Faker::Lorem.paragraph(sentence_count: 2)}" } + about { generate_localized_title(:user_group_about, skip_injection: skip_injection) } organization avatar { Decidim::Dev.test_file("avatar.jpg", "image/jpeg") } # Keep after organization @@ -265,21 +304,27 @@ def generate_localized_title next if users.empty? creator = users.shift - create(:user_group_membership, user: creator, user_group: user_group, role: :creator) + create(:user_group_membership, user: creator, user_group: user_group, role: :creator, skip_injection: evaluator.skip_injection) users.each do |user| - create(:user_group_membership, user: user, user_group: user_group, role: :admin) + create(:user_group_membership, user: user, user_group: user_group, role: :admin, skip_injection: evaluator.skip_injection) end end end factory :user_group_membership, class: "Decidim::UserGroupMembership" do - user { create(:user, :confirmed, organization: user_group.organization) } + transient do + skip_injection { false } + end + user { create(:user, :confirmed, organization: user_group.organization, skip_injection: skip_injection) } role { :creator } user_group end factory :identity, class: "Decidim::Identity" do + transient do + skip_injection { false } + end provider { "facebook" } sequence(:uid) user @@ -287,6 +332,9 @@ def generate_localized_title end factory :authorization, class: "Decidim::Authorization" do + transient do + skip_injection { false } + end sequence(:name) { |n| "dummy_authorization_#{n}" } user metadata { {} } @@ -302,10 +350,13 @@ def generate_localized_title end factory :static_page, class: "Decidim::StaticPage" do + transient do + skip_injection { false } + end slug { generate(:slug) } - title { generate_localized_title } - content { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } - organization { build(:organization) } + title { generate_localized_title(:static_page_title, skip_injection: skip_injection) } + content { generate_localized_description(:static_page_content, skip_injection: skip_injection) } + organization { build(:organization, skip_injection: skip_injection) } allow_public_access { false } trait :default do @@ -321,8 +372,8 @@ def generate_localized_title end trait :with_topic do - after(:create) do |static_page| - topic = create(:static_page_topic, organization: static_page.organization) + after(:create) do |static_page, evaluator| + topic = create(:static_page_topic, organization: static_page.organization, skip_injection: evaluator.skip_injection) static_page.topic = topic static_page.save end @@ -330,24 +381,33 @@ def generate_localized_title end factory :static_page_topic, class: "Decidim::StaticPageTopic" do - title { generate_localized_title } - description { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } + transient do + skip_injection { false } + end + title { generate_localized_title(:static_page_topic_title, skip_injection: skip_injection) } + description { generate_localized_description(:static_page_topic_description, skip_injection: skip_injection) } organization end factory :attachment_collection, class: "Decidim::AttachmentCollection" do - name { generate_localized_title } - description { generate_localized_title } + transient do + skip_injection { false } + end + name { generate_localized_title(:attachment_collection_name, skip_injection: skip_injection) } + description { generate_localized_title(:attachment_collection_description, skip_injection: skip_injection) } weight { Faker::Number.number(digits: 1) } association :collection_for, factory: :participatory_process end factory :attachment, class: "Decidim::Attachment" do - title { generate_localized_title } - description { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } + transient do + skip_injection { false } + end + title { generate_localized_title(:attachment_title, skip_injection: skip_injection) } + description { generate_localized_description(:attachment_description, skip_injection: skip_injection) } weight { Faker::Number.number(digits: 1) } - attached_to { build(:participatory_process) } + attached_to { build(:participatory_process, skip_injection: skip_injection) } content_type { "image/jpeg" } file { Decidim::Dev.test_file("city.jpeg", "image/jpeg") } # Keep after attached_to file_size { 108_908 } @@ -365,23 +425,24 @@ def generate_localized_title factory :component, class: "Decidim::Component" do transient do - organization { create(:organization) } + skip_injection { false } + organization { create(:organization, skip_injection: skip_injection) } end - name { generate_localized_title } - participatory_space { create(:participatory_process, organization: organization) } + name { generate_localized_title(:component_name, skip_injection: skip_injection) } + participatory_space { create(:participatory_process, organization: organization, skip_injection: skip_injection) } manifest_name { "dummy" } published_at { Time.current } settings do { - dummy_global_translatable_text: generate_localized_title, + dummy_global_translatable_text: generate_localized_title(:dummy_global_translatable_text, skip_injection: skip_injection), comments_max_length: participatory_space.organization.comments_max_length || organization.comments_max_length } end default_step_settings do { - dummy_step_translatable_text: generate_localized_title + dummy_step_translatable_text: generate_localized_title(:dummy_step_translatable_text, skip_injection: skip_injection) } end @@ -419,7 +480,8 @@ def generate_localized_title create(:participatory_process_step, active: true, end_date: 1.month.from_now, - participatory_process: participatory_space) + participatory_process: participatory_space, + skip_injection: skip_injection) participatory_space.reload participatory_space.steps.reload end @@ -462,20 +524,29 @@ def generate_localized_title end factory :scope_type, class: "Decidim::ScopeType" do - name { Decidim::Faker::Localized.word } + transient do + skip_injection { false } + end + name { generate_localized_word(:scope_type_name, skip_injection: skip_injection) } plural { Decidim::Faker::Localized.literal(name.values.first.pluralize) } organization end factory :scope, class: "Decidim::Scope" do + transient do + skip_injection { false } + end name { Decidim::Faker::Localized.literal(generate(:scope_name)) } code { generate(:scope_code) } - scope_type { create(:scope_type, organization: organization) } - organization { parent ? parent.organization : build(:organization) } + scope_type { create(:scope_type, organization: organization, skip_injection: skip_injection) } + organization { parent ? parent.organization : build(:organization, skip_injection: skip_injection) } end factory :subscope, parent: :scope do - parent { build(:scope) } + transient do + skip_injection { false } + end + parent { build(:scope, skip_injection: skip_injection) } before(:create) do |object| object.parent.save unless object.parent.persisted? @@ -483,34 +554,44 @@ def generate_localized_title end factory :area_type, class: "Decidim::AreaType" do - name { Decidim::Faker::Localized.word } + transient do + skip_injection { false } + end + name { generate_localized_word(:area_type_name, skip_injection: skip_injection) } plural { Decidim::Faker::Localized.literal(name.values.first.pluralize) } organization end factory :area, class: "Decidim::Area" do + transient do + skip_injection { false } + end name { Decidim::Faker::Localized.literal(generate(:area_name)) } organization end factory :coauthorship, class: "Decidim::Coauthorship" do - coauthorable { create(:dummy_resource) } + transient do + skip_injection { false } + end + coauthorable { create(:dummy_resource, skip_injection: skip_injection) } transient do organization { coauthorable.component.participatory_space.organization } end - author { create(:user, :confirmed, organization: organization) } + author { create(:user, :confirmed, organization: organization, skip_injection: skip_injection) } end factory :dummy_resource, class: "Decidim::DummyResources::DummyResource" do transient do + skip_injection { false } users { nil } # user_groups correspondence to users is by sorting order user_groups { [] } end title { Decidim::Faker::Localized.localized { generate(:name) } } - component { create(:component, manifest_name: "dummy") } - author { create(:user, :confirmed, organization: component.organization) } - scope { create(:scope, organization: component.organization) } + component { create(:component, manifest_name: "dummy", skip_injection: skip_injection) } + author { create(:user, :confirmed, organization: component.organization, skip_injection: skip_injection) } + scope { create(:scope, organization: component.organization, skip_injection: skip_injection) } trait :published do published_at { Time.current } @@ -526,15 +607,22 @@ def generate_localized_title end factory :nested_dummy_resource, class: "Decidim::DummyResources::NestedDummyResource" do + transient do + skip_injection { false } + end title { generate(:name) } - dummy_resource { create(:dummy_resource) } + dummy_resource { create(:dummy_resource, skip_injection: skip_injection) } end factory :coauthorable_dummy_resource, class: "Decidim::DummyResources::CoauthorableDummyResource" do + transient do + skip_injection { false } + end title { generate(:name) } - component { create(:component, manifest_name: "dummy") } + component { create(:component, manifest_name: "dummy", skip_injection: skip_injection) } transient do + skip_injection { false } authors_list { [create(:user, organization: component.organization)] } end @@ -550,17 +638,21 @@ def generate_localized_title end factory :resource_link, class: "Decidim::ResourceLink" do + transient do + skip_injection { false } + end name { generate(:slug) } - to { build(:dummy_resource) } - from { build(:dummy_resource, component: to.component) } + to { build(:dummy_resource, skip_injection: skip_injection) } + from { build(:dummy_resource, component: to.component, skip_injection: skip_injection) } end factory :newsletter, class: "Decidim::Newsletter" do transient do - body { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } + skip_injection { false } + body { generate_localized_description(:newsletter_body, skip_injection: skip_injection) } end - author { build(:user, :confirmed, organization: organization) } + author { build(:user, :confirmed, organization: organization, skip_injection: skip_injection) } organization subject { generate_localized_title } @@ -572,7 +664,8 @@ def generate_localized_title organization: evaluator.organization, scoped_resource_id: newsletter.id, manifest_name: "basic_only_text", - settings: evaluator.body.transform_keys { |key| "body_#{key}" } + settings: evaluator.body.transform_keys { |key| "body_#{key}" }, + skip_injection: evaluator.skip_injection ) end @@ -582,7 +675,10 @@ def generate_localized_title end factory :moderation, class: "Decidim::Moderation" do - reportable { build(:dummy_resource) } + transient do + skip_injection { false } + end + reportable { build(:dummy_resource, skip_injection: skip_injection) } participatory_space { reportable.component.participatory_space } trait :hidden do @@ -591,35 +687,47 @@ def generate_localized_title end factory :report, class: "Decidim::Report" do + transient do + skip_injection { false } + end moderation - user { build(:user, organization: moderation.reportable.organization) } + user { build(:user, organization: moderation.reportable.organization, skip_injection: skip_injection) } reason { "spam" } end factory :impersonation_log, class: "Decidim::ImpersonationLog" do - admin { build(:user, :admin) } - user { build(:user, :managed, organization: admin.organization) } + transient do + skip_injection { false } + end + admin { build(:user, :admin, skip_injection: skip_injection) } + user { build(:user, :managed, organization: admin.organization, skip_injection: skip_injection) } started_at { 10.minutes.ago } end factory :follow, class: "Decidim::Follow" do + transient do + skip_injection { false } + end user do build( :user, - organization: followable.try(:organization) || build(:organization) + organization: followable.try(:organization) || build(:organization, skip_injection: skip_injection) ) end - followable { build(:dummy_resource) } + followable { build(:dummy_resource, skip_injection: skip_injection) } end factory :notification, class: "Decidim::Notification" do + transient do + skip_injection { false } + end user do build( :user, - organization: resource.try(:organization) || build(:organization) + organization: resource.try(:organization) || build(:organization, skip_injection: skip_injection) ) end - resource { build(:dummy_resource) } + resource { build(:dummy_resource, skip_injection: skip_injection) } event_name { resource.class.name.underscore.tr("/", ".") } event_class { "Decidim::DummyResourceEvent" } extra do @@ -631,14 +739,15 @@ def generate_localized_title factory :action_log, class: "Decidim::ActionLog" do transient do + skip_injection { false } extra_data { {} } end organization { user.organization } user - participatory_space { build :participatory_process, organization: organization } - component { build :component, participatory_space: participatory_space } - resource { build(:dummy_resource, component: component) } + participatory_space { build(:participatory_process, organization: organization, skip_injection: skip_injection) } + component { build(:component, participatory_space: participatory_space, skip_injection: skip_injection) } + resource { build(:dummy_resource, component: component, skip_injection: skip_injection) } action { "create" } visibility { "admin-only" } extra do @@ -664,6 +773,9 @@ def generate_localized_title end factory :oauth_application, class: "Decidim::OAuthApplication" do + transient do + skip_injection { false } + end organization sequence(:name) { |n| "OAuth application #{n}" } sequence(:organization_name) { |n| "OAuth application owner #{n}" } @@ -674,8 +786,11 @@ def generate_localized_title end factory :oauth_access_token, class: "Doorkeeper::AccessToken" do - resource_owner_id { create(:user, organization: application.organization).id } - application { build(:oauth_application) } + transient do + skip_injection { false } + end + resource_owner_id { create(:user, organization: application.organization, skip_injection: skip_injection).id } + application { build(:oauth_application, skip_injection: skip_injection) } token { SecureRandom.hex(32) } expires_in { 1.month.from_now } created_at { Time.current } @@ -683,7 +798,10 @@ def generate_localized_title end factory :searchable_resource, class: "Decidim::SearchableResource" do - resource { build(:dummy_resource) } + transient do + skip_injection { false } + end + resource { build(:dummy_resource, skip_injection: skip_injection) } resource_id { resource.id } resource_type { resource.class.name } organization { resource.component.organization } @@ -695,6 +813,9 @@ def generate_localized_title end factory :content_block, class: "Decidim::ContentBlock" do + transient do + skip_injection { false } + end organization scope_name { :homepage } manifest_name { :hero } @@ -708,24 +829,33 @@ def generate_localized_title end factory :hashtag, class: "Decidim::Hashtag" do + transient do + skip_injection { false } + end name { generate(:hashtag_name) } organization end factory :metric, class: "Decidim::Metric" do + transient do + skip_injection { false } + end organization day { Time.zone.today } metric_type { "random_metric" } cumulative { 2 } quantity { 1 } category { create :category } - participatory_space { create :participatory_process, organization: organization } - related_object { create :component, participatory_space: participatory_space } + participatory_space { create(:participatory_process, organization: organization, skip_injection: skip_injection) } + related_object { create(:component, participatory_space: participatory_space, skip_injection: skip_injection) } end factory :amendment, class: "Decidim::Amendment" do - amendable { build(:dummy_resource) } - emendation { build(:dummy_resource) } + transient do + skip_injection { false } + end + amendable { build(:dummy_resource, skip_injection: skip_injection) } + emendation { build(:dummy_resource, skip_injection: skip_injection) } amender { emendation.try(:creator_author) || emendation.try(:author) } state { "evaluating" } @@ -739,29 +869,44 @@ def generate_localized_title end factory :user_report, class: "Decidim::UserReport" do + transient do + skip_injection { false } + end reason { "spam" } - moderation { create(:user_moderation, user: user) } + moderation { create(:user_moderation, user: user, skip_injection: skip_injection) } user { build(:user) } end factory :user_moderation, class: "Decidim::UserModeration" do - user { build(:user) } + transient do + skip_injection { false } + end + user { build(:user, skip_injection: skip_injection) } end factory :endorsement, class: "Decidim::Endorsement" do - resource { build(:dummy_resource) } - author { resource.try(:creator_author) || resource.try(:author) || build(:user, organization: resource.organization) } + transient do + skip_injection { false } + end + resource { build(:dummy_resource, skip_injection: skip_injection) } + author { resource.try(:creator_author) || resource.try(:author) || build(:user, organization: resource.organization, skip_injection: skip_injection) } end factory :user_group_endorsement, class: "Decidim::Endorsement" do - resource { build(:dummy_resource) } - author { build(:user, organization: resource.organization) } - user_group { create(:user_group, verified_at: Time.current, organization: resource.organization, users: [author]) } + transient do + skip_injection { false } + end + resource { build(:dummy_resource, skip_injection: skip_injection) } + author { build(:user, organization: resource.organization, skip_injection: skip_injection) } + user_group { create(:user_group, verified_at: Time.current, organization: resource.organization, users: [author], skip_injection: skip_injection) } end factory :share_token, class: "Decidim::ShareToken" do - token_for { build(:component) } - user { build(:user, organization: token_for.organization) } + transient do + skip_injection { false } + end + token_for { build(:component, skip_injection: skip_injection) } + user { build(:user, organization: token_for.organization, skip_injection: skip_injection) } before(:create) do |object| object.organization ||= object.token_for.organization @@ -778,33 +923,48 @@ def generate_localized_title end factory :editor_image, class: "Decidim::EditorImage" do + transient do + skip_injection { false } + end organization - author { create(:user, :admin, :confirmed, organization: organization) } + author { create(:user, :admin, :confirmed, organization: organization, skip_injection: skip_injection) } file { Decidim::Dev.test_file("city.jpeg", "image/jpeg") } end factory :reminder, class: "Decidim::Reminder" do - user { build(:user) } - component { build(:dummy_component, organization: user.organization) } + transient do + skip_injection { false } + end + user { build(:user, skip_injection: skip_injection) } + component { build(:dummy_component, organization: user.organization, skip_injection: skip_injection) } end factory :reminder_record, class: "Decidim::ReminderRecord" do - reminder { create(:reminder) } - remindable { build(:dummy_resource) } + transient do + skip_injection { false } + end + reminder { create(:reminder, skip_injection: skip_injection) } + remindable { build(:dummy_resource, skip_injection: skip_injection) } end factory :reminder_delivery, class: "Decidim::ReminderDelivery" do - reminder { create(:reminder) } + transient do + skip_injection { false } + end + reminder { create(:reminder, skip_injection: skip_injection) } end factory :short_link, class: "Decidim::ShortLink" do - target { create(:component, manifest_name: "dummy") } + transient do + skip_injection { false } + end + target { create(:component, manifest_name: "dummy", skip_injection: skip_injection) } route_name { nil } params { {} } - before(:create) do |object| + before(:create) do |object, evaluator| object.organization ||= object.target if object.target.is_a?(Decidim::Organization) - object.organization ||= object.target.try(:organization) || create(:organization) + object.organization ||= object.target.try(:organization) || create(:organization, skip_injection: evaluator.skip_injection) object.identifier ||= Decidim::ShortLink.unique_identifier_within(object.organization) object.mounted_engine_name ||= if object.target.respond_to?(:participatory_space) diff --git a/decidim-dev/lib/decidim/dev/test/factories.rb b/decidim-dev/lib/decidim/dev/test/factories.rb index 60b600182a74..0a83c6a14b3e 100644 --- a/decidim-dev/lib/decidim/dev/test/factories.rb +++ b/decidim-dev/lib/decidim/dev/test/factories.rb @@ -2,6 +2,10 @@ FactoryBot.define do factory :dummy_component, parent: :component do + transient do + skip_injection { false } + end + name { Decidim::Components::Namer.new(participatory_space.organization.available_locales, :surveys).i18n_name } manifest_name { :dummy } end diff --git a/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb b/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb index 6e16991fb2ee..7cb57a483531 100644 --- a/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb +++ b/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb @@ -11,6 +11,9 @@ end factory :participatory_process, class: "Decidim::ParticipatoryProcess" do + transient do + skip_injection { false } + end title { generate_localized_title } slug { generate(:participatory_process_slug) } subtitle { generate_localized_title } From 8128ffe61486b5b6044a4a07ec6aba262360f00c Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Tue, 27 Feb 2024 13:34:14 +0200 Subject: [PATCH 2/7] Fix failing specs --- .../app/helpers/decidim/admin/admin_terms_helper.rb | 2 +- decidim-assemblies/lib/decidim/assemblies/admin_engine.rb | 2 +- decidim-conferences/lib/decidim/conferences/admin_engine.rb | 2 +- .../lib/decidim/consultations/admin_engine.rb | 2 +- .../decidim/dev/test/rspec_support/decidim_sanitization.rb | 5 +++++ decidim-elections/lib/decidim/votings/admin_engine.rb | 2 +- decidim-initiatives/lib/decidim/initiatives/admin_engine.rb | 2 +- .../lib/decidim/participatory_processes/admin_engine.rb | 2 +- 8 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 decidim-dev/lib/decidim/dev/test/rspec_support/decidim_sanitization.rb diff --git a/decidim-admin/app/helpers/decidim/admin/admin_terms_helper.rb b/decidim-admin/app/helpers/decidim/admin/admin_terms_helper.rb index bbb4f276735e..2837c0df9eb9 100644 --- a/decidim-admin/app/helpers/decidim/admin/admin_terms_helper.rb +++ b/decidim-admin/app/helpers/decidim/admin/admin_terms_helper.rb @@ -5,7 +5,7 @@ module Admin # This module includes helpers to show Admin Terms of Use module AdminTermsHelper def admin_terms_of_use_body - current_organization.admin_terms_of_use_body.symbolize_keys[I18n.locale].html_safe + decidim_sanitize_admin(translated_attribute(current_organization.admin_terms_of_use_body)).html_safe end def announcement_body diff --git a/decidim-assemblies/lib/decidim/assemblies/admin_engine.rb b/decidim-assemblies/lib/decidim/assemblies/admin_engine.rb index 763aeb234275..589e29c94120 100644 --- a/decidim-assemblies/lib/decidim/assemblies/admin_engine.rb +++ b/decidim-assemblies/lib/decidim/assemblies/admin_engine.rb @@ -128,7 +128,7 @@ class AdminEngine < ::Rails::Engine initializer "decidim_assemblies.admin_assemblies_components_menu" do Decidim.menu :admin_assemblies_components_menu do |menu| current_participatory_space.components.each do |component| - caption = translated_attribute(component.name) + caption = decidim_escape_translated(component.name) if component.primary_stat.present? caption += content_tag(:span, component.primary_stat, class: component.primary_stat.zero? ? "component-counter component-counter--off" : "component-counter") end diff --git a/decidim-conferences/lib/decidim/conferences/admin_engine.rb b/decidim-conferences/lib/decidim/conferences/admin_engine.rb index 99239dbbb054..f2a6f4ea598e 100644 --- a/decidim-conferences/lib/decidim/conferences/admin_engine.rb +++ b/decidim-conferences/lib/decidim/conferences/admin_engine.rb @@ -91,7 +91,7 @@ class AdminEngine < ::Rails::Engine initializer "decidim_conferences.admin_conferences_components_menu" do Decidim.menu :admin_conferences_components_menu do |menu| current_participatory_space.components.each do |component| - caption = translated_attribute(component.name) + caption = decidim_escape_translated(component.name) if component.primary_stat.present? caption += content_tag(:span, component.primary_stat, class: component.primary_stat.zero? ? "component-counter component-counter--off" : "component-counter") end diff --git a/decidim-consultations/lib/decidim/consultations/admin_engine.rb b/decidim-consultations/lib/decidim/consultations/admin_engine.rb index 7d8066806094..571a4baf86a8 100644 --- a/decidim-consultations/lib/decidim/consultations/admin_engine.rb +++ b/decidim-consultations/lib/decidim/consultations/admin_engine.rb @@ -157,7 +157,7 @@ class AdminEngine < ::Rails::Engine initializer "decidim_consultations.admin_consultation_components_menu" do Decidim.menu :admin_consultation_components_menu do |menu| current_participatory_space.components.each do |component| - caption = translated_attribute(component.name) + caption = decidim_escape_translated(component.name) if component.primary_stat.present? caption += content_tag(:span, component.primary_stat, class: component.primary_stat.zero? ? "component-counter component-counter--off" : "component-counter") end diff --git a/decidim-dev/lib/decidim/dev/test/rspec_support/decidim_sanitization.rb b/decidim-dev/lib/decidim/dev/test/rspec_support/decidim_sanitization.rb new file mode 100644 index 000000000000..809391a4b330 --- /dev/null +++ b/decidim-dev/lib/decidim/dev/test/rspec_support/decidim_sanitization.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +RSpec.configure do |config| + config.include Decidim::SanitizeHelper +end diff --git a/decidim-elections/lib/decidim/votings/admin_engine.rb b/decidim-elections/lib/decidim/votings/admin_engine.rb index b59af940620c..1d7985d9300a 100644 --- a/decidim-elections/lib/decidim/votings/admin_engine.rb +++ b/decidim-elections/lib/decidim/votings/admin_engine.rb @@ -86,7 +86,7 @@ class AdminEngine < ::Rails::Engine initializer "decidim_votings.admin_votings_components_menu" do Decidim.menu :admin_votings_components_menu do |menu| current_participatory_space.components.each do |component| - caption = translated_attribute(component.name) + caption = decidim_escape_translated(component.name) if component.primary_stat.present? caption += content_tag(:span, component.primary_stat, class: component.primary_stat.zero? ? "component-counter component-counter--off" : "component-counter") end diff --git a/decidim-initiatives/lib/decidim/initiatives/admin_engine.rb b/decidim-initiatives/lib/decidim/initiatives/admin_engine.rb index 965cb4281649..ac343f0edfba 100644 --- a/decidim-initiatives/lib/decidim/initiatives/admin_engine.rb +++ b/decidim-initiatives/lib/decidim/initiatives/admin_engine.rb @@ -104,7 +104,7 @@ class AdminEngine < ::Rails::Engine initializer "admin_decidim_initiatives.admin_components_menu" do Decidim.menu :admin_initiatives_components_menu do |menu| current_participatory_space.components.each do |component| - caption = translated_attribute(component.name) + caption = decidim_escape_translated(component.name) if component.primary_stat.present? caption += content_tag(:span, component.primary_stat, class: component.primary_stat.zero? ? "component-counter component-counter--off" : "component-counter") end diff --git a/decidim-participatory_processes/lib/decidim/participatory_processes/admin_engine.rb b/decidim-participatory_processes/lib/decidim/participatory_processes/admin_engine.rb index 7e790fe37c0c..3ef4f538c709 100644 --- a/decidim-participatory_processes/lib/decidim/participatory_processes/admin_engine.rb +++ b/decidim-participatory_processes/lib/decidim/participatory_processes/admin_engine.rb @@ -153,7 +153,7 @@ class AdminEngine < ::Rails::Engine initializer "decidim_participatory_processes.admin_process_components_menu" do Decidim.menu :admin_participatory_process_components_menu do |menu| current_participatory_space.components.each do |component| - caption = translated_attribute(component.name) + caption = decidim_escape_translated(component.name) if component.primary_stat.present? caption += content_tag(:span, component.primary_stat, class: component.primary_stat.zero? ? "component-counter component-counter--off" : "component-counter") end From fd0eb16c1e05ef32ef631ea3d4dfd8d077da387c Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Tue, 27 Feb 2024 15:54:40 +0200 Subject: [PATCH 3/7] Fix specs --- .../mailers/decidim/budgets/order_summary_mailer_spec.rb | 8 ++++---- .../app/views/decidim/application/_collection.html.erb | 4 ++-- decidim-core/app/views/decidim/application/_document.erb | 2 +- decidim-core/lib/decidim/core/test/factories.rb | 7 ++----- .../decidim/core/test/shared_examples/has_attachments.rb | 9 ++++----- decidim-core/lib/decidim/view_model.rb | 1 + .../decidim/admin/questionnaire_answer_presenter_spec.rb | 2 +- .../helpers/decidim/initiatives/application_helper.rb | 2 +- .../spec/system/filter_initiatives_spec.rb | 1 - .../meetings/highlighted_meetings_for_component/show.erb | 4 ++-- .../highlighted_proposals_for_component/show.erb | 2 +- 11 files changed, 19 insertions(+), 23 deletions(-) diff --git a/decidim-budgets/spec/mailers/decidim/budgets/order_summary_mailer_spec.rb b/decidim-budgets/spec/mailers/decidim/budgets/order_summary_mailer_spec.rb index 130856251adc..4d3ccc0d221e 100644 --- a/decidim-budgets/spec/mailers/decidim/budgets/order_summary_mailer_spec.rb +++ b/decidim-budgets/spec/mailers/decidim/budgets/order_summary_mailer_spec.rb @@ -23,16 +23,16 @@ module Decidim::Budgets end it "includes the budget title" do - expect(mail.body.encoded).to include(translated(budget.title)) + expect(mail.body.encoded).to include(decidim_escape_translated(budget.title)) end it "includes the participatory space title" do - expect(mail.body).to include(translated(space.title)) + expect(mail.body).to include(decidim_escape_translated(space.title)) end it "includes the projects names" do order.projects.each do |project| - expect(mail.body).to include(translated(project.title)) + expect(mail.body).to include(decidim_escape_translated(project.title)) end end end @@ -51,7 +51,7 @@ module Decidim::Budgets it "includes the scope name and scope type name" do expect(mail.body.encoded).to include(translated(scope.name)) - expect(mail.body.encoded).to include(translated(scope.scope_type.name)) + expect(mail.body.encoded).to include(decidim_escape_translated(scope.scope_type.name)) end end end diff --git a/decidim-core/app/views/decidim/application/_collection.html.erb b/decidim-core/app/views/decidim/application/_collection.html.erb index 6d4f28768610..5a3df17980e3 100644 --- a/decidim-core/app/views/decidim/application/_collection.html.erb +++ b/decidim-core/app/views/decidim/application/_collection.html.erb @@ -1,14 +1,14 @@ <% unless attachment_collection.unused? %>
-

<%= translated_attribute(attachment_collection.description) %>

+

<%= decidim_escape_translated(attachment_collection.description) %>

<% documents.each do |document| %> diff --git a/decidim-core/app/views/decidim/application/_document.erb b/decidim-core/app/views/decidim/application/_document.erb index 76a19b4d4fc3..ebe5164b0cf8 100644 --- a/decidim-core/app/views/decidim/application/_document.erb +++ b/decidim-core/app/views/decidim/application/_document.erb @@ -6,7 +6,7 @@ <%= attachment_title(document) %> <%= document.file_type %> <%= number_to_human_size(document.file_size) %> <% if document.description.present? %> - <%= translated_attribute(document.description) %> + <%= decidim_escape_translated(document.description) %> <% end %>
diff --git a/decidim-core/lib/decidim/core/test/factories.rb b/decidim-core/lib/decidim/core/test/factories.rb index 8e7a62177e57..96738bcd9ce7 100644 --- a/decidim-core/lib/decidim/core/test/factories.rb +++ b/decidim-core/lib/decidim/core/test/factories.rb @@ -617,15 +617,12 @@ def generate_localized_title(field = nil, skip_injection: false) factory :coauthorable_dummy_resource, class: "Decidim::DummyResources::CoauthorableDummyResource" do transient do skip_injection { false } + + authors_list { [create(:user, organization: component.organization, skip_injection: skip_injection)] } end title { generate(:name) } component { create(:component, manifest_name: "dummy", skip_injection: skip_injection) } - transient do - skip_injection { false } - authors_list { [create(:user, organization: component.organization)] } - end - after :build do |resource, evaluator| evaluator.authors_list.each do |coauthor| resource.coauthorships << if coauthor.is_a?(::Decidim::UserGroup) diff --git a/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb b/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb index 16f879f147af..5a2588f602f4 100644 --- a/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb +++ b/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb @@ -14,7 +14,7 @@ it "shows them" do within "div.wrapper .documents" do - expect(page).to have_content(/#{translated(document.title, locale: :en)}/i) + expect(page).to have_content(translated(document.title)) end within "div.wrapper .images" do @@ -27,7 +27,7 @@ let!(:last_document) { create(:attachment, :with_pdf, attached_to: attached_to, weight: 2) } let!(:first_document) { create(:attachment, :with_pdf, attached_to: attached_to, weight: 1) } let!(:last_image) { create(:attachment, attached_to: attached_to, weight: 2) } - let!(:fist_image) { create(:attachment, attached_to: attached_to, weight: 1) } + let!(:first_image) { create(:attachment, attached_to: attached_to, weight: 1) } before do visit current_path @@ -35,11 +35,10 @@ it "shows them ordered" do within "div.wrapper .documents" do - expect(translated(first_document.title, locale: :en)).to appear_before(translated(last_document.title, locale: :en)) - end + expect(decidim_escape_translated(first_document.title).gsub(""", "\"")).to appear_before(decidim_escape_translated(last_document.title).gsub(""", "\"")) end within "div.wrapper .images" do - expect(strip_tags(translated(fist_image.title, locale: :en))).to appear_before(strip_tags(translated(last_image.title, locale: :en))) + expect(strip_tags(translated(first_image.title, locale: :en))).to appear_before(strip_tags(translated(last_image.title, locale: :en))) end end end diff --git a/decidim-core/lib/decidim/view_model.rb b/decidim-core/lib/decidim/view_model.rb index 67e269aca37f..ae33aac444e8 100644 --- a/decidim-core/lib/decidim/view_model.rb +++ b/decidim-core/lib/decidim/view_model.rb @@ -16,6 +16,7 @@ class ViewModel < Cell::ViewModel include Cell::Caching::Notifications include Decidim::MarkupHelper include ::Webpacker::Helper + include Decidim::SanitizeHelper delegate :current_organization, to: :controller diff --git a/decidim-forms/spec/presenters/decidim/admin/questionnaire_answer_presenter_spec.rb b/decidim-forms/spec/presenters/decidim/admin/questionnaire_answer_presenter_spec.rb index 66c11c41025b..38e1e914f477 100644 --- a/decidim-forms/spec/presenters/decidim/admin/questionnaire_answer_presenter_spec.rb +++ b/decidim-forms/spec/presenters/decidim/admin/questionnaire_answer_presenter_spec.rb @@ -79,7 +79,7 @@ module Decidim let!(:attachment) { create(:attachment, :with_image, attached_to: answer) } it "returns the download attachment link" do - expect(subject.body).to eq(%()) + expect(subject.body).to eq(%()) end context "when the attachment does not have a title" do diff --git a/decidim-initiatives/app/helpers/decidim/initiatives/application_helper.rb b/decidim-initiatives/app/helpers/decidim/initiatives/application_helper.rb index 62376cfdb944..9032d134e979 100644 --- a/decidim-initiatives/app/helpers/decidim/initiatives/application_helper.rb +++ b/decidim-initiatives/app/helpers/decidim/initiatives/application_helper.rb @@ -92,7 +92,7 @@ def filter_areas(areas) def filter_areas_and_types(area_types) area_types.map do |area_type| TreeNode.new( - TreePoint.new(area_type.area_ids.join("_"), area_type.name[I18n.locale.to_s]), + TreePoint.new(area_type.area_ids.join("_"), decidim_escape_translated(area_type.name)), area_type.areas.map do |area| TreePoint.new(area.id.to_s, area.name[I18n.locale.to_s]) end diff --git a/decidim-initiatives/spec/system/filter_initiatives_spec.rb b/decidim-initiatives/spec/system/filter_initiatives_spec.rb index 5d9952aa6422..f94b268b56d6 100644 --- a/decidim-initiatives/spec/system/filter_initiatives_spec.rb +++ b/decidim-initiatives/spec/system/filter_initiatives_spec.rb @@ -201,7 +201,6 @@ end it "doesn't display TYPE filter" do - expect(page).not_to have_content(/Type/i) expect(page).not_to have_css(".filters__section.with_any_type_check_boxes_tree_filter") end diff --git a/decidim-meetings/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb b/decidim-meetings/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb index c1d8fb54f74e..4dcb69932306 100644 --- a/decidim-meetings/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb +++ b/decidim-meetings/app/cells/decidim/meetings/highlighted_meetings_for_component/show.erb @@ -1,7 +1,7 @@ <% if upcoming_meetings.any? %>

- <%= translated_attribute(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.upcoming_meetings") %> + <%= decidim_escape_translated(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.upcoming_meetings") %> <%= t("decidim.participatory_spaces.highlighted_meetings.see_all", count: upcoming_meetings_count) %>

@@ -18,7 +18,7 @@ <% elsif past_meetings.any? %>

- <%= translated_attribute(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.past_meetings") %> <%= t("decidim.participatory_spaces.highlighted_meetings.see_all", count: past_meetings_count) %> + <%= decidim_escape_translated(model.name) %> - <%= t("decidim.participatory_spaces.highlighted_meetings.past_meetings") %> <%= t("decidim.participatory_spaces.highlighted_meetings.see_all", count: past_meetings_count) %>

<% past_meetings.each do |meeting| %> diff --git a/decidim-proposals/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb b/decidim-proposals/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb index efd3a5fa11d9..189d93a9d567 100644 --- a/decidim-proposals/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb +++ b/decidim-proposals/app/cells/decidim/proposals/highlighted_proposals_for_component/show.erb @@ -1,6 +1,6 @@

- <%= translated_attribute(model.name) %> <%= t("decidim.participatory_spaces.highlighted_proposals.see_all", count: proposals_count) %> + <%= decidim_escape_translated(model.name) %> <%= t("decidim.participatory_spaces.highlighted_proposals.see_all", count: proposals_count) %>

<%= cell( From 48ed5f5a409d0376ea44ea7e326d27d279933e62 Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Tue, 27 Feb 2024 16:52:49 +0200 Subject: [PATCH 4/7] Fix failing specs --- .../highlighted_results_for_component/show.erb | 2 +- .../events/decidim/component_published_event_spec.rb | 9 +++++---- .../app/cells/decidim/conferences/photo_cell.rb | 2 +- decidim-conferences/spec/system/media_spec.rb | 4 ++-- .../decidim/core/test/shared_examples/has_attachments.rb | 3 ++- .../spec/cells/decidim/upload_modal_cell_spec.rb | 2 +- decidim-core/spec/helpers/decidim/scopes_helper_spec.rb | 2 +- decidim-core/spec/types/component_input_sort_spec.rb | 2 +- .../decidim/participatory_processes/test/factories.rb | 3 +++ 9 files changed, 17 insertions(+), 12 deletions(-) diff --git a/decidim-accountability/app/cells/decidim/accountability/highlighted_results_for_component/show.erb b/decidim-accountability/app/cells/decidim/accountability/highlighted_results_for_component/show.erb index c61872f1f258..37a731e55652 100644 --- a/decidim-accountability/app/cells/decidim/accountability/highlighted_results_for_component/show.erb +++ b/decidim-accountability/app/cells/decidim/accountability/highlighted_results_for_component/show.erb @@ -1,6 +1,6 @@

- <%= translated_attribute(model.name) %> <%= t("decidim.participatory_spaces.highlighted_results.see_all", count: results_count) %> + <%= decidim_escape_translated(model.name) %> <%= t("decidim.participatory_spaces.highlighted_results.see_all", count: results_count) %>

diff --git a/decidim-admin/spec/events/decidim/component_published_event_spec.rb b/decidim-admin/spec/events/decidim/component_published_event_spec.rb index 8e099dc44339..2f3ba6aa1ed6 100644 --- a/decidim-admin/spec/events/decidim/component_published_event_spec.rb +++ b/decidim-admin/spec/events/decidim/component_published_event_spec.rb @@ -11,10 +11,11 @@ let(:resource) { create(:component) } let(:participatory_space) { resource.participatory_space } let(:resource_path) { main_component_path(resource) } - let(:email_subject) { "An update to #{participatory_space.title["en"]}" } - let(:email_intro) { "The #{resource.name["en"]} component is now active for #{participatory_space.title["en"]}. You can see it from this page:" } - let(:email_outro) { "You have received this notification because you are following #{participatory_space.title["en"]}. You can stop receiving notifications following the previous link." } - let(:notification_title) { "The #{resource.name["en"]} component is now active for #{participatory_space.title["en"]}" } + let(:email_subject) { "An update to #{participatory_space_title}" } + let(:resource_title) { decidim_sanitize_translated(resource.name) } + let(:email_intro) { "The #{resource_title} component is now active for #{participatory_space_title}. You can see it from this page:" } + let(:email_outro) { "You have received this notification because you are following #{participatory_space_title}. You can stop receiving notifications following the previous link." } + let(:notification_title) { "The #{resource_title} component is now active for #{participatory_space_title}" } it_behaves_like "a simple event" it_behaves_like "a simple event email" diff --git a/decidim-conferences/app/cells/decidim/conferences/photo_cell.rb b/decidim-conferences/app/cells/decidim/conferences/photo_cell.rb index 37386ec1fea8..6462b680859a 100644 --- a/decidim-conferences/app/cells/decidim/conferences/photo_cell.rb +++ b/decidim-conferences/app/cells/decidim/conferences/photo_cell.rb @@ -26,7 +26,7 @@ def image_big end def title - translated_attribute model.title + decidim_escape_translated model.title end def short_description diff --git a/decidim-conferences/spec/system/media_spec.rb b/decidim-conferences/spec/system/media_spec.rb index 9ef22fd8498c..637747414122 100644 --- a/decidim-conferences/spec/system/media_spec.rb +++ b/decidim-conferences/spec/system/media_spec.rb @@ -65,7 +65,7 @@ def visit_conference it "shows them" do within "div.wrapper .documents" do - expect(page).to have_content(/#{translated(document.title, locale: :en)}/i) + expect(page).to have_content(translated(document.title)) end within "div.wrapper .images" do @@ -86,7 +86,7 @@ def visit_conference it "shows them ordered" do within "div.wrapper .documents" do - expect(translated(first_document.title, locale: :en)).to appear_before(translated(last_document.title, locale: :en)) + expect(decidim_escape_translated(first_document.title).gsub(""", "\"")).to appear_before(decidim_escape_translated(last_document.title).gsub(""", "\"")) end within "div.wrapper .images" do diff --git a/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb b/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb index 5a2588f602f4..f70341536e0e 100644 --- a/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb +++ b/decidim-core/lib/decidim/core/test/shared_examples/has_attachments.rb @@ -35,7 +35,8 @@ it "shows them ordered" do within "div.wrapper .documents" do - expect(decidim_escape_translated(first_document.title).gsub(""", "\"")).to appear_before(decidim_escape_translated(last_document.title).gsub(""", "\"")) end + expect(decidim_escape_translated(first_document.title).gsub(""", "\"")).to appear_before(decidim_escape_translated(last_document.title).gsub(""", "\"")) + end within "div.wrapper .images" do expect(strip_tags(translated(first_image.title, locale: :en))).to appear_before(strip_tags(translated(last_image.title, locale: :en))) diff --git a/decidim-core/spec/cells/decidim/upload_modal_cell_spec.rb b/decidim-core/spec/cells/decidim/upload_modal_cell_spec.rb index 6709f1b27855..a73ae7424753 100644 --- a/decidim-core/spec/cells/decidim/upload_modal_cell_spec.rb +++ b/decidim-core/spec/cells/decidim/upload_modal_cell_spec.rb @@ -122,7 +122,7 @@ def model_name expect(subject).to have_selector("[data-filename='#{filename}']") details = subject.find(".attachment-details") - expect(details).to have_content("#{attachments[0].title["en"]} (#{filename})") + expect(details).to have_content("#{decidim_sanitize_translated(attachments[0].title)} (#{filename})") end end diff --git a/decidim-core/spec/helpers/decidim/scopes_helper_spec.rb b/decidim-core/spec/helpers/decidim/scopes_helper_spec.rb index ced6767de950..ae3307967b3f 100644 --- a/decidim-core/spec/helpers/decidim/scopes_helper_spec.rb +++ b/decidim-core/spec/helpers/decidim/scopes_helper_spec.rb @@ -15,7 +15,7 @@ module Decidim diff --git a/decidim-core/spec/types/component_input_sort_spec.rb b/decidim-core/spec/types/component_input_sort_spec.rb index 707946787cd2..04f2c48bf750 100644 --- a/decidim-core/spec/types/component_input_sort_spec.rb +++ b/decidim-core/spec/types/component_input_sort_spec.rb @@ -13,7 +13,7 @@ module Core let(:model) { create(:participatory_process, organization: current_organization) } let(:models) { model.components } - let!(:proposal) { create(:proposal_component, :published, participatory_space: model) } + let!(:proposal) { create(:proposal_component, :published, participatory_space: model, name: generate_component_name(current_organization.available_locales, :proposals)) } let!(:dummy) { create(:component, :published, participatory_space: model) } context "when sorting by component id" do diff --git a/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb b/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb index 7cb57a483531..6157e254bb6c 100644 --- a/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb +++ b/decidim-participatory_processes/lib/decidim/participatory_processes/test/factories.rb @@ -114,6 +114,9 @@ end factory :participatory_process_step, class: "Decidim::ParticipatoryProcessStep" do + transient do + skip_injection { false } + end title { generate_localized_title } description { Decidim::Faker::Localized.wrapped("

", "

") { generate_localized_title } } start_date { 1.month.ago } From e4a179ca93e5f99f84f3f197202f2d181ba9011a Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Tue, 27 Feb 2024 18:33:50 +0200 Subject: [PATCH 5/7] Fix more specs --- .../decidim/component_published_event.rb | 12 ++++ .../spec/controllers/pages_controller_spec.rb | 4 +- ...cipatory_space_components_importer_spec.rb | 57 ++++++++++--------- decidim-core/spec/system/homepage_spec.rb | 2 +- 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/decidim-admin/app/events/decidim/component_published_event.rb b/decidim-admin/app/events/decidim/component_published_event.rb index 4d3209336c23..d050b164b340 100644 --- a/decidim-admin/app/events/decidim/component_published_event.rb +++ b/decidim-admin/app/events/decidim/component_published_event.rb @@ -2,5 +2,17 @@ module Decidim class ComponentPublishedEvent < Decidim::Events::SimpleEvent + + # Public: The Hash of options to pass to the I18.t method. + def i18n_options + default_i18n_options.merge(event_interpolations) + end + + def resource_title + return unless resource + + title = decidim_sanitize_translated(resource.name) + Decidim::ContentProcessor.render_without_format(title, links: false).html_safe + end end end diff --git a/decidim-core/spec/controllers/pages_controller_spec.rb b/decidim-core/spec/controllers/pages_controller_spec.rb index 05c68d7408eb..4870b8e6dded 100644 --- a/decidim-core/spec/controllers/pages_controller_spec.rb +++ b/decidim-core/spec/controllers/pages_controller_spec.rb @@ -21,8 +21,8 @@ module Devise expect(response).to render_template(:show) - expect(response.body).to include(page.title[I18n.locale.to_s]) - expect(response.body).to include(page.content[I18n.locale.to_s]) + expect(response.body).to include(decidim_escape_translated(page.title)) + expect(response.body).to include(decidim_sanitize_admin(translated(page.content))) end end diff --git a/decidim-core/spec/serializers/decidim/importers/participatory_space_components_importer_spec.rb b/decidim-core/spec/serializers/decidim/importers/participatory_space_components_importer_spec.rb index 7635069ca331..757590dd795a 100644 --- a/decidim-core/spec/serializers/decidim/importers/participatory_space_components_importer_spec.rb +++ b/decidim-core/spec/serializers/decidim/importers/participatory_space_components_importer_spec.rb @@ -16,38 +16,39 @@ module Decidim::Importers let!(:component2) { create(:component, :with_one_step, :unpublished, :with_permissions, participatory_space: participatory_space, weight: 2) } let(:json_as_text) do - <<~EOJSON - [{ - "manifest_name": "#{component1.manifest_name}", - "id": #{component1.id}, - "name": { - "ca": "#{component1.name["ca"]}", - "en": "#{component1.name["en"]}", - "es": "#{component1.name["es"]}" + json = [ + { + manifest_name: component1.manifest_name, + id: component1.id, + name: { + ca: component1.name["ca"], + en: component1.name["en"], + es: component1.name["es"] }, - "participatory_space_id": #{previous_participatory_space.id}, - "participatory_space_type": "#{component1.participatory_space.class.name}", - "settings": #{component1.attributes["settings"].to_json}, - "weight": #{component1.weight}, - "permissions": #{component1.permissions.to_json}, - "published_at": "#{component1.published_at&.iso8601 || "null"}" + participatory_space_id: previous_participatory_space.id, + participatory_space_type: component1.participatory_space.class.name, + settings: component1.attributes["settings"], + weight: component1.weight, + permissions: component1.permissions, + published_at: component1.published_at&.iso8601 }, { - "manifest_name": "#{component2.manifest_name}", - "id": #{component2.id}, - "name": { - "ca": "#{component2.name["ca"]}", - "en": "#{component2.name["en"]}", - "es": "#{component2.name["es"]}" + manifest_name: component2.manifest_name, + id: component2.id, + name: { + ca: component2.name["ca"], + en: component2.name["en"], + es: component2.name["es"] }, - "participatory_space_id": #{previous_participatory_space.id}, - "participatory_space_type": "#{component2.participatory_space.class.name}", - "settings": #{component2.attributes["settings"].to_json}, - "weight": #{component2.weight}, - "permissions": #{component2.permissions.to_json}, - "published_at": "#{component2.published_at&.iso8601 || "null"}" + participatory_space_id: previous_participatory_space.id, + participatory_space_type: component2.participatory_space.class.name, + settings: component2.attributes["settings"], + weight: component2.weight, + permissions: component2.permissions, + published_at: component2.published_at&.iso8601 } - ] - EOJSON + ] + + JSON.generate(json) end describe "#import" do diff --git a/decidim-core/spec/system/homepage_spec.rb b/decidim-core/spec/system/homepage_spec.rb index c14c7f23efc6..1ab800e26f1f 100644 --- a/decidim-core/spec/system/homepage_spec.rb +++ b/decidim-core/spec/system/homepage_spec.rb @@ -180,7 +180,7 @@ click_link static_page1.title["en"] expect(page).to have_i18n_content(static_page1.title) - expect(page).to have_i18n_content(static_page1.content) + expect(page).to have_i18n_content(static_page1.content, strip_tags: true) end it "includes the footer sub_hero with the current organization name" do From 3472cd9117835b29f97ed653914e8436b5e9ea13 Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Tue, 27 Feb 2024 20:19:14 +0200 Subject: [PATCH 6/7] Fix specs --- .../events/decidim/component_published_event.rb | 1 - .../decidim/scopes_picker/scope_picker_values.erb | 2 +- .../views/decidim/application/_collection.html.erb | 4 ++-- .../app/views/decidim/application/_document.erb | 2 +- .../shared_examples/has_attachment_collections.rb | 14 ++++++++------ 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/decidim-admin/app/events/decidim/component_published_event.rb b/decidim-admin/app/events/decidim/component_published_event.rb index d050b164b340..203902c18a10 100644 --- a/decidim-admin/app/events/decidim/component_published_event.rb +++ b/decidim-admin/app/events/decidim/component_published_event.rb @@ -2,7 +2,6 @@ module Decidim class ComponentPublishedEvent < Decidim::Events::SimpleEvent - # Public: The Hash of options to pass to the I18.t method. def i18n_options default_i18n_options.merge(event_interpolations) diff --git a/decidim-core/app/cells/decidim/scopes_picker/scope_picker_values.erb b/decidim-core/app/cells/decidim/scopes_picker/scope_picker_values.erb index cdd04e2c9e7a..7539aba8126b 100644 --- a/decidim-core/app/cells/decidim/scopes_picker/scope_picker_values.erb +++ b/decidim-core/app/cells/decidim/scopes_picker/scope_picker_values.erb @@ -1,5 +1,5 @@
<%- scopes.each do |scope, params| %> -
<%= link_to params[:text], params[:url], data: { picker_value: scope.id } %>
+
<%= link_to decidim_html_escape(params[:text]), params[:url], data: { picker_value: scope.id } %>
<% end %>
diff --git a/decidim-core/app/views/decidim/application/_collection.html.erb b/decidim-core/app/views/decidim/application/_collection.html.erb index 5a3df17980e3..6d4f28768610 100644 --- a/decidim-core/app/views/decidim/application/_collection.html.erb +++ b/decidim-core/app/views/decidim/application/_collection.html.erb @@ -1,14 +1,14 @@ <% unless attachment_collection.unused? %>
-

<%= decidim_escape_translated(attachment_collection.description) %>

+

<%= translated_attribute(attachment_collection.description) %>

<% documents.each do |document| %> diff --git a/decidim-core/app/views/decidim/application/_document.erb b/decidim-core/app/views/decidim/application/_document.erb index ebe5164b0cf8..76a19b4d4fc3 100644 --- a/decidim-core/app/views/decidim/application/_document.erb +++ b/decidim-core/app/views/decidim/application/_document.erb @@ -6,7 +6,7 @@ <%= attachment_title(document) %> <%= document.file_type %> <%= number_to_human_size(document.file_size) %> <% if document.description.present? %> - <%= decidim_escape_translated(document.description) %> + <%= translated_attribute(document.description) %> <% end %>
diff --git a/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb b/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb index 5882fa3f2cf3..559e1beea6c3 100644 --- a/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb +++ b/decidim-core/lib/decidim/core/test/shared_examples/has_attachment_collections.rb @@ -14,14 +14,14 @@ it "shows them" do within ".attachments .documents" do - expect(page).to have_content(/#{translated(attachment_collection.name, locale: :en)}/i) + expect(page).to have_content(translated(attachment_collection.name)) end end it "show their documents" do within ".attachments .documents #docs-collection-#{attachment_collection.id}", visible: false do - expect(page).to have_content(:all, /#{translated(document.title, locale: :en)}/i) - expect(page).not_to have_content(:all, /#{translated(other_document.title, locale: :en)}/i) + expect(page).to have_content(:all, translated(document.title)) + expect(page).not_to have_content(:all, translated(other_document.title)) end end end @@ -39,7 +39,9 @@ it "shows them ordered" do within ".attachments .documents" do - expect(translated(first_attachment_collection.name, locale: :en)).to appear_before(translated(last_attachment_collection.name, locale: :en)) + expect(decidim_escape_translated(first_attachment_collection.name).gsub(""", + "\"")).to appear_before(decidim_escape_translated(last_attachment_collection.name).gsub(""", + "\"")) end end end @@ -55,8 +57,8 @@ it "is not present" do within ".attachments .documents" do - expect(page).to have_content(/#{translated(attachment_collection.name, locale: :en)}/i) - expect(page).not_to have_content(/#{translated(empty_attachment_collection.name, locale: :en)}/i) + expect(page).to have_content(translated(attachment_collection.name)) + expect(page).not_to have_content(translated(empty_attachment_collection.name)) end end end From b27ca940e7973562e8c2e3ab35148295cd4d1dbc Mon Sep 17 00:00:00 2001 From: Alexandru Emil Lupu Date: Wed, 28 Feb 2024 12:38:56 +0200 Subject: [PATCH 7/7] Apply review recommendations --- decidim-conferences/spec/system/media_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decidim-conferences/spec/system/media_spec.rb b/decidim-conferences/spec/system/media_spec.rb index 637747414122..12828dec5729 100644 --- a/decidim-conferences/spec/system/media_spec.rb +++ b/decidim-conferences/spec/system/media_spec.rb @@ -48,7 +48,7 @@ def visit_conference it "shows them" do within "div.wrapper .conference-media" do expect(page).to have_content("MEDIA AND LINKS") - expect(page).to have_content(/#{translated(media_link.title, locale: :en)}/i) + expect(page).to have_content(translated(media_link.title)) expect(page).to have_css(".media-links a") end end