From cdda100fb55aa6c0540e90867c1bc38c492de194 Mon Sep 17 00:00:00 2001 From: Jack S Date: Wed, 22 Mar 2023 10:18:16 +0000 Subject: [PATCH] Add UPRN lettings questions --- app/models/form/lettings/pages/address.rb | 24 +++++ .../pages/property_local_authority.rb | 8 ++ app/models/form/lettings/pages/uprn.rb | 28 ++++++ .../form/lettings/pages/uprn_confirmation.rb | 17 ++++ app/models/form/lettings/pages/uprn_known.rb | 16 ++++ .../form/lettings/questions/address_line1.rb | 38 ++++++++ .../form/lettings/questions/address_line2.rb | 13 +++ app/models/form/lettings/questions/county.rb | 13 +++ app/models/form/lettings/questions/la.rb | 4 + .../questions/postcode_for_full_address.rb | 25 +++++ .../form/lettings/questions/town_or_city.rb | 13 +++ app/models/form/lettings/questions/uprn.rb | 35 +++++++ .../lettings/questions/uprn_confirmation.rb | 34 +++++++ .../form/lettings/questions/uprn_known.rb | 21 +++++ .../subsections/property_information.rb | 19 +++- .../form/lettings/pages/address_spec.rb | 73 +++++++++++++++ .../pages/property_local_authority_spec.rb | 77 ++++++++++++++++ .../lettings/pages/uprn_confirmation_spec.rb | 59 ++++++++++++ .../form/lettings/pages/uprn_known_spec.rb | 51 ++++++++++ spec/models/form/lettings/pages/uprn_spec.rb | 81 ++++++++++++++++ .../lettings/questions/address_line1_spec.rb | 79 ++++++++++++++++ .../lettings/questions/address_line2_spec.rb | 49 ++++++++++ .../form/lettings/questions/county_spec.rb | 49 ++++++++++ .../models/form/lettings/questions/la_spec.rb | 30 ++++++ .../postcode_for_full_address_spec.rb | 62 +++++++++++++ .../lettings/questions/town_or_city_spec.rb | 49 ++++++++++ .../questions/uprn_confirmation_spec.rb | 90 ++++++++++++++++++ .../lettings/questions/uprn_known_spec.rb | 59 ++++++++++++ .../form/lettings/questions/uprn_spec.rb | 92 +++++++++++++++++++ .../subsections/property_information_spec.rb | 83 ++++++++++++----- 30 files changed, 1267 insertions(+), 24 deletions(-) create mode 100644 app/models/form/lettings/pages/address.rb create mode 100644 app/models/form/lettings/pages/uprn.rb create mode 100644 app/models/form/lettings/pages/uprn_confirmation.rb create mode 100644 app/models/form/lettings/pages/uprn_known.rb create mode 100644 app/models/form/lettings/questions/address_line1.rb create mode 100644 app/models/form/lettings/questions/address_line2.rb create mode 100644 app/models/form/lettings/questions/county.rb create mode 100644 app/models/form/lettings/questions/postcode_for_full_address.rb create mode 100644 app/models/form/lettings/questions/town_or_city.rb create mode 100644 app/models/form/lettings/questions/uprn.rb create mode 100644 app/models/form/lettings/questions/uprn_confirmation.rb create mode 100644 app/models/form/lettings/questions/uprn_known.rb create mode 100644 spec/models/form/lettings/pages/address_spec.rb create mode 100644 spec/models/form/lettings/pages/property_local_authority_spec.rb create mode 100644 spec/models/form/lettings/pages/uprn_confirmation_spec.rb create mode 100644 spec/models/form/lettings/pages/uprn_known_spec.rb create mode 100644 spec/models/form/lettings/pages/uprn_spec.rb create mode 100644 spec/models/form/lettings/questions/address_line1_spec.rb create mode 100644 spec/models/form/lettings/questions/address_line2_spec.rb create mode 100644 spec/models/form/lettings/questions/county_spec.rb create mode 100644 spec/models/form/lettings/questions/postcode_for_full_address_spec.rb create mode 100644 spec/models/form/lettings/questions/town_or_city_spec.rb create mode 100644 spec/models/form/lettings/questions/uprn_confirmation_spec.rb create mode 100644 spec/models/form/lettings/questions/uprn_known_spec.rb create mode 100644 spec/models/form/lettings/questions/uprn_spec.rb diff --git a/app/models/form/lettings/pages/address.rb b/app/models/form/lettings/pages/address.rb new file mode 100644 index 000000000..6f88bad0d --- /dev/null +++ b/app/models/form/lettings/pages/address.rb @@ -0,0 +1,24 @@ +class Form::Lettings::Pages::Address < ::Form::Page + def initialize(id, hsh, subsection) + super + @id = "address" + @header = "What is the property's address?" + end + + def questions + @questions ||= [ + Form::Lettings::Questions::AddressLine1.new(nil, nil, self), + Form::Lettings::Questions::AddressLine2.new(nil, nil, self), + Form::Lettings::Questions::TownOrCity.new(nil, nil, self), + Form::Lettings::Questions::County.new(nil, nil, self), + Form::Lettings::Questions::PostcodeForFullAddress.new(nil, nil, self), + ] + end + + def routed_to?(log, _current_user = nil) + return false if log.uprn_known.nil? + return false if log.is_supported_housing? + + log.uprn_confirmed != 1 || log.uprn_known.zero? + end +end diff --git a/app/models/form/lettings/pages/property_local_authority.rb b/app/models/form/lettings/pages/property_local_authority.rb index 711d908d8..4284aa7f4 100644 --- a/app/models/form/lettings/pages/property_local_authority.rb +++ b/app/models/form/lettings/pages/property_local_authority.rb @@ -8,4 +8,12 @@ class Form::Lettings::Pages::PropertyLocalAuthority < ::Form::Page def questions @questions ||= [Form::Lettings::Questions::La.new(nil, nil, self)] end + + def routed_to?(log, _current_user = nil) + return false if log.uprn_known.nil? && form.start_date.year >= 2023 + return false if log.is_la_inferred? + return false if log.is_supported_housing? + + true + end end diff --git a/app/models/form/lettings/pages/uprn.rb b/app/models/form/lettings/pages/uprn.rb new file mode 100644 index 000000000..7b6b90f1a --- /dev/null +++ b/app/models/form/lettings/pages/uprn.rb @@ -0,0 +1,28 @@ +class Form::Lettings::Pages::Uprn < ::Form::Page + def initialize(id, hsh, subsection) + super + @id = "uprn" + end + + def questions + @questions ||= [ + Form::Lettings::Questions::Uprn.new(nil, nil, self), + ] + end + + def routed_to?(log, _current_user = nil) + return false if log.is_supported_housing? + + log.uprn_known == 1 + end + + def skip_text + "Enter address instead" + end + + def skip_href(log = nil) + return unless log + + "/#{log.model_name.param_key.dasherize}s/#{log.id}/address" + end +end diff --git a/app/models/form/lettings/pages/uprn_confirmation.rb b/app/models/form/lettings/pages/uprn_confirmation.rb new file mode 100644 index 000000000..26cde2d97 --- /dev/null +++ b/app/models/form/lettings/pages/uprn_confirmation.rb @@ -0,0 +1,17 @@ +class Form::Lettings::Pages::UprnConfirmation < ::Form::Page + def initialize(id, hsh, subsection) + super + @id = "uprn_confirmation" + @header = "We found an address that might be this property" + end + + def questions + @questions ||= [ + Form::Lettings::Questions::UprnConfirmation.new(nil, nil, self), + ] + end + + def routed_to?(log, _current_user = nil) + log.uprn.present? && log.uprn_known == 1 + end +end diff --git a/app/models/form/lettings/pages/uprn_known.rb b/app/models/form/lettings/pages/uprn_known.rb new file mode 100644 index 000000000..1ded1ba82 --- /dev/null +++ b/app/models/form/lettings/pages/uprn_known.rb @@ -0,0 +1,16 @@ +class Form::Lettings::Pages::UprnKnown < ::Form::Page + def initialize(id, hsh, subsection) + super + @id = "uprn_known" + end + + def questions + @questions ||= [ + Form::Lettings::Questions::UprnKnown.new(nil, nil, self), + ] + end + + def routed_to?(log, _current_user = nil) + !log.is_supported_housing? + end +end diff --git a/app/models/form/lettings/questions/address_line1.rb b/app/models/form/lettings/questions/address_line1.rb new file mode 100644 index 000000000..6f82edf45 --- /dev/null +++ b/app/models/form/lettings/questions/address_line1.rb @@ -0,0 +1,38 @@ +class Form::Lettings::Questions::AddressLine1 < ::Form::Question + def initialize(id, hsh, page) + super + @id = "address_line1" + @check_answer_label = "Address" + @header = "Address line 1" + @type = "text" + @plain_label = true + @question_number = 12 + end + + def hidden_in_check_answers?(log, _current_user = nil) + return true if log.uprn_known.nil? + return false if log.uprn_known&.zero? + return true if log.uprn_confirmed.nil? && log.uprn.present? + return true if log.uprn_known == 1 && log.uprn.blank? + + log.uprn_confirmed == 1 + end + + def answer_label(log, _current_user = nil) + [ + log.address_line1, + log.address_line2, + log.postcode_full, + log.town_or_city, + log.county, + ].select(&:present?).join("\n") + end + + def get_extra_check_answer_value(log) + return unless log.is_la_inferred? + + la = LocalAuthority.find_by(code: log.la)&.name + + la.presence + end +end diff --git a/app/models/form/lettings/questions/address_line2.rb b/app/models/form/lettings/questions/address_line2.rb new file mode 100644 index 000000000..16f7c8336 --- /dev/null +++ b/app/models/form/lettings/questions/address_line2.rb @@ -0,0 +1,13 @@ +class Form::Lettings::Questions::AddressLine2 < ::Form::Question + def initialize(id, hsh, page) + super + @id = "address_line2" + @header = "Address line 2 (optional)" + @type = "text" + @plain_label = true + end + + def hidden_in_check_answers?(_log = nil, _current_user = nil) + true + end +end diff --git a/app/models/form/lettings/questions/county.rb b/app/models/form/lettings/questions/county.rb new file mode 100644 index 000000000..360c0966c --- /dev/null +++ b/app/models/form/lettings/questions/county.rb @@ -0,0 +1,13 @@ +class Form::Lettings::Questions::County < ::Form::Question + def initialize(id, hsh, page) + super + @id = "county" + @header = "County (optional)" + @type = "text" + @plain_label = true + end + + def hidden_in_check_answers?(_log = nil, _current_user = nil) + true + end +end diff --git a/app/models/form/lettings/questions/la.rb b/app/models/form/lettings/questions/la.rb index 3cafda054..b70e7590b 100644 --- a/app/models/form/lettings/questions/la.rb +++ b/app/models/form/lettings/questions/la.rb @@ -13,4 +13,8 @@ class Form::Lettings::Questions::La < ::Form::Question def answer_options { "" => "Select an option" }.merge(LocalAuthority.active(form.start_date).england.map { |la| [la.code, la.name] }.to_h) end + + def hidden_in_check_answers?(log, _current_user = nil) + log.startdate && log.startdate.year >= 2023 && log.is_la_inferred? + end end diff --git a/app/models/form/lettings/questions/postcode_for_full_address.rb b/app/models/form/lettings/questions/postcode_for_full_address.rb new file mode 100644 index 000000000..015abc2e8 --- /dev/null +++ b/app/models/form/lettings/questions/postcode_for_full_address.rb @@ -0,0 +1,25 @@ +class Form::Lettings::Questions::PostcodeForFullAddress < ::Form::Question + def initialize(id, hsh, page) + super + @id = "postcode_full" + @header = "Postcode" + @type = "text" + @width = 5 + @inferred_check_answers_value = [{ + "condition" => { + "pcodenk" => 1, + }, + "value" => "Not known", + }] + @inferred_answers = { + "la" => { + "is_la_inferred" => true, + }, + } + @plain_label = true + end + + def hidden_in_check_answers?(_log = nil, _current_user = nil) + true + end +end diff --git a/app/models/form/lettings/questions/town_or_city.rb b/app/models/form/lettings/questions/town_or_city.rb new file mode 100644 index 000000000..f1eac8dff --- /dev/null +++ b/app/models/form/lettings/questions/town_or_city.rb @@ -0,0 +1,13 @@ +class Form::Lettings::Questions::TownOrCity < ::Form::Question + def initialize(id, hsh, page) + super + @id = "town_or_city" + @header = "Town or city" + @type = "text" + @plain_label = true + end + + def hidden_in_check_answers?(_log = nil, _current_user = nil) + true + end +end diff --git a/app/models/form/lettings/questions/uprn.rb b/app/models/form/lettings/questions/uprn.rb new file mode 100644 index 000000000..efe9a4ea4 --- /dev/null +++ b/app/models/form/lettings/questions/uprn.rb @@ -0,0 +1,35 @@ +class Form::Lettings::Questions::Uprn < ::Form::Question + def initialize(id, hsh, page) + super + @id = "uprn" + @check_answer_label = "UPRN" + @header = "What is the property's UPRN" + @type = "text" + @hint_text = "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355." + @width = 10 + @question_number = 11 + end + + def unanswered_error_message + I18n.t("validations.property.uprn.invalid") + end + + def get_extra_check_answer_value(log) + value = [ + log.address_line1, + log.address_line2, + log.town_or_city, + log.county, + log.postcode_full, + (LocalAuthority.find_by(code: log.la)&.name if log.la.present?), + ].select(&:present?) + + return unless value.any? + + "\n\n#{value.join("\n")}" + end + + def hidden_in_check_answers?(log, _current_user = nil) + log.uprn_known != 1 + end +end diff --git a/app/models/form/lettings/questions/uprn_confirmation.rb b/app/models/form/lettings/questions/uprn_confirmation.rb new file mode 100644 index 000000000..5b7bbd535 --- /dev/null +++ b/app/models/form/lettings/questions/uprn_confirmation.rb @@ -0,0 +1,34 @@ +class Form::Lettings::Questions::UprnConfirmation < ::Form::Question + def initialize(id, hsh, page) + super + @id = "uprn_confirmed" + @header = "Is this the property address?" + @type = "radio" + @answer_options = ANSWER_OPTIONS + @check_answer_label = "Is this the right address?" + end + + ANSWER_OPTIONS = { + "1" => { "value" => "Yes" }, + "0" => { "value" => "No, I want to enter the address manually" }, + }.freeze + + def notification_banner(log = nil) + return unless log&.uprn + + { + title: "UPRN: #{log.uprn}", + heading: [ + log.address_line1, + log.address_line2, + log.postcode_full, + log.town_or_city, + log.county, + ].select(&:present?).join("\n"), + } + end + + def hidden_in_check_answers?(log, _current_user = nil) + log.uprn_known != 1 || log.uprn_confirmed.present? + end +end diff --git a/app/models/form/lettings/questions/uprn_known.rb b/app/models/form/lettings/questions/uprn_known.rb new file mode 100644 index 000000000..6e3ce0302 --- /dev/null +++ b/app/models/form/lettings/questions/uprn_known.rb @@ -0,0 +1,21 @@ +class Form::Lettings::Questions::UprnKnown < ::Form::Question + def initialize(id, hsh, page) + super + @id = "uprn_known" + @check_answer_label = "UPRN known?" + @header = "Do you know the property UPRN?" + @type = "radio" + @answer_options = ANSWER_OPTIONS + @hint_text = "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.

+ You can continue without the UPRN, but it means we will need you to enter the address of the property." + end + + ANSWER_OPTIONS = { + "1" => { "value" => "Yes" }, + "0" => { "value" => "No" }, + }.freeze + + def unanswered_error_message + I18n.t("validations.property.uprn_known.invalid") + end +end diff --git a/app/models/form/lettings/subsections/property_information.rb b/app/models/form/lettings/subsections/property_information.rb index cc07535ae..8daccb55e 100644 --- a/app/models/form/lettings/subsections/property_information.rb +++ b/app/models/form/lettings/subsections/property_information.rb @@ -8,7 +8,7 @@ class Form::Lettings::Subsections::PropertyInformation < ::Form::Subsection def pages @pages ||= [ - Form::Lettings::Pages::PropertyPostcode.new(nil, nil, self), + uprn_questions, Form::Lettings::Pages::PropertyLocalAuthority.new(nil, nil, self), Form::Lettings::Pages::FirstTimePropertyLetAsSocialHousing.new(nil, nil, self), Form::Lettings::Pages::PropertyLetType.new(nil, nil, self), @@ -25,6 +25,21 @@ class Form::Lettings::Subsections::PropertyInformation < ::Form::Subsection Form::Lettings::Pages::NewBuildHandoverDate.new(nil, nil, self), Form::Lettings::Pages::PropertyMajorRepairs.new(nil, nil, self), Form::Lettings::Pages::PropertyMajorRepairsValueCheck.new(nil, nil, self), - ].compact + ].flatten.compact + end + + def uprn_questions + if form.start_date.year >= 2023 + [ + Form::Lettings::Pages::UprnKnown.new(nil, nil, self), + Form::Lettings::Pages::Uprn.new(nil, nil, self), + Form::Lettings::Pages::UprnConfirmation.new(nil, nil, self), + Form::Lettings::Pages::Address.new(nil, nil, self), + ] + else + [ + Form::Lettings::Pages::PropertyPostcode.new(nil, nil, self), + ] + end end end diff --git a/spec/models/form/lettings/pages/address_spec.rb b/spec/models/form/lettings/pages/address_spec.rb new file mode 100644 index 000000000..e4cf044b8 --- /dev/null +++ b/spec/models/form/lettings/pages/address_spec.rb @@ -0,0 +1,73 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::Address, 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) } + + 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[address_line1 address_line2 town_or_city county postcode_full]) + end + + it "has the correct id" do + expect(page.id).to eq("address") + end + + it "has the correct header" do + expect(page.header).to eq("What is the property's address?") + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to be_nil + end + + describe "has correct routed_to?" do + context "when uprn_known == nil" do + let(:log) { create(:lettings_log, uprn_known: nil) } + + it "returns false" do + expect(page.routed_to?(log)).to eq(false) + end + end + + context "when uprn_confirmed != 1" do + let(:log) do + create(:lettings_log, uprn_known: 1, uprn_confirmed: 0) + end + + it "returns true" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when uprn_known == 0" do + let(:log) do + create(:lettings_log, uprn_known: 0, uprn_confirmed: 0) + end + + it "returns true" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when uprn_confirmed == 1 && uprn_known != 0" do + let(:log) do + create(:lettings_log, uprn_known: 1, uprn_confirmed: 1) + end + + it "returns true" do + expect(page.routed_to?(log)).to eq(false) + end + end + end +end diff --git a/spec/models/form/lettings/pages/property_local_authority_spec.rb b/spec/models/form/lettings/pages/property_local_authority_spec.rb new file mode 100644 index 000000000..068feaf0f --- /dev/null +++ b/spec/models/form/lettings/pages/property_local_authority_spec.rb @@ -0,0 +1,77 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::PropertyLocalAuthority, 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: instance_double(Form, start_date:)) } + let(:start_date) { Time.utc(2022, 4, 1) } + + 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[ + la + ], + ) + end + + it "has the correct id" do + expect(page.id).to eq("property_local_authority") + end + + it "has the correct header" do + expect(page.header).to be_nil + 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 match([{ "is_la_inferred" => false, "needstype" => 1 }]) + end + + describe "has correct routed_to?" do + context "when start_date < 2023" do + let(:log) { create(:lettings_log, uprn_known: 1) } + let(:start_date) { Time.utc(2022, 2, 8) } + + it "returns false" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when start_date >= 2023" do + let(:log) { create(:lettings_log, uprn_known: 1) } + let(:start_date) { Time.utc(2023, 2, 8) } + + it "returns true" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when start_date < 2023 and uprn_known: nil" do + let(:log) { create(:lettings_log, uprn_known: nil) } + let(:start_date) { Time.utc(2023, 2, 8) } + + it "returns true" do + expect(page.routed_to?(log)).to eq(false) + end + + context "when is_la_inferred: true" do + before do + allow(log).to receive(:is_la_inferred?).and_return(true) + end + + it "returns true" do + expect(page.routed_to?(log)).to eq(false) + end + end + end + end +end diff --git a/spec/models/form/lettings/pages/uprn_confirmation_spec.rb b/spec/models/form/lettings/pages/uprn_confirmation_spec.rb new file mode 100644 index 000000000..e1c6a587d --- /dev/null +++ b/spec/models/form/lettings/pages/uprn_confirmation_spec.rb @@ -0,0 +1,59 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::UprnConfirmation, 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) } + + 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[uprn_confirmed]) + end + + it "has the correct id" do + expect(page.id).to eq("uprn_confirmation") + end + + it "has the correct header" do + expect(page.header).to eq("We found an address that might be this property") + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to be_nil + end + + describe "has correct routed_to?" do + context "when uprn present && uprn_known == 1 " do + let(:log) { create(:lettings_log, uprn_known: 1, uprn: "123456789") } + + it "returns true" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when uprn = nil" do + let(:log) { create(:lettings_log, uprn_known: 1, uprn: nil) } + + it "returns false" do + expect(page.routed_to?(log)).to eq(false) + end + end + + context "when uprn_known == 0" do + let(:log) { create(:lettings_log, uprn_known: 0, uprn: "123456789") } + + it "returns false" do + expect(page.routed_to?(log)).to eq(false) + end + end + end +end diff --git a/spec/models/form/lettings/pages/uprn_known_spec.rb b/spec/models/form/lettings/pages/uprn_known_spec.rb new file mode 100644 index 000000000..27b893a5c --- /dev/null +++ b/spec/models/form/lettings/pages/uprn_known_spec.rb @@ -0,0 +1,51 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::UprnKnown, 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) } + + 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[uprn_known]) + end + + it "has the correct id" do + expect(page.id).to eq("uprn_known") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to be_nil + end + + describe "has correct routed_to?" do + context "when needstype != 2" do + let(:log) { create(:lettings_log, needstype: nil) } + + it "returns true" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when needstype == 2" do + let(:log) { create(:lettings_log, needstype: 2) } + + it "returns true" do + expect(page.routed_to?(log)).to eq(false) + end + end + end +end diff --git a/spec/models/form/lettings/pages/uprn_spec.rb b/spec/models/form/lettings/pages/uprn_spec.rb new file mode 100644 index 000000000..7b480b6b2 --- /dev/null +++ b/spec/models/form/lettings/pages/uprn_spec.rb @@ -0,0 +1,81 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::Uprn, 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) } + + 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[uprn]) + end + + it "has the correct id" do + expect(page.id).to eq("uprn") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has the correct description" do + expect(page.description).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to be_nil + end + + it "has correct skip_text" do + expect(page.skip_text).to eq("Enter address instead") + end + + describe "has correct routed_to?" do + context "when uprn_known != 1" do + let(:log) { create(:lettings_log, uprn_known: 0) } + + it "returns false" do + expect(page.routed_to?(log)).to eq(false) + end + end + + context "when uprn_known == 1" do + let(:log) { create(:lettings_log, uprn_known: 1) } + + it "returns true" do + expect(page.routed_to?(log)).to eq(true) + end + end + + context "when needstype == 2" do + let(:log) { create(:lettings_log, uprn_known: 1, needstype: 2) } + + it "returns true" do + expect(page.routed_to?(log)).to eq(false) + end + end + end + + describe "has correct skip_href" do + context "when log is nil" do + it "is nil" do + expect(page.skip_href).to be_nil + end + end + + context "when log is present" do + let(:log) { create(:lettings_log) } + + it "points to address page" do + expect(page.skip_href(log)).to eq( + "/lettings-logs/#{log.id}/address", + ) + end + end + end +end diff --git a/spec/models/form/lettings/questions/address_line1_spec.rb b/spec/models/form/lettings/questions/address_line1_spec.rb new file mode 100644 index 000000000..781b0a748 --- /dev/null +++ b/spec/models/form/lettings/questions/address_line1_spec.rb @@ -0,0 +1,79 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::AddressLine1, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("address_line1") + end + + it "has the correct header" do + expect(question.header).to eq("Address line 1") + end + + it "has the correct question_number" do + expect(question.question_number).to eq(12) + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Address") + end + + it "has the correct type" do + expect(question.type).to eq("text") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + it "has the correct inferred check answers value" do + expect(question.inferred_check_answers_value).to be_nil + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to be_nil + end + + describe "has the correct get_extra_check_answer_value" do + context "when la is not present" do + let(:log) { create(:lettings_log, la: nil) } + + it "returns nil" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end + end + + context "when la is present but not inferred" do + let(:log) { create(:lettings_log, la: "E09000003", is_la_inferred: false) } + + it "returns nil" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end + end + + context "when la is present but inferred" do + let(:log) { create(:lettings_log, la: "E09000003") } + + before do + allow(log).to receive(:is_la_inferred?).and_return(true) + end + + it "returns the la" do + expect(question.get_extra_check_answer_value(log)).to eq("Barnet") + end + end + end +end diff --git a/spec/models/form/lettings/questions/address_line2_spec.rb b/spec/models/form/lettings/questions/address_line2_spec.rb new file mode 100644 index 000000000..4ac51a231 --- /dev/null +++ b/spec/models/form/lettings/questions/address_line2_spec.rb @@ -0,0 +1,49 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::AddressLine2, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("address_line2") + end + + it "has the correct header" do + expect(question.header).to eq("Address line 2 (optional)") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to be_nil + end + + it "has the correct type" do + expect(question.type).to eq("text") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + it "has the correct inferred check answers value" do + expect(question.inferred_check_answers_value).to be_nil + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to be_nil + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers?).to eq(true) + end +end diff --git a/spec/models/form/lettings/questions/county_spec.rb b/spec/models/form/lettings/questions/county_spec.rb new file mode 100644 index 000000000..cf8f814e4 --- /dev/null +++ b/spec/models/form/lettings/questions/county_spec.rb @@ -0,0 +1,49 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::County, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("county") + end + + it "has the correct header" do + expect(question.header).to eq("County (optional)") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to be_nil + end + + it "has the correct type" do + expect(question.type).to eq("text") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + it "has the correct inferred check answers value" do + expect(question.inferred_check_answers_value).to be_nil + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to be_nil + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers?).to eq(true) + end +end diff --git a/spec/models/form/lettings/questions/la_spec.rb b/spec/models/form/lettings/questions/la_spec.rb index f73a29660..3b5e30977 100644 --- a/spec/models/form/lettings/questions/la_spec.rb +++ b/spec/models/form/lettings/questions/la_spec.rb @@ -315,4 +315,34 @@ RSpec.describe Form::Lettings::Questions::La, type: :model do "E06000065" => "North Yorkshire", }) end + + describe "has the correct hidden_in_check_answers" do + context "when saledate.year before 2023" do + let(:log) { build(:lettings_log, startdate: Time.zone.parse("2022-07-01")) } + + it "returns false" do + expect(question.hidden_in_check_answers?(log)).to eq(false) + end + end + + context "when saledate.year >= 2023" do + let(:log) { build(:lettings_log, startdate: Time.zone.parse("2023-07-01")) } + + it "returns true" do + expect(question.hidden_in_check_answers?(log)).to eq(false) + end + end + + context "when saledate.year >= 2023 and la inferred" do + let(:log) { build(:lettings_log, startdate: Time.zone.parse("2023-07-01")) } + + before do + allow(log).to receive(:is_la_inferred?).and_return(true) + end + + it "returns true" do + expect(question.hidden_in_check_answers?(log)).to eq(true) + end + end + end end diff --git a/spec/models/form/lettings/questions/postcode_for_full_address_spec.rb b/spec/models/form/lettings/questions/postcode_for_full_address_spec.rb new file mode 100644 index 000000000..ccb02ef07 --- /dev/null +++ b/spec/models/form/lettings/questions/postcode_for_full_address_spec.rb @@ -0,0 +1,62 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::PostcodeForFullAddress, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("postcode_full") + end + + it "has the correct header" do + expect(question.header).to eq("Postcode") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to be_nil + end + + it "has the correct type" do + expect(question.type).to eq("text") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + it "has the correct width" do + expect(question.width).to eq(5) + end + + it "has the correct inferred_answers" do + expect(question.inferred_answers).to eq({ + "la" => { + "is_la_inferred" => true, + }, + }) + end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([{ + "condition" => { + "pcodenk" => 1, + }, + "value" => "Not known", + }]) + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers?).to eq(true) + end +end diff --git a/spec/models/form/lettings/questions/town_or_city_spec.rb b/spec/models/form/lettings/questions/town_or_city_spec.rb new file mode 100644 index 000000000..8741fb058 --- /dev/null +++ b/spec/models/form/lettings/questions/town_or_city_spec.rb @@ -0,0 +1,49 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::TownOrCity, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("town_or_city") + end + + it "has the correct header" do + expect(question.header).to eq("Town or city") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to be_nil + end + + it "has the correct type" do + expect(question.type).to eq("text") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + it "has the correct inferred check answers value" do + expect(question.inferred_check_answers_value).to be_nil + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to be_nil + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers?).to eq(true) + end +end diff --git a/spec/models/form/lettings/questions/uprn_confirmation_spec.rb b/spec/models/form/lettings/questions/uprn_confirmation_spec.rb new file mode 100644 index 000000000..3c409641d --- /dev/null +++ b/spec/models/form/lettings/questions/uprn_confirmation_spec.rb @@ -0,0 +1,90 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::UprnConfirmation, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("uprn_confirmed") + end + + it "has the correct header" do + expect(question.header).to eq("Is this the property address?") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Is this the right address?") + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + it "has the correct unanswered_error_message" do + expect(question.unanswered_error_message).to eq("You must answer is this the right address?") + end + + describe "notification_banner" do + context "when address is not present" do + it "returns nil" do + log = create(:lettings_log) + + expect(question.notification_banner(log)).to be_nil + end + end + + context "when address is present" do + it "returns formatted value" do + log = create(:lettings_log, address_line1: "1, Test Street", town_or_city: "Test Town", county: "Test County", postcode_full: "AA1 1AA", uprn: "1234") + + expect(question.notification_banner(log)).to eq( + { + heading: "1, Test Street\nAA1 1AA\nTest Town\nTest County", + title: "UPRN: 1234", + }, + ) + end + end + end + + describe "has the correct hidden_in_check_answers" do + context "when uprn_known != 1 && uprn_confirmed == nil" do + let(:log) { create(:lettings_log, uprn_known: 0, uprn_confirmed: nil) } + + it "returns true" do + expect(question.hidden_in_check_answers?(log)).to eq(true) + end + end + + context "when uprn_known == 1 && uprn_confirmed == nil" do + let(:log) { create(:lettings_log, uprn_known: 1, uprn_confirmed: nil) } + + it "returns false" do + expect(question.hidden_in_check_answers?(log)).to eq(false) + end + end + + context "when uprn_known != 1 && uprn_confirmed == 1" do + let(:log) { create(:lettings_log, uprn_known: 1, uprn_confirmed: 1) } + + it "returns true" do + expect(question.hidden_in_check_answers?(log)).to eq(true) + end + end + end +end diff --git a/spec/models/form/lettings/questions/uprn_known_spec.rb b/spec/models/form/lettings/questions/uprn_known_spec.rb new file mode 100644 index 000000000..1a0f810da --- /dev/null +++ b/spec/models/form/lettings/questions/uprn_known_spec.rb @@ -0,0 +1,59 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::UprnKnown, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("uprn_known") + end + + it "has the correct header" do + expect(question.header).to eq("Do you know the property UPRN?") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("UPRN known?") + end + + it "has the correct type" do + expect(question.type).to eq("radio") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "0" => { "value" => "No" }, + "1" => { "value" => "Yes" }, + }) + end + + it "has correct conditional for" do + expect(question.conditional_for).to be_nil + end + + it "has the correct unanswered_error_message" do + expect(question.unanswered_error_message).to eq("You must answer UPRN known?") + end + + it "has the correct hint" do + expect(question.hint_text).to eq( + "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.

+ You can continue without the UPRN, but it means we will need you to enter the address of the property.", + ) + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers).to be_nil + end +end diff --git a/spec/models/form/lettings/questions/uprn_spec.rb b/spec/models/form/lettings/questions/uprn_spec.rb new file mode 100644 index 000000000..8f6ba047a --- /dev/null +++ b/spec/models/form/lettings/questions/uprn_spec.rb @@ -0,0 +1,92 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::Uprn, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("uprn") + end + + it "has the correct header" do + expect(question.header).to eq("What is the property's UPRN") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("UPRN") + end + + it "has the correct type" do + expect(question.type).to eq("text") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct question_number" do + expect(question.question_number).to eq(11) + end + + it "has the correct hint" do + expect(question.hint_text).to eq("The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.") + end + + it "has the correct unanswered_error_message" do + expect(question.unanswered_error_message).to eq("UPRN must be 12 digits or less") + end + + describe "get_extra_check_answer_value" do + context "when address is not present" do + let(:log) { create(:lettings_log) } + + it "returns nil" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end + end + + context "when address is present" do + let(:log) do + create( + :lettings_log, + address_line1: "1, Test Street", + town_or_city: "Test Town", + county: "Test County", + postcode_full: "AA1 1AA", + la: "E09000003", + ) + end + + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to eq( + "\n\n1, Test Street\nTest Town\nTest County\nAA1 1AA\nWestminster", + ) + end + end + end + + describe "has the correct hidden_in_check_answers" do + context "when uprn_known == 1" do + let(:log) { create(:lettings_log, uprn_known: 1) } + + it "returns false" do + expect(question.hidden_in_check_answers?(log)).to eq(false) + end + end + + context "when uprn_known != 1" do + let(:log) { create(:lettings_log, uprn_known: 0) } + + it "returns false" do + expect(question.hidden_in_check_answers?(log)).to eq(true) + end + end + end +end diff --git a/spec/models/form/lettings/subsections/property_information_spec.rb b/spec/models/form/lettings/subsections/property_information_spec.rb index 227773487..98b336a23 100644 --- a/spec/models/form/lettings/subsections/property_information_spec.rb +++ b/spec/models/form/lettings/subsections/property_information_spec.rb @@ -11,28 +11,67 @@ RSpec.describe Form::Lettings::Subsections::PropertyInformation, type: :model do expect(property_information.section).to eq(section) end - it "has correct pages" do - expect(property_information.pages.map(&:id)).to eq( - %w[ - property_postcode - property_local_authority - first_time_property_let_as_social_housing - property_let_type - property_vacancy_reason_not_first_let - property_vacancy_reason_first_let - property_number_of_times_relet_not_social_let - property_number_of_times_relet_social_let - property_unit_type - property_building_type - property_wheelchair_accessible - property_number_of_bedrooms - void_or_renewal_date - void_date_value_check - new_build_handover_date - property_major_repairs - property_major_repairs_value_check - ], - ) + describe "pages" do + let(:section) { instance_double(Form::Sales::Sections::Household, form: instance_double(Form, start_date:)) } + + context "when 2022" do + let(:start_date) { Time.utc(2022, 2, 8) } + + it "has correct pages" do + expect(property_information.pages.compact.map(&:id)).to eq( + %w[ + property_postcode + property_local_authority + first_time_property_let_as_social_housing + property_let_type + property_vacancy_reason_not_first_let + property_vacancy_reason_first_let + property_number_of_times_relet_not_social_let + property_number_of_times_relet_social_let + property_unit_type + property_building_type + property_wheelchair_accessible + property_number_of_bedrooms + void_or_renewal_date + void_date_value_check + new_build_handover_date + property_major_repairs + property_major_repairs_value_check + ], + ) + end + end + + context "when 2023" do + let(:start_date) { Time.utc(2023, 2, 8) } + + it "has correct pages" do + expect(property_information.pages.map(&:id)).to eq( + %w[ + uprn_known + uprn + uprn_confirmation + address + property_local_authority + first_time_property_let_as_social_housing + property_let_type + property_vacancy_reason_not_first_let + property_vacancy_reason_first_let + property_number_of_times_relet_not_social_let + property_number_of_times_relet_social_let + property_unit_type + property_building_type + property_wheelchair_accessible + property_number_of_bedrooms + void_or_renewal_date + void_date_value_check + new_build_handover_date + property_major_repairs + property_major_repairs_value_check + ], + ) + end + end end it "has the correct id" do