From b75c290a1689c835903a8bd47899d6cef749c345 Mon Sep 17 00:00:00 2001 From: Samuel Young Date: Thu, 29 Jan 2026 17:19:44 +0000 Subject: [PATCH] CLDC-4188: Update tests --- .../pages/referral_register_la_spec.rb | 78 ++++++++++++++++ ..._spec.rb => referral_register_prp_spec.rb} | 4 +- .../questions/referral_register_spec.rb | 70 +++++++++++--- .../subsections/household_situation_spec.rb | 3 +- .../validations/household_validations_spec.rb | 93 +++++++++++++++++-- 5 files changed, 221 insertions(+), 27 deletions(-) create mode 100644 spec/models/form/lettings/pages/referral_register_la_spec.rb rename spec/models/form/lettings/pages/{referral_register_spec.rb => referral_register_prp_spec.rb} (85%) diff --git a/spec/models/form/lettings/pages/referral_register_la_spec.rb b/spec/models/form/lettings/pages/referral_register_la_spec.rb new file mode 100644 index 000000000..1f2459cbd --- /dev/null +++ b/spec/models/form/lettings/pages/referral_register_la_spec.rb @@ -0,0 +1,78 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::ReferralRegisterLa, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { nil } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection, form:) } + let(:form) { instance_double(Form, start_date: Time.zone.today) } + let(:la?) { nil } + let(:organisation) { instance_double(Organisation, la?: la?) } + let(:is_renewal?) { nil } + let(:log) { instance_double(LettingsLog, is_renewal?: is_renewal?, owning_organisation: organisation) } + + before do + allow(subsection).to receive(:form).and_return(form) + end + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[referral_register]) + end + + it "has the correct id" do + expect(page.id).to eq("referral_register_la") + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has the correct depends_on" do + expect(page.depends_on).to be nil + end + + context "when log is a renewal" do + let(:is_renewal?) { true } + + context "and log owning organisation is la" do + let(:la?) { true } + + it "is not routed to" do + expect(page.routed_to?(log, nil)).to be false + end + end + + context "and log owning organisation is not an la" do + let(:la?) { false } + + it "is not routed to" do + expect(page.routed_to?(log, nil)).to be false + end + end + end + + context "when log is not a renewal" do + let(:is_renewal?) { false } + + context "and log owning organisation is la" do + let(:la?) { true } + + it "is routed to" do + expect(page.routed_to?(log, nil)).to be true + end + end + + context "and log owning organisation is not an la" do + let(:la?) { false } + + it "is not routed to" do + expect(page.routed_to?(log, nil)).to be false + end + end + end +end diff --git a/spec/models/form/lettings/pages/referral_register_spec.rb b/spec/models/form/lettings/pages/referral_register_prp_spec.rb similarity index 85% rename from spec/models/form/lettings/pages/referral_register_spec.rb rename to spec/models/form/lettings/pages/referral_register_prp_spec.rb index 28981e03d..e62d54e47 100644 --- a/spec/models/form/lettings/pages/referral_register_spec.rb +++ b/spec/models/form/lettings/pages/referral_register_prp_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" -RSpec.describe Form::Lettings::Pages::ReferralRegister, type: :model do +RSpec.describe Form::Lettings::Pages::ReferralRegisterPrp, type: :model do subject(:page) { described_class.new(page_id, page_definition, subsection) } let(:page_id) { nil } @@ -21,7 +21,7 @@ RSpec.describe Form::Lettings::Pages::ReferralRegister, type: :model do end it "has the correct id" do - expect(page.id).to eq("referral_register") + expect(page.id).to eq("referral_register_prp") end it "has the correct description" do diff --git a/spec/models/form/lettings/questions/referral_register_spec.rb b/spec/models/form/lettings/questions/referral_register_spec.rb index 6d5ad3ffd..112de43e0 100644 --- a/spec/models/form/lettings/questions/referral_register_spec.rb +++ b/spec/models/form/lettings/questions/referral_register_spec.rb @@ -1,13 +1,16 @@ require "rails_helper" RSpec.describe Form::Lettings::Questions::ReferralRegister, type: :model do - subject(:question) { described_class.new(question_id, question_definition, page) } + subject(:question) { described_class.new(question_id, question_definition, page, provider_type) } let(:question_id) { nil } let(:question_definition) { nil } let(:page) { instance_double(Form::Page) } + let(:provider_type) { nil } let(:subsection) { instance_double(Form::Subsection) } let(:form) { instance_double(Form, start_date: Time.zone.today) } + let(:is_renewal?) { nil } + let(:log) { instance_double(LettingsLog, is_renewal?: is_renewal?) } before do allow(page).to receive(:subsection).and_return(subsection) @@ -26,21 +29,60 @@ RSpec.describe Form::Lettings::Questions::ReferralRegister, type: :model do expect(question.type).to eq("radio") end - it "is not marked as derived" do - expect(question.derived?(nil)).to be false + context "when log is a renewal" do + let(:is_renewal?) { true } + + it "is marked as derived" do + expect(question.derived?(log)).to be true + end + end + + context "when log is not a renewal" do + let(:is_renewal?) { false } + + it "is not marked as derived" do + expect(question.derived?(log)).to be false + end end - it "has the correct answer_options" do - expect(question.answer_options).to eq( - { - "1" => { - "value" => "Answer A", - }, - "2" => { - "value" => "Answer B", - }, - }.freeze, - ) + context "when log is owned by an LA" do + let(:provider_type) { :la } + + it "has the correct answer_options" do + expect(question.answer_options).to eq( + { + "1" => { + "value" => "Renewal to the same tenant in the same property", + }, + "2" => { + "value" => "Internal transfer from another property owned by the same local authority - for existing social tenants only", + }, + "3" => { + "value" => "From a housing register (waiting list)", + }, + "4" => { + "value" => "Tenant applied directly (not via a nomination or housing register)", + }, + }.freeze, + ) + end + end + + context "when log is owned by an PRP" do + let(:provider_type) { :prp } + + it "has the correct answer_options" do + expect(question.answer_options).to eq( + { + "1" => { + "value" => "Answer A", + }, + "2" => { + "value" => "Answer B", + }, + }.freeze, + ) + end end it "has the correct question_number" do diff --git a/spec/models/form/lettings/subsections/household_situation_spec.rb b/spec/models/form/lettings/subsections/household_situation_spec.rb index 985ac1783..909046719 100644 --- a/spec/models/form/lettings/subsections/household_situation_spec.rb +++ b/spec/models/form/lettings/subsections/household_situation_spec.rb @@ -107,7 +107,8 @@ RSpec.describe Form::Lettings::Subsections::HouseholdSituation, type: :model do reasonable_preference reasonable_preference_reason allocation_system - referral_register + referral_register_la + referral_register_prp referral_noms referral_org ], diff --git a/spec/models/validations/household_validations_spec.rb b/spec/models/validations/household_validations_spec.rb index f79f2c6e4..7ae866800 100644 --- a/spec/models/validations/household_validations_spec.rb +++ b/spec/models/validations/household_validations_spec.rb @@ -1,6 +1,8 @@ require "rails_helper" RSpec.describe Validations::HouseholdValidations do + include CollectionTimeHelper + subject(:household_validator) { validator_class.new } let(:validator_class) { Class.new { include Validations::HouseholdValidations } } @@ -488,6 +490,60 @@ RSpec.describe Validations::HouseholdValidations do expect(record.errors["homeless"]).to be_empty end end + + context "when start year is 2026 and record is internal transfer and owning organisation is LA" do + let(:startdate) { collection_start_date_for_year(2026) } + + [ + { code: 3, label: "Private sector tenancy" }, + { code: 27, label: "Owner occupation (low-cost home ownership)" }, + { code: 26, label: "Owner occupation (private)" }, + { code: 28, label: "Living with friends or family (long-term)" }, + { code: 39, label: "Sofa surfing (moving regularly between family or friends, no permanent bed)" }, + { code: 14, label: "Bed and breakfast" }, + { code: 7, label: "Direct access hostel" }, + { code: 10, label: "Hospital" }, + { code: 29, label: "Prison or approved probation hostel" }, + { code: 19, label: "Rough sleeping" }, + { code: 18, label: "Any other temporary accommodation" }, + { code: 13, label: "Children’s home or foster care" }, + { code: 24, label: "Home Office Asylum Support" }, + { code: 37, label: "Host family or similar refugee accommodation" }, + { code: 23, label: "Mobile home or caravan" }, + { code: 21, label: "Refuge" }, + { code: 9, label: "Residential care home" }, + { code: 4, label: "Tied housing or rented with job" }, + { code: 25, label: "Any other accommodation" }, + ].each do |prevten| + it "prevten cannot be #{prevten[:code]}" do + record.referral_register = 2 + record.prevten = prevten[:code] + household_validator.validate_referral(record) + expect(record.errors["prevten"]) + .to include(match I18n.t("validations.lettings.household.prevten.general_needs.internal_transfer", prevten: prevten[:label])) + expect(record.errors["referral_register"]) + .to include(match I18n.t("validations.lettings.household.referral.general_needs.internal_transfer", prevten: prevten[:label])) + end + end + + [ + { code: 30, label: "Fixed-term local authority general needs tenancy" }, + { code: 31, label: "Lifetime local authority general needs tenancy" }, + { code: 32, label: "Fixed-term private registered provider (PRP) general needs tenancy" }, + { code: 33, label: "Lifetime private registered provider (PRP) general needs tenancy" }, + { code: 35, label: "Extra care housing" }, + { code: 38, label: "Older people’s housing for tenants with low support needs" }, + { code: 6, label: "Other supported housing" }, + ].each do |prevten| + it "prevten can be #{prevten[:code]}" do + record.referral_register = 2 + record.prevten = prevten[:code] + household_validator.validate_referral(record) + expect(record.errors["prevten"]).to be_empty + expect(record.errors["referral"]).to be_empty + end + end + end end describe "la validations" do @@ -593,16 +649,33 @@ RSpec.describe Validations::HouseholdValidations do { code: 28, label: "Living with friends or family" }, { code: 29, label: "Prison or approved probation hostel" }, ].each do |prevten| - it "prevten cannot be #{prevten[:code]}" do - record.referral_type = 3 - record.referral = 1 - record.prevten = prevten[:code] - household_validator.validate_previous_housing_situation(record) - label = record.form.start_year_2025_or_later? && prevten[:code] == 28 ? "Living with friends or family (long-term)" : prevten[:label] - expect(record.errors["prevten"]) - .to include(match I18n.t("validations.lettings.household.prevten.internal_transfer", prevten: label)) - expect(record.errors["referral"]) - .to include(match I18n.t("validations.lettings.household.referral.prevten_invalid", prevten: "")) + context "when year is 2025" do + let(:startdate) { collection_start_date_for_year(2025) } + + it "prevten cannot be #{prevten[:code]}" do + record.referral_type = 3 + record.referral = 1 + record.prevten = prevten[:code] + household_validator.validate_previous_housing_situation(record) + label = record.form.start_year_2025_or_later? && prevten[:code] == 28 ? "Living with friends or family (long-term)" : prevten[:label] + expect(record.errors["prevten"]) + .to include(match I18n.t("validations.lettings.household.prevten.internal_transfer", prevten: label)) + expect(record.errors["referral"]) + .to include(match I18n.t("validations.lettings.household.referral.prevten_invalid", prevten: "")) + end + end + + context "when year is 2026" do + let(:startdate) { collection_start_date_for_year(2026) } + + it "prevten can be #{prevten[:code]}" do + record.referral_type = 3 + record.referral = 1 + record.prevten = prevten[:code] + household_validator.validate_previous_housing_situation(record) + expect(record.errors["prevten"]).to be_empty + expect(record.errors["referral"]).to be_empty + end end end end