From 80474651e77ec6b4d6e8a39fb513df788a431aa0 Mon Sep 17 00:00:00 2001 From: Kat Date: Thu, 22 Feb 2024 11:41:10 +0000 Subject: [PATCH] Separate sales validations --- .../sales/household_validations.rb | 112 +++++++-------- .../sales/household_validations_spec.rb | 133 +++++++++--------- 2 files changed, 127 insertions(+), 118 deletions(-) diff --git a/app/models/validations/sales/household_validations.rb b/app/models/validations/sales/household_validations.rb index c23a72609..061c0d8b2 100644 --- a/app/models/validations/sales/household_validations.rb +++ b/app/models/validations/sales/household_validations.rb @@ -1,13 +1,7 @@ module Validations::Sales::HouseholdValidations include Validations::SharedValidations - def validate_household_number_of_other_members(record) - (2..6).each do |n| - validate_person_age_matches_relationship(record, n) - validate_person_age_and_relationship_matches_economic_status(record, n) - validate_person_age_matches_economic_status(record, n) - validate_child_12_years_younger(record, n) - end + def validate_partner_count(record) shared_validate_partner_count(record, 6) end @@ -31,74 +25,82 @@ module Validations::Sales::HouseholdValidations end end -private - - def validate_person_age_matches_relationship(record, person_num) - age = record.public_send("age#{person_num}") - relationship = record.public_send("relat#{person_num}") - return unless age && relationship - - if age < 16 && !relationship_is_child_other_or_refused?(relationship) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat_sales", person_num:) - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16_sales", person_num:) - elsif age >= 20 && person_is_child?(relationship) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_20") - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_over_20") + def validate_person_age_matches_relationship(record) + (2..6).each do |person_num| + age = record.public_send("age#{person_num}") + relationship = record.public_send("relat#{person_num}") + next unless age && relationship + + if age < 16 && !relationship_is_child_other_or_refused?(relationship) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_relat_sales", person_num:) + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16_sales", person_num:) + elsif age >= 20 && person_is_child?(relationship) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_20") + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_over_20") + end end end - def validate_person_age_and_relationship_matches_economic_status(record, person_num) - age = record.public_send("age#{person_num}") - economic_status = record.public_send("ecstat#{person_num}") - relationship = record.public_send("relat#{person_num}") - return unless age && economic_status && relationship - - age_between_16_19 = age.between?(16, 19) - student = person_is_fulltime_student?(economic_status) - economic_status_refused = person_economic_status_refused?(economic_status) - child = person_is_child?(relationship) - - if age_between_16_19 && !(student || economic_status_refused) && child - record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student") - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student") - record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") - end + def validate_person_age_and_relationship_matches_economic_status(record) + (2..6).each do |person_num| + age = record.public_send("age#{person_num}") + economic_status = record.public_send("ecstat#{person_num}") + relationship = record.public_send("relat#{person_num}") + next unless age && economic_status && relationship + + age_between_16_19 = age.between?(16, 19) + student = person_is_fulltime_student?(economic_status) + economic_status_refused = person_economic_status_refused?(economic_status) + child = person_is_child?(relationship) + + if age_between_16_19 && !(student || economic_status_refused) && child + record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student") + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student") + record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") + end + + next unless !age_between_16_19 && student && child - if !age_between_16_19 && student && child record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.must_be_16_19") record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.cannot_be_student.child_not_16_19") record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19") end end - def validate_person_age_matches_economic_status(record, person_num) - age = record.public_send("age#{person_num}") - economic_status = record.public_send("ecstat#{person_num}") - return unless age && economic_status - - if age < 16 && !economic_status_is_child_other_or_refused?(economic_status) - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_under_16", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_ecstat", person_num:) - end - if person_is_economic_child?(economic_status) && age > 16 - record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_over_16", person_num:) - record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_16", person_num:) + def validate_person_age_matches_economic_status(record) + (2..6).each do |person_num| + age = record.public_send("age#{person_num}") + economic_status = record.public_send("ecstat#{person_num}") + next unless age && economic_status + + if age < 16 && !economic_status_is_child_other_or_refused?(economic_status) + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_under_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_ecstat", person_num:) + end + if person_is_economic_child?(economic_status) && age > 16 + record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_over_16", person_num:) + record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_16", person_num:) + end end end - def validate_child_12_years_younger(record, person_num) - buyer_1_age = record.public_send("age1") - person_age = record.public_send("age#{person_num}") - relationship = record.public_send("relat#{person_num}") - return unless buyer_1_age && person_age && relationship + def validate_child_12_years_younger(record) + (2..6).each do |person_num| + buyer_1_age = record.public_send("age1") + person_age = record.public_send("age#{person_num}") + relationship = record.public_send("relat#{person_num}") + next unless buyer_1_age && person_age && relationship + + next unless person_age > buyer_1_age - 12 && person_is_child?(relationship) - if person_age > buyer_1_age - 12 && person_is_child?(relationship) record.errors.add "age1", I18n.t("validations.household.age.child_12_years_younger") record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_12_years_younger") record.errors.add "relat#{person_num}", I18n.t("validations.household.age.child_12_years_younger") end end +private + def person_is_fulltime_student?(economic_status) economic_status == 7 end diff --git a/spec/models/validations/sales/household_validations_spec.rb b/spec/models/validations/sales/household_validations_spec.rb index deddfa8ef..10cae10f4 100644 --- a/spec/models/validations/sales/household_validations_spec.rb +++ b/spec/models/validations/sales/household_validations_spec.rb @@ -4,14 +4,13 @@ RSpec.describe Validations::Sales::HouseholdValidations do subject(:household_validator) { validator_class.new } let(:validator_class) { Class.new { include Validations::Sales::HouseholdValidations } } + let(:record) { build(:sales_log) } - describe "household member validations" do - let(:record) { build(:sales_log) } - + describe "#validate_partner_count" do it "validates that only 1 partner exists" do record.relat2 = "P" record.relat3 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_partner_count(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.one_partner")) expect(record.errors["relat3"]) @@ -22,15 +21,17 @@ RSpec.describe Validations::Sales::HouseholdValidations do it "expects that a tenant can have a partner" do record.relat3 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_partner_count(record) expect(record.errors["base"]).to be_empty end + end + describe "#validate_person_age_matches_relationship" do context "when the household contains a person under 16" do it "expects that person is a child of the tenant" do record.age2 = 14 record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]).to be_empty expect(record.errors["age2"]).to be_empty end @@ -38,80 +39,86 @@ RSpec.describe Validations::Sales::HouseholdValidations do it "validates that a person under 16 must not be a partner of the buyer" do record.age2 = 14 record.relat2 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.child_under_16_sales", person_num: 2)) expect(record.errors["age2"]) .to include(match I18n.t("validations.household.age.child_under_16_relat_sales", person_num: 2)) end - - it "validates that person's economic status must be Child" do - record.age2 = 14 - record.ecstat2 = 1 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]) - .to include(match I18n.t("validations.household.ecstat.child_under_16", person_num: 2)) - expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_under_16_ecstat", person_num: 2)) - end - - it "expects that person's economic status is Child" do - record.age2 = 14 - record.ecstat2 = 9 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]).to be_empty - expect(record.errors["age2"]).to be_empty - end - - it "validates that a person with economic status 'child' must be under 16" do - record.age2 = 21 - record.ecstat2 = 9 - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["ecstat2"]) - .to include(match I18n.t("validations.household.ecstat.child_over_16", person_num: 2)) - expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_over_16", person_num: 2)) - end - - it "validates the child is at least 12 years younger than buyer 1" do - record.age1 = 30 - record.age2 = record.age1 - 11 - record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["age1"]) - .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) - expect(record.errors["age2"]) - .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) - expect(record.errors["relat2"]) - .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) - end - - it "expects the child is at least 12 years younger than buyer 1" do - record.age1 = 30 - record.age2 = record.age1 - 12 - record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) - expect(record.errors["age1"]).to be_empty - expect(record.errors["age2"]).to be_empty - expect(record.errors["relate2"]).to be_empty - end end it "validates that a person over 20 must not be a child of the buyer" do record.age2 = 21 record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_matches_relationship(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.child_over_20")) expect(record.errors["age2"]) .to include(match I18n.t("validations.household.age.child_over_20")) end + end + + describe "#validate_person_age_matches_economic_status" do + it "validates that person's economic status must be Child" do + record.age2 = 14 + record.ecstat2 = 1 + household_validator.validate_person_age_matches_economic_status(record) + expect(record.errors["ecstat2"]) + .to include(match I18n.t("validations.household.ecstat.child_under_16", person_num: 2)) + expect(record.errors["age2"]) + .to include(match I18n.t("validations.household.age.child_under_16_ecstat", person_num: 2)) + end + + it "expects that person's economic status is Child" do + record.age2 = 14 + record.ecstat2 = 9 + household_validator.validate_person_age_matches_economic_status(record) + expect(record.errors["ecstat2"]).to be_empty + expect(record.errors["age2"]).to be_empty + end + + it "validates that a person with economic status 'child' must be under 16" do + record.age2 = 21 + record.ecstat2 = 9 + household_validator.validate_person_age_matches_economic_status(record) + expect(record.errors["ecstat2"]) + .to include(match I18n.t("validations.household.ecstat.child_over_16", person_num: 2)) + expect(record.errors["age2"]) + .to include(match I18n.t("validations.household.age.child_over_16", person_num: 2)) + end + end + + describe "#validate_child_12_years_younger" do + it "validates the child is at least 12 years younger than buyer 1" do + record.age1 = 30 + record.age2 = record.age1 - 11 + record.relat2 = "C" + household_validator.validate_child_12_years_younger(record) + expect(record.errors["age1"]) + .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) + expect(record.errors["age2"]) + .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) + expect(record.errors["relat2"]) + .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) + end + + it "expects the child is at least 12 years younger than buyer 1" do + record.age1 = 30 + record.age2 = record.age1 - 12 + record.relat2 = "C" + household_validator.validate_child_12_years_younger(record) + expect(record.errors["age1"]).to be_empty + expect(record.errors["age2"]).to be_empty + expect(record.errors["relate2"]).to be_empty + end + end + describe "#validate_person_age_and_relationship_matches_economic_status" do it "does not add an error for a person aged 16-19 who is a student but not a child of the buyer" do record.age2 = 18 record.ecstat2 = "7" record.relat2 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]).to be_empty expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty @@ -121,7 +128,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.age2 = 20 record.ecstat2 = "7" record.relat2 = "P" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]).to be_empty expect(record.errors["ecstat2"]).to be_empty expect(record.errors["age2"]).to be_empty @@ -131,7 +138,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.age2 = 17 record.ecstat2 = "1" record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student")) expect(record.errors["age2"]) @@ -144,7 +151,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do record.age2 = 14 record.ecstat2 = "7" record.relat2 = "C" - household_validator.validate_household_number_of_other_members(record) + household_validator.validate_person_age_and_relationship_matches_economic_status(record) expect(record.errors["relat2"]) .to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19")) expect(record.errors["age2"])