Browse Source

Merge 3ad111a65f into 8c79d152b2

pull/3152/merge
Carolyn Barker 1 week ago committed by GitHub
parent
commit
c4618631b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 38
      app/models/derived_variables/lettings_log_variables.rb
  2. 5
      app/models/form.rb
  3. 5
      app/models/form/lettings/pages/person_lead_partner.rb
  4. 9
      app/models/form/lettings/questions/person_partner.rb
  5. 42
      app/models/form/lettings/subsections/household_characteristics.rb
  6. 14
      app/models/lettings_log.rb
  7. 72
      spec/features/form/page_routing_spec.rb
  8. 6
      spec/fixtures/files/lettings_log_csv_export_codes_26.csv
  9. 6
      spec/fixtures/files/lettings_log_csv_export_labels_26.csv
  10. 87
      spec/models/form/lettings/pages/person_lead_partner_spec.rb
  11. 140
      spec/models/form/lettings/questions/person_partner_spec.rb
  12. 7
      spec/models/form/lettings/subsections/household_characteristics_spec.rb
  13. 241
      spec/models/lettings_log_derived_fields_spec.rb

38
app/models/derived_variables/lettings_log_variables.rb

@ -75,6 +75,10 @@ module DerivedVariables::LettingsLogVariables
self.beds = nil
end
if form.start_year_2026_or_later?
infer_at_most_one_relationship!
end
clear_child_constraints_for_age_changes!
child_under_16_constraints!
@ -243,6 +247,9 @@ private
if form.start_year_2024_or_later? && (unittype_gn_changed? && unittype_gn_was == 2)
self.beds = nil
end
if form.start_year_2026_or_later?
reset_partner_fields!
end
end
def get_totelder
@ -295,6 +302,37 @@ private
end
end
def infer_at_most_one_relationship!
if partner_numbers.any?
infer_only_partner!(partner_numbers.first)
end
end
def infer_only_partner!(partner_number)
return unless hhmemb
(2..hhmemb).each do |i|
next if i == partner_number
if ["P", nil].include?(public_send("relat#{i}"))
self["relat#{i}"] = "X"
end
end
end
def reset_partner_fields!
person_count = hhmemb || 8
(2..person_count).each do |i|
next unless send("relat#{i}_changed?") && send("relat#{i}_was") == "P"
((i + 1)..person_count).each do |j|
if self["relat#{j}"] == "X"
self["relat#{j}"] = nil
end
end
end
end
def household_type
return unless totelder && totadult && totchild

5
app/models/form.rb

@ -323,7 +323,12 @@ class Form
if value.is_a?(Hash) && value.key?("operator")
operator = value["operator"]
operand = value["operand"]
if operator == "!=" # This branch is needed as `nil` does not behave as expected with the default logic (`nil&.send("!=", operand)` => `nil` i.e., `false`).
log[question] != operand
else
log[question]&.send(operator, operand)
end
else
parts = question.split(".")
log_value = send_chain(parts, log)

5
app/models/form/lettings/pages/person_lead_partner.rb

@ -18,8 +18,11 @@ class Form::Lettings::Pages::PersonLeadPartner < ::Form::Page
"operator" => ">=",
"operand" => 16,
},
**(2...@person_index).map { |i| ["relat#{i}", { "operator" => "!=", "operand" => "P" }] }.to_h,
},
{ "details_known_#{@person_index}" => 0, "age#{@person_index}" => nil },
{ "details_known_#{@person_index}" => 0,
"age#{@person_index}" => nil,
**(2...@person_index).map { |i| ["relat#{i}", { "operator" => "!=", "operand" => "P" }] }.to_h },
]
else
[{ "details_known_#{@person_index}" => 0 }]

9
app/models/form/lettings/questions/person_partner.rb

@ -7,6 +7,7 @@ class Form::Lettings::Questions::PersonPartner < ::Form::Question
@answer_options = answer_options
@person_index = person_index
@question_number = question_number
@disable_clearing_if_not_routed_or_dynamic_answer_options = form.start_year_2026_or_later?
end
def answer_options
@ -31,4 +32,12 @@ class Form::Lettings::Questions::PersonPartner < ::Form::Question
def derived?(log)
form.start_year_2026_or_later? && log.is_partner_inferred?(@person_index)
end
def hidden_in_check_answers?(log, _current_user = nil)
if form.start_year_2026_or_later?
log.is_an_earlier_person_partner(@person_index)
else
false
end
end
end

42
app/models/form/lettings/subsections/household_characteristics.rb

@ -36,8 +36,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 2),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 2) if form.start_year_2026_or_later?),
relationship_question(person_index: 2),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_2_partner_under_16_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_2_multiple_partners_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_2_partner_under_16_value_check", nil, self, person_index: 2) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_2_multiple_partners_value_check", nil, self, person_index: 2) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 2) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 2),
@ -45,7 +45,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 2),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_2_under_retirement_value_check", nil, self, person_index: 2),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_2_over_retirement_value_check", nil, self, person_index: 2),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_2_partner_under_16_value_check", nil, self, person_index: 2) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_2_partner_under_16_value_check", nil, self, person_index: 2) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 2) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 2),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 2),
@ -59,8 +59,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 3),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 3) if form.start_year_2026_or_later?),
relationship_question(person_index: 3),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_3_partner_under_16_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_3_multiple_partners_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_3_partner_under_16_value_check", nil, self, person_index: 3) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_3_multiple_partners_value_check", nil, self, person_index: 3) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 3) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 3),
@ -68,7 +68,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 3),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_3_under_retirement_value_check", nil, self, person_index: 3),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_3_over_retirement_value_check", nil, self, person_index: 3),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_3_partner_under_16_value_check", nil, self, person_index: 3) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_3_partner_under_16_value_check", nil, self, person_index: 3) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 3) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 3),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 3),
@ -82,8 +82,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 4),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 4) if form.start_year_2026_or_later?),
relationship_question(person_index: 4),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_4_partner_under_16_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_4_multiple_partners_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_4_partner_under_16_value_check", nil, self, person_index: 4) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_4_multiple_partners_value_check", nil, self, person_index: 4) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 4) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 4),
@ -91,7 +91,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 4),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_4_under_retirement_value_check", nil, self, person_index: 4),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_4_over_retirement_value_check", nil, self, person_index: 4),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_4_partner_under_16_value_check", nil, self, person_index: 4) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_4_partner_under_16_value_check", nil, self, person_index: 4) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 4) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 4),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 4),
@ -105,8 +105,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 5),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 5) if form.start_year_2026_or_later?),
relationship_question(person_index: 5),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_5_partner_under_16_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_5_multiple_partners_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_5_partner_under_16_value_check", nil, self, person_index: 5) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_5_multiple_partners_value_check", nil, self, person_index: 5) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 5) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 5),
@ -114,7 +114,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 5),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_5_under_retirement_value_check", nil, self, person_index: 5),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_5_over_retirement_value_check", nil, self, person_index: 5),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_5_partner_under_16_value_check", nil, self, person_index: 5) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_5_partner_under_16_value_check", nil, self, person_index: 5) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 5) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 5),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 5),
@ -128,8 +128,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 6),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 6) if form.start_year_2026_or_later?),
relationship_question(person_index: 6),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_6_partner_under_16_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_6_multiple_partners_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_6_partner_under_16_value_check", nil, self, person_index: 6) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_6_multiple_partners_value_check", nil, self, person_index: 6) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 6) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 6),
@ -137,7 +137,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 6),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_6_under_retirement_value_check", nil, self, person_index: 6),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_6_over_retirement_value_check", nil, self, person_index: 6),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_6_partner_under_16_value_check", nil, self, person_index: 6) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_6_partner_under_16_value_check", nil, self, person_index: 6) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 6) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 6),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 6),
@ -151,8 +151,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 7),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 7) if form.start_year_2026_or_later?),
relationship_question(person_index: 7),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_7_partner_under_16_value_check", nil, self, person_index: 7) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_7_multiple_partners_value_check", nil, self, person_index: 7) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_7_partner_under_16_value_check", nil, self, person_index: 7) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_7_multiple_partners_value_check", nil, self, person_index: 7) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 7) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 7),
@ -160,7 +160,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 7),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_7_under_retirement_value_check", nil, self, person_index: 7),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_7_over_retirement_value_check", nil, self, person_index: 7),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_7_partner_under_16_value_check", nil, self, person_index: 7) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_7_partner_under_16_value_check", nil, self, person_index: 7) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 7) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 7),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 7),
@ -174,8 +174,8 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index: 8),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 8) if form.start_year_2026_or_later?),
relationship_question(person_index: 8),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_8_partner_under_16_value_check", nil, self, person_index: 8) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_8_multiple_partners_value_check", nil, self, person_index: 8) if form.start_year_2024_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_8_partner_under_16_value_check", nil, self, person_index: 8) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_8_multiple_partners_value_check", nil, self, person_index: 8) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index: 8) unless form.start_year_2026_or_later?),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self,
person_index: 8),
@ -183,7 +183,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
person_index: 8),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_8_under_retirement_value_check", nil, self, person_index: 8),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_8_over_retirement_value_check", nil, self, person_index: 8),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_8_partner_under_16_value_check", nil, self, person_index: 8) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_8_partner_under_16_value_check", nil, self, person_index: 8) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index: 8) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index: 8),
Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonValueCheck.new(nil, nil, self, person_index: 8),

14
app/models/lettings_log.rb

@ -403,9 +403,19 @@ class LettingsLog < Log
end
def is_partner_inferred?(person_index)
is_person_under_16(person_index) || is_an_earlier_person_partner(person_index)
end
def is_person_under_16(person_index)
public_send("age#{person_index}") && public_send("age#{person_index}") < 16
end
def is_an_earlier_person_partner(person_index)
(2...person_index).any? do |i|
public_send("relat#{i}") == "P"
end
end
def age_changed_from_below_16(person_index)
public_send("age#{person_index}_was") && public_send("age#{person_index}_was") < 16
end
@ -876,6 +886,10 @@ private
end
end
def partner_numbers
(2..8).select { |i| public_send("relat#{i}") == "P" }
end
def age_refused?
[age1_known, age2_known, age3_known, age4_known, age5_known, age6_known, age7_known, age8_known].any?(1)
end

72
spec/features/form/page_routing_spec.rb

@ -270,6 +270,78 @@ RSpec.describe "Form Page Routing" do
expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to eq(true)
end
describe "using the 'not equal to' operator" do
it "returns true if both values are non-nil and different" do
depends_on = [
{
"relat2" => {
"operator" => "!=",
"operand" => "P",
},
},
]
lettings_log.relat2 = "X"
expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to eq(true)
end
it "returns false if both values are non-nil and the same" do
depends_on = [
{
"relat2" => {
"operator" => "!=",
"operand" => "P",
},
},
]
lettings_log.relat2 = "P"
expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to eq(false)
end
it "returns true if the being tested is nil and the operand is non-nil" do
depends_on = [
{
"relat2" => {
"operator" => "!=",
"operand" => "P",
},
},
]
lettings_log.relat2 = nil
expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to eq(true)
end
it "returns true if the being tested is non-nil and the operand is nil" do
depends_on = [
{
"relat2" => {
"operator" => "!=",
"operand" => nil,
},
},
]
lettings_log.relat2 = "P"
expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to eq(true)
end
it "returns false if both values are nil" do
depends_on = [
{
"relat2" => {
"operator" => "!=",
"operand" => nil,
},
},
]
lettings_log.relat2 = nil
expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to eq(false)
end
end
end
end

6
spec/fixtures/files/lettings_log_csv_export_codes_26.csv vendored

File diff suppressed because one or more lines are too long

6
spec/fixtures/files/lettings_log_csv_export_labels_26.csv vendored

File diff suppressed because one or more lines are too long

87
spec/models/form/lettings/pages/person_lead_partner_spec.rb

@ -17,10 +17,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
end
context "with person 2" do
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat2])
end
it "has the correct id" do
expect(page.id).to eq("person_2_lead_partner")
end
@ -30,6 +26,10 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
allow(form).to receive(:start_year_2026_or_later?).and_return(false)
end
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat2])
end
it "has correct depends_on" do
expect(page.depends_on).to eq(
[{ "details_known_2" => 0 }],
@ -42,6 +42,10 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
allow(form).to receive(:start_year_2026_or_later?).and_return(true)
end
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat2])
end
it "has correct depends_on" do
expect(page.depends_on).to eq(
[
@ -62,10 +66,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
context "with person 3" do
let(:person_index) { 3 }
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat3])
end
it "has the correct id" do
expect(page.id).to eq("person_3_lead_partner")
end
@ -75,6 +75,10 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
allow(form).to receive(:start_year_2026_or_later?).and_return(false)
end
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat3])
end
it "has correct depends_on" do
expect(page.depends_on).to eq(
[{ "details_known_3" => 0 }],
@ -87,6 +91,10 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
allow(form).to receive(:start_year_2026_or_later?).and_return(true)
end
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat3])
end
it "has correct depends_on" do
expect(page.depends_on).to eq(
[
@ -96,8 +104,69 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
"operator" => ">=",
"operand" => 16,
},
"relat2" => { "operator" => "!=", "operand" => "P" },
},
{
"details_known_3" => 0,
"age3" => nil,
"relat2" => { "operator" => "!=", "operand" => "P" },
},
],
)
end
end
end
context "with person 4" do
let(:person_index) { 4 }
it "has the correct id" do
expect(page.id).to eq("person_4_lead_partner")
end
context "with start year < 2026", metadata: { year: 25 } do
before do
allow(form).to receive(:start_year_2026_or_later?).and_return(false)
end
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat4])
end
it "has correct depends_on" do
expect(page.depends_on).to eq(
[{ "details_known_4" => 0 }],
)
end
end
context "with start year >= 2026", metadata: { year: 26 } do
before do
allow(form).to receive(:start_year_2026_or_later?).and_return(true)
end
it "has correct questions" do
expect(page.questions.map(&:id)).to eq(%w[relat4])
end
it "has correct depends_on" do
expect(page.depends_on).to eq(
[
{
"details_known_4" => 0,
"age4" => {
"operator" => ">=",
"operand" => 16,
},
"relat2" => { "operator" => "!=", "operand" => "P" },
"relat3" => { "operator" => "!=", "operand" => "P" },
},
{
"details_known_4" => 0,
"age4" => nil,
"relat2" => { "operator" => "!=", "operand" => "P" },
"relat3" => { "operator" => "!=", "operand" => "P" },
},
{ "details_known_3" => 0, "age3" => nil },
],
)
end

140
spec/models/form/lettings/questions/person_partner_spec.rb

@ -45,6 +45,22 @@ RSpec.describe Form::Lettings::Questions::PersonPartner, type: :model do
expect(question.hidden_in_check_answers).to be nil
end
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct disable_clearing_if_not_routed_or_dynamic_answer_options value" do
expect(question.disable_clearing_if_not_routed_or_dynamic_answer_options).to eq(false)
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
it "has the correct disable_clearing_if_not_routed_or_dynamic_answer_options value" do
expect(question.disable_clearing_if_not_routed_or_dynamic_answer_options).to eq(true)
end
end
context "with person 2" do
it "has the correct id" do
expect(question.id).to eq("relat2")
@ -105,5 +121,129 @@ RSpec.describe Form::Lettings::Questions::PersonPartner, type: :model do
it "has the correct check_answers_card_number" do
expect(question.check_answers_card_number).to eq(3)
end
context "when the log has a preceding value of `relat` as 'P'" do
let(:log) { build(:lettings_log, relat2: "P") }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(false)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(true)
end
it "is marked as derived" do
expect(question.derived?(log)).to be true
end
end
end
context "when the log does not have a preceding value of `relat` as 'P'" do
let(:log) { build(:lettings_log, relat2: "X") }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(false)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(false)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
end
end
context "with person 4" do
let(:person_index) { 4 }
it "has the correct id" do
expect(question.id).to eq("relat4")
end
it "has the correct check_answers_card_number" do
expect(question.check_answers_card_number).to eq(4)
end
context "when the log has a preceding value of `relat` as 'P'" do
let(:log) { build(:lettings_log, relat2: "P", relat3: "X") }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(false)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(true)
end
it "is marked as derived" do
expect(question.derived?(log)).to be true
end
end
end
context "when the log does not have a preceding value of `relat` as 'P'" do
let(:log) { build(:lettings_log, relat2: "R", relat3: "X") }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(false)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
it "has the correct hidden_in_check_answers?" do
expect(question.hidden_in_check_answers?(log)).to eq(false)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
end
end
end

7
spec/models/form/lettings/subsections/household_characteristics_spec.rb

@ -365,7 +365,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_2_known
person_2_age
person_2_lead_partner
relationship_2_multiple_partners_value_check
no_females_pregnant_household_person_2_age_value_check
females_in_soft_age_range_in_pregnant_household_person_2_age_value_check
age_2_under_retirement_value_check
@ -382,7 +381,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_3_known
person_3_age
person_3_lead_partner
relationship_3_multiple_partners_value_check
no_females_pregnant_household_person_3_age_value_check
females_in_soft_age_range_in_pregnant_household_person_3_age_value_check
age_3_under_retirement_value_check
@ -399,7 +397,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_4_known
person_4_age
person_4_lead_partner
relationship_4_multiple_partners_value_check
no_females_pregnant_household_person_4_age_value_check
females_in_soft_age_range_in_pregnant_household_person_4_age_value_check
age_4_under_retirement_value_check
@ -416,7 +413,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_5_known
person_5_age
person_5_lead_partner
relationship_5_multiple_partners_value_check
no_females_pregnant_household_person_5_age_value_check
females_in_soft_age_range_in_pregnant_household_person_5_age_value_check
age_5_under_retirement_value_check
@ -433,7 +429,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_6_known
person_6_age
person_6_lead_partner
relationship_6_multiple_partners_value_check
no_females_pregnant_household_person_6_age_value_check
females_in_soft_age_range_in_pregnant_household_person_6_age_value_check
age_6_under_retirement_value_check
@ -450,7 +445,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_7_known
person_7_age
person_7_lead_partner
relationship_7_multiple_partners_value_check
no_females_pregnant_household_person_7_age_value_check
females_in_soft_age_range_in_pregnant_household_person_7_age_value_check
age_7_under_retirement_value_check
@ -467,7 +461,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_8_known
person_8_age
person_8_lead_partner
relationship_8_multiple_partners_value_check
no_females_pregnant_household_person_8_age_value_check
females_in_soft_age_range_in_pregnant_household_person_8_age_value_check
age_8_under_retirement_value_check

241
spec/models/lettings_log_derived_fields_spec.rb

@ -1588,4 +1588,245 @@ RSpec.describe LettingsLog, type: :model do
end
end
end
describe "At most one relationships inferences" do
context "when 2025", metadata: { year: 25 } do
before do
Timecop.freeze(Time.zone.local(2025, 5, 10))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
context "when there are no existing relationships" do
# `relat2` is "P" by default when creating a lettings log from the factory, so we explicitly set it to `nil`.
let(:log) { create(:lettings_log, :completed, hhmemb: 6, relat2: nil, relat3: "X", relat4: "X", relat5: "R") }
it "does not infer no to any relationship answers when a new relationship is added" do
log.relat4 = "P"
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and not_change(log, :relat3)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
end
context "when there is an existing relationship" do
let(:log) { create(:lettings_log, :completed, hhmemb: 6, relat2: "X", relat3: "P", relat4: "R", relat5: "X") }
it "does not infer no to any relationship answers when a new relationship is added" do
log.relat2 = "P"
expect { log.set_derived_fields! }
.to not_change(log, :relat3)
.and not_change(log, :relat4)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
it "does not reset any answers when the relationship is removed" do
log.relat3 = "X"
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and not_change(log, :relat4)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
end
context "when more than one relationship is set" do
let(:log) { create(:lettings_log, :completed, relat2: "X", relat3: "X", relat4: "R", relat5: "X") }
before do
log.relat2 = "P"
log.relat3 = "P"
end
it "does not infer no to any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat4)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
end
end
context "when 2026", metadata: { year: 26 } do
before do
Timecop.freeze(Time.zone.local(2026, 5, 10))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
context "when there are no existing relationships" do
# `relat2` is "P" by default when creating a lettings log from the factory, so we explicitly set it to `nil`.
let(:log) { create(:lettings_log, :completed, hhmemb: 6, relat2: nil, relat3: "X", relat4: "X", relat5: "R") }
context "and a new relationship is added" do
before do
log.relat4 = "P"
end
it "infers no to unanswered questions" do
expect { log.set_derived_fields! }
.to change(log, :relat2).to("X")
.and change(log, :relat6).to("X")
end
it "does not change relationship answers for people not in the household" do
expect { log.set_derived_fields! }
.to not_change(log, :relat7)
.and not_change(log, :relat8)
end
it "does not change relationship answers of no or prefer not to say" do
expect { log.set_derived_fields! }
.to not_change(log, :relat3)
.and not_change(log, :relat5)
end
end
it "does not change other relationship values if no is changed to prefer not to say" do
log.relat4 = "R"
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and not_change(log, :relat3)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
it "does not change other relationship values if prefer not to say is changed to no" do
log.relat5 = "X"
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and not_change(log, :relat3)
.and not_change(log, :relat4)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
end
context "when there is an existing relationship" do
let(:log) { create(:lettings_log, :completed, hhmemb: 6, relat2: "X", relat3: "P", relat4: "R", relat5: "X") }
context "and a new relationship is added to an earlier person than the existing one" do
before do
log.relat6 = nil # This is necessary because `log.set_derived_fields!` runs when the log is created from the factory, which sets `relat6` to "X".
log.relat2 = "P"
end
it "infers no to the existing relationship" do
expect { log.set_derived_fields! }.to change(log, :relat3).to "X"
end
it "infers no to unanswered questions" do
expect { log.set_derived_fields! }.to change(log, :relat6).to "X"
end
it "does not change relationship answers for people not in the household" do
expect { log.set_derived_fields! }
.to not_change(log, :relat7)
.and not_change(log, :relat8)
end
it "does not change relationship answers of no or prefer not to say" do
expect { log.set_derived_fields! }
.to not_change(log, :relat5)
.and not_change(log, :relat4)
end
end
it "does not change other relationship values if no is changed to prefer not to say" do
log.relat2 = "R"
expect { log.set_derived_fields! }
.to not_change(log, :relat3)
.and not_change(log, :relat4)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
it "does not change other relationship values if prefer not to say is changed to no" do
log.relat4 = "X"
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and not_change(log, :relat3)
.and not_change(log, :relat5)
.and not_change(log, :relat6)
.and not_change(log, :relat7)
.and not_change(log, :relat8)
end
context "and the relationship is removed" do
before do
log.relat3 = "X"
end
it "does not reset answers of no that come before the removed relationship to nil" do
expect { log.set_derived_fields! }.to not_change(log, :relat2)
end
it "resets answers of no that come after the removed relationship to nil, regardless of whether they were inferred or not" do
expect { log.set_derived_fields! }
.to change(log, :relat5).to(nil) # `relat5` was set to "X" explicitly.
.and change(log, :relat6).to(nil) # `relat6` was inferred as "X" when we created the log from the factory.
end
it "does not reset answers of prefer not to say" do
expect { log.set_derived_fields! }.to not_change(log, :relat4)
end
end
end
context "when more than one relationship is set" do
let(:log) { create(:lettings_log, :completed, hhmemb: 6, relat2: "X", relat3: "X", relat4: "R", relat5: "X") }
before do
log.relat2 = "P"
log.relat3 = "P"
end
it "keeps the lower numbered relationship and infers the higher numbered one to false" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and change(log, :relat3).to("X")
end
it "infers no to unanswered questions" do
expect { log.set_derived_fields! }.to change(log, :relat6).to "X"
end
it "does not change relationship answers for people not in the household" do
expect { log.set_derived_fields! }
.to not_change(log, :relat7)
.and not_change(log, :relat8)
end
it "does not change relationship answers of no or prefer not to say" do
expect { log.set_derived_fields! }
.to not_change(log, :relat5)
.and not_change(log, :relat4)
end
end
end
end
end

Loading…
Cancel
Save