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
end
if form.start_year_2026_or_later?
infer_at_most_one_relationship!
end
clear_child_constraints_for_age_changes!
child_under_16_constraints!
@ -325,6 +329,25 @@ private
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
return unless totelder && totadult && totchild

10
app/models/form.rb

@ -108,7 +108,8 @@ class Form
return :check_answers if next_page.nil?
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:)
end
@ -323,7 +324,12 @@ class Form
if value.is_a?(Hash) && value.key?("operator")
operator = value["operator"]
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
parts = question.split(".")
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,
},
},
{ "details_known_#{@person_index}" => 0, "age#{@person_index}" => nil },
{
"details_known_#{@person_index}" => 0,
"age#{@person_index}" => nil,
},
]
else
[{ "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
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

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::PersonAge.new(nil, nil, self, person_index:) if form.start_year_2026_or_later?),
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::MultiplePartnersValueCheck.new("relationship_#{person_index}_multiple_partners_value_check", nil, self, person_index:) if form.start_year_2024_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:) 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::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::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::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::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?),

4
app/models/form/question.rb

@ -304,6 +304,10 @@ class Form::Question
nil
end
def skip_question_in_form_flow?(_log)
false
end
private
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
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
end
def is_any_person_partner?
!partner_numbers.empty?
end
def age_changed_from_below_16(person_index)
public_send("age#{person_index}_was") && public_send("age#{person_index}_was") < 16
end
@ -943,6 +947,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 be(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 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

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
context "with start year < 2026", metadata: { year: 25 } do
let(:person_question_count) { 4 }
it "has correct depends_on" do
expect(page.depends_on).to eq(
[{ "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
let(:start_year_2026_or_later?) { true }
let(:person_question_count) { 5 }
it "has correct depends_on" do
expect(page.depends_on).to eq(
@ -70,8 +67,6 @@ RSpec.describe Form::Lettings::Pages::PersonLeadPartner, type: :model do
end
context "with start year < 2026", metadata: { year: 25 } do
let(:person_question_count) { 4 }
it "has correct depends_on" do
expect(page.depends_on).to eq(
[{ "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
let(:start_year_2026_or_later?) { true }
let(:person_question_count) { 5 }
it "has correct depends_on" do
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
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
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
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
it "has the correct id" do
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)
end
context "with person 2 age < 16" do
let(:log) { build(:lettings_log, age2: 10) }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
let(:person_question_count) { 4 }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct question number" do
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
expect(question.derived?(log)).to be false
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
context "with person 2 age >= 16" do
let(:log) { build(:lettings_log, age2: 20) }
it "is marked as derived" do
expect(question.derived?(log)).to be true
it "is not marked as derived" do
expect(question.derived?(log)).to be false
end
end
end
context "with person 2 age >= 16" do
let(:log) { build(:lettings_log, age2: 20) }
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
let(:person_question_count) { 5 }
context "and in 2025", metadata: { year: 25 } do
let(:year) { 2025 }
it "has the correct question number" do
expect(question.question_number).to eq(38)
end
it "is not marked as derived" do
expect(question.derived?(log)).to be false
context "with person 2 age < 16" do
let(:log) { build(:lettings_log, age2: 10) }
it "is marked as derived" do
expect(question.derived?(log)).to be true
end
end
context "and in 2026", metadata: { year: 26 } do
let(:year) { 2026 }
context "with person 2 age >= 16" do
let(:log) { build(:lettings_log, age2: 20) }
it "is not marked as derived" do
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_age
person_2_lead_partner
relationship_2_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_2_check
age_2_under_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_age
person_3_lead_partner
relationship_3_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_3_check
age_3_under_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_age
person_4_lead_partner
relationship_4_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_4_check
age_4_under_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_age
person_5_lead_partner
relationship_5_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_5_check
age_5_under_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_age
person_6_lead_partner
relationship_6_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_6_check
age_6_under_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_age
person_7_lead_partner
relationship_7_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_7_check
age_7_under_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_age
person_8_lead_partner
relationship_8_multiple_partners_value_check
no_household_member_likely_to_be_pregnant_person_age_8_check
age_8_under_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(: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")
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
before do
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
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

18
spec/models/lettings_log_spec.rb

@ -2349,5 +2349,23 @@ RSpec.describe LettingsLog do
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
# rubocop:enable RSpec/MessageChain

Loading…
Cancel
Save