Browse Source

[CLDC-2068] Add UPRN questions to lettings (#1432)

* Update CYA page

* Update UPRN derived fields

* Update sales' UPRN questions

* Add UPRN lettings questions

* Fix spec
pull/1459/head
Jack 2 years ago committed by GitHub
parent
commit
1a5d9fc14b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      app/components/check_answers_summary_list_card_component.html.erb
  2. 21
      app/models/derived_variables/lettings_log_variables.rb
  3. 24
      app/models/form/lettings/pages/address.rb
  4. 8
      app/models/form/lettings/pages/property_local_authority.rb
  5. 28
      app/models/form/lettings/pages/uprn.rb
  6. 17
      app/models/form/lettings/pages/uprn_confirmation.rb
  7. 16
      app/models/form/lettings/pages/uprn_known.rb
  8. 38
      app/models/form/lettings/questions/address_line1.rb
  9. 13
      app/models/form/lettings/questions/address_line2.rb
  10. 13
      app/models/form/lettings/questions/county.rb
  11. 4
      app/models/form/lettings/questions/la.rb
  12. 25
      app/models/form/lettings/questions/postcode_for_full_address.rb
  13. 13
      app/models/form/lettings/questions/town_or_city.rb
  14. 35
      app/models/form/lettings/questions/uprn.rb
  15. 34
      app/models/form/lettings/questions/uprn_confirmation.rb
  16. 21
      app/models/form/lettings/questions/uprn_known.rb
  17. 19
      app/models/form/lettings/subsections/property_information.rb
  18. 1
      app/models/form/sales/questions/address_line1.rb
  19. 1
      app/models/form/sales/questions/uprn.rb
  20. 5
      app/models/lettings_log.rb
  21. 1
      app/models/log.rb
  22. 2
      app/views/form/_check_answers_summary_list.html.erb
  23. 73
      spec/models/form/lettings/pages/address_spec.rb
  24. 77
      spec/models/form/lettings/pages/property_local_authority_spec.rb
  25. 59
      spec/models/form/lettings/pages/uprn_confirmation_spec.rb
  26. 51
      spec/models/form/lettings/pages/uprn_known_spec.rb
  27. 81
      spec/models/form/lettings/pages/uprn_spec.rb
  28. 79
      spec/models/form/lettings/questions/address_line1_spec.rb
  29. 49
      spec/models/form/lettings/questions/address_line2_spec.rb
  30. 49
      spec/models/form/lettings/questions/county_spec.rb
  31. 30
      spec/models/form/lettings/questions/la_spec.rb
  32. 62
      spec/models/form/lettings/questions/postcode_for_full_address_spec.rb
  33. 49
      spec/models/form/lettings/questions/town_or_city_spec.rb
  34. 90
      spec/models/form/lettings/questions/uprn_confirmation_spec.rb
  35. 59
      spec/models/form/lettings/questions/uprn_known_spec.rb
  36. 92
      spec/models/form/lettings/questions/uprn_spec.rb
  37. 83
      spec/models/form/lettings/subsections/property_information_spec.rb
  38. 4
      spec/models/form/sales/questions/address_line1_spec.rb
  39. 4
      spec/models/form/sales/questions/uprn_spec.rb
  40. 57
      spec/models/lettings_log_spec.rb
  41. 10
      spec/models/sales_log_spec.rb

16
app/components/check_answers_summary_list_card_component.html.erb

@ -12,16 +12,22 @@
<% summary_list.row do |row| %> <% summary_list.row do |row| %>
<% row.key { get_question_label(question) } %> <% row.key { get_question_label(question) } %>
<% row.value do %> <% row.value do %>
<span class="govuk-!-margin-right-4"><%= get_answer_label(question) %></span> <%= simple_format(
get_answer_label(question),
wrapper_tag: "span",
class: "govuk-!-margin-right-4",
) %>
<% extra_value = question.get_extra_check_answer_value(log) %> <% extra_value = question.get_extra_check_answer_value(log) %>
<% if extra_value %> <% if extra_value && question.answer_label(log).present? %>
<span class="govuk-!-font-weight-regular app-!-colour-muted"><%= extra_value %></span> <%= simple_format(
extra_value,
wrapper_tag: "span",
class: "govuk-!-font-weight-regular app-!-colour-muted",
) %>
<% end %> <% end %>
<br>
<% question.get_inferred_answers(log).each do |inferred_answer| %> <% question.get_inferred_answers(log).each do |inferred_answer| %>
<span class="govuk-!-font-weight-regular app-!-colour-muted"><%= inferred_answer %></span> <span class="govuk-!-font-weight-regular app-!-colour-muted"><%= inferred_answer %></span>
<% end %> <% end %>

21
app/models/derived_variables/lettings_log_variables.rb

@ -94,6 +94,17 @@ module DerivedVariables::LettingsLogVariables
self.vacdays = property_vacant_days self.vacdays = property_vacant_days
set_housingneeds_fields if housingneeds? set_housingneeds_fields if housingneeds?
if uprn_known&.zero?
self.uprn = nil
end
if uprn_confirmed&.zero?
self.uprn = nil
self.uprn_known = 0
end
reset_address_fields! if is_supported_housing?
end end
private private
@ -229,4 +240,14 @@ private
self.housingneeds_g = 0 self.housingneeds_g = 0
self.housingneeds_h = 0 self.housingneeds_h = 0
end end
def reset_address_fields!
self.uprn = nil
self.uprn_known = nil
self.uprn_confirmed = nil
self.address_line1 = nil
self.address_line2 = nil
self.town_or_city = nil
self.county = nil
end
end end

24
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

8
app/models/form/lettings/pages/property_local_authority.rb

@ -8,4 +8,12 @@ class Form::Lettings::Pages::PropertyLocalAuthority < ::Form::Page
def questions def questions
@questions ||= [Form::Lettings::Questions::La.new(nil, nil, self)] @questions ||= [Form::Lettings::Questions::La.new(nil, nil, self)]
end 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 end

28
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

17
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

16
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

38
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

13
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

13
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

4
app/models/form/lettings/questions/la.rb

@ -13,4 +13,8 @@ class Form::Lettings::Questions::La < ::Form::Question
def answer_options def answer_options
{ "" => "Select an option" }.merge(LocalAuthority.active(form.start_date).england.map { |la| [la.code, la.name] }.to_h) { "" => "Select an option" }.merge(LocalAuthority.active(form.start_date).england.map { |la| [la.code, la.name] }.to_h)
end end
def hidden_in_check_answers?(log, _current_user = nil)
log.startdate && log.startdate.year >= 2023 && log.is_la_inferred?
end
end end

25
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

13
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

35
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

34
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

21
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.<br><br>
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

19
app/models/form/lettings/subsections/property_information.rb

@ -8,7 +8,7 @@ class Form::Lettings::Subsections::PropertyInformation < ::Form::Subsection
def pages def pages
@pages ||= [ @pages ||= [
Form::Lettings::Pages::PropertyPostcode.new(nil, nil, self), uprn_questions,
Form::Lettings::Pages::PropertyLocalAuthority.new(nil, nil, self), Form::Lettings::Pages::PropertyLocalAuthority.new(nil, nil, self),
Form::Lettings::Pages::FirstTimePropertyLetAsSocialHousing.new(nil, nil, self), Form::Lettings::Pages::FirstTimePropertyLetAsSocialHousing.new(nil, nil, self),
Form::Lettings::Pages::PropertyLetType.new(nil, nil, self), Form::Lettings::Pages::PropertyLetType.new(nil, nil, self),
@ -25,7 +25,22 @@ class Form::Lettings::Subsections::PropertyInformation < ::Form::Subsection
Form::Lettings::Pages::NewBuildHandoverDate.new(nil, nil, self), Form::Lettings::Pages::NewBuildHandoverDate.new(nil, nil, self),
Form::Lettings::Pages::PropertyMajorRepairs.new(nil, nil, self), Form::Lettings::Pages::PropertyMajorRepairs.new(nil, nil, self),
Form::Lettings::Pages::PropertyMajorRepairsValueCheck.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
def displayed_in_tasklist?(log) def displayed_in_tasklist?(log)

1
app/models/form/sales/questions/address_line1.rb

@ -6,6 +6,7 @@ class Form::Sales::Questions::AddressLine1 < ::Form::Question
@header = "Address line 1" @header = "Address line 1"
@type = "text" @type = "text"
@plain_label = true @plain_label = true
@question_number = 15
end end
def hidden_in_check_answers?(log, _current_user = nil) def hidden_in_check_answers?(log, _current_user = nil)

1
app/models/form/sales/questions/uprn.rb

@ -7,6 +7,7 @@ class Form::Sales::Questions::Uprn < ::Form::Question
@type = "text" @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." @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 @width = 10
@question_number = 14
end end
def unanswered_error_message def unanswered_error_message

5
app/models/lettings_log.rb

@ -32,6 +32,7 @@ class LettingsLog < Log
before_validation :reset_location_fields!, unless: :postcode_known? before_validation :reset_location_fields!, unless: :postcode_known?
before_validation :reset_previous_location_fields!, unless: :previous_postcode_known? before_validation :reset_previous_location_fields!, unless: :previous_postcode_known?
before_validation :set_derived_fields! before_validation :set_derived_fields!
after_validation :process_uprn_change!, if: :should_process_uprn_change?
belongs_to :scheme, optional: true belongs_to :scheme, optional: true
belongs_to :location, optional: true belongs_to :location, optional: true
@ -679,4 +680,8 @@ private
def unknown_housingneeds? def unknown_housingneeds?
housingneeds == 3 housingneeds == 3
end end
def should_process_uprn_change?
uprn_changed? && startdate && startdate.year >= 2023
end
end end

1
app/models/log.rb

@ -45,6 +45,7 @@ class Log < ApplicationRecord
self.address_line2 = presenter.address_line2 self.address_line2 = presenter.address_line2
self.town_or_city = presenter.town_or_city self.town_or_city = presenter.town_or_city
self.postcode_full = presenter.postcode self.postcode_full = presenter.postcode
self.county = nil
process_postcode_changes! process_postcode_changes!
end end
end end

2
app/views/form/_check_answers_summary_list.html.erb

@ -9,7 +9,7 @@
class: "govuk-!-margin-right-4", class: "govuk-!-margin-right-4",
) %> ) %>
<% extra_value = question.get_extra_check_answer_value(@log) %> <% extra_value = question.get_extra_check_answer_value(@log) %>
<% if extra_value && question.answer_label(lettings_log, current_user).present? %> <% if extra_value && question.answer_label(@log, current_user).present? %>
<%= simple_format( <%= simple_format(
extra_value, extra_value,
wrapper_tag: "span", wrapper_tag: "span",

73
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

77
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_general_needs?" => true, "is_la_inferred" => false }])
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

59
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

51
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

81
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

79
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

49
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

49
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

30
spec/models/form/lettings/questions/la_spec.rb

@ -315,4 +315,34 @@ RSpec.describe Form::Lettings::Questions::La, type: :model do
"E06000065" => "North Yorkshire", "E06000065" => "North Yorkshire",
}) })
end 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 end

62
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

49
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

90
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

59
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.<br><br>
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

92
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

83
spec/models/form/lettings/subsections/property_information_spec.rb

@ -9,28 +9,67 @@ RSpec.describe Form::Lettings::Subsections::PropertyInformation, type: :model do
expect(property_information.section).to eq(section) expect(property_information.section).to eq(section)
end end
it "has correct pages" do describe "pages" do
expect(property_information.pages.map(&:id)).to eq( let(:section) { instance_double(Form::Sales::Sections::Household, form: instance_double(Form, start_date:)) }
%w[
property_postcode context "when 2022" do
property_local_authority let(:start_date) { Time.utc(2022, 2, 8) }
first_time_property_let_as_social_housing
property_let_type it "has correct pages" do
property_vacancy_reason_not_first_let expect(property_information.pages.compact.map(&:id)).to eq(
property_vacancy_reason_first_let %w[
property_number_of_times_relet_not_social_let property_postcode
property_number_of_times_relet_social_let property_local_authority
property_unit_type first_time_property_let_as_social_housing
property_building_type property_let_type
property_wheelchair_accessible property_vacancy_reason_not_first_let
property_number_of_bedrooms property_vacancy_reason_first_let
void_or_renewal_date property_number_of_times_relet_not_social_let
void_date_value_check property_number_of_times_relet_social_let
new_build_handover_date property_unit_type
property_major_repairs property_building_type
property_major_repairs_value_check 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 end
it "has the correct id" do it "has the correct id" do

4
spec/models/form/sales/questions/address_line1_spec.rb

@ -11,6 +11,10 @@ RSpec.describe Form::Sales::Questions::AddressLine1, type: :model do
expect(question.page).to eq(page) expect(question.page).to eq(page)
end end
it "has the correct question_number" do
expect(question.question_number).to eq(15)
end
it "has the correct id" do it "has the correct id" do
expect(question.id).to eq("address_line1") expect(question.id).to eq("address_line1")
end end

4
spec/models/form/sales/questions/uprn_spec.rb

@ -31,6 +31,10 @@ RSpec.describe Form::Sales::Questions::Uprn, type: :model do
expect(question.derived?).to be false expect(question.derived?).to be false
end end
it "has the correct question_number" do
expect(question.question_number).to eq(14)
end
it "has the correct hint" do 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.") 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 end

57
spec/models/lettings_log_spec.rb

@ -1,6 +1,7 @@
require "rails_helper" require "rails_helper"
require "shared/shared_examples_for_derived_fields" require "shared/shared_examples_for_derived_fields"
# rubocop:disable RSpec/AnyInstance
RSpec.describe LettingsLog do RSpec.describe LettingsLog do
let(:different_managing_organisation) { create(:organisation) } let(:different_managing_organisation) { create(:organisation) }
let(:created_by_user) { create(:user) } let(:created_by_user) { create(:user) }
@ -3010,4 +3011,60 @@ RSpec.describe LettingsLog do
end end
end end
end end
describe "#process_uprn_change!" do
context "when UPRN set to a value" do
let(:lettings_log) do
create(
:lettings_log,
uprn: "123456789",
uprn_confirmed: 1,
county: "county",
)
end
it "updates sales log fields" do
lettings_log.uprn = "1111111"
allow_any_instance_of(UprnClient).to receive(:call)
allow_any_instance_of(UprnClient).to receive(:result).and_return({
"UPRN" => "UPRN",
"UDPRN" => "UDPRN",
"ADDRESS" => "full address",
"SUB_BUILDING_NAME" => "0",
"BUILDING_NAME" => "building name",
"THOROUGHFARE_NAME" => "thoroughfare",
"POST_TOWN" => "posttown",
"POSTCODE" => "postcode",
})
expect { lettings_log.process_uprn_change! }.to change(lettings_log, :address_line1).from(nil).to("0, Building Name, Thoroughfare")
.and change(lettings_log, :town_or_city).from(nil).to("Posttown")
.and change(lettings_log, :postcode_full).from(nil).to("POSTCODE")
.and change(lettings_log, :uprn_confirmed).from(1).to(nil)
.and change(lettings_log, :county).from("county").to(nil)
end
end
context "when UPRN nil" do
let(:lettings_log) { create(:lettings_log, uprn: nil) }
it "does not update sales log" do
expect { lettings_log.process_uprn_change! }.not_to change(lettings_log, :attributes)
end
end
context "when service errors" do
let(:lettings_log) { create(:lettings_log, uprn: "123456789", uprn_confirmed: 1) }
let(:error_message) { "error" }
it "adds error to sales log" do
allow_any_instance_of(UprnClient).to receive(:call)
allow_any_instance_of(UprnClient).to receive(:error).and_return(error_message)
expect { lettings_log.process_uprn_change! }.to change { lettings_log.errors[:uprn] }.from([]).to([error_message])
end
end
end
end end
# rubocop:enable RSpec/AnyInstance

10
spec/models/sales_log_spec.rb

@ -517,7 +517,14 @@ RSpec.describe SalesLog, type: :model do
describe "#process_uprn_change!" do describe "#process_uprn_change!" do
context "when UPRN set to a value" do context "when UPRN set to a value" do
let(:sales_log) { create(:sales_log, uprn: "123456789", uprn_confirmed: 1) } let(:sales_log) do
create(
:sales_log,
uprn: "123456789",
uprn_confirmed: 1,
county: "county",
)
end
it "updates sales log fields" do it "updates sales log fields" do
sales_log.uprn = "1111111" sales_log.uprn = "1111111"
@ -538,6 +545,7 @@ RSpec.describe SalesLog, type: :model do
.and change(sales_log, :town_or_city).from(nil).to("Posttown") .and change(sales_log, :town_or_city).from(nil).to("Posttown")
.and change(sales_log, :postcode_full).from(nil).to("POSTCODE") .and change(sales_log, :postcode_full).from(nil).to("POSTCODE")
.and change(sales_log, :uprn_confirmed).from(1).to(nil) .and change(sales_log, :uprn_confirmed).from(1).to(nil)
.and change(sales_log, :county).from("county").to(nil)
end end
end end

Loading…
Cancel
Save