Browse Source

Separate sales validations

pull/2256/head
Kat 2 years ago
parent
commit
80474651e7
  1. 112
      app/models/validations/sales/household_validations.rb
  2. 133
      spec/models/validations/sales/household_validations_spec.rb

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

@ -1,13 +1,7 @@
module Validations::Sales::HouseholdValidations module Validations::Sales::HouseholdValidations
include Validations::SharedValidations include Validations::SharedValidations
def validate_household_number_of_other_members(record) def validate_partner_count(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
shared_validate_partner_count(record, 6) shared_validate_partner_count(record, 6)
end end
@ -31,74 +25,82 @@ module Validations::Sales::HouseholdValidations
end end
end end
private def validate_person_age_matches_relationship(record)
(2..6).each do |person_num|
def validate_person_age_matches_relationship(record, person_num) age = record.public_send("age#{person_num}")
age = record.public_send("age#{person_num}") relationship = record.public_send("relat#{person_num}")
relationship = record.public_send("relat#{person_num}") next unless age && relationship
return unless age && relationship
if age < 16 && !relationship_is_child_other_or_refused?(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 "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:)
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_under_16_sales", person_num:) elsif age >= 20 && person_is_child?(relationship)
elsif age >= 20 && person_is_child?(relationship) record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_20")
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")
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.child_over_20") end
end end
end end
def validate_person_age_and_relationship_matches_economic_status(record, person_num) def validate_person_age_and_relationship_matches_economic_status(record)
age = record.public_send("age#{person_num}") (2..6).each do |person_num|
economic_status = record.public_send("ecstat#{person_num}") age = record.public_send("age#{person_num}")
relationship = record.public_send("relat#{person_num}") economic_status = record.public_send("ecstat#{person_num}")
return unless age && economic_status && relationship 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) age_between_16_19 = age.between?(16, 19)
economic_status_refused = person_economic_status_refused?(economic_status) student = person_is_fulltime_student?(economic_status)
child = person_is_child?(relationship) 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") if age_between_16_19 && !(student || economic_status_refused) && child
record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student") record.errors.add "age#{person_num}", I18n.t("validations.household.age.student_16_19.cannot_be_16_19.child_not_student")
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.student_16_19.must_be_student")
end 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 "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 "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") record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19")
end end
end end
def validate_person_age_matches_economic_status(record, person_num) def validate_person_age_matches_economic_status(record)
age = record.public_send("age#{person_num}") (2..6).each do |person_num|
economic_status = record.public_send("ecstat#{person_num}") age = record.public_send("age#{person_num}")
return unless age && economic_status 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:) if age < 16 && !economic_status_is_child_other_or_refused?(economic_status)
record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_ecstat", person_num:) record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_under_16", person_num:)
end record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_under_16_ecstat", person_num:)
if person_is_economic_child?(economic_status) && age > 16 end
record.errors.add "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_over_16", person_num:) if person_is_economic_child?(economic_status) && age > 16
record.errors.add "age#{person_num}", I18n.t("validations.household.age.child_over_16", person_num:) 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
end end
def validate_child_12_years_younger(record, person_num) def validate_child_12_years_younger(record)
buyer_1_age = record.public_send("age1") (2..6).each do |person_num|
person_age = record.public_send("age#{person_num}") buyer_1_age = record.public_send("age1")
relationship = record.public_send("relat#{person_num}") person_age = record.public_send("age#{person_num}")
return unless buyer_1_age && person_age && relationship 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 "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 "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") record.errors.add "relat#{person_num}", I18n.t("validations.household.age.child_12_years_younger")
end end
end end
private
def person_is_fulltime_student?(economic_status) def person_is_fulltime_student?(economic_status)
economic_status == 7 economic_status == 7
end end

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

@ -4,14 +4,13 @@ RSpec.describe Validations::Sales::HouseholdValidations do
subject(:household_validator) { validator_class.new } subject(:household_validator) { validator_class.new }
let(:validator_class) { Class.new { include Validations::Sales::HouseholdValidations } } let(:validator_class) { Class.new { include Validations::Sales::HouseholdValidations } }
let(:record) { build(:sales_log) }
describe "household member validations" do describe "#validate_partner_count" do
let(:record) { build(:sales_log) }
it "validates that only 1 partner exists" do it "validates that only 1 partner exists" do
record.relat2 = "P" record.relat2 = "P"
record.relat3 = "P" record.relat3 = "P"
household_validator.validate_household_number_of_other_members(record) household_validator.validate_partner_count(record)
expect(record.errors["relat2"]) expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.one_partner")) .to include(match I18n.t("validations.household.relat.one_partner"))
expect(record.errors["relat3"]) expect(record.errors["relat3"])
@ -22,15 +21,17 @@ RSpec.describe Validations::Sales::HouseholdValidations do
it "expects that a tenant can have a partner" do it "expects that a tenant can have a partner" do
record.relat3 = "P" 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 expect(record.errors["base"]).to be_empty
end end
end
describe "#validate_person_age_matches_relationship" do
context "when the household contains a person under 16" do context "when the household contains a person under 16" do
it "expects that person is a child of the tenant" do it "expects that person is a child of the tenant" do
record.age2 = 14 record.age2 = 14
record.relat2 = "C" 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["relat2"]).to be_empty
expect(record.errors["age2"]).to be_empty expect(record.errors["age2"]).to be_empty
end 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 it "validates that a person under 16 must not be a partner of the buyer" do
record.age2 = 14 record.age2 = 14
record.relat2 = "P" record.relat2 = "P"
household_validator.validate_household_number_of_other_members(record) household_validator.validate_person_age_matches_relationship(record)
expect(record.errors["relat2"]) expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.child_under_16_sales", person_num: 2)) .to include(match I18n.t("validations.household.relat.child_under_16_sales", person_num: 2))
expect(record.errors["age2"]) expect(record.errors["age2"])
.to include(match I18n.t("validations.household.age.child_under_16_relat_sales", person_num: 2)) .to include(match I18n.t("validations.household.age.child_under_16_relat_sales", person_num: 2))
end 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 end
it "validates that a person over 20 must not be a child of the buyer" do it "validates that a person over 20 must not be a child of the buyer" do
record.age2 = 21 record.age2 = 21
record.relat2 = "C" record.relat2 = "C"
household_validator.validate_household_number_of_other_members(record) household_validator.validate_person_age_matches_relationship(record)
expect(record.errors["relat2"]) expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.child_over_20")) .to include(match I18n.t("validations.household.relat.child_over_20"))
expect(record.errors["age2"]) expect(record.errors["age2"])
.to include(match I18n.t("validations.household.age.child_over_20")) .to include(match I18n.t("validations.household.age.child_over_20"))
end 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 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.age2 = 18
record.ecstat2 = "7" record.ecstat2 = "7"
record.relat2 = "P" 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["relat2"]).to be_empty
expect(record.errors["ecstat2"]).to be_empty expect(record.errors["ecstat2"]).to be_empty
expect(record.errors["age2"]).to be_empty expect(record.errors["age2"]).to be_empty
@ -121,7 +128,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do
record.age2 = 20 record.age2 = 20
record.ecstat2 = "7" record.ecstat2 = "7"
record.relat2 = "P" 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["relat2"]).to be_empty
expect(record.errors["ecstat2"]).to be_empty expect(record.errors["ecstat2"]).to be_empty
expect(record.errors["age2"]).to be_empty expect(record.errors["age2"]).to be_empty
@ -131,7 +138,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do
record.age2 = 17 record.age2 = 17
record.ecstat2 = "1" record.ecstat2 = "1"
record.relat2 = "C" 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"]) expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student")) .to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student"))
expect(record.errors["age2"]) expect(record.errors["age2"])
@ -144,7 +151,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do
record.age2 = 14 record.age2 = 14
record.ecstat2 = "7" record.ecstat2 = "7"
record.relat2 = "C" 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"]) expect(record.errors["relat2"])
.to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19")) .to include(match I18n.t("validations.household.relat.student_16_19.cannot_be_child.student_not_16_19"))
expect(record.errors["age2"]) expect(record.errors["age2"])

Loading…
Cancel
Save