Browse Source

CLDC-4146 infer no other partners (#3152)

* CLDC-4146 infer no to multiple partners

* CLDC-4146 try removing factory change

* Simplify inference logic

* Fix not equals logic

* Improve person_partner tests

* Add tests for new not equals logic

* Improve person_lead_partner tests

* Fix inference logic

* Revert to simpler inference logic

* Correct hidden_in_check_answers logic

* Fixed derived?

* Improve lettings log variables tests

* Pull out resetting partner fields into method

* Convert 'else next' to guard clause

* Refactor infer_only_partner!

* Match updated requirements

* Fix tests

* Small tweaks

* Remove redundant logic from infer_at_most_one_relationship!

* Remove redundant `disable_clearing_if_not_routed_or_dynamic_answer_options`

* Add tests for question number

* Remove puts

* Refactor derived fields tests

* Fix lint

* After build, set nil values for `details_known` to 0

* Add details_known to tests

* Add question mark to method name

* Rewrite `is_another_person_partner?` to be `is_any_person_partner?`

* Move skip in form flow method from page to question

* Fix tests

* Fix tests after merge

---------

Co-authored-by: Carolyn <carolyn.barker@softwire.com>
Co-authored-by: oscar-richardson-softwire <oscar.richardson@softwire.com>
main v0.6.5
Carolyn Barker 3 days ago committed by GitHub
parent
commit
de4e0945a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 23
      app/models/derived_variables/lettings_log_variables.rb
  2. 10
      app/models/form.rb
  3. 5
      app/models/form/lettings/pages/person_lead_partner.rb
  4. 6
      app/models/form/lettings/questions/person_partner.rb
  5. 6
      app/models/form/lettings/subsections/household_characteristics.rb
  6. 4
      app/models/form/question.rb
  7. 10
      app/models/lettings_log.rb
  8. 72
      spec/features/form/page_routing_spec.rb
  9. 6
      spec/fixtures/files/lettings_log_csv_export_codes_26.csv
  10. 6
      spec/fixtures/files/lettings_log_csv_export_labels_26.csv
  11. 6
      spec/models/form/lettings/pages/person_lead_partner_spec.rb
  12. 86
      spec/models/form/lettings/questions/person_partner_spec.rb
  13. 7
      spec/models/form/lettings/subsections/household_characteristics_spec.rb
  14. 37
      spec/models/form_spec.rb
  15. 319
      spec/models/lettings_log_derived_fields_spec.rb
  16. 18
      spec/models/lettings_log_spec.rb

23
app/models/derived_variables/lettings_log_variables.rb

@ -75,6 +75,10 @@ module DerivedVariables::LettingsLogVariables
self.beds = nil self.beds = nil
end end
if form.start_year_2026_or_later?
infer_at_most_one_relationship!
end
clear_child_constraints_for_age_changes! clear_child_constraints_for_age_changes!
child_under_16_constraints! child_under_16_constraints!
@ -325,6 +329,25 @@ private
end end
end end
def infer_at_most_one_relationship!
new_partner_numbers = partner_numbers.select { |i| public_send("relat#{i}_changed?") }
return unless new_partner_numbers.any?
infer_only_partner!(new_partner_numbers.first)
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 household_type def household_type
return unless totelder && totadult && totchild return unless totelder && totadult && totchild

10
app/models/form.rb

@ -108,7 +108,8 @@ class Form
return :check_answers if next_page.nil? return :check_answers if next_page.nil?
return next_page.id if next_page.routed_to?(log, current_user) && return next_page.id if next_page.routed_to?(log, current_user) &&
(!ignore_answered || next_page.has_unanswered_questions?(log)) (!ignore_answered || next_page.has_unanswered_questions?(log)) &&
next_page.questions.any? { |question| !question.skip_question_in_form_flow?(log) }
next_page_id(next_page, log, current_user, ignore_answered:) next_page_id(next_page, log, current_user, ignore_answered:)
end end
@ -323,7 +324,12 @@ class Form
if value.is_a?(Hash) && value.key?("operator") if value.is_a?(Hash) && value.key?("operator")
operator = value["operator"] operator = value["operator"]
operand = value["operand"] operand = value["operand"]
log[question]&.send(operator, operand)
if operator == "!=" # This branch is needed as `nil` does not behave as expected with the default logic (`nil&.send("!=", nil)` => `nil` i.e., `false`).
log[question] != operand
else
log[question]&.send(operator, operand)
end
else else
parts = question.split(".") parts = question.split(".")
log_value = send_chain(parts, log) log_value = send_chain(parts, log)

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

@ -19,7 +19,10 @@ class Form::Lettings::Pages::PersonLeadPartner < ::Form::Page
"operand" => 16, "operand" => 16,
}, },
}, },
{ "details_known_#{@person_index}" => 0, "age#{@person_index}" => nil }, {
"details_known_#{@person_index}" => 0,
"age#{@person_index}" => nil,
},
] ]
else else
[{ "details_known_#{@person_index}" => 0 }] [{ "details_known_#{@person_index}" => 0 }]

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

@ -35,6 +35,10 @@ class Form::Lettings::Questions::PersonPartner < ::Form::Question
end end
def derived?(log) def derived?(log)
form.start_year_2026_or_later? && log.is_partner_inferred?(@person_index) form.start_year_2026_or_later? && log.is_person_under_16?(@person_index)
end
def skip_question_in_form_flow?(log)
form.start_year_2026_or_later? && log.is_any_person_partner?
end end
end end

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

@ -52,15 +52,15 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection
Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index:), Form::Lettings::Pages::PersonKnown.new(nil, nil, self, person_index:),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?),
relationship_question(person_index:), relationship_question(person_index:),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_#{person_index}_partner_under_16_value_check", nil, self, person_index:) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?), (Form::Lettings::Pages::PartnerUnder16ValueCheck.new("relationship_#{person_index}_partner_under_16_value_check", nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_#{person_index}_multiple_partners_value_check", nil, self, person_index:) if form.start_year_2024_or_later?), (Form::Lettings::Pages::MultiplePartnersValueCheck.new("relationship_#{person_index}_multiple_partners_value_check", nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonAge.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?), (Form::Lettings::Pages::NoFemalesPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?), (Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdPersonAgeValueCheck.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_person_age_#{person_index}_check", nil, self, person_index:) if form.start_year_2026_or_later?), (Form::Lettings::Pages::NoHouseholdMemberLikelyToBePregnantCheck.new("no_household_member_likely_to_be_pregnant_person_age_#{person_index}_check", nil, self, person_index:) if form.start_year_2026_or_later?),
Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_#{person_index}_under_retirement_value_check", nil, self, person_index:), Form::Lettings::Pages::PersonUnderRetirementValueCheck.new("age_#{person_index}_under_retirement_value_check", nil, self, person_index:),
Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_#{person_index}_over_retirement_value_check", nil, self, person_index:), Form::Lettings::Pages::PersonOverRetirementValueCheck.new("age_#{person_index}_over_retirement_value_check", nil, self, person_index:),
(Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_#{person_index}_partner_under_16_value_check", nil, self, person_index:) if form.start_year_2024_or_later? && !form.start_year_2026_or_later?), (Form::Lettings::Pages::PartnerUnder16ValueCheck.new("age_#{person_index}_partner_under_16_value_check", nil, self, person_index:) unless form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonSexRegisteredAtBirth.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonGenderSameAsSex.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonGenderSameAsSex.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?),
(Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?), (Form::Lettings::Pages::PersonGenderIdentity.new(nil, nil, self, person_index:) unless form.start_year_2026_or_later?),

4
app/models/form/question.rb

@ -304,6 +304,10 @@ class Form::Question
nil nil
end end
def skip_question_in_form_flow?(_log)
false
end
private private
def selected_answer_option_is_derived?(log) def selected_answer_option_is_derived?(log)

10
app/models/lettings_log.rb

@ -445,10 +445,14 @@ class LettingsLog < Log
unittype_gn_changed? && unittype_gn_was == 2 unittype_gn_changed? && unittype_gn_was == 2
end end
def is_partner_inferred?(person_index) def is_person_under_16?(person_index)
public_send("age#{person_index}") && public_send("age#{person_index}") < 16 public_send("age#{person_index}") && public_send("age#{person_index}") < 16
end end
def is_any_person_partner?
!partner_numbers.empty?
end
def age_changed_from_below_16(person_index) def age_changed_from_below_16(person_index)
public_send("age#{person_index}_was") && public_send("age#{person_index}_was") < 16 public_send("age#{person_index}_was") && public_send("age#{person_index}_was") < 16
end end
@ -943,6 +947,10 @@ private
end end
end end
def partner_numbers
(2..8).select { |i| public_send("relat#{i}") == "P" }
end
def age_refused? def age_refused?
[age1_known, age2_known, age3_known, age4_known, age5_known, age6_known, age7_known, age8_known].any?(1) [age1_known, age2_known, age3_known, age4_known, age5_known, age6_known, age7_known, age8_known].any?(1)
end 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 be(true) expect(lettings_log.form.depends_on_met(depends_on, lettings_log)).to be(true)
end 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 be(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 be(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 be(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 be(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 be(false)
end
end
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

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

@ -28,8 +28,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
end end
context "with start year < 2026", metadata: { year: 25 } do context "with start year < 2026", metadata: { year: 25 } do
let(:person_question_count) { 4 }
it "has correct depends_on" do it "has correct depends_on" do
expect(page.depends_on).to eq( expect(page.depends_on).to eq(
[{ "details_known_2" => 0 }], [{ "details_known_2" => 0 }],
@ -39,7 +37,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
context "with start year >= 2026", metadata: { year: 26 } do context "with start year >= 2026", metadata: { year: 26 } do
let(:start_year_2026_or_later?) { true } let(:start_year_2026_or_later?) { true }
let(:person_question_count) { 5 }
it "has correct depends_on" do it "has correct depends_on" do
expect(page.depends_on).to eq( expect(page.depends_on).to eq(
@ -70,8 +67,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
end end
context "with start year < 2026", metadata: { year: 25 } do context "with start year < 2026", metadata: { year: 25 } do
let(:person_question_count) { 4 }
it "has correct depends_on" do it "has correct depends_on" do
expect(page.depends_on).to eq( expect(page.depends_on).to eq(
[{ "details_known_3" => 0 }], [{ "details_known_3" => 0 }],
@ -81,7 +76,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
context "with start year >= 2026", metadata: { year: 26 } do context "with start year >= 2026", metadata: { year: 26 } do
let(:start_year_2026_or_later?) { true } let(:start_year_2026_or_later?) { true }
let(:person_question_count) { 5 }
it "has correct depends_on" do it "has correct depends_on" do
expect(page.depends_on).to eq( expect(page.depends_on).to eq(

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

@ -24,6 +24,8 @@ RSpec.describe Form::Lettings::Questions::PersonPartner, type: :model do
) )
end end
let(:person_index) { 2 } let(:person_index) { 2 }
let(:is_any_person_partner?) { false }
let(:log) { instance_double(LettingsLog, is_any_person_partner?: is_any_person_partner?) }
it "has correct page" do it "has correct page" do
expect(question.page).to eq(page) expect(question.page).to eq(page)
@ -47,6 +49,48 @@ RSpec.describe Form::Lettings::Questions::PersonPartner, type: :model do
expect(question.hidden_in_check_answers).to be_nil expect(question.hidden_in_check_answers).to be_nil
end end
describe "#skip_page_in_form_flow?" do
context "with start year < 2026", metadata: { year: 25 } do
let(:year) { 2025 }
context "when no other person is the partner of the lead tenant" do
let(:is_any_person_partner?) { false }
it "returns false" do
expect(question.skip_question_in_form_flow?(log)).to be false
end
end
context "when another person is the partner of the lead tenant" do
let(:is_any_person_partner?) { true }
it "returns false" do
expect(question.skip_question_in_form_flow?(log)).to be false
end
end
end
context "with start year >= 2026", metadata: { year: 26 } do
let(:year) { 2026 }
context "when no other person is the partner of the lead tenant" do
let(:is_any_person_partner?) { false }
it "returns false" do
expect(question.skip_question_in_form_flow?(log)).to be false
end
end
context "when another person is the partner of the lead tenant" do
let(:is_any_person_partner?) { true }
it "returns true" do
expect(question.skip_question_in_form_flow?(log)).to be true
end
end
end
end
context "with person 2" do context "with person 2" do
it "has the correct id" do it "has the correct id" do
expect(question.id).to eq("relat2") expect(question.id).to eq("relat2")
@ -56,39 +100,49 @@ RSpec.describe Form::Lettings::Questions::PersonPartner, type: :model do
expect(question.check_answers_card_number).to eq(2) expect(question.check_answers_card_number).to eq(2)
end end
context "with person 2 age < 16" do context "and in 2025", metadata: { year: 25 } do
let(:log) { build(:lettings_log, age2: 10) } let(:year) { 2025 }
let(:person_question_count) { 4 }
context "and in 2025", metadata: { year: 25 } do it "has the correct question number" do
let(:year) { 2025 } expect(question.question_number).to eq(37)
end
context "with person 2 age < 16" do
let(:log) { build(:lettings_log, age2: 10) }
it "is not marked as derived" do it "is not marked as derived" do
expect(question.derived?(log)).to be false expect(question.derived?(log)).to be false
end end
end end
context "and in 2026", metadata: { year: 26 } do context "with person 2 age >= 16" do
let(:year) { 2026 } let(:log) { build(:lettings_log, age2: 20) }
it "is marked as derived" do it "is not marked as derived" do
expect(question.derived?(log)).to be true expect(question.derived?(log)).to be false
end end
end end
end end
context "with person 2 age >= 16" do context "and in 2026", metadata: { year: 26 } do
let(:log) { build(:lettings_log, age2: 20) } let(:year) { 2026 }
let(:person_question_count) { 5 }
context "and in 2025", metadata: { year: 25 } do it "has the correct question number" do
let(:year) { 2025 } expect(question.question_number).to eq(38)
end
it "is not marked as derived" do context "with person 2 age < 16" do
expect(question.derived?(log)).to be false let(:log) { build(:lettings_log, age2: 10) }
it "is marked as derived" do
expect(question.derived?(log)).to be true
end end
end end
context "and in 2026", metadata: { year: 26 } do context "with person 2 age >= 16" do
let(:year) { 2026 } let(:log) { build(:lettings_log, age2: 20) }
it "is not marked as derived" do it "is not marked as derived" do
expect(question.derived?(log)).to be false expect(question.derived?(log)).to be false

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

@ -357,7 +357,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_2_known person_2_known
person_2_age person_2_age
person_2_lead_partner person_2_lead_partner
relationship_2_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_2_check no_household_member_likely_to_be_pregnant_person_age_2_check
age_2_under_retirement_value_check age_2_under_retirement_value_check
age_2_over_retirement_value_check age_2_over_retirement_value_check
@ -372,7 +371,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_3_known person_3_known
person_3_age person_3_age
person_3_lead_partner person_3_lead_partner
relationship_3_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_3_check no_household_member_likely_to_be_pregnant_person_age_3_check
age_3_under_retirement_value_check age_3_under_retirement_value_check
age_3_over_retirement_value_check age_3_over_retirement_value_check
@ -387,7 +385,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_4_known person_4_known
person_4_age person_4_age
person_4_lead_partner person_4_lead_partner
relationship_4_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_4_check no_household_member_likely_to_be_pregnant_person_age_4_check
age_4_under_retirement_value_check age_4_under_retirement_value_check
age_4_over_retirement_value_check age_4_over_retirement_value_check
@ -402,7 +399,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_5_known person_5_known
person_5_age person_5_age
person_5_lead_partner person_5_lead_partner
relationship_5_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_5_check no_household_member_likely_to_be_pregnant_person_age_5_check
age_5_under_retirement_value_check age_5_under_retirement_value_check
age_5_over_retirement_value_check age_5_over_retirement_value_check
@ -417,7 +413,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_6_known person_6_known
person_6_age person_6_age
person_6_lead_partner person_6_lead_partner
relationship_6_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_6_check no_household_member_likely_to_be_pregnant_person_age_6_check
age_6_under_retirement_value_check age_6_under_retirement_value_check
age_6_over_retirement_value_check age_6_over_retirement_value_check
@ -432,7 +427,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_7_known person_7_known
person_7_age person_7_age
person_7_lead_partner person_7_lead_partner
relationship_7_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_7_check no_household_member_likely_to_be_pregnant_person_age_7_check
age_7_under_retirement_value_check age_7_under_retirement_value_check
age_7_over_retirement_value_check age_7_over_retirement_value_check
@ -447,7 +441,6 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod
person_8_known person_8_known
person_8_age person_8_age
person_8_lead_partner person_8_lead_partner
relationship_8_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_8_check no_household_member_likely_to_be_pregnant_person_age_8_check
age_8_under_retirement_value_check age_8_under_retirement_value_check
age_8_over_retirement_value_check age_8_over_retirement_value_check

37
spec/models/form_spec.rb

@ -19,10 +19,45 @@ RSpec.describe Form, type: :model do
let(:previous_page_id) { form.get_page("person_1_age") } let(:previous_page_id) { form.get_page("person_1_age") }
let(:value_check_previous_page) { form.get_page("net_income_value_check") } let(:value_check_previous_page) { form.get_page("net_income_value_check") }
it "returns the next page given the previous" do it "returns the next page, given the previous" do
expect(form.next_page_id(previous_page_id, lettings_log, user)).to eq("person_1_gender") expect(form.next_page_id(previous_page_id, lettings_log, user)).to eq("person_1_gender")
end end
context "when the next page has more than one question" do
let(:previous_page_id) { form.get_page("tenancy_start_date") }
let(:next_page) { form.get_page("rent_type") }
context "when every question on the next page returns `true` from its `skip_question_in_form_flow?` method" do
before do
allow(next_page.questions.first).to receive(:skip_question_in_form_flow?)
.with(lettings_log)
.and_return(true)
allow(next_page.questions.second).to receive(:skip_question_in_form_flow?)
.with(lettings_log)
.and_return(true)
end
it "returns the page after next, given the previous" do
expect(form.next_page_id(previous_page_id, lettings_log, user)).to eq("tenant_code")
end
end
context "when at least question on the next page returns `false` from its `skip_question_in_form_flow?` method" do
before do
allow(next_page.questions.first).to receive(:skip_question_in_form_flow?)
.with(lettings_log)
.and_return(true)
allow(next_page.questions.second).to receive(:skip_question_in_form_flow?)
.with(lettings_log)
.and_return(false)
end
it "returns the next page, given the previous" do
expect(form.next_page_id(previous_page_id, lettings_log, user)).to eq("rent_type")
end
end
end
context "when the current page is a value check page" do context "when the current page is a value check page" do
before do before do
lettings_log.hhmemb = 1 lettings_log.hhmemb = 1

319
spec/models/lettings_log_derived_fields_spec.rb

@ -1588,4 +1588,323 @@ RSpec.describe LettingsLog, type: :model do
end end
end end
end end
describe "#infer_at_most_one_relationship!" do
context "when 2025", metadata: { year: 25 } do
before do
Timecop.freeze(collection_start_date_for_year(2025))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
context "when there are no existing relationships" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 6, details_known_2: 0, details_known_3: 0, details_known_4: 0, details_known_5: 0, details_known_6: 0, relat2: nil, relat3: "X", relat4: "X", relat5: "R") }
context "when a new relationship is added" do
before do
log.relat4 = "P"
end
it "does not infer no to any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
end
context "when there is an existing relationship" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 6, details_known_2: 0, details_known_3: 0, details_known_4: 0, details_known_5: 0, details_known_6: 0, relat2: "X", relat3: "P", relat4: "R", relat5: "X") }
context "when a new relationship is added" do
before do
log.relat2 = "P"
end
it "does not infer no to any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
context "when the relationship is removed" do
before do
log.relat3 = "X"
end
it "does not reset any answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
end
context "when more than one relationship is set" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 6, details_known_2: 0, details_known_3: 0, details_known_4: 0, details_known_5: 0, details_known_6: 0, 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, :relat2)
.and 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
end
end
context "when 2026", metadata: { year: 26 } do
before do
Timecop.freeze(collection_start_date_for_year(2026))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
context "when there are no existing relationships" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 6, details_known_2: 0, details_known_3: 0, details_known_4: 0, details_known_5: 0, details_known_6: 0, relat3: "X", relat4: "X", relat5: "R") }
context "when 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
it "does not change the relationship answer for the newly added relationship" do
expect { log.set_derived_fields! }.to not_change(log, :relat4)
end
end
context "when a 'no' is changed to 'prefers not to say'" do
before do
log.relat4 = "R"
end
it "does not change any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
context "when a 'prefers not to say' is changed to 'no'" do
before do
log.relat5 = "X"
end
it "does not change any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
end
context "when there is an existing relationship" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 6, details_known_2: 0, details_known_3: 0, details_known_4: 0, details_known_5: 0, details_known_6: 0, 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
it "does not change the relationship answer for the newly added relationship" do
expect { log.set_derived_fields! }.to not_change(log, :relat2)
end
end
context "and a new relationship is added to an later 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.relat5 = "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, :relat2)
.and not_change(log, :relat4)
end
it "does not change the relationship answer for the newly added relationship" do
expect { log.set_derived_fields! }.to not_change(log, :relat5)
end
end
context "when a 'no' is changed to 'prefers not to say'" do
before do
log.relat4 = "R"
end
it "does not change any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
context "when a 'prefers not to say' is changed to 'no'" do
before do
log.relat5 = "X"
end
it "does not change any relationship answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
context "and the relationship is removed" do
before do
log.relat3 = "X"
end
it "does not reset any answers" do
expect { log.set_derived_fields! }
.to not_change(log, :relat2)
.and 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
end
end
context "when more than one relationship is set" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 6, details_known_2: 0, details_known_3: 0, details_known_4: 0, details_known_5: 0, details_known_6: 0, 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 end

18
spec/models/lettings_log_spec.rb

@ -2349,5 +2349,23 @@ RSpec.describe LettingsLog do
end end
end end
end end
describe "#is_any_person_partner?" do
context "when no person is the partner of the lead tenant" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 3, details_known_2: 0, details_known_3: 0, relat2: "X", relat3: "R") }
it "returns false" do
expect(log.is_any_person_partner?).to be false
end
end
context "when a person is the partner of the lead tenant" do
let(:log) { create(:lettings_log, :in_progress, hhmemb: 3, details_known_2: 0, details_known_3: 0, relat2: "X", relat3: "P") }
it "returns true" do
expect(log.is_any_person_partner?).to be true
end
end
end
end end
# rubocop:enable RSpec/MessageChain # rubocop:enable RSpec/MessageChain

Loading…
Cancel
Save