Browse Source

feat: add more validation and update tests

pull/1178/head
natdeanlewissoftwire 3 years ago
parent
commit
6e43b72855
  1. 23
      app/models/validations/household_validations.rb
  2. 21
      app/models/validations/sales/household_validations.rb
  3. 25
      app/models/validations/shared_validations.rb
  4. 5
      config/locales/en.yml
  5. 35
      spec/models/validations/sales/household_validations_spec.rb

23
app/models/validations/household_validations.rb

@ -45,7 +45,7 @@ module Validations::HouseholdValidations
(2..8).each do |n| (2..8).each do |n|
validate_person_age_matches_economic_status(record, n) validate_person_age_matches_economic_status(record, n)
validate_person_age_matches_relationship(record, n) validate_person_age_matches_relationship(record, n)
shared_validate_person_age_and_relationship_matches_economic_status(record, n) validate_person_age_and_relationship_matches_economic_status(record, n)
end end
shared_validate_partner_count(record, 8) shared_validate_partner_count(record, 8)
end end
@ -170,10 +170,31 @@ private
end 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
if age >= 16 && age <= 19 && tenant_is_child?(relationship) && (!tenant_is_fulltime_student?(economic_status) && !tenant_economic_status_refused?(economic_status))
record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19", person_num:)
record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19", person_num:)
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19", person_num:)
end
end
def tenant_is_economic_child?(economic_status) def tenant_is_economic_child?(economic_status)
economic_status == 9 economic_status == 9
end end
def tenant_is_fulltime_student?(economic_status)
economic_status == 7
end
def tenant_economic_status_refused?(economic_status)
economic_status == 10
end
def tenant_is_child?(relationship) def tenant_is_child?(relationship)
relationship == "C" relationship == "C"
end end

21
app/models/validations/sales/household_validations.rb

@ -12,7 +12,7 @@ module Validations::Sales::HouseholdValidations
def validate_household_number_of_other_members(record) def validate_household_number_of_other_members(record)
(2..6).each do |n| (2..6).each do |n|
validate_person_age_matches_relationship(record, n) validate_person_age_matches_relationship(record, n)
shared_validate_person_age_and_relationship_matches_economic_status(record, n) validate_person_age_and_relationship_matches_economic_status(record, n)
end end
shared_validate_partner_count(record, 6) shared_validate_partner_count(record, 6)
end end
@ -31,10 +31,29 @@ private
end 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
if age >= 16 && age <= 19 && !person_is_child?(relationship) && person_is_fulltime_student?(economic_status)
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19_sales", person_num:)
end
end
def person_is_partner?(relationship) def person_is_partner?(relationship)
relationship == "P" relationship == "P"
end end
def person_is_fulltime_student?(economic_status)
economic_status == 7
end
def person_economic_status_refused?(economic_status)
economic_status == 10
end
def person_is_child?(relationship) def person_is_child?(relationship)
relationship == "C" relationship == "C"
end end

25
app/models/validations/shared_validations.rb

@ -82,19 +82,6 @@ module Validations::SharedValidations
end end
end end
def shared_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
if age >= 16 && age <= 19 && person_is_child?(relationship) && (!person_is_fulltime_student?(economic_status) && !person_economic_status_refused?(economic_status))
record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19", person_num:)
record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19", person_num:)
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19", person_num:)
end
end
def shared_validate_partner_count(record, max_people) def shared_validate_partner_count(record, max_people)
partner_count = (2..max_people).count { |n| person_is_partner?(record["relat#{n}"]) } partner_count = (2..max_people).count { |n| person_is_partner?(record["relat#{n}"]) }
if partner_count > 1 if partner_count > 1
@ -108,16 +95,4 @@ private
def person_is_partner?(relationship) def person_is_partner?(relationship)
relationship == "P" relationship == "P"
end end
def person_is_child?(relationship)
relationship == "C"
end
def person_is_fulltime_student?(economic_status)
economic_status == 7
end
def person_economic_status_refused?(economic_status)
economic_status == 10
end
end end

5
config/locales/en.yml

@ -298,6 +298,8 @@ en:
child_under_16: "Answer cannot be under 16 as person’s %{person_num} working situation is not ‘child under 16’" child_under_16: "Answer cannot be under 16 as person’s %{person_num} working situation is not ‘child under 16’"
child_over_16: "Answer cannot be over 16 as person’s %{person_num} working situation is ‘child under 16‘" child_over_16: "Answer cannot be over 16 as person’s %{person_num} working situation is ‘child under 16‘"
student_16_19: "Answer cannot be between 16 and 19 as person %{person_num} is a child of the lead tenant but is not a full-time student" student_16_19: "Answer cannot be between 16 and 19 as person %{person_num} is a child of the lead tenant but is not a full-time student"
partner_under_16: "Cannot be under 16 if the relationship is partner"
child_over_20: "Cannot be 20 or over as the relationship is child"
lead: lead:
over_20: "The lead tenant must be under 20 as you told us their housing situation immediately before this letting was a children’s home or foster care" over_20: "The lead tenant must be under 20 as you told us their housing situation immediately before this letting was a children’s home or foster care"
ecstat: ecstat:
@ -310,9 +312,10 @@ en:
relat: relat:
partner_under_16: "Cannot be partner if the person's age is under 16" partner_under_16: "Cannot be partner if the person's age is under 16"
child_under_16: "Person’s %{person_num}’s relationship to tenant 1 must be ‘child’ as you told us they’re under 16" child_under_16: "Person’s %{person_num}’s relationship to tenant 1 must be ‘child’ as you told us they’re under 16"
child_over_20: "Relationship cannot be child if the person's age is 20 or over" child_over_20: "Relationship cannot be child if the person's age is 20 or over"
one_partner: "Number of partners cannot be greater than 1" one_partner: "Number of partners cannot be greater than 1"
student_16_19: "Answer cannot be ‘child’ as you told us the person %{person_num} is between 16 and 19 and is not a full-time student" student_16_19: "Answer cannot be ‘child’ as you told us the person %{person_num} is between 16 and 19 and is not a full-time student"
student_16_19_sales: "Person %{person_num} must be a child if they are aged 16-19 and a student"
housingneeds_a: housingneeds_a:
one_or_two_choices: "You can only select one option or ‘other disabled access needs’ plus ‘wheelchair-accessible housing’, ‘wheelchair access to essential rooms’ or ‘level access housing’" one_or_two_choices: "You can only select one option or ‘other disabled access needs’ plus ‘wheelchair-accessible housing’, ‘wheelchair access to essential rooms’ or ‘level access housing’"
prevten: prevten:

35
spec/models/validations/sales/household_validations_spec.rb

@ -61,5 +61,40 @@ RSpec.describe Validations::Sales::HouseholdValidations do
household_validator.validate_household_number_of_other_members(record) household_validator.validate_household_number_of_other_members(record)
expect(record.errors["base"]).to be_empty expect(record.errors["base"]).to be_empty
end end
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)
expect(record.errors["relat2"]).to be_empty
expect(record.errors["age2"]).to be_empty
end
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)
expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.partner_under_16", person_num: 2))
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)
expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.child_over_20", person_num: 2))
end
it "validates that a person aged 16-19 who is a student must be a child of the buyer" do
record.age2 = 18
record.ecstat2 = "7"
record.relat2 = "P"
household_validator.validate_household_number_of_other_members(record)
expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.student_16_19_sales", person_num: 2))
end
end
end end
end end

Loading…
Cancel
Save