From 6af8ddd32465e7d918dff27b1d66f9efab160b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javi=20Mart=C3=ADn?= Date: Sat, 12 Oct 2024 15:56:47 +0200 Subject: [PATCH] Extract component to render the date of birth We reduce code duplication thanks to that, and make it easier to change this field. Note that there was one place where the "16.years" value was hardcoded. We're moving the test for this case to the component and changing it so the test doesn't use the default age. We're also removing the redundant helper method that had the same code as a method in the User class which is called everywhere else. --- .../date_of_birth_field_component.html.erb | 1 + .../shared/date_of_birth_field_component.rb | 26 +++++++++++++++++++ app/helpers/verification_helper.rb | 4 --- .../admin/local_census_records/_form.html.erb | 4 +-- .../document_verifications/index.html.erb | 4 +-- app/views/management/users/new.html.erb | 5 +--- app/views/officing/residence/new.html.erb | 4 +-- app/views/verification/residence/new.html.erb | 4 +-- .../date_of_birth_field_component_spec.rb | 26 +++++++++++++++++++ spec/system/verification/residence_spec.rb | 15 ----------- 10 files changed, 58 insertions(+), 35 deletions(-) create mode 100644 app/components/shared/date_of_birth_field_component.html.erb create mode 100644 app/components/shared/date_of_birth_field_component.rb create mode 100644 spec/components/shared/date_of_birth_field_component_spec.rb diff --git a/app/components/shared/date_of_birth_field_component.html.erb b/app/components/shared/date_of_birth_field_component.html.erb new file mode 100644 index 000000000..91fedf367 --- /dev/null +++ b/app/components/shared/date_of_birth_field_component.html.erb @@ -0,0 +1 @@ +<%= form.date_select :date_of_birth, **field_options %> diff --git a/app/components/shared/date_of_birth_field_component.rb b/app/components/shared/date_of_birth_field_component.rb new file mode 100644 index 000000000..9289ff05f --- /dev/null +++ b/app/components/shared/date_of_birth_field_component.rb @@ -0,0 +1,26 @@ +class Shared::DateOfBirthFieldComponent < ApplicationComponent + attr_reader :form, :options + + def initialize(form, **options) + @form = form + @options = options + end + + private + + def default_options + { + prompt: true, + start_year: 1900, + end_year: minimum_required_age.years.ago.year + } + end + + def field_options + default_options.merge(options) + end + + def minimum_required_age + User.minimum_required_age + end +end diff --git a/app/helpers/verification_helper.rb b/app/helpers/verification_helper.rb index 3dd9123c9..17f57b774 100644 --- a/app/helpers/verification_helper.rb +++ b/app/helpers/verification_helper.rb @@ -5,10 +5,6 @@ module VerificationHelper [t("verification.residence.new.document_type.residence_card"), 3]] end - def minimum_required_age - (Setting["min_age_to_participate"] || 16).to_i - end - def mask_phone(number) match = number.match(/\d{3}$/) "******#{match}" diff --git a/app/views/admin/local_census_records/_form.html.erb b/app/views/admin/local_census_records/_form.html.erb index c84bb997c..11ef1fb01 100644 --- a/app/views/admin/local_census_records/_form.html.erb +++ b/app/views/admin/local_census_records/_form.html.erb @@ -15,9 +15,7 @@
- <%= f.date_select :date_of_birth, - prompt: true, - start_year: 1900, end_year: minimum_required_age.years.ago.year %> + <%= render Shared::DateOfBirthFieldComponent.new(f) %>
diff --git a/app/views/management/document_verifications/index.html.erb b/app/views/management/document_verifications/index.html.erb index 4c81f65ef..59010bf0b 100644 --- a/app/views/management/document_verifications/index.html.erb +++ b/app/views/management/document_verifications/index.html.erb @@ -17,9 +17,7 @@ <% if Setting.force_presence_date_of_birth? %>
- <%= f.date_select :date_of_birth, - prompt: true, - start_year: 1900, end_year: minimum_required_age.years.ago.year %> + <%= render Shared::DateOfBirthFieldComponent.new(f) %>
<% end %> diff --git a/app/views/management/users/new.html.erb b/app/views/management/users/new.html.erb index e7431d0f3..a5f01c432 100644 --- a/app/views/management/users/new.html.erb +++ b/app/views/management/users/new.html.erb @@ -11,10 +11,7 @@ <%= f.text_field :email, label: t("management.users.email_optional_label") %>
- <%= f.date_select :date_of_birth, - prompt: true, - start_year: 1900, end_year: 16.years.ago.year, - label: t("management.date_of_birth") %> + <%= render Shared::DateOfBirthFieldComponent.new(f, label: t("management.date_of_birth")) %>
<%= f.submit t("management.users.create_user_submit"), class: "button success" %> <% end %> diff --git a/app/views/officing/residence/new.html.erb b/app/views/officing/residence/new.html.erb index 93c510b14..49d6ce437 100644 --- a/app/views/officing/residence/new.html.erb +++ b/app/views/officing/residence/new.html.erb @@ -14,9 +14,7 @@ <% if Setting.force_presence_date_of_birth? %>
- <%= f.date_select :date_of_birth, - prompt: true, - start_year: 1900, end_year: minimum_required_age.years.ago.year %> + <%= render Shared::DateOfBirthFieldComponent.new(f) %>
<% else %>
diff --git a/app/views/verification/residence/new.html.erb b/app/views/verification/residence/new.html.erb index c361d7d4c..9909d41af 100644 --- a/app/views/verification/residence/new.html.erb +++ b/app/views/verification/residence/new.html.erb @@ -57,9 +57,7 @@
- <%= f.date_select :date_of_birth, - prompt: true, - start_year: 1900, end_year: minimum_required_age.years.ago.year %> + <%= render Shared::DateOfBirthFieldComponent.new(f) %>
diff --git a/spec/components/shared/date_of_birth_field_component_spec.rb b/spec/components/shared/date_of_birth_field_component_spec.rb new file mode 100644 index 000000000..8687b84cf --- /dev/null +++ b/spec/components/shared/date_of_birth_field_component_spec.rb @@ -0,0 +1,26 @@ +require "rails_helper" + +describe Shared::DateOfBirthFieldComponent do + before do + dummy_model = Class.new do + include ActiveModel::Model + attr_accessor :date_of_birth + end + + stub_const("DummyModel", dummy_model) + end + + let(:form) { ConsulFormBuilder.new(:dummy, DummyModel.new, ApplicationController.new.view_context, {}) } + let(:component) { Shared::DateOfBirthFieldComponent.new(form) } + + it "uses the minimum required age as the latest date by default" do + Setting["min_age_to_participate"] = 13 + + travel_to "2015-07-15" do + render_inline component + + expect(page).to have_select with_options: [2002, 2001, 2000, 1999] + expect(page).not_to have_select with_options: [2003] + end + end +end diff --git a/spec/system/verification/residence_spec.rb b/spec/system/verification/residence_spec.rb index a44d6e3ae..a806cc378 100644 --- a/spec/system/verification/residence_spec.rb +++ b/spec/system/verification/residence_spec.rb @@ -38,21 +38,6 @@ describe "Residence" do expect(page).to have_content "Residence verified" end - scenario "Residence form use min age to participate" do - min_age = (Setting["min_age_to_participate"] = 16).to_i - underage = min_age - 1 - user = create(:user) - login_as(user) - - visit account_path - click_link "Verify my account" - - expect(page).to have_select("residence_date_of_birth_1i", - with_options: [min_age.years.ago.year]) - expect(page).not_to have_select("residence_date_of_birth_1i", - with_options: [underage.years.ago.year]) - end - scenario "When trying to verify a deregistered account old votes are reassigned" do erased_user = create(:user, document_number: "12345678Z", document_type: "1", erased_at: Time.current) vote = create(:vote, voter: erased_user)