Browse Source

Separate sales validations

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

40
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,12 +25,11 @@ 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}")
return unless age && relationship next 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:)
@ -46,12 +39,14 @@ private
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)
(2..6).each do |person_num|
age = record.public_send("age#{person_num}") age = record.public_send("age#{person_num}")
economic_status = record.public_send("ecstat#{person_num}") economic_status = record.public_send("ecstat#{person_num}")
relationship = record.public_send("relat#{person_num}") relationship = record.public_send("relat#{person_num}")
return unless age && economic_status && relationship next unless age && economic_status && relationship
age_between_16_19 = age.between?(16, 19) age_between_16_19 = age.between?(16, 19)
student = person_is_fulltime_student?(economic_status) student = person_is_fulltime_student?(economic_status)
@ -64,17 +59,19 @@ private
record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student") record.errors.add "relat#{person_num}", I18n.t("validations.household.relat.student_16_19.cannot_be_child.16_19_not_student")
end end
if !age_between_16_19 && student && child next unless !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)
(2..6).each do |person_num|
age = record.public_send("age#{person_num}") age = record.public_send("age#{person_num}")
economic_status = record.public_send("ecstat#{person_num}") economic_status = record.public_send("ecstat#{person_num}")
return unless age && economic_status next unless age && economic_status
if age < 16 && !economic_status_is_child_other_or_refused?(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 "ecstat#{person_num}", I18n.t("validations.household.ecstat.child_under_16", person_num:)
@ -85,20 +82,25 @@ private
record.errors.add "age#{person_num}", I18n.t("validations.household.age.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)
(2..6).each do |person_num|
buyer_1_age = record.public_send("age1") buyer_1_age = record.public_send("age1")
person_age = record.public_send("age#{person_num}") person_age = record.public_send("age#{person_num}")
relationship = record.public_send("relat#{person_num}") relationship = record.public_send("relat#{person_num}")
return unless buyer_1_age && person_age && relationship 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

57
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 } }
describe "household member validations" do
let(:record) { build(:sales_log) } let(:record) { build(:sales_log) }
describe "#validate_partner_count" do
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,17 +39,30 @@ 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
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_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 it "validates that person's economic status must be Child" do
record.age2 = 14 record.age2 = 14
record.ecstat2 = 1 record.ecstat2 = 1
household_validator.validate_household_number_of_other_members(record) household_validator.validate_person_age_matches_economic_status(record)
expect(record.errors["ecstat2"]) expect(record.errors["ecstat2"])
.to include(match I18n.t("validations.household.ecstat.child_under_16", person_num: 2)) .to include(match I18n.t("validations.household.ecstat.child_under_16", person_num: 2))
expect(record.errors["age2"]) expect(record.errors["age2"])
@ -58,7 +72,7 @@ RSpec.describe Validations::Sales::HouseholdValidations do
it "expects that person's economic status is Child" do it "expects that person's economic status is Child" do
record.age2 = 14 record.age2 = 14
record.ecstat2 = 9 record.ecstat2 = 9
household_validator.validate_household_number_of_other_members(record) household_validator.validate_person_age_matches_economic_status(record)
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
end end
@ -66,18 +80,20 @@ RSpec.describe Validations::Sales::HouseholdValidations do
it "validates that a person with economic status 'child' must be under 16" do it "validates that a person with economic status 'child' must be under 16" do
record.age2 = 21 record.age2 = 21
record.ecstat2 = 9 record.ecstat2 = 9
household_validator.validate_household_number_of_other_members(record) household_validator.validate_person_age_matches_economic_status(record)
expect(record.errors["ecstat2"]) expect(record.errors["ecstat2"])
.to include(match I18n.t("validations.household.ecstat.child_over_16", person_num: 2)) .to include(match I18n.t("validations.household.ecstat.child_over_16", person_num: 2))
expect(record.errors["age2"]) expect(record.errors["age2"])
.to include(match I18n.t("validations.household.age.child_over_16", person_num: 2)) .to include(match I18n.t("validations.household.age.child_over_16", person_num: 2))
end end
end
describe "#validate_child_12_years_younger" do
it "validates the child is at least 12 years younger than buyer 1" do it "validates the child is at least 12 years younger than buyer 1" do
record.age1 = 30 record.age1 = 30
record.age2 = record.age1 - 11 record.age2 = record.age1 - 11
record.relat2 = "C" record.relat2 = "C"
household_validator.validate_household_number_of_other_members(record) household_validator.validate_child_12_years_younger(record)
expect(record.errors["age1"]) expect(record.errors["age1"])
.to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2)) .to include(match I18n.t("validations.household.age.child_12_years_younger", person_num: 2))
expect(record.errors["age2"]) expect(record.errors["age2"])
@ -90,28 +106,19 @@ RSpec.describe Validations::Sales::HouseholdValidations do
record.age1 = 30 record.age1 = 30
record.age2 = record.age1 - 12 record.age2 = record.age1 - 12
record.relat2 = "C" record.relat2 = "C"
household_validator.validate_household_number_of_other_members(record) household_validator.validate_child_12_years_younger(record)
expect(record.errors["age1"]).to be_empty expect(record.errors["age1"]).to be_empty
expect(record.errors["age2"]).to be_empty expect(record.errors["age2"]).to be_empty
expect(record.errors["relate2"]).to be_empty expect(record.errors["relate2"]).to be_empty
end end
end end
it "validates that a person over 20 must not be a child of the buyer" do describe "#validate_person_age_and_relationship_matches_economic_status" 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"))
expect(record.errors["age2"])
.to include(match I18n.t("validations.household.age.child_over_20"))
end
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