Browse Source

Refactor model form tests

pull/2421/head
Kat 2 years ago committed by kosiakkatrina
parent
commit
d051728f68
  1. 2
      app/models/form/sales/pages/buyer_previous.rb
  2. 2
      app/models/form/sales/pages/la_nominations.rb
  3. 2
      app/models/form/sales/pages/last_accommodation.rb
  4. 2
      app/models/form/sales/pages/last_accommodation_la.rb
  5. 2
      spec/models/form/lettings/questions/address_line1_for_address_matcher_spec.rb
  6. 6
      spec/models/form/lettings/questions/location_id_spec.rb
  7. 2
      spec/models/form/lettings/questions/postcode_for_address_matcher_spec.rb
  8. 26
      spec/models/form/lettings/questions/stock_owner_spec.rb
  9. 2
      spec/models/form/lettings/questions/uprn_selection_spec.rb
  10. 75
      spec/models/form/page_spec.rb
  11. 187
      spec/models/form/question_spec.rb
  12. 32
      spec/models/form/sales/pages/buyer_previous_spec.rb
  13. 24
      spec/models/form/sales/pages/la_nominations_spec.rb
  14. 22
      spec/models/form/sales/pages/last_accommodation_la_spec.rb
  15. 20
      spec/models/form/sales/pages/last_accommodation_spec.rb
  16. 40
      spec/models/form/sales/questions/owning_organisation_id_spec.rb
  17. 52
      spec/models/form/subsection_spec.rb

2
app/models/form/sales/pages/buyer_previous.rb

@ -12,7 +12,7 @@ class Form::Sales::Pages::BuyerPrevious < ::Form::Page
end end
def routed_to?(log, _current_user) def routed_to?(log, _current_user)
return false if log.is_staircase? && log.form.start_year_after_2024? return false if log.is_staircase? && form.start_year_after_2024?
super super
end end

2
app/models/form/sales/pages/la_nominations.rb

@ -11,7 +11,7 @@ class Form::Sales::Pages::LaNominations < ::Form::Page
end end
def routed_to?(log, _current_user) def routed_to?(log, _current_user)
return false if log.staircase == 1 && log.form.start_year_after_2024? return false if log.staircase == 1 && form.start_year_after_2024?
super super
end end

2
app/models/form/sales/pages/last_accommodation.rb

@ -12,7 +12,7 @@ class Form::Sales::Pages::LastAccommodation < ::Form::Page
end end
def routed_to?(log, _user) def routed_to?(log, _user)
return false if log.form.start_year_after_2024? && log.discounted_ownership_sale? return false if form.start_year_after_2024? && log.discounted_ownership_sale?
super super
end end

2
app/models/form/sales/pages/last_accommodation_la.rb

@ -15,7 +15,7 @@ class Form::Sales::Pages::LastAccommodationLa < ::Form::Page
end end
def routed_to?(log, _user) def routed_to?(log, _user)
return false if log.form.start_year_after_2024? && log.discounted_ownership_sale? return false if form.start_year_after_2024? && log.discounted_ownership_sale?
super super
end end

2
spec/models/form/lettings/questions/address_line1_for_address_matcher_spec.rb

@ -6,7 +6,7 @@ RSpec.describe Form::Lettings::Questions::AddressLine1ForAddressMatcher, type: :
let(:question_id) { nil } let(:question_id) { nil }
let(:question_definition) { nil } let(:question_definition) { nil }
let(:page) { instance_double(Form::Page) } let(:page) { instance_double(Form::Page) }
let(:log) { create(:lettings_log, :in_progress, address_line1_input: "Address line 1", postcode_full_input: "AA1 1AA") } let(:log) { build(:lettings_log, :in_progress, address_line1_input: "Address line 1", postcode_full_input: "AA1 1AA") }
it "has correct page" do it "has correct page" do
expect(question.page).to eq(page) expect(question.page).to eq(page)

6
spec/models/form/lettings/questions/location_id_spec.rb

@ -61,11 +61,7 @@ RSpec.describe Form::Lettings::Questions::LocationId, type: :model do
context "when selected scheme has locations" do context "when selected scheme has locations" do
before do before do
Timecop.freeze(Time.utc(2022, 5, 12)) allow(Time).to receive(:now).and_return(Time.utc(2022, 5, 12))
end
after do
Timecop.unfreeze
end end
context "and all the locations have a startdate more than 2 weeks in the future" do context "and all the locations have a startdate more than 2 weeks in the future" do

2
spec/models/form/lettings/questions/postcode_for_address_matcher_spec.rb

@ -6,7 +6,7 @@ RSpec.describe Form::Lettings::Questions::PostcodeForAddressMatcher, type: :mode
let(:question_id) { nil } let(:question_id) { nil }
let(:question_definition) { nil } let(:question_definition) { nil }
let(:page) { instance_double(Form::Page) } let(:page) { instance_double(Form::Page) }
let(:log) { create(:lettings_log, :in_progress, address_line1_input: "Address line 1", postcode_full_input: "AA1 1AA") } let(:log) { build(:lettings_log, :in_progress, address_line1_input: "Address line 1", postcode_full_input: "AA1 1AA") }
it "has correct page" do it "has correct page" do
expect(question.page).to eq(page) expect(question.page).to eq(page)

26
spec/models/form/lettings/questions/stock_owner_spec.rb

@ -117,11 +117,7 @@ RSpec.describe Form::Lettings::Questions::StockOwner, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation)
user.organisation.update!(available_from: Time.zone.local(2021, 2, 2)) user.organisation.update!(available_from: Time.zone.local(2021, 2, 2))
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "shows merged organisation as an option" do it "shows merged organisation as an option" do
@ -143,11 +139,7 @@ RSpec.describe Form::Lettings::Questions::StockOwner, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation)
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "shows merged organisation as an option" do it "shows merged organisation as an option" do
@ -167,16 +159,12 @@ RSpec.describe Form::Lettings::Questions::StockOwner, type: :model do
end end
before do before do
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
org_rel.update!(child_organisation: merged_organisation) org_rel.update!(child_organisation: merged_organisation)
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation)
user.organisation.update!(available_from: Time.zone.local(2021, 2, 2)) user.organisation.update!(available_from: Time.zone.local(2021, 2, 2))
end end
after do
Timecop.return
end
it "does not show merged organisations stock owners as options" do it "does not show merged organisations stock owners as options" do
expect(question.displayed_answer_options(log, user)).to eq(options) expect(question.displayed_answer_options(log, user)).to eq(options)
end end
@ -193,7 +181,7 @@ RSpec.describe Form::Lettings::Questions::StockOwner, type: :model do
end end
before do before do
Timecop.freeze(Time.zone.local(2023, 4, 2)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 4, 2))
org_rel.update!(child_organisation: merged_organisation) org_rel.update!(child_organisation: merged_organisation)
merged_organisation.update!(merge_date: Time.zone.local(2021, 6, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2021, 6, 2), absorbing_organisation: user.organisation)
user.organisation.update!(available_from: Time.zone.local(2021, 2, 2)) user.organisation.update!(available_from: Time.zone.local(2021, 2, 2))
@ -238,11 +226,7 @@ RSpec.describe Form::Lettings::Questions::StockOwner, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: org) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: org)
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "shows merged organisation as an option" do it "shows merged organisation as an option" do

2
spec/models/form/lettings/questions/uprn_selection_spec.rb

@ -6,7 +6,7 @@ RSpec.describe Form::Lettings::Questions::UprnSelection, type: :model do
let(:question_id) { nil } let(:question_id) { nil }
let(:question_definition) { nil } let(:question_definition) { nil }
let(:page) { instance_double(Form::Page, skip_href: "skip_href") } let(:page) { instance_double(Form::Page, skip_href: "skip_href") }
let(:log) { create(:lettings_log, :in_progress, address_line1_input: "Address line 1", postcode_full_input: "AA1 1AA") } let(:log) { build(:lettings_log, :in_progress, address_line1_input: "Address line 1", postcode_full_input: "AA1 1AA") }
let(:address_client_instance) { AddressClient.new(log.address_string) } let(:address_client_instance) { AddressClient.new(log.address_string) }
before do before do

75
spec/models/form/page_spec.rb

@ -3,30 +3,21 @@ require "rails_helper"
RSpec.describe Form::Page, type: :model do RSpec.describe Form::Page, type: :model do
subject(:page) { described_class.new(page_id, page_definition, subsection) } subject(:page) { described_class.new(page_id, page_definition, subsection) }
around do |example|
Timecop.freeze(Time.zone.local(2022, 1, 1)) do
Singleton.__init__(FormHandler)
example.run
end
Timecop.return
Singleton.__init__(FormHandler)
end
let(:user) { FactoryBot.create(:user) } let(:user) { FactoryBot.create(:user) }
let(:lettings_log) { FactoryBot.build(:lettings_log) } let(:lettings_log) { FactoryBot.build(:lettings_log) }
let(:form) { lettings_log.form } let(:depends_on) { nil }
let(:section_id) { "rent_and_charges" } let(:enabled) { true }
let(:section_definition) { form.form_definition["sections"][section_id] } let(:depends_on_met) { true }
let(:section) { Form::Section.new(section_id, section_definition, form) } let(:form) { instance_double(Form, depends_on_met:) }
let(:subsection_id) { "income_and_benefits" } let(:subsection) { instance_double(Form::Subsection, depends_on:, enabled?: enabled, form:) }
let(:subsection_definition) { section_definition["subsections"][subsection_id] }
let(:subsection) { Form::Subsection.new(subsection_id, subsection_definition, section) }
let(:page_id) { "net_income" } let(:page_id) { "net_income" }
let(:page_definition) { subsection_definition["pages"][page_id] } let(:questions) { [["earnings", { "conditional_for" => { "age1": nil }, "type" => "radio" }], %w[incfreq]] }
let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } let(:page_definition) do
{
before do "header" => "Test header",
allow(FormHandler.instance).to receive(:current_lettings_form).and_return(fake_2021_2022_form) "description" => "Some extra text for the page",
"questions" => questions,
}
end end
it "has an id" do it "has an id" do
@ -46,15 +37,11 @@ RSpec.describe Form::Page, type: :model do
expect(page.questions.map(&:id)).to eq(expected_questions) expect(page.questions.map(&:id)).to eq(expected_questions)
end end
context "with a page having conditional questions" do
let(:page_id) { "housing_benefit" }
it "knows which questions are not conditional" do it "knows which questions are not conditional" do
expected_non_conditional_questions = %w[hb] expected_non_conditional_questions = %w[earnings incfreq]
expect(page.non_conditional_questions.map(&:id)) expect(page.non_conditional_questions.map(&:id))
.to eq(expected_non_conditional_questions) .to eq(expected_non_conditional_questions)
end end
end
describe "#interruption_screen?" do describe "#interruption_screen?" do
context "when it has regular questions" do context "when it has regular questions" do
@ -64,7 +51,7 @@ RSpec.describe Form::Page, type: :model do
end end
context "when it has interruption_screen question" do context "when it has interruption_screen question" do
let(:page) { form.get_page("retirement_value_check") } let(:questions) { [["earnings", { "type" => "interruption_screen" }]] }
it "returns true" do it "returns true" do
expect(page.interruption_screen?).to be true expect(page.interruption_screen?).to be true
@ -80,43 +67,33 @@ RSpec.describe Form::Page, type: :model do
end end
context "with routing conditions" do context "with routing conditions" do
let(:page_id) { "dependent_page" } let(:depends_on) { true }
it "evaluates not met conditions correctly" do context "when the conditions are not met" do
expect(page.routed_to?(lettings_log, user)).to be false let(:depends_on_met) { false }
end
it "evaluates met conditions correctly" do it "evaluates conditions correctly" do
lettings_log.incfreq = 1 expect(page.routed_to?(lettings_log, user)).to be false
expect(page.routed_to?(lettings_log, user)).to be true
end end
end end
context "with expression routing conditions" do context "when the conditions are met" do
let(:section_id) { "household" } let(:depends_on_met) { true }
let(:subsection_id) { "household_characteristics" }
let(:page_id) { "person_2_working_situation" }
it "evaluates not met conditions correctly" do
lettings_log.age2 = 12
expect(page.routed_to?(lettings_log, user)).to be false
end
it "evaluates met conditions correctly" do it "evaluates met conditions correctly" do
lettings_log.age2 = 17 lettings_log.incfreq = 1
expect(page.routed_to?(lettings_log, user)).to be true expect(page.routed_to?(lettings_log, user)).to be true
end end
end end
end
context "when the page's subsection has routing conditions" do context "when the page's subsection has routing conditions" do
let(:section_id) { "submission" } let(:depends_on) { true }
let(:subsection_id) { "declaration" } let(:depends_on_met) { true }
let(:page_id) { "declaration" } let(:enabled) { false }
let(:completed_lettings_log) { FactoryBot.build(:lettings_log, :completed, incfreq: "Weekly") }
it "evaluates the sections dependencies" do it "evaluates the sections dependencies" do
expect(page.routed_to?(lettings_log, user)).to be false expect(page.routed_to?(lettings_log, user)).to be false
expect(page.routed_to?(completed_lettings_log, user)).to be true
end end
end end
end end

187
spec/models/form/question_spec.rb

@ -3,32 +3,35 @@ require "rails_helper"
RSpec.describe Form::Question, type: :model do RSpec.describe Form::Question, type: :model do
subject(:question) { described_class.new(question_id, question_definition, page) } subject(:question) { described_class.new(question_id, question_definition, page) }
around do |example|
Timecop.freeze(Time.zone.local(2022, 1, 1)) do
Singleton.__init__(FormHandler)
example.run
end
Timecop.return
Singleton.__init__(FormHandler)
end
let(:lettings_log) { FactoryBot.build(:lettings_log) } let(:lettings_log) { FactoryBot.build(:lettings_log) }
let(:form) { lettings_log.form } let(:type) { "numeric" }
let(:section_id) { "rent_and_charges" } let(:readonly) { nil }
let(:section_definition) { form.form_definition["sections"][section_id] } let(:prefix) { nil }
let(:section) { Form::Section.new(section_id, section_definition, form) } let(:suffix) { nil }
let(:subsection_id) { "income_and_benefits" } let(:depends_on_met) { nil }
let(:subsection_definition) { section_definition["subsections"][subsection_id] } let(:conditional_question_conditions) { nil }
let(:subsection) { Form::Subsection.new(subsection_id, subsection_definition, section) } let(:form_questions) { nil }
let(:page_id) { "net_income" } let(:answer_options) { { "1" => { "value" => "Weekly" }, "2" => { "value" => "Monthly" } } }
let(:page_definition) { subsection_definition["pages"][page_id] } let(:inferred_check_answers_value) { [{ "condition" => { "postcode_known" => 0 }, "value" => "Weekly" }] }
let(:page) { Form::Page.new(page_id, page_definition, subsection) }
let(:form) { instance_double(Form, depends_on_met:, conditional_question_conditions:) }
let(:subsection) { instance_double(Form::Subsection, form:) }
let(:page) { instance_double(Form::Page, subsection:, routed_to?: true, questions: form_questions) }
let(:question_id) { "earnings" } let(:question_id) { "earnings" }
let(:question_definition) { page_definition["questions"][question_id] } let(:question_definition) do
let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } { "header" => "What is the tenant’s /and partner’s combined income after tax?",
"check_answer_label" => "Income",
before do "type" => type,
allow(FormHandler.instance).to receive(:current_lettings_form).and_return(fake_2021_2022_form) "min" => 0,
"step" => 1,
"answer_options" => answer_options,
"readonly" => readonly,
"result-field" => "tcharge",
"fields-to-add" => %w[brent scharge pscharge supcharg],
"inferred_check_answers_value" => inferred_check_answers_value,
"suffix" => suffix,
"prefix" => prefix,
"hidden_in_check_answers" => {} }
end end
it "has an id" do it "has an id" do
@ -80,10 +83,10 @@ RSpec.describe Form::Question, type: :model do
end end
context "when type is radio" do context "when type is radio" do
let(:question_id) { "incfreq" } let(:type) { "radio" }
it "has answer options" do it "has answer options" do
expected_answer_options = { "1" => { "value" => "Weekly" }, "2" => { "value" => "Monthly" }, "3" => { "value" => "Yearly" } } expected_answer_options = { "1" => { "value" => "Weekly" }, "2" => { "value" => "Monthly" } }
expect(question.answer_options).to eq(expected_answer_options) expect(question.answer_options).to eq(expected_answer_options)
end end
@ -92,13 +95,10 @@ RSpec.describe Form::Question, type: :model do
end end
it "can map label from value" do it "can map label from value" do
expect(question.label_from_value(3)).to eq("Yearly") expect(question.label_from_value(1)).to eq("Weekly")
end end
context "when answer options include yes, no, prefer not to say" do context "when answer options include yes, no, prefer not to say" do
let(:section_id) { "household" }
let(:subsection_id) { "household_needs" }
let(:page_id) { "medical_conditions" }
let(:question_id) { "illness" } let(:question_id) { "illness" }
it "maps those options" do it "maps those options" do
@ -109,9 +109,6 @@ RSpec.describe Form::Question, type: :model do
end end
context "when answer options includes don’t know" do context "when answer options includes don’t know" do
let(:section_id) { "local_authority" }
let(:subsection_id) { "local_authority" }
let(:page_id) { "time_lived_in_la" }
let(:question_id) { "layear" } let(:question_id) { "layear" }
it "maps those options" do it "maps those options" do
@ -128,23 +125,11 @@ RSpec.describe Form::Question, type: :model do
end end
context "when answer options include derived options" do context "when answer options include derived options" do
let(:section_id) { "household" } let(:answer_options) { { "0" => { "value" => "Other" }, "9" => { "value" => "This", "depends_on" => [false] } } }
let(:subsection_id) { "household_characteristics" } let(:depends_on_met) { false }
let(:page_id) { "person_2_working_situation" }
let(:question_id) { "ecstat2" }
let(:expected_answer_options) do let(:expected_answer_options) do
{ {
"0" => { "value" => "Other" }, "0" => { "value" => "Other" },
"1" => { "value" => "Full-time – 30 hours or more" },
"10" => { "value" => "Tenant prefers not to say" },
"2" => { "value" => "Part-time – Less than 30 hours" },
"3" => { "value" => "In government training into work, such as New Deal" },
"4" => { "value" => "Jobseeker" },
"5" => { "value" => "Retired" },
"6" => { "value" => "Not seeking work" },
"7" => { "value" => "Full-time student" },
"8" => { "value" => "Unable to work because of long term sick or disability" },
"divider" => { "value" => true },
} }
end end
@ -153,7 +138,7 @@ RSpec.describe Form::Question, type: :model do
end end
it "can still map the value label" do it "can still map the value label" do
expect(question.label_from_value(9)).to eq("Child under 16") expect(question.label_from_value(9)).to eq("This")
end end
end end
@ -165,10 +150,8 @@ RSpec.describe Form::Question, type: :model do
end end
context "when type is select" do context "when type is select" do
let(:section_id) { "household" } let(:type) { "select" }
let(:subsection_id) { "household_needs" } let(:answer_options) { { "E08000003" => "Manchester", "E09000033" => "Westminster" } }
let(:page_id) { "accessible_select" }
let(:question_id) { "prevloc" }
it "can map value from label" do it "can map value from label" do
expect(question.value_from_label("Manchester")).to eq("E08000003") expect(question.value_from_label("Manchester")).to eq("E08000003")
@ -186,10 +169,9 @@ RSpec.describe Form::Question, type: :model do
end end
context "when type is checkbox" do context "when type is checkbox" do
let(:section_id) { "household" } let(:type) { "checkbox" }
let(:subsection_id) { "household_needs" } let(:page_id) { "illness" }
let(:page_id) { "condition_effects" } let(:answer_options) { { "illness_type_1" => { "value" => "Vision - such as blindness or partial sight" }, "illness_type_2" => { "value" => "Hearing - such as deafness or partial hearing" } } }
let(:question_id) { "condition_effects" }
it "has answer options" do it "has answer options" do
expected_answer_options = { expected_answer_options = {
@ -206,9 +188,7 @@ RSpec.describe Form::Question, type: :model do
end end
context "when the question is read only" do context "when the question is read only" do
let(:subsection_id) { "rent_and_charges" } let(:readonly) { true }
let(:page_id) { "rent" }
let(:question_id) { "tcharge" }
it "has a read only helper" do it "has a read only helper" do
expect(question.read_only?).to be true expect(question.read_only?).to be true
@ -231,6 +211,8 @@ RSpec.describe Form::Question, type: :model do
context "with a lettings log" do context "with a lettings log" do
let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress) } let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress) }
let(:question_id) { "incfreq" } let(:question_id) { "incfreq" }
let(:type) { "radio" }
let(:answer_options) { { "1" => { "value" => "Weekly" }, "2" => { "value" => "Monthly" }, "3" => { "value" => "Yearly", "depends_on" => true } } }
it "has an answer label" do it "has an answer label" do
lettings_log.incfreq = 1 lettings_log.incfreq = 1
@ -244,11 +226,9 @@ RSpec.describe Form::Question, type: :model do
end end
context "when the question has an inferred answer" do context "when the question has an inferred answer" do
let(:section_id) { "tenancy_and_property" }
let(:subsection_id) { "property_information" }
let(:page_id) { "property_postcode" }
let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress, postcode_known: 0, postcode_full: nil) } let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress, postcode_known: 0, postcode_full: nil) }
let(:question_id) { "postcode_full" } let(:question_id) { "incfreq" }
let(:type) { "radio" }
it "displays 'change' in the check answers link text" do it "displays 'change' in the check answers link text" do
expect(question.action_text(lettings_log)).to match(/Change/) expect(question.action_text(lettings_log)).to match(/Change/)
@ -256,13 +236,8 @@ RSpec.describe Form::Question, type: :model do
end end
context "when the answer option is a derived answer option" do context "when the answer option is a derived answer option" do
let(:section_id) { "household" } let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress, incfreq: 3, postcode_full: nil) }
let(:subsection_id) { "household_characteristics" } let(:depends_on_met) { true }
let(:page_id) { "person_2_working_situation" }
let(:question_id) { "ecstat2" }
let(:lettings_log) do
FactoryBot.create(:lettings_log, :in_progress, hhmemb: 2, details_known_2: 0, age2_known: 0, age2: 12)
end
it "knows it has an inferred value or is derived for check answers" do it "knows it has an inferred value or is derived for check answers" do
expect(question.is_derived_or_has_inferred_check_answers_value?(lettings_log)).to be true expect(question.is_derived_or_has_inferred_check_answers_value?(lettings_log)).to be true
@ -270,10 +245,8 @@ RSpec.describe Form::Question, type: :model do
end end
context "when type is date" do context "when type is date" do
let(:section_id) { "local_authority" }
let(:subsection_id) { "local_authority" }
let(:page_id) { "property_major_repairs" }
let(:question_id) { "mrcdate" } let(:question_id) { "mrcdate" }
let(:type) { "date" }
it "displays a formatted answer label" do it "displays a formatted answer label" do
lettings_log.mrcdate = Time.zone.local(2021, 10, 11) lettings_log.mrcdate = Time.zone.local(2021, 10, 11)
@ -287,10 +260,15 @@ RSpec.describe Form::Question, type: :model do
end end
context "when type is checkbox" do context "when type is checkbox" do
let(:section_id) { "household" } let(:question_id) { "housingneeds_type" }
let(:subsection_id) { "household_needs" } let(:type) { "checkbox" }
let(:page_id) { "accessibility_requirements" } let(:answer_options) do
let(:question_id) { "accessibility_requirements" } {
"housingneeds_a" => { "value" => "Fully wheelchair accessible housing" },
"housingneeds_b" => { "value" => "Wheelchair access to essential rooms" },
"housingneeds_c" => { "value" => "Level access housing" },
}
end
it "has a joined answers label" do it "has a joined answers label" do
lettings_log.housingneeds_a = 1 lettings_log.housingneeds_a = 1
@ -301,8 +279,9 @@ RSpec.describe Form::Question, type: :model do
end end
context "when a condition is present" do context "when a condition is present" do
let(:page_id) { "housing_benefit" }
let(:question_id) { "conditional_question" } let(:question_id) { "conditional_question" }
let(:conditional_question_conditions) { [{ to: question_id, from: "hb", cond: [0] }] }
let(:form_questions) { [OpenStruct.new(id: "hb", type: "radio")] }
it "knows whether it is enabled or not for unmet conditions" do it "knows whether it is enabled or not for unmet conditions" do
expect(question.enabled?(lettings_log)).to be false expect(question.enabled?(lettings_log)).to be false
@ -314,11 +293,7 @@ RSpec.describe Form::Question, type: :model do
end end
context "when the condition type hasn't been implemented yet" do context "when the condition type hasn't been implemented yet" do
let(:unimplemented_question) { OpenStruct.new(id: "hb", type: "unkown") } let(:form_questions) { [OpenStruct.new(id: "hb", type: "unkown")] }
before do
allow(page).to receive(:questions).and_return([unimplemented_question])
end
it "raises an exception" do it "raises an exception" do
expect { question.enabled?(lettings_log) }.to raise_error("Not implemented yet") expect { question.enabled?(lettings_log) }.to raise_error("Not implemented yet")
@ -327,10 +302,16 @@ RSpec.describe Form::Question, type: :model do
end end
context "when answers have a suffix dependent on another answer" do context "when answers have a suffix dependent on another answer" do
let(:section_id) { "rent_and_charges" }
let(:subsection_id) { "income_and_benefits" }
let(:page_id) { "net_income" }
let(:question_id) { "earnings" } let(:question_id) { "earnings" }
let(:type) { "numeric" }
let(:suffix) do
[
{ "label" => " every week", "depends_on" => { "incfreq" => 1 } },
{ "label" => " every month", "depends_on" => { "incfreq" => 2 } },
{ "label" => " every year", "depends_on" => { "incfreq" => 3 } },
]
end
let(:prefix) { "£" }
it "displays the correct label for given suffix and answer the suffix depends on" do it "displays the correct label for given suffix and answer the suffix depends on" do
lettings_log.incfreq = 1 lettings_log.incfreq = 1
@ -345,10 +326,8 @@ RSpec.describe Form::Question, type: :model do
context "with inferred_check_answers_value" do context "with inferred_check_answers_value" do
context "when Lettings form" do context "when Lettings form" do
let(:section_id) { "household" }
let(:subsection_id) { "household_needs" }
let(:page_id) { "armed_forces" }
let(:question_id) { "armedforces" } let(:question_id) { "armedforces" }
let(:inferred_check_answers_value) { [{ "condition" => { "armedforces" => 3 }, "value" => "Prefers not to say" }] }
it "returns the inferred label value" do it "returns the inferred label value" do
lettings_log.armedforces = 3 lettings_log.armedforces = 3
@ -357,8 +336,9 @@ RSpec.describe Form::Question, type: :model do
end end
context "when Sales form" do context "when Sales form" do
let(:sales_log) { FactoryBot.create(:sales_log, :completed, national: 13, saledate: Time.zone.local(2022, 1, 1)) } let(:question_id) { "national" }
let(:question) { sales_log.form.get_question("national", sales_log) } let(:sales_log) { FactoryBot.build(:sales_log, :completed, national: 13) }
let(:inferred_check_answers_value) { [{ "condition" => { "national" => 13 }, "value" => "Prefers not to say" }] }
it "returns the inferred label value" do it "returns the inferred label value" do
expect(question.answer_label(sales_log)).to eq("Prefers not to say") expect(question.answer_label(sales_log)).to eq("Prefers not to say")
@ -369,11 +349,6 @@ RSpec.describe Form::Question, type: :model do
describe ".completed?" do describe ".completed?" do
context "when the question has inferred value only for check answers display" do context "when the question has inferred value only for check answers display" do
let(:section_id) { "tenancy_and_property" }
let(:subsection_id) { "property_information" }
let(:page_id) { "property_postcode" }
let(:question_id) { "postcode_full" }
it "returns true" do it "returns true" do
lettings_log["postcode_known"] = 0 lettings_log["postcode_known"] = 0
expect(question.completed?(lettings_log)).to be(true) expect(question.completed?(lettings_log)).to be(true)
@ -382,18 +357,22 @@ RSpec.describe Form::Question, type: :model do
end end
context "when the question has a hidden in check answers attribute with dependencies" do context "when the question has a hidden in check answers attribute with dependencies" do
let(:section_id) { "local_authority" } let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress) }
let(:subsection_id) { "local_authority" }
let(:page_id) { "time_lived_in_la" } context "when it's hidden in check answers" do
let(:question_id) { "layear" } let(:depends_on_met) { true }
let(:lettings_log) do
FactoryBot.create(:lettings_log, :in_progress) it "can work out if the question will be shown in check answers" do
expect(question.hidden_in_check_answers?(lettings_log, nil)).to be(true)
end
end end
context "when it's not hidden in check answers" do
let(:depends_on_met) { false }
it "can work out if the question will be shown in check answers" do it "can work out if the question will be shown in check answers" do
expect(question.hidden_in_check_answers?(lettings_log, nil)).to be(false) expect(question.hidden_in_check_answers?(lettings_log, nil)).to be(false)
lettings_log.layear = 0 end
expect(question.hidden_in_check_answers?(lettings_log, nil)).to be(true)
end end
end end
end end

32
spec/models/form/sales/pages/buyer_previous_spec.rb

@ -3,21 +3,15 @@ require "rails_helper"
RSpec.describe Form::Sales::Pages::BuyerPrevious, type: :model do RSpec.describe Form::Sales::Pages::BuyerPrevious, type: :model do
subject(:page) { described_class.new(page_id, page_definition, subsection, joint_purchase:) } subject(:page) { described_class.new(page_id, page_definition, subsection, joint_purchase:) }
let(:log) { create(:sales_log, :completed) } let(:log) { build(:sales_log, :completed) }
let(:page_id) { "example" } let(:page_id) { "example" }
let(:page_definition) { nil } let(:page_definition) { nil }
let(:subsection) { instance_double(Form::Subsection) } let(:subsection) { instance_double(Form::Subsection, depends_on: nil, enabled?: true, form:) }
let(:form) { instance_double(Form, start_date: Time.zone.local(2023, 4, 1)) } let(:start_date_after_2024) { false }
let(:form) { instance_double(Form, start_date: Time.zone.local(2023, 4, 1), start_year_after_2024?: start_date_after_2024, depends_on_met: true) }
let(:joint_purchase) { false } let(:joint_purchase) { false }
before do
allow(subsection).to receive(:depends_on).and_return(nil)
allow(subsection).to receive(:enabled?).and_return(true)
allow(subsection).to receive(:form).and_return(form)
allow(form).to receive(:depends_on_met).and_return(true)
end
it "has correct subsection" do it "has correct subsection" do
expect(page.subsection).to eq(subsection) expect(page.subsection).to eq(subsection)
end end
@ -53,14 +47,7 @@ RSpec.describe Form::Sales::Pages::BuyerPrevious, type: :model do
end end
context "with 23/24 log" do context "with 23/24 log" do
before do let(:start_date_after_2024) { false }
Timecop.freeze(Time.zone.local(2023, 4, 2))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
end
it "has correct routed to" do it "has correct routed to" do
log.staircase = 1 log.staircase = 1
@ -69,14 +56,7 @@ RSpec.describe Form::Sales::Pages::BuyerPrevious, type: :model do
end end
context "with 24/25 log" do context "with 24/25 log" do
before do let(:start_date_after_2024) { true }
Timecop.freeze(Time.zone.local(2024, 4, 2))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
end
it "has correct routed to when staircase is yes" do it "has correct routed to when staircase is yes" do
log.staircase = 1 log.staircase = 1

24
spec/models/form/sales/pages/la_nominations_spec.rb

@ -3,11 +3,13 @@ require "rails_helper"
RSpec.describe Form::Sales::Pages::LaNominations, type: :model do RSpec.describe Form::Sales::Pages::LaNominations, type: :model do
subject(:page) { described_class.new(page_id, page_definition, subsection) } subject(:page) { described_class.new(page_id, page_definition, subsection) }
let(:log) { create(:sales_log, :completed) } let(:log) { build(:sales_log, :completed) }
let(:page_id) { nil } let(:page_id) { nil }
let(:page_definition) { nil } let(:page_definition) { nil }
let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2023, 4, 1))) } let(:start_year_after_2024) { false }
let(:form) { instance_double(Form, start_date: Time.zone.local(2023, 4, 1), start_year_after_2024?: start_year_after_2024) }
let(:subsection) { instance_double(Form::Subsection, form:) }
before do before do
allow(subsection).to receive(:depends_on).and_return(nil) allow(subsection).to receive(:depends_on).and_return(nil)
@ -34,14 +36,7 @@ RSpec.describe Form::Sales::Pages::LaNominations, type: :model do
end end
context "with 23/24 log" do context "with 23/24 log" do
before do let(:start_year_after_2024) { false }
Timecop.freeze(Time.zone.local(2023, 4, 2))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
end
it "has correct routed to" do it "has correct routed to" do
log.staircase = 1 log.staircase = 1
@ -50,14 +45,7 @@ RSpec.describe Form::Sales::Pages::LaNominations, type: :model do
end end
context "with 24/25 log" do context "with 24/25 log" do
before do let(:start_year_after_2024) { true }
Timecop.freeze(Time.zone.local(2024, 4, 2))
Singleton.__init__(FormHandler)
end
after do
Timecop.return
end
it "has correct routed to when staircase is yes" do it "has correct routed to when staircase is yes" do
log.staircase = 1 log.staircase = 1

22
spec/models/form/sales/pages/last_accommodation_la_spec.rb

@ -5,22 +5,10 @@ RSpec.describe Form::Sales::Pages::LastAccommodationLa, type: :model do
let(:page_id) { nil } let(:page_id) { nil }
let(:page_definition) { nil } let(:page_definition) { nil }
let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, depends_on_met: true, start_date: Time.zone.local(2023, 4, 1))) } let(:start_year_after_2024) { false }
let(:start_date) { Time.utc(2022, 4, 1) } let(:form) { instance_double(Form, depends_on_met: true, start_date: Time.zone.local(2023, 4, 1), start_year_after_2024?: start_year_after_2024) }
let(:log) { create(:sales_log, :completed, saledate: now) } let(:subsection) { instance_double(Form::Subsection, form:, depends_on: nil, enabled?: true) }
let(:now) { Time.zone.local(2023, 4, 4) } let(:log) { build(:sales_log, :completed) }
before do
Timecop.freeze(now)
Singleton.__init__(FormHandler)
allow(subsection).to receive(:depends_on).and_return(nil)
allow(subsection).to receive(:enabled?).and_return(true)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "has correct subsection" do it "has correct subsection" do
expect(page.subsection).to eq(subsection) expect(page.subsection).to eq(subsection)
@ -54,7 +42,7 @@ RSpec.describe Form::Sales::Pages::LastAccommodationLa, type: :model do
end end
context "with 2024 form" do context "with 2024 form" do
let(:now) { Time.zone.local(2024, 4, 4) } let(:start_year_after_2024) { true }
it "is routed to for 2024 non discounted sale logs" do it "is routed to for 2024 non discounted sale logs" do
log.update!(ownershipsch: 1) log.update!(ownershipsch: 1)

20
spec/models/form/sales/pages/last_accommodation_spec.rb

@ -3,23 +3,13 @@ require "rails_helper"
RSpec.describe Form::Sales::Pages::LastAccommodation, type: :model do RSpec.describe Form::Sales::Pages::LastAccommodation, type: :model do
subject(:page) { described_class.new(page_id, page_definition, subsection) } subject(:page) { described_class.new(page_id, page_definition, subsection) }
let(:log) { create(:sales_log, :completed, saledate: now) } let(:log) { build(:sales_log, :completed) }
let(:now) { Time.zone.local(2023, 4, 4) }
let(:page_id) { nil } let(:page_id) { nil }
let(:page_definition) { nil } let(:page_definition) { nil }
let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2023, 4, 1))) } let(:start_year_after_2024) { false }
let(:form) { instance_double(Form, start_date: Time.zone.local(2023, 4, 1), start_year_after_2024?: start_year_after_2024) }
before do let(:subsection) { instance_double(Form::Subsection, form:, depends_on: nil) }
Timecop.freeze(now)
Singleton.__init__(FormHandler)
allow(subsection).to receive(:depends_on).and_return(nil)
end
after do
Timecop.return
Singleton.__init__(FormHandler)
end
it "has correct subsection" do it "has correct subsection" do
expect(page.subsection).to eq(subsection) expect(page.subsection).to eq(subsection)
@ -51,7 +41,7 @@ RSpec.describe Form::Sales::Pages::LastAccommodation, type: :model do
end end
context "with 2024 form" do context "with 2024 form" do
let(:now) { Time.zone.local(2024, 4, 4) } let(:start_year_after_2024) { true }
it "is routed to for 2024 non discounted sale logs" do it "is routed to for 2024 non discounted sale logs" do
log.update!(ownershipsch: 1) log.update!(ownershipsch: 1)

40
spec/models/form/sales/questions/owning_organisation_id_spec.rb

@ -9,7 +9,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
let(:page) { instance_double(Form::Page, subsection: instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2023, 4, 1)))) } let(:page) { instance_double(Form::Page, subsection: instance_double(Form::Subsection, form: instance_double(Form, start_date: Time.zone.local(2023, 4, 1)))) }
let!(:organisation_1) { FactoryBot.create(:organisation, name: "first test org") } let!(:organisation_1) { FactoryBot.create(:organisation, name: "first test org") }
let!(:organisation_2) { FactoryBot.create(:organisation, name: "second test org") } let!(:organisation_2) { FactoryBot.create(:organisation, name: "second test org") }
let(:lettings_log) { FactoryBot.create(:lettings_log) } let(:lettings_log) { FactoryBot.build(:lettings_log) }
let(:expected_answer_options) do let(:expected_answer_options) do
{ {
"" => "Select an option", "" => "Select an option",
@ -59,7 +59,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
let(:owning_org_2) { create(:organisation, name: "Owning org 2") } let(:owning_org_2) { create(:organisation, name: "Owning org 2") }
let(:inactive_owning_org) { create(:organisation, name: "Inactive owning org", active: false) } let(:inactive_owning_org) { create(:organisation, name: "Inactive owning org", active: false) }
let(:non_stock_owner) { create(:organisation, name: "Non stock owner", holds_own_stock: false) } let(:non_stock_owner) { create(:organisation, name: "Non stock owner", holds_own_stock: false) }
let(:log) { create(:lettings_log, owning_organisation: owning_org_1) } let(:log) { build(:lettings_log, owning_organisation: owning_org_1) }
context "when user's org owns stock" do context "when user's org owns stock" do
before do before do
@ -117,11 +117,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation)
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "shows merged organisation as an option" do it "shows merged organisation as an option" do
@ -143,11 +139,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation)
user.organisation.update!(available_from: Time.zone.local(2021, 2, 2)) user.organisation.update!(available_from: Time.zone.local(2021, 2, 2))
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "shows available from date if it is given" do it "shows available from date if it is given" do
@ -169,11 +161,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
before do before do
create(:organisation_relationship, child_organisation: user.organisation, parent_organisation: merged_organisation) create(:organisation_relationship, child_organisation: user.organisation, parent_organisation: merged_organisation)
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: user.organisation)
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "does not show merged organisations stock owners as options" do it "does not show merged organisations stock owners as options" do
@ -193,7 +181,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
end end
before do before do
Timecop.freeze(Time.zone.local(2023, 4, 2)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 4, 2))
create(:organisation_relationship, child_organisation: user.organisation, parent_organisation: merged_organisation) create(:organisation_relationship, child_organisation: user.organisation, parent_organisation: merged_organisation)
merged_organisation.update!(merge_date: Time.zone.local(2021, 6, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2021, 6, 2), absorbing_organisation: user.organisation)
user.organisation.update!(available_from: Time.zone.local(2021, 2, 2)) user.organisation.update!(available_from: Time.zone.local(2021, 2, 2))
@ -207,7 +195,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
context "when user is support" do context "when user is support" do
let(:user) { create(:user, :support, organisation: organisation_1) } let(:user) { create(:user, :support, organisation: organisation_1) }
let(:log) { create(:lettings_log, assigned_to: user) } let(:log) { build(:lettings_log, assigned_to: user) }
it "shows active orgs where organisation holds own stock" do it "shows active orgs where organisation holds own stock" do
non_stock_organisation = create(:organisation, holds_own_stock: false) non_stock_organisation = create(:organisation, holds_own_stock: false)
@ -238,11 +226,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: organisation_1) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: organisation_1)
organisation_1.update!(created_at: Time.zone.local(2021, 3, 2), available_from: Time.zone.local(2021, 2, 2)) organisation_1.update!(created_at: Time.zone.local(2021, 3, 2), available_from: Time.zone.local(2021, 2, 2))
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "shows merged organisation as an option" do it "shows merged organisation as an option" do
@ -261,7 +245,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
end end
before do before do
Timecop.freeze(Time.zone.local(2023, 4, 2)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 4, 2))
merged_organisation.update!(merge_date: Time.zone.local(2021, 6, 2), absorbing_organisation: user.organisation) merged_organisation.update!(merge_date: Time.zone.local(2021, 6, 2), absorbing_organisation: user.organisation)
user.organisation.update!(created_at: Time.zone.local(2021, 2, 2)) user.organisation.update!(created_at: Time.zone.local(2021, 2, 2))
end end
@ -285,11 +269,7 @@ RSpec.describe Form::Sales::Questions::OwningOrganisationId, type: :model do
before do before do
merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: organisation_1) merged_organisation.update!(merge_date: Time.zone.local(2023, 2, 2), absorbing_organisation: organisation_1)
organisation_1.update!(created_at: Time.zone.local(2021, 2, 2), available_from: nil) organisation_1.update!(created_at: Time.zone.local(2021, 2, 2), available_from: nil)
Timecop.freeze(Time.zone.local(2023, 11, 10)) allow(Time).to receive(:now).and_return(Time.zone.local(2023, 11, 10))
end
after do
Timecop.return
end end
it "does not show abailable from for absorbing organisation" do it "does not show abailable from for absorbing organisation" do

52
spec/models/form/subsection_spec.rb

@ -4,27 +4,15 @@ require_relative "../../request_helper"
RSpec.describe Form::Subsection, type: :model do RSpec.describe Form::Subsection, type: :model do
subject(:subsection) { described_class.new(subsection_id, subsection_definition, section) } subject(:subsection) { described_class.new(subsection_id, subsection_definition, section) }
around do |example|
Timecop.freeze(Time.zone.local(2022, 1, 1)) do
Singleton.__init__(FormHandler)
example.run
end
Timecop.return
Singleton.__init__(FormHandler)
end
let(:lettings_log) { FactoryBot.build(:lettings_log) } let(:lettings_log) { FactoryBot.build(:lettings_log) }
let(:form) { lettings_log.form } let(:form) { instance_double(Form, conditional_question_conditions: []) }
let(:section_id) { "household" } let(:section) { instance_double(Form::Section, form:) }
let(:section_definition) { form.form_definition["sections"][section_id] }
let(:section) { Form::Section.new(section_id, section_definition, form) }
let(:subsection_id) { "household_characteristics" } let(:subsection_id) { "household_characteristics" }
let(:subsection_definition) { section_definition["subsections"][subsection_id] } let(:subsection_definition) do
let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } {
"label" => "Household characteristics",
before do "pages" => [["tenant_code", { "questions" => { "tenancycode" => {} } }], ["person_1", { "questions" => { "age1" => {}, "sex1" => {} } }]],
RequestHelper.stub_http_requests }
allow(FormHandler.instance).to receive(:current_lettings_form).and_return(fake_2021_2022_form)
end end
it "has an id" do it "has an id" do
@ -36,30 +24,24 @@ RSpec.describe Form::Subsection, type: :model do
end end
it "has pages" do it "has pages" do
expected_pages = %w[tenant_code_test person_1_age person_1_gender person_1_working_situation household_number_of_members retirement_value_check person_2_working_situation propcode] expected_pages = %w[tenant_code person_1]
expect(subsection.pages.map(&:id)).to eq(expected_pages) expect(subsection.pages.map(&:id)).to eq(expected_pages)
end end
it "has questions" do it "has questions" do
expected_questions = %w[tenancycode age1 sex1 ecstat1 hhmemb relat2 age2 sex2 retirement_value_check ecstat2 propcode] expected_questions = %w[tenancycode age1 sex1]
expect(subsection.questions.map(&:id)).to eq(expected_questions) expect(subsection.questions.map(&:id)).to eq(expected_questions)
end end
context "with an in progress lettings log" do context "with an in progress lettings log" do
let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress) } let(:lettings_log) { FactoryBot.build(:lettings_log, :in_progress, tenancycode: 3, age1: 18) }
it "has a status" do it "has a status" do
expect(subsection.status(lettings_log)).to eq(:in_progress) expect(subsection.status(lettings_log)).to eq(:in_progress)
end end
it "has a completed status for completed subsection" do it "has a completed status for completed subsection" do
subsection_definition = section_definition["subsections"]["household_needs"] lettings_log.sex1 = "X"
subsection = described_class.new("household_needs", subsection_definition, section)
lettings_log.armedforces = 3
lettings_log.illness = 1
lettings_log.housingneeds_a = 1
lettings_log.la = "E06000014"
lettings_log.illness_type_1 = 1
expect(subsection.status(lettings_log)).to eq(:completed) expect(subsection.status(lettings_log)).to eq(:completed)
end end
@ -69,22 +51,14 @@ RSpec.describe Form::Subsection, type: :model do
end end
context "with optional fields" do context "with optional fields" do
subject(:subsection) { described_class.new(subsection_id, subsection_definition, section) }
let(:section_id) { "tenancy_and_property" }
let(:section_definition) { form.form_definition["sections"][section_id] }
let(:section) { Form::Section.new(section_id, section_definition, form) }
let(:subsection_id) { "property_information" }
let(:subsection_definition) { section_definition["subsections"][subsection_id] }
it "has a started status even if only an optional field has been answered" do it "has a started status even if only an optional field has been answered" do
lettings_log.postcode_known = 0 lettings_log.age1 = nil
expect(subsection.is_started?(lettings_log)).to be(true) expect(subsection.is_started?(lettings_log)).to be(true)
end end
end end
it "has question helpers for the number of applicable questions" do it "has question helpers for the number of applicable questions" do
expected_questions = %w[tenancycode age1 sex1 ecstat1 hhmemb relat2 age2 sex2 ecstat2 propcode] expected_questions = %w[tenancycode age1 sex1]
expect(subsection.applicable_questions(lettings_log).map(&:id)).to eq(expected_questions) expect(subsection.applicable_questions(lettings_log).map(&:id)).to eq(expected_questions)
end end
end end

Loading…
Cancel
Save