From 7ad9955f9f3e7d9552ea42f1983ab233b0c0a8a1 Mon Sep 17 00:00:00 2001 From: baarkerlounger Date: Fri, 25 Feb 2022 10:47:25 +0000 Subject: [PATCH] More convenience methods --- app/models/case_log.rb | 4 + app/models/form/question.rb | 129 +++++++++++++++++- .../validations/property_validations.rb | 2 +- spec/models/form/question_spec.rb | 62 ++++++++- 4 files changed, 190 insertions(+), 7 deletions(-) diff --git a/app/models/case_log.rb b/app/models/case_log.rb index 3c55d51e4..fdc9b0a62 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -207,6 +207,10 @@ class CaseLog < ApplicationRecord homeless == 2 end + def is_london_rent? + rent_type == 2 || rent_type == 4 + end + private PIO = Postcodes::IO.new diff --git a/app/models/form/question.rb b/app/models/form/question.rb index 69fdf4e0a..4159a6384 100644 --- a/app/models/form/question.rb +++ b/app/models/form/question.rb @@ -75,7 +75,7 @@ class Form::Question def update_answer_link_name(case_log) link_type = if type == "checkbox" - answer_options.keys.any? { |key| case_log[key] == 1 } ? "Change" : "Answer" + answer_options.keys.any? { |key| value_is_yes?(case_log[key]) } ? "Change" : "Answer" else case_log[id].blank? ? "Answer" : "Change" end @@ -83,7 +83,7 @@ class Form::Question end def completed?(case_log) - return answer_options.keys.any? { |key| case_log[key] == 1 } if type == "checkbox" + return answer_options.keys.any? { |key| value_is_yes?(case_log[key]) } if type == "checkbox" case_log[id].present? || !case_log.respond_to?(id.to_sym) || has_inferred_display_value?(case_log) end @@ -114,6 +114,36 @@ class Form::Question end end + def value_is_yes?(value) + case type + when "checkbox" + value == 1 + when "radio" + RADIO_YES_VALUE[id.to_sym]&.include?(value) + else + value.downcase == "yes" + end + end + + def value_is_no?(value) + case type + when "checkbox" + value && value.zero? + when "radio" + RADIO_NO_VALUE[id.to_sym]&.include?(value) + else + value.downcase == "no" + end + end + + def value_is_dont_know?(value) + type == "radio" && RADIO_DONT_KNOW_VALUE[id.to_sym]&.include?(value) + end + + def value_is_refused?(value) + type == "radio" && RADIO_REFUSED_VALUE[id.to_sym]&.include?(value) + end + private def has_inferred_display_value?(case_log) @@ -122,7 +152,7 @@ private def checkbox_answer_label(case_log) answer = [] - answer_options.each { |key, options| case_log[key] == 1 ? answer << options["value"] : nil } + answer_options.each { |key, options| value_is_yes?(case_log[key]) ? answer << options["value"] : nil } answer.join(", ") end @@ -176,4 +206,97 @@ private 1 => " every month", 2 => " every year", }.freeze + + RADIO_YES_VALUE = { + renewal: [1], + postcode_known: [1], + previous_postcode_known: [1], + la_known: [1], + previous_la_known: [1], + first_time_property_let_as_social_housing: [1], + wchair: [1], + majorrepairs: [1], + startertenancy: [0], + letting_in_sheltered_accommodation: [0, 1], + armedforces: [0, 1, 2], + leftreg: [0], + reservist: [0], + preg_occ: [0], + illness: [0], + underoccupation_benefitcap: [0, 1, 2], + reasonpref: [0], + net_income_known: [0], + household_charge: [0], + is_carehome: [1], + rent_shortfall: [0], + }.freeze + + RADIO_NO_VALUE = { + renewal: [0], + postcode_known: [0], + previous_postcode_known: [0], + la_known: [0], + previous_la_known: [0], + first_time_property_let_as_social_housing: [0], + wchair: [0], + majorrepairs: [0], + startertenancy: [1], + letting_in_sheltered_accommodation: [2], + armedforces: [3], + leftreg: [1], + reservist: [1], + preg_occ: [1], + illness: [1], + underoccupation_benefitcap: [3], + reasonpref: [1], + net_income_known: [1], + household_charge: [1], + is_carehome: [0], + rent_shortfall: [1], + }.freeze + + RADIO_DONT_KNOW_VALUE = { + letting_in_sheltered_accommodation: [3], + underoccupation_benefitcap: [4], + reasonpref: [2], + rent_shortfall: [1], + layear: [7], + reason_for_leaving_last_settled_home: [32], + hb: [5], + benefits: [3], + unitletas: [3], + }.freeze + + RADIO_REFUSED_VALUE = { + sex1: %w[R], + sex2: %w[R], + sex3: %w[R], + sex4: %w[R], + sex5: %w[R], + sex6: %w[R], + sex7: %w[R], + sex8: %w[R], + relat2: [3], + relat3: [3], + relat4: [3], + relat5: [3], + relat6: [3], + relat7: [3], + relat8: [3], + ecstat1: [10], + ecstat2: [10], + ecstat3: [10], + ecstat4: [10], + ecstat5: [10], + ecstat6: [10], + ecstat7: [10], + ecstat8: [10], + letting_in_sheltered_accommodation: [3], + armedforces: [4], + leftreg: [3], + reservist: [2], + preg_occ: [2], + illness: [2], + hb: [6], + }.freeze end diff --git a/app/models/validations/property_validations.rb b/app/models/validations/property_validations.rb index bb57fda31..af551a849 100644 --- a/app/models/validations/property_validations.rb +++ b/app/models/validations/property_validations.rb @@ -55,7 +55,7 @@ module Validations::PropertyValidations E09000032 E09000033].freeze def validate_la(record) - if record.la.present? && !LONDON_BOROUGHS.include?(record.la) && (record.rent_type == 2 || record.rent_type == 4) + if record.la.present? && !LONDON_BOROUGHS.include?(record.la) && (record.is_london_rent?) record.errors.add :la, I18n.t("validations.property.la.london_rent") end diff --git a/spec/models/form/question_spec.rb b/spec/models/form/question_spec.rb index dfd6fe215..027eb5d56 100644 --- a/spec/models/form/question_spec.rb +++ b/spec/models/form/question_spec.rb @@ -45,6 +45,18 @@ RSpec.describe Form::Question, type: :model do expect(question.read_only?).to be false end + it "has a yes value helper" do + expect(question.value_is_yes?("Yes")).to be_truthy + expect(question.value_is_yes?("YES")).to be_truthy + expect(question.value_is_yes?("random")).to be_falsey + end + + it "has a no value helper" do + expect(question.value_is_no?("No")).to be_truthy + expect(question.value_is_no?("NO")).to be_truthy + expect(question.value_is_no?("random")).to be_falsey + end + context "when type is numeric" do it "has a min value" do expect(question.min).to eq(0) @@ -74,6 +86,35 @@ RSpec.describe Form::Question, type: :model do it "can map label from value" do expect(question.value_label_from_value(2)).to eq("Yearly") end + + 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" } + + it "maps those options" do + expect(question).to be_value_is_yes(0) + expect(question).not_to be_value_is_no(0) + expect(question).not_to be_value_is_refused(0) + expect(question).to be_value_is_no(1) + expect(question).to be_value_is_refused(2) + end + end + + 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" } + + it "maps those options" do + expect(question).not_to be_value_is_yes(7) + expect(question).not_to be_value_is_no(7) + expect(question).not_to be_value_is_refused(7) + expect(question).to be_value_is_dont_know(7) + end + end end context "when type is select" do @@ -92,13 +133,28 @@ RSpec.describe Form::Question, type: :model do end context "when type is checkbox" do - let(:page_id) { "dependent_page" } - let(:question_id) { "dependent_question" } + let(:section_id) { "household" } + let(:subsection_id) { "household_needs" } + let(:page_id) { "condition_effects" } + let(:question_id) { "condition_effects" } it "has answer options" do - expected_answer_options = { "0" => { "value" => "Option A" }, "1" => { "value" => "Option B" } } + expected_answer_options = { + "illness_type_1" => { "value" => "Vision - such as blindness or partial sight" }, + "illness_type_2" => { "value" => "Hearing - such as deafness or partial hearing" }, + } expect(question.answer_options).to eq(expected_answer_options) end + + it "can map yes values" do + expect(question).to be_value_is_yes(1) + expect(question).not_to be_value_is_yes(0) + end + + it "can map no values" do + expect(question).to be_value_is_no(0) + expect(question).not_to be_value_is_no(1) + end end context "when the question is read only" do