From 681e1cf51873e32faa9afd810a80124b78255fea Mon Sep 17 00:00:00 2001 From: sebastiencarceles Date: Tue, 14 Feb 2023 13:45:30 +0100 Subject: [PATCH] :recycle: refactor possible_values impl for clarity --- .../types_de_champ/prefill_type_de_champ.rb | 23 +++---- .../prefill_type_de_champ_spec.rb | 62 ++++++++++++++----- 2 files changed, 60 insertions(+), 25 deletions(-) diff --git a/app/models/types_de_champ/prefill_type_de_champ.rb b/app/models/types_de_champ/prefill_type_de_champ.rb index 31422be58..aebd01ae2 100644 --- a/app/models/types_de_champ/prefill_type_de_champ.rb +++ b/app/models/types_de_champ/prefill_type_de_champ.rb @@ -24,13 +24,18 @@ class TypesDeChamp::PrefillTypeDeChamp < SimpleDelegator end def possible_values - [possible_values_list_display, link_to_all_possible_values].compact.join('
').html_safe # rubocop:disable Rails/OutputSafety + values = [] + values << description if description.present? + if too_many_possible_values? + values << link_to_all_possible_values + else + values << all_possible_values.to_sentence + end + values.compact.join('
').html_safe # rubocop:disable Rails/OutputSafety end def all_possible_values - return [] unless prefillable? - - [I18n.t("views.prefill_descriptions.edit.possible_values.#{type_champ}_html")] + [] end def example_value @@ -50,7 +55,7 @@ class TypesDeChamp::PrefillTypeDeChamp < SimpleDelegator private def link_to_all_possible_values - return unless too_many_possible_values? && prefillable? + return unless prefillable? link_to I18n.t("views.prefill_descriptions.edit.possible_values.link.text"), Rails.application.routes.url_helpers.prefill_type_de_champ_path(path, self), title: new_tab_suffix(I18n.t("views.prefill_descriptions.edit.possible_values.link.title")), **external_link_attributes end @@ -59,11 +64,7 @@ class TypesDeChamp::PrefillTypeDeChamp < SimpleDelegator all_possible_values.count > POSSIBLE_VALUES_THRESHOLD end - def possible_values_list_display - if too_many_possible_values? - I18n.t("views.prefill_descriptions.edit.possible_values.#{type_champ}_html").html_safe # rubocop:disable Rails/OutputSafety - else - all_possible_values.to_sentence - end + def description + @description ||= I18n.t("views.prefill_descriptions.edit.possible_values.#{type_champ}_html", default: nil)&.html_safe # rubocop:disable Rails/OutputSafety end end diff --git a/spec/models/types_de_champ/prefill_type_de_champ_spec.rb b/spec/models/types_de_champ/prefill_type_de_champ_spec.rb index d5e322155..b0c19a666 100644 --- a/spec/models/types_de_champ/prefill_type_de_champ_spec.rb +++ b/spec/models/types_de_champ/prefill_type_de_champ_spec.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true RSpec.describe TypesDeChamp::PrefillTypeDeChamp, type: :model do + include ActionView::Helpers::UrlHelper + include ApplicationHelper + describe '.build' do subject(:built) { described_class.build(type_de_champ) } @@ -45,26 +48,57 @@ RSpec.describe TypesDeChamp::PrefillTypeDeChamp, type: :model do end describe '#possible_values' do - subject(:possible_values) { described_class.new(type_de_champ).possible_values } + let(:built) { described_class.build(type_de_champ) } + subject(:possible_values) { built.possible_values } + + context 'when the type de champ is prefillable' do + context 'when the type de champ has a description' do + let(:type_de_champ) { build(:type_de_champ_text) } + + it { expect(possible_values).to include(I18n.t("views.prefill_descriptions.edit.possible_values.#{type_de_champ.type_champ}_html")) } + end + + context 'when the type de champ does not have a description' do + let(:type_de_champ) { build(:type_de_champ_mesri) } + + it { expect(possible_values).not_to include(I18n.t("views.prefill_descriptions.edit.possible_values.#{type_de_champ.type_champ}_html")) } + end + + describe 'too many possible values or not' do + let!(:procedure) { create(:procedure, :with_drop_down_list) } + let(:type_de_champ) { procedure.draft_types_de_champ_public.first } + let(:link_to_all_possible_values) { + link_to( + I18n.t("views.prefill_descriptions.edit.possible_values.link.text"), + Rails.application.routes.url_helpers.prefill_type_de_champ_path(type_de_champ.path, type_de_champ), + title: new_tab_suffix(I18n.t("views.prefill_descriptions.edit.possible_values.link.title")), + **external_link_attributes + ) + } + + context 'when there is too many possible values' do + before { type_de_champ.drop_down_options = (1..described_class::POSSIBLE_VALUES_THRESHOLD + 1).map(&:to_s) } + + it { expect(possible_values).to include(link_to_all_possible_values) } + + it { expect(possible_values).not_to include(built.all_possible_values.to_sentence) } + end + + context 'when there is not too many possible values' do + before { type_de_champ.drop_down_options = (1..described_class::POSSIBLE_VALUES_THRESHOLD - 1).map(&:to_s) } + + it { expect(possible_values).not_to include(link_to_all_possible_values) } + + it { expect(possible_values).to include(built.all_possible_values.to_sentence) } + end + end + end context 'when the type de champ is not prefillable' do let(:type_de_champ) { build(:type_de_champ_mesri) } it { expect(possible_values).to be_empty } end - - context 'when there is too many possible values' do - let(:type_de_champ) { create(:type_de_champ_drop_down_list, procedure: create(:procedure)) } - before { type_de_champ.drop_down_options = (1..described_class::POSSIBLE_VALUES_THRESHOLD + 1).map(&:to_s) } - - it { expect(possible_values).to eq("Un choix parmi ceux sélectionnés à la création de la procédure") } - end - - context 'when the type de champ is prefillable' do - let(:type_de_champ) { build(:type_de_champ_email) } - - it { expect(possible_values).to eq("Une adresse email") } - end end describe '#example_value' do