From 9f738b53e5e8e05b8a05439fc40a4b9c4d180f47 Mon Sep 17 00:00:00 2001 From: baarkerlounger <5101747+baarkerlounger@users.noreply.github.com> Date: Tue, 17 May 2022 11:08:09 +0100 Subject: [PATCH] CLDC-1224: Tenancy type and tenancy length (#578) * Fix value mapping for tenancy type 22/23 * Update secure helper * Null safe * Spec update * Update mandatory * Use helper --- app/models/case_log.rb | 29 +++- config/forms/2022_2023.json | 13 +- .../validations/tenancy_validations_spec.rb | 148 ++++++++++++++---- spec/requests/case_logs_controller_spec.rb | 3 + 4 files changed, 155 insertions(+), 38 deletions(-) diff --git a/app/models/case_log.rb b/app/models/case_log.rb index df91376cf..6796be006 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -191,9 +191,20 @@ class CaseLog < ApplicationRecord tshortfall_known == 1 end + def is_fixed_term_tenancy? + [4, 6].include?(tenancy) + end + def is_secure_tenancy? + return unless collection_start_year + # 1: Secure (including flexible) - tenancy == 1 + if collection_start_year < 2022 + tenancy == 1 + else + # 6: Secure - fixed term, 7: Secure - lifetime + [6, 7].include?(tenancy) + end end def is_assured_shorthold_tenancy? @@ -461,9 +472,19 @@ private end def dynamically_not_required - previous_la_known_field = postcode_known? ? %w[previous_la_known] : [] - tshortfall_field = tshortfall_unknown? ? %w[tshortfall] : [] - previous_la_known_field + tshortfall_field + not_required = [] + not_required << "previous_la_known" if postcode_known? + not_required << "tshortfall" if tshortfall_unknown? + not_required << "tenancylength" if tenancylength_optional? + + not_required + end + + def tenancylength_optional? + return false unless collection_start_year + return true if collection_start_year < 2022 + + collection_start_year >= 2022 && !is_fixed_term_tenancy? end def set_derived_fields! diff --git a/config/forms/2022_2023.json b/config/forms/2022_2023.json index 7c7c2e66b..c6ed9dcad 100644 --- a/config/forms/2022_2023.json +++ b/config/forms/2022_2023.json @@ -994,7 +994,7 @@ "hint_text": "", "type": "radio", "answer_options": { - "1": { + "4": { "value": "Assured Shorthold Tenancy (AST) - Fixed term" }, "6": { @@ -1041,7 +1041,7 @@ "hint_text": "This is also known as an ‘introductory period’.", "type": "radio", "answer_options": { - "1": { + "4": { "value": "Assured Shorthold Tenancy (AST) - Fixed term" }, "6": { @@ -1095,10 +1095,13 @@ }, "depends_on": [ { - "tenancy": 1 + "tenancy": 4 }, { "tenancy": 6 + }, + { + "tenancy": 3 } ] }, @@ -6297,7 +6300,7 @@ "label": true, "i18n_template": "la" }, - { + { "key": "soft_min_for_period", "label": false, "i18n_template": "soft_min_for_period" @@ -6336,7 +6339,7 @@ "label": true, "i18n_template": "la" }, - { + { "key": "soft_max_for_period", "label": false, "i18n_template": "soft_max_for_period" diff --git a/spec/models/validations/tenancy_validations_spec.rb b/spec/models/validations/tenancy_validations_spec.rb index 09b3c5314..9e80fc2d1 100644 --- a/spec/models/validations/tenancy_validations_spec.rb +++ b/spec/models/validations/tenancy_validations_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Validations::TenancyValidations do subject(:tenancy_validator) { validator_class.new } let(:validator_class) { Class.new { include Validations::TenancyValidations } } - let(:record) { FactoryBot.create(:case_log) } + let(:record) { FactoryBot.create(:case_log, startdate: Time.zone.local(2021, 5, 1)) } describe "fixed term tenancy validations" do context "when fixed term tenancy" do @@ -62,44 +62,134 @@ RSpec.describe Validations::TenancyValidations do end end - context "when type of tenancy is secure" do - let(:expected_error) { I18n.t("validations.tenancy.length.secure") } + context "when the collection start year is before 2022" do + context "when type of tenancy is secure" do + let(:expected_error) { I18n.t("validations.tenancy.length.secure") } - before { record.tenancy = 1 } + before { record.tenancy = 1 } - context "when tenancy length is greater than 1" do - it "adds an error" do - record.tenancylength = 1 - tenancy_validator.validate_fixed_term_tenancy(record) - expect(record.errors["tenancylength"]).to include(match(expected_error)) - expect(record.errors["tenancy"]).to include(match(expected_error)) + context "when tenancy length is greater than 1" do + it "adds an error" do + record.tenancylength = 1 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to include(match(expected_error)) + expect(record.errors["tenancy"]).to include(match(expected_error)) + end end - end - context "when tenancy length is less than 100" do - it "adds an error" do - record.tenancylength = 100 - tenancy_validator.validate_fixed_term_tenancy(record) - expect(record.errors["tenancylength"]).to include(match(expected_error)) - expect(record.errors["tenancy"]).to include(match(expected_error)) + context "when tenancy length is less than 100" do + it "adds an error" do + record.tenancylength = 100 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to include(match(expected_error)) + expect(record.errors["tenancy"]).to include(match(expected_error)) + end + end + + context "when tenancy length is between 2-99" do + it "does not add an error" do + record.tenancylength = 3 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to be_empty + expect(record.errors["tenancy"]).to be_empty + end + end + + context "when tenancy length has not been answered" do + it "does not add an error" do + record.tenancylength = nil + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to be_empty + expect(record.errors["tenancy"]).to be_empty + end end end + end - context "when tenancy length is between 2-99" do - it "does not add an error" do - record.tenancylength = 3 - tenancy_validator.validate_fixed_term_tenancy(record) - expect(record.errors["tenancylength"]).to be_empty - expect(record.errors["tenancy"]).to be_empty + context "when the collection start year is 2022 or later" do + let(:record) { FactoryBot.create(:case_log, startdate: Time.zone.local(2022, 5, 1)) } + + context "when type of tenancy is Secure - fixed term" do + let(:expected_error) { I18n.t("validations.tenancy.length.secure") } + + before { record.tenancy = 6 } + + context "when tenancy length is greater than 1" do + it "adds an error" do + record.tenancylength = 1 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to include(match(expected_error)) + expect(record.errors["tenancy"]).to include(match(expected_error)) + end + end + + context "when tenancy length is less than 100" do + it "adds an error" do + record.tenancylength = 100 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to include(match(expected_error)) + expect(record.errors["tenancy"]).to include(match(expected_error)) + end + end + + context "when tenancy length is between 2-99" do + it "does not add an error" do + record.tenancylength = 3 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to be_empty + expect(record.errors["tenancy"]).to be_empty + end + end + + context "when tenancy length has not been answered" do + it "does not add an error" do + record.tenancylength = nil + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to be_empty + expect(record.errors["tenancy"]).to be_empty + end end end - context "when tenancy length has not been answered" do - it "does not add an error" do - record.tenancylength = nil - tenancy_validator.validate_fixed_term_tenancy(record) - expect(record.errors["tenancylength"]).to be_empty - expect(record.errors["tenancy"]).to be_empty + context "when type of tenancy is Secure - lifetime" do + let(:expected_error) { I18n.t("validations.tenancy.length.secure") } + + before { record.tenancy = 7 } + + context "when tenancy length is greater than 1" do + it "adds an error" do + record.tenancylength = 1 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to include(match(expected_error)) + expect(record.errors["tenancy"]).to include(match(expected_error)) + end + end + + context "when tenancy length is less than 100" do + it "adds an error" do + record.tenancylength = 100 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to include(match(expected_error)) + expect(record.errors["tenancy"]).to include(match(expected_error)) + end + end + + context "when tenancy length is between 2-99" do + it "does not add an error" do + record.tenancylength = 3 + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to be_empty + expect(record.errors["tenancy"]).to be_empty + end + end + + context "when tenancy length has not been answered" do + it "does not add an error" do + record.tenancylength = nil + tenancy_validator.validate_fixed_term_tenancy(record) + expect(record.errors["tenancylength"]).to be_empty + expect(record.errors["tenancy"]).to be_empty + end end end end diff --git a/spec/requests/case_logs_controller_spec.rb b/spec/requests/case_logs_controller_spec.rb index 293a3997d..3c91db3e4 100644 --- a/spec/requests/case_logs_controller_spec.rb +++ b/spec/requests/case_logs_controller_spec.rb @@ -239,6 +239,7 @@ RSpec.describe CaseLogsController, type: :request do owning_organisation: organisation, mrcdate: Time.zone.local(2022, 2, 1), startdate: Time.zone.local(2022, 12, 1), + tenancy: 6, managing_organisation: organisation) end @@ -267,6 +268,7 @@ RSpec.describe CaseLogsController, type: :request do owning_organisation: organisation, mrcdate: Time.zone.local(2022, 2, 1), startdate: Time.zone.local(2022, 12, 1), + tenancy: 6, managing_organisation: organisation) end let!(:case_log_2022_in_progress) do @@ -274,6 +276,7 @@ RSpec.describe CaseLogsController, type: :request do owning_organisation: organisation, mrcdate: Time.zone.local(2022, 2, 1), startdate: Time.zone.local(2022, 12, 1), + tenancy: 6, managing_organisation: organisation) end