From c39271d4867f110748cd76361f9a61829cad149a Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Wed, 27 Oct 2021 11:48:33 +0100 Subject: [PATCH] CLDC-466: Add fixed term tenancy validation (#66) * Add fixed term tenancy validation * refactor validate_fixed_term_tenancy * add fixed_term_tenancy pattern to api docs and make it dynamically not required --- app/models/case_log.rb | 18 ++++++++++ docs/api/DLUHC-CORE-Data.v1.json | 3 +- spec/fixtures/complete_case_log.json | 2 +- spec/models/case_log_spec.rb | 51 ++++++++++++++++++++++++++-- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/app/models/case_log.rb b/app/models/case_log.rb index 99285ca3f..0ff5e9c95 100644 --- a/app/models/case_log.rb +++ b/app/models/case_log.rb @@ -74,6 +74,20 @@ class CaseLogValidator < ActiveModel::Validator end end + def validate_fixed_term_tenancy(record) + is_present = record.fixed_term_tenancy.present? + is_in_range = record.fixed_term_tenancy.to_i.between?(2, 99) + is_secure = record.tenancy_type == "Fixed term – Secure" + is_ast = record.tenancy_type == "Fixed term – Assured Shorthold Tenancy (AST)" + conditions = [ + { condition: !(is_secure || is_ast) && is_present, error: "You must only answer the fixed term tenancy length question if the tenancy type is fixed term" }, + { condition: is_ast && !is_in_range, error: "Fixed term – Assured Shorthold Tenancy (AST) should be between 2 and 99 years" }, + { condition: is_secure && (!is_in_range && is_present), error: "Fixed term – Secure should be between 2 and 99 years or not specified" }, + ] + + conditions.each { |condition| condition[:condition] ? (record.errors.add :fixed_term_tenancy, condition[:error]) : nil } + end + def validate(record) # If we've come from the form UI we only want to validate the specific fields # that have just been submitted. If we're submitting a log via API or Bulk Upload @@ -172,6 +186,10 @@ private dynamically_not_required << "net_income_frequency" end + if tenancy_type == "Fixed term – Secure" + dynamically_not_required << "fixed_term_tenancy" + end + required.delete_if { |key, _value| dynamically_not_required.include?(key) } end end diff --git a/docs/api/DLUHC-CORE-Data.v1.json b/docs/api/DLUHC-CORE-Data.v1.json index f50e096fb..64d5ca517 100644 --- a/docs/api/DLUHC-CORE-Data.v1.json +++ b/docs/api/DLUHC-CORE-Data.v1.json @@ -873,7 +873,8 @@ }, "fixed_term_tenancy": { "type": "string", - "minLength": 1 + "minLength": 1, + "pattern": "((?!1|0)([0-9][0-9]))+" }, "tenancy_type": { "type": "string", diff --git a/spec/fixtures/complete_case_log.json b/spec/fixtures/complete_case_log.json index 541c63970..9238bba6a 100644 --- a/spec/fixtures/complete_case_log.json +++ b/spec/fixtures/complete_case_log.json @@ -51,7 +51,7 @@ "tenancy_code": "BZ757", "tenancy_start_date": "12/03/2019", "starter_tenancy": "No", - "fixed_term_tenancy": "No", + "fixed_term_tenancy": "5", "tenancy_type": "Fixed term – Secure", "letting_type": "Affordable Rent - General Needs", "letting_provider": "This landlord", diff --git a/spec/models/case_log_spec.rb b/spec/models/case_log_spec.rb index ae85b2fd1..e8241bd14 100644 --- a/spec/models/case_log_spec.rb +++ b/spec/models/case_log_spec.rb @@ -82,14 +82,14 @@ RSpec.describe Form, type: :model do end context "armed forces injured validation" do - it "must be anwered if tenant was a regular or reserve in armed forces" do + it "must be answered if tenant was a regular or reserve in armed forces" do expect { CaseLog.create!(armed_forces: "Yes - a regular", armed_forces_injured: nil) }.to raise_error(ActiveRecord::RecordInvalid) end - it "must be anwered if tenant was not a regular or reserve in armed forces" do + it "must be answered if tenant was not a regular or reserve in armed forces" do expect { CaseLog.create!(armed_forces: "No", armed_forces_injured: "Yes") @@ -116,6 +116,53 @@ RSpec.describe Form, type: :model do }.to raise_error(ActiveRecord::RecordInvalid) end end + context "fixed term tenancy length" do + it "Must not be completed if Type of main tenancy is not responded with either Secure or Assured shorthold " do + expect { + CaseLog.create!(tenancy_type: "Other", + fixed_term_tenancy: 10) + }.to raise_error(ActiveRecord::RecordInvalid) + end + + it "Must be completed and between 2 and 99 if type of tenancy is Assured shorthold" do + expect { + CaseLog.create!(tenancy_type: "Fixed term – Assured Shorthold Tenancy (AST)", + fixed_term_tenancy: 1) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!(tenancy_type: "Fixed term – Assured Shorthold Tenancy (AST)", + fixed_term_tenancy: nil) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!(tenancy_type: "Fixed term – Assured Shorthold Tenancy (AST)", + fixed_term_tenancy: 2) + }.not_to raise_error + end + + it "Must be empty or between 2 and 99 if type of tenancy is Secure" do + expect { + CaseLog.create!(tenancy_type: "Fixed term – Secure", + fixed_term_tenancy: 1) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!(tenancy_type: "Fixed term – Secure", + fixed_term_tenancy: 100) + }.to raise_error(ActiveRecord::RecordInvalid) + + expect { + CaseLog.create!(tenancy_type: "Fixed term – Secure", + fixed_term_tenancy: nil) + }.not_to raise_error + + expect { + CaseLog.create!(tenancy_type: "Fixed term – Secure", + fixed_term_tenancy: 2) + }.not_to raise_error + end + end end describe "status" do