Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/hb-passport-review-followups.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Tighten the Housing Benefit passport tests: hold Guarantee Credit at nil in the contributory-benefit property control, and base the applicable-income arithmetic fixtures on earnings and working tax credit rather than Child Benefit.
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,20 @@
housing_benefit_applicable_income: 1_000

- name: Pension contributions halved
# SI 2006/213 reg 36(3)(b): half of the pension contributions come off
# earnings. 3,250 - 1,500 / 2 = 2,500.
period: 2025
input:
# Benefits
child_benefit: 1_000
child_benefit: 0
income_support: 0
jsa_income: 0
esa_income: 0
# Income
employment_income: 0
employment_income: 3_250
self_employment_income: 0
property_income: 0
private_pension_income: 2_250
private_pension_income: 0
# Tax
income_tax: 0
national_insurance: 0
Expand All @@ -71,47 +73,50 @@
housing_benefit_applicable_income: 2_500

- name: Added Tax and income
# Earnings plus working tax credit, which counts in full where Sch 5
# para 56 does not apply. 3,250 + 2,000 - 1,500 / 2 = 4,500.
period: 2025
input:
# Benefits
child_benefit: 1_000
child_benefit: 0
income_support: 0
jsa_income: 0
esa_income: 0
# Income
employment_income: 0
employment_income: 3_250
self_employment_income: 0
property_income: 1_000
private_pension_income: 2_250
property_income: 0
private_pension_income: 0
# Tax
income_tax: 0
national_insurance: 0
# Other
tax_credits: 1_000
tax_credits: 2_000
pension_contributions: 1_500
housing_benefit_applicable_income_disregard: 0
housing_benefit_applicable_income_childcare_element: 0
output:
housing_benefit_applicable_income: 4_500

- name: Pension contributions capped at 0
# Applicable income is floored at nil: 3,250 - 100,000 / 2 < 0.
period: 2025
input:
# Benefits
child_benefit: 1_000
child_benefit: 0
income_support: 0
jsa_income: 0
esa_income: 0
# Income
employment_income: 0
employment_income: 3_250
self_employment_income: 0
property_income: 1_000
private_pension_income: 2_250
property_income: 0
private_pension_income: 0
# Tax
income_tax: 0
national_insurance: 0
# Other
tax_credits: 1_000
tax_credits: 0
pension_contributions: 100_000
housing_benefit_applicable_income_disregard: 0
housing_benefit_applicable_income_childcare_element: 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
family in receipt equals the rent whether its members are of working age,
a mixed-age couple or over State Pension age.
7. Contributory JSA and ESA are not a passport: moving an amount from
income-based to contribution-based JSA or ESA turns the passport off.
income-based to contribution-based JSA or ESA turns the passport off, and
with no guarantee credit either (which passports a pension-age family in
its own right) the family's savings stay its capital.
"""

import numpy as np
Expand Down Expand Up @@ -287,13 +289,18 @@ def test_contributory_jsa_and_esa_are_not_a_passport(units, amount):
if name.startswith("a") and name.endswith("_0"):
person["jsa_contrib"] = {YEAR: amount}
person["esa_contrib"] = {YEAR: amount}
# A pension-age family can still have its capital disregarded through the
# Guarantee Credit passport, so hold that at nil to isolate this one.
for name, benunit in contributory["benunits"].items():
if name.startswith("b"):
benunit["guarantee_credit"] = {YEAR: 0.0}
sim = Simulation(situation=contributory)
on_benefit = np.asarray(
sim.calculate("in_receipt_of_income_support_jsa_ib_or_esa_ir", YEAR)
)
assert not on_benefit.any()
capital = np.asarray(sim.calculate("housing_benefit_assessable_capital", YEAR))
savings = np.array([unit["savings"] for unit in units])
# Without the passport the family's savings count as its capital (no
# With neither passport the family's savings count as its capital (no
# non-dependants here, so no household apportionment).
assert np.allclose(capital, savings, atol=0.01)