require " rails_helper "
RSpec . describe Validations :: FinancialValidations do
subject ( :financial_validator ) { validator_class . new }
let ( :validator_class ) { Class . new { include Validations :: FinancialValidations } }
let ( :record ) { FactoryBot . create ( :lettings_log ) }
let ( :fake_2021_2022_form ) { Form . new ( " spec/fixtures/forms/2021_2022.json " ) }
before do
allow ( FormHandler . instance ) . to receive ( :current_lettings_form ) . and_return ( fake_2021_2022_form )
end
describe " earnings and income frequency " do
it " when earnings are provided it validates that income frequency must be provided " do
record . earnings = 500
record . incfreq = nil
financial_validator . validate_net_income ( record )
expect ( record . errors [ " incfreq " ] )
. to include ( match I18n . t ( " validations.financial.earnings.freq_missing " ) )
expect ( record . errors [ " earnings " ] )
. to include ( match I18n . t ( " validations.financial.earnings.freq_missing " ) )
end
it " when income frequency is provided it validates that earnings must be provided " do
record . earnings = nil
record . incfreq = 1
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] )
. to include ( match I18n . t ( " validations.financial.earnings.earnings_missing " ) )
expect ( record . errors [ " incfreq " ] )
. to include ( match I18n . t ( " validations.financial.earnings.earnings_missing " ) )
end
end
describe " benefits proportion validations " do
context " when the proportion is all " do
it " validates that the lead tenant is not in full time employment " do
record . benefits = 0
record . ecstat1 = 1
financial_validator . validate_net_income_uc_proportion ( record )
expect ( record . errors [ " benefits " ] ) . to include ( match I18n . t ( " validations.financial.benefits.part_or_full_time " ) )
end
it " validates that the lead tenant is not in part time employment " do
record . benefits = 0
record . ecstat1 = 0
financial_validator . validate_net_income_uc_proportion ( record )
expect ( record . errors [ " benefits " ] ) . to include ( match I18n . t ( " validations.financial.benefits.part_or_full_time " ) )
end
it " expects that the lead tenant is not in full-time or part-time employment " do
record . benefits = 0
record . ecstat1 = 4
financial_validator . validate_net_income_uc_proportion ( record )
expect ( record . errors [ " benefits " ] ) . to be_empty
end
it " validates that the tenant’s partner is not in full time employment " do
record . benefits = 0
record . ecstat2 = 0
record . relat2 = " P "
financial_validator . validate_net_income_uc_proportion ( record )
expect ( record . errors [ " benefits " ] ) . to include ( match I18n . t ( " validations.financial.benefits.part_or_full_time " ) )
end
it " expects that the tenant’s partner is not in full-time or part-time employment " do
record . benefits = 0
record . ecstat2 = 4
record . relat2 = " P "
financial_validator . validate_net_income_uc_proportion ( record )
expect ( record . errors [ " benefits " ] ) . to be_empty
end
end
end
describe " outstanding rent amount validations " do
context " when outstanding rent or charges is no " do
it " validates that no shortfall is provided " do
record . hbrentshortfall = 2
record . tshortfall = 99
financial_validator . validate_outstanding_rent_amount ( record )
expect ( record . errors [ " tshortfall " ] )
. to include ( match I18n . t ( " validations.financial.tshortfall.outstanding_amount_not_expected " ) )
end
end
context " when outstanding rent or charges is yes " do
let ( :record ) { FactoryBot . create ( :lettings_log , :setup_completed , startdate : Time . zone . now ) }
it " expects that a shortfall is provided " do
record . hbrentshortfall = 1
record . tshortfall = 99
financial_validator . validate_outstanding_rent_amount ( record )
expect ( record . errors [ " tshortfall " ] ) . to be_empty
end
it " validates that the shortfall is a positive £ amount " do
record . hb = 6
record . hbrentshortfall = 1
record . tshortfall_known = 0
record . tshortfall = 0
record . period = 2
record . set_derived_fields!
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tshortfall " ] )
. to include ( match I18n . t ( " validations.financial.tshortfall.must_be_positive " ) )
end
it " validates that basic rent is no less than the shortfall " do
record . hb = 6
record . hbrentshortfall = 1
record . tshortfall_known = 0
record . tshortfall = 299 . 50
record . brent = 198
record . period = 2
record . set_derived_fields!
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.rent.less_than_shortfall " ) )
expect ( record . errors [ " tshortfall " ] )
. to include ( match I18n . t ( " validations.financial.tshortfall.more_than_rent " ) )
end
end
end
describe " rent period validations " do
let ( :organisation ) { FactoryBot . create ( :organisation ) }
let ( :user ) { FactoryBot . create ( :user ) }
let ( :record ) { FactoryBot . create ( :lettings_log , owning_organisation : user . organisation , managing_organisation : organisation , created_by : user ) }
before do
FactoryBot . create ( :organisation_relationship , parent_organisation : user . organisation , child_organisation : organisation )
FactoryBot . create ( :organisation_rent_period , organisation : , rent_period : 2 )
end
context " when the organisation only uses specific rent periods " do
it " validates that the selected rent period is used by the managing organisation " do
record . period = 3
financial_validator . validate_rent_period ( record )
expect ( record . errors [ " period " ] )
. to include ( match I18n . t (
" validations.financial.rent_period.invalid_for_org " ,
org_name : organisation . name ,
rent_period : " every 4 weeks " ,
) )
end
end
end
describe " housing benefit rent shortfall validations " do
before { record . startdate = Time . zone . local ( 2022 , 5 , 1 ) }
context " when shortfall is yes " do
it " validates that housing benefit is not none " do
record . hbrentshortfall = 1
record . hb = 9
financial_validator . validate_tshortfall ( record )
expect ( record . errors [ " tshortfall " ] )
. to include ( match I18n . t ( " validations.financial.hbrentshortfall.outstanding_no_benefits " ) )
end
it " validates that housing benefit is not don't know " do
record . hbrentshortfall = 1
record . hb = 3
financial_validator . validate_tshortfall ( record )
expect ( record . errors [ " tshortfall " ] )
. to include ( match I18n . t ( " validations.financial.hbrentshortfall.outstanding_no_benefits " ) )
end
it " validates that housing benefit is not Universal Credit without housing benefit (prior to 22/23) " do
record . startdate = Time . zone . local ( 2022 , 3 , 1 )
record . hbrentshortfall = 1
record . hb = 7
financial_validator . validate_tshortfall ( record )
expect ( record . errors [ " tshortfall " ] )
. to include ( match I18n . t ( " validations.financial.hbrentshortfall.outstanding_no_benefits " ) )
end
it " validates that housing benefit is provided " do
record . hbrentshortfall = 1
record . hb = 1
financial_validator . validate_tshortfall ( record )
expect ( record . errors [ " tshortfall " ] ) . to be_empty
end
end
end
describe " net income validations " do
it " validates that the net income is within the expected range for the household’s employment status " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 200
record . incfreq = 1
record . hhmemb = 1
record . ecstat1 = 1
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] ) . to be_empty
end
context " when the net income is higher than the hard max for their employment status " do
it " adds an error " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 5000
record . incfreq = 1
record . hhmemb = 1
record . ecstat1 = 1
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] )
. to eq ( [ " The household’s income cannot be greater than £1,230.00 per week given the household’s working situation " ] )
expect ( record . errors [ " ecstat1 " ] )
. to eq ( [ " The household’s income of £5,000.00 weekly is too high given the household’s working situation " ] )
expect ( record . errors [ " hhmemb " ] )
. to eq ( [ " The household’s income of £5,000.00 weekly is too high for this number of tenants. Change either the household income or number of tenants. " ] )
end
end
context " when the net income is lower than the hard min for their employment status " do
it " adds an error " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 50
record . incfreq = 1
record . hhmemb = 1
record . ecstat1 = 1
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] )
. to eq ( [ " The household’s income cannot be less than £90.00 per week given the household’s working situation " ] )
expect ( record . errors [ " ecstat1 " ] )
. to eq ( [ " The household’s income of £50.00 weekly is too low given the household’s working situation " ] )
expect ( record . errors [ " hhmemb " ] )
. to eq ( [ " The household’s income of £50.00 weekly is too low for this number of tenants. Change either the household income or number of tenants. " ] )
end
end
context " when there is more than one household member " do
it " allows income levels based on all working situations combined " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 5000
record . incfreq = 1
record . hhmemb = 4
record . ecstat1 = 1
record . ecstat2 = 1
record . ecstat3 = 8
record . ecstat4 = 9
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] ) . to be_empty
end
it " uses the combined value in error messages " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 100
record . incfreq = 1
record . hhmemb = 3
record . ecstat1 = 1
record . ecstat2 = 2
record . ecstat3 = 9
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] )
. to eq ( [ " The household’s income cannot be less than £150.00 per week given the household’s working situation " ] )
end
it " adds errors to relevant fields for each tenant when income is too high " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 5000
record . incfreq = 1
record . hhmemb = 3
record . ecstat1 = 1
record . ecstat2 = 2
record . age3 = 12
record . ecstat3 = 9
financial_validator . validate_net_income ( record )
( 1 .. record . hhmemb ) . each do | n |
expect ( record . errors [ " ecstat #{ n } " ] )
. to eq ( [ " The household’s income of £5,000.00 weekly is too high given the household’s working situation " ] )
end
expect ( record . errors [ " age1 " ] ) . to be_empty
expect ( record . errors [ " age2 " ] ) . to be_empty
expect ( record . errors [ " age3 " ] )
. to eq ( [ " The household’s income of £5,000.00 weekly is too high for the number of adults. Change either the household income or the age of the tenants. " ] )
( record . hhmemb + 1 .. 8 ) . each do | n |
expect ( record . errors [ " ecstat #{ n } " ] ) . to be_empty
expect ( record . errors [ " age #{ n } " ] ) . to be_empty
end
end
it " adds errors to relevant fields for each tenant when income is too low " do
record . startdate = Time . zone . local ( 2023 , 5 , 1 )
record . earnings = 50
record . incfreq = 1
record . hhmemb = 3
record . ecstat1 = 1
record . ecstat2 = 2
record . age3 = 12
record . ecstat3 = 9
financial_validator . validate_net_income ( record )
( 1 .. record . hhmemb ) . each do | n |
expect ( record . errors [ " ecstat #{ n } " ] )
. to eq ( [ " The household’s income of £50.00 weekly is too low given the household’s working situation " ] )
end
( record . hhmemb + 1 .. 8 ) . each do | n |
expect ( record . errors [ " ecstat #{ n } " ] ) . to be_empty
end
end
context " when the net income is lower than the hard min for their employment status for 22/23 collection " do
it " does not add an error " do
record . startdate = Time . zone . local ( 2022 , 5 , 1 )
record . earnings = 50
record . incfreq = 1
record . hhmemb = 1
record . ecstat1 = 1
financial_validator . validate_net_income ( record )
expect ( record . errors [ " earnings " ] ) . to be_empty
expect ( record . errors [ " ecstat1 " ] ) . to be_empty
expect ( record . errors [ " hhmemb " ] ) . to be_empty
end
end
end
end
describe " financial validations " do
context " when currency is negative " do
it " returns error " do
record . earnings = - 8
record . brent = - 2
record . scharge = - 134
record . pscharge = - 10_024
record . supcharg = - 1
financial_validator . validate_negative_currency ( record )
expect ( record . errors [ " earnings " ] )
. to include ( match I18n . t ( " validations.financial.negative_currency " ) )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.negative_currency " ) )
expect ( record . errors [ " scharge " ] )
. to include ( match I18n . t ( " validations.financial.negative_currency " ) )
expect ( record . errors [ " pscharge " ] )
. to include ( match I18n . t ( " validations.financial.negative_currency " ) )
expect ( record . errors [ " supcharg " ] )
. to include ( match I18n . t ( " validations.financial.negative_currency " ) )
end
end
context " when the field allows decimals " do
it " correctly co-erces values " do
record . brent = " 20 "
record . pscharge = " 0.0 "
record . period = " 2 "
financial_validator . validate_numeric_min_max ( record )
expect ( record . errors [ " pscharge " ] ) . to be_empty
end
end
end
describe " rent and charges validations " do
let! ( :location ) { FactoryBot . create ( :location , location_code : " E07000223 " ) }
context " when the owning organisation is a private registered provider " do
before { record . owning_organisation . provider_type = 2 }
context " when needstype is general needs " do
before { record . needstype = 1 }
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 801 } ,
charge_name : " service charge " ,
maximum_per_period : " £800.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 3471 } ,
charge_name : " service charge " ,
maximum_per_period : " £3,466.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 1601 } ,
charge_name : " service charge " ,
maximum_per_period : " £1,600.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 701 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £700.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 3200 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £3,033.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 1401 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £1,400.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 801 } ,
charge_name : " support charge " ,
maximum_per_period : " £800.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 3471 } ,
charge_name : " support charge " ,
maximum_per_period : " £3,466.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 1601 } ,
charge_name : " support charge " ,
maximum_per_period : " £1,600.00 " ,
} ] . each do | test_case |
it " does not allow charges outside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to include ( match I18n . t ( " validations.financial.rent.out_of_range " , charge_name : test_case [ :charge_name ] , maximum_per_period : test_case [ :maximum_per_period ] , frequency : test_case [ :period ] [ :label ] , letting_type : " general needs " , provider_type : " private registered provider " ) )
end
end
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 799 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 3400 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 1599 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 699 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 2500 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 1399 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 799 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 3000 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 1599 } ,
} ] . each do | test_case |
it " does allow charges inside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to be_empty
end
end
end
context " when needstype is supported housing " do
before { record . needstype = 2 }
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 801 } ,
charge_name : " service charge " ,
maximum_per_period : " £800.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 3471 } ,
charge_name : " service charge " ,
maximum_per_period : " £3,466.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 1601 } ,
charge_name : " service charge " ,
maximum_per_period : " £1,600.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 701 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £700.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 3200 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £3,033.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 1401 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £1,400.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 801 } ,
charge_name : " support charge " ,
maximum_per_period : " £800.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 3471 } ,
charge_name : " support charge " ,
maximum_per_period : " £3,466.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 1601 } ,
charge_name : " support charge " ,
maximum_per_period : " £1,600.00 " ,
} ] . each do | test_case |
it " does not allow charges outside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to include ( match I18n . t ( " validations.financial.rent.out_of_range " , charge_name : test_case [ :charge_name ] , maximum_per_period : test_case [ :maximum_per_period ] , frequency : test_case [ :period ] [ :label ] , letting_type : " supported housing " , provider_type : " private registered provider " ) )
end
end
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 799 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 3400 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 1599 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 699 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 2500 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 1399 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 799 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 3400 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 1599 } ,
} ] . each do | test_case |
it " does allow charges inside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to be_empty
end
end
end
end
context " when the owning organisation is a local authority " do
before { record . owning_organisation . provider_type = 1 }
context " when needstype is general needs " do
before { record . needstype = 1 }
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 501 } ,
charge_name : " service charge " ,
maximum_per_period : " £500.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 2300 } ,
charge_name : " service charge " ,
maximum_per_period : " £2,166.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 1001 } ,
charge_name : " service charge " ,
maximum_per_period : " £1,000.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 201 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £200.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 1000 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £866.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 401 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £400.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 201 } ,
charge_name : " support charge " ,
maximum_per_period : " £200.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 1000 } ,
charge_name : " support charge " ,
maximum_per_period : " £866.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 401 } ,
charge_name : " support charge " ,
maximum_per_period : " £400.00 " ,
} ] . each do | test_case |
it " does not allow charges outside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to include ( match I18n . t ( " validations.financial.rent.out_of_range " , charge_name : test_case [ :charge_name ] , maximum_per_period : test_case [ :maximum_per_period ] , frequency : test_case [ :period ] [ :label ] , letting_type : " general needs " , provider_type : " local authority " ) )
end
end
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 499 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 2000 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 999 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 199 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 800 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 399 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 199 . 99 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 800 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 399 } ,
} ] . each do | test_case |
it " does allow charges inside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to be_empty
end
end
end
context " when needstype is supported housing " do
before { record . needstype = 2 }
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 501 } ,
charge_name : " service charge " ,
maximum_per_period : " £500.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 2300 } ,
charge_name : " service charge " ,
maximum_per_period : " £2,166.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 1001 } ,
charge_name : " service charge " ,
maximum_per_period : " £1,000.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 201 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £200.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 1000 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £866.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 401 } ,
charge_name : " personal service charge " ,
maximum_per_period : " £400.00 " ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 201 } ,
charge_name : " support charge " ,
maximum_per_period : " £200.00 " ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 1000 } ,
charge_name : " support charge " ,
maximum_per_period : " £866.00 " ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 401 } ,
charge_name : " support charge " ,
maximum_per_period : " £400.00 " ,
} ] . each do | test_case |
it " does not allow charges outside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to include ( match I18n . t ( " validations.financial.rent.out_of_range " , charge_name : test_case [ :charge_name ] , maximum_per_period : test_case [ :maximum_per_period ] , frequency : test_case [ :period ] [ :label ] , letting_type : " supported housing " , provider_type : " local authority " ) )
end
end
context " when charges are not given " do
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : nil } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : nil } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : nil } ,
} ] . each do | test_case |
it " does not error " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to be_empty
end
end
end
[ {
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " scharge " , value : 499 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " scharge " , value : 2000 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " scharge " , value : 999 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " pscharge " , value : 199 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " pscharge " , value : 800 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " pscharge " , value : 399 } ,
} ,
{
period : { label : " weekly for 52 weeks " , value : 1 } ,
charge : { field : " supcharg " , value : 199 . 99 } ,
} ,
{
period : { label : " every calendar month " , value : 4 } ,
charge : { field : " supcharg " , value : 800 } ,
} ,
{
period : { label : " every 2 weeks " , value : 2 } ,
charge : { field : " supcharg " , value : 399 } ,
} ] . each do | test_case |
it " does allow charges inside the range when period is #{ test_case [ :period ] [ :label ] } " do
record . period = test_case [ :period ] [ :value ]
record [ test_case [ :charge ] [ :field ] ] = test_case [ :charge ] [ :value ]
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ test_case [ :charge ] [ :field ] ] )
. to be_empty
end
end
end
context " when period is weekly " do
it " validates that total charge is at least 10 per week " do
record . period = 1
record . tcharge = 9
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to include ( match I18n . t ( " validations.financial.tcharge.under_10 " ) )
end
it " allows the total charge to be over 10 per week " do
record . period = 1
record . tcharge = 10
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to be_empty
end
end
context " when period is every 2 weeks " do
it " validates that total charge is at least 10 per week " do
record . period = 2
record . tcharge = 19 . 99
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to include ( match I18n . t ( " validations.financial.tcharge.under_10 " ) )
end
it " allows the total charge to be over 10 per week " do
record . period = 2
record . tcharge = 20
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to be_empty
end
end
context " when entering charges " do
it " returns an error for 3 charge types selected " do
record . tcharge = 19 . 99
record . chcharge = 20
record . household_charge = 1
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
expect ( record . errors [ " chcharge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
expect ( record . errors [ " household_charge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
end
it " returns an error for tcharge and chcharge types selected " do
record . tcharge = 19 . 99
record . chcharge = 20
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " household_charge " ] )
. to be_empty
expect ( record . errors [ " tcharge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
expect ( record . errors [ " chcharge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
end
it " returns an error for tcharge type and household_charge not paid selected " do
record . tcharge = 19 . 99
record . household_charge = 1
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " chcharge " ] )
. to be_empty
expect ( record . errors [ " tcharge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
expect ( record . errors [ " household_charge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
end
it " returns an error for chcharge type and household_charge not paid selected " do
record . chcharge = 20
record . household_charge = 1
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to be_empty
expect ( record . errors [ " chcharge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
expect ( record . errors [ " household_charge " ] )
. to include ( match I18n . t ( " validations.financial.charges.complete_1_of_3 " ) )
end
end
it " does not return an error for household_charge being no " do
record . household_charge = 1
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to be_empty
expect ( record . errors [ " chcharge " ] )
. to be_empty
expect ( record . errors [ " household_charge " ] )
. to be_empty
end
it " does not return an error for chcharge being selected " do
record . household_charge = 0
record . chcharge = 20
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to be_empty
expect ( record . errors [ " chcharge " ] )
. to be_empty
expect ( record . errors [ " household_charge " ] )
. to be_empty
end
it " does not return an error for tcharge being selected " do
record . household_charge = 0
record . tcharge = 19 . 99
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " tcharge " ] )
. to be_empty
expect ( record . errors [ " chcharge " ] )
. to be_empty
expect ( record . errors [ " household_charge " ] )
. to be_empty
end
context " when validating ranges based on LA and needstype " do
before do
LaRentRange . create! (
ranges_rent_id : " 1 " ,
la : " E07000223 " ,
beds : 4 ,
lettype : 1 ,
soft_min : 12 . 41 ,
soft_max : 89 . 54 ,
hard_min : 9 . 87 ,
hard_max : 100 . 99 ,
start_year : 2021 ,
)
LaRentRange . create! (
ranges_rent_id : " 2 " ,
la : " E07000223 " ,
beds : 0 ,
lettype : 2 ,
soft_min : 12 . 41 ,
soft_max : 89 . 54 ,
hard_min : 9 . 87 ,
hard_max : 100 . 99 ,
start_year : 2021 ,
)
end
it " validates hard minimum for general needs " do
record . needstype = 1
record . lettype = 1
record . period = 1
record . la = " E07000223 "
record . beds = 4
record . startdate = Time . zone . local ( 2021 , 9 , 17 )
record . brent = 9 . 17
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.brent.below_hard_min " ) )
end
it " validates hard minimum for supported housing " do
record . needstype = 2
record . lettype = 2
record . period = 1
record . location = location
record . startdate = Time . zone . local ( 2021 , 9 , 17 )
record . brent = 9 . 17
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.brent.below_hard_min " ) )
%w[ beds la postcode_known scheme_id location_id rent_type needstype period ] . each do | field |
expect ( record . errors [ field ] )
. to include ( match I18n . t ( " validations.financial.brent. #{ field } .below_hard_min " ) )
end
end
it " validates hard max for general needs " do
record . needstype = 1
record . lettype = 1
record . period = 1
record . la = " E07000223 "
record . beds = 4
record . startdate = Time . zone . local ( 2021 , 9 , 17 )
record . brent = 200
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.brent.above_hard_max " ) )
%w[ beds la postcode_known scheme_id location_id rent_type needstype period ] . each do | field |
expect ( record . errors [ field ] )
. to include ( match I18n . t ( " validations.financial.brent. #{ field } .above_hard_max " ) )
end
end
it " validates hard max for supported housing " do
record . needstype = 2
record . lettype = 2
record . period = 1
record . location = location
record . startdate = Time . zone . local ( 2021 , 9 , 17 )
record . brent = 200
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.brent.above_hard_max " ) )
%w[ beds la postcode_known scheme_id location_id rent_type needstype period ] . each do | field |
expect ( record . errors [ field ] )
. to include ( match I18n . t ( " validations.financial.brent. #{ field } .above_hard_max " ) )
end
end
it " validates hard max for correct collection year " do
record . lettype = 1
record . period = 1
record . la = " E07000223 "
record . startdate = Time . zone . local ( 2022 , 2 , 5 )
record . beds = 4
record . brent = 200
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to include ( match I18n . t ( " validations.financial.brent.above_hard_max " ) )
%w[ beds la postcode_known scheme_id location_id rent_type needstype period ] . each do | field |
expect ( record . errors [ field ] )
. to include ( match I18n . t ( " validations.financial.brent. #{ field } .above_hard_max " ) )
end
end
it " does not error if some of the fields are missing " do
record . managing_organisation . provider_type = 2
record . startdate = Time . zone . local ( 2021 , 9 , 17 )
record . brent = 200
financial_validator . validate_rent_amount ( record )
expect ( record . errors [ " brent " ] )
. to be_empty
end
end
end
context " when the accommodation is care home " do
before do
record . is_carehome = 1
end
context " and charges are over the valid limit (£1,000 per week) " do
it " validates charge when period is weekly for 52 weeks " do
record . period = 1
record . chcharge = 5001
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks " )
end
it " validates charge when period is monthly " do
record . period = 4
record . chcharge = 21_667
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month " )
end
it " validates charge when period is every 2 weeks " do
record . period = 2
record . chcharge = 12_001
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks " )
end
it " validates charge when period is every 4 weeks " do
record . period = 3
record . chcharge = 24_001
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks " )
end
end
context " and charges are within the valid limit (£1,000 per week) " do
it " does not throw error when period is weekly for 52 weeks " do
record . period = 1
record . chcharge = 999
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] ) . to be_empty
expect ( record . errors [ " period " ] ) . to be_empty
end
it " does not throw error when period is monthly " do
record . period = 4
record . chcharge = 4333
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] ) . to be_empty
expect ( record . errors [ " period " ] ) . to be_empty
end
it " does not throw error when period is every 2 weeks " do
record . period = 2
record . chcharge = 1999 . 99
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] ) . to be_empty
expect ( record . errors [ " period " ] ) . to be_empty
end
it " does not throw error when period is every 4 weeks " do
record . period = 3
record . chcharge = 3999
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] ) . to be_empty
expect ( record . errors [ " period " ] ) . to be_empty
end
end
context " and charges are not provided " do
xit " throws an error " do
record . period = 3
record . chcharge = nil
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( match I18n . t ( " validations.financial.carehome.not_provided " , period : " every 4 weeks " ) )
expect ( record . errors [ " is_carehome " ] )
. to include ( match I18n . t ( " validations.financial.carehome.not_provided " , period : " every 4 weeks " ) )
end
end
context " and charges under valid limit (£10pw) " do
it " validates charge when period is weekly for 52 weeks " do
record . period = 1
record . chcharge = 9
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £10.00 and £5,000.00 if paying weekly for 52 weeks " )
end
it " validates charge when period is monthly " do
record . period = 4
record . chcharge = 42
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £43.00 and £21,666.00 if paying every calendar month " )
end
it " validates charge when period is every 2 weeks " do
record . period = 2
record . chcharge = 19
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £20.00 and £10,000.00 if paying every 2 weeks " )
end
it " validates charge when period is every 4 weeks " do
record . period = 3
record . chcharge = 39
financial_validator . validate_care_home_charges ( record )
expect ( record . errors [ " chcharge " ] )
. to include ( " Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks " )
expect ( record . errors [ " period " ] )
. to include ( " Household rent and other charges must be between £40.00 and £20,000.00 if paying every 4 weeks " )
end
end
end
end
end