[
{
"name": "statutory minimum, relief at source, monthly: 5% and 3% of pay between \u00a3520 and \u00a34,189",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 198000,
"currency": "GBP"
},
"employeeGross": {
"minor": 9900,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 7920,
"currency": "GBP"
},
"employer": {
"minor": 5940,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "the same under a net pay arrangement: the whole 5% comes off before tax",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "net-pay"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 198000,
"currency": "GBP"
},
"employeeGross": {
"minor": 9900,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 9900,
"currency": "GBP"
},
"employer": {
"minor": 5940,
"currency": "GBP"
},
"deductBeforeTax": true,
"earningsTriggerMet": true
}
},
{
"name": "pay above the upper level: contributions stop at \u00a34,189",
"args": [
{
"minor": 500000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 366900,
"currency": "GBP"
},
"employeeGross": {
"minor": 18345,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 14676,
"currency": "GBP"
},
"employer": {
"minor": 11007,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "pay exactly at the upper level",
"args": [
{
"minor": 418900,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 366900,
"currency": "GBP"
},
"employeeGross": {
"minor": 18345,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 14676,
"currency": "GBP"
},
"employer": {
"minor": 11007,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "pay below the lower level: nothing to contribute",
"args": [
{
"minor": 50000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 0,
"currency": "GBP"
},
"employeeGross": {
"minor": 0,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 0,
"currency": "GBP"
},
"employer": {
"minor": 0,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": false
}
},
{
"name": "between the lower level and the trigger: contributions due if enrolled, but no automatic enrolment",
"args": [
{
"minor": 70000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 18000,
"currency": "GBP"
},
"employeeGross": {
"minor": 900,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 720,
"currency": "GBP"
},
"employer": {
"minor": 540,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": false
}
},
{
"name": "exactly the trigger is not more than it",
"args": [
{
"minor": 83300,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 31300,
"currency": "GBP"
},
"employeeGross": {
"minor": 1565,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 1252,
"currency": "GBP"
},
"employer": {
"minor": 939,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": false
}
},
{
"name": "weekly in 2025-26 uses the \u00a3120 weekly lower level",
"args": [
{
"minor": 40000,
"currency": "GBP"
},
"weekly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2025-07-04"
],
"expect": {
"pensionableEarnings": {
"minor": 28000,
"currency": "GBP"
},
"employeeGross": {
"minor": 1400,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 1120,
"currency": "GBP"
},
"employer": {
"minor": 840,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "fortnightly in 2024-25 uses the \u00a3240 fortnightly lower level",
"args": [
{
"minor": 100000,
"currency": "GBP"
},
"fortnightly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2024-07-05"
],
"expect": {
"pensionableEarnings": {
"minor": 76000,
"currency": "GBP"
},
"employeeGross": {
"minor": 3800,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 3040,
"currency": "GBP"
},
"employer": {
"minor": 2280,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "four-weekly in 2023-24 uses the \u00a3480 four-weekly lower level",
"args": [
{
"minor": 200000,
"currency": "GBP"
},
"four-weekly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2023-07-07"
],
"expect": {
"pensionableEarnings": {
"minor": 152000,
"currency": "GBP"
},
"employeeGross": {
"minor": 7600,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 6080,
"currency": "GBP"
},
"employer": {
"minor": 4560,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "all-earnings scheme with supplied rates",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": 300,
"employerBasisPoints": 500,
"earningsBasis": "all-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 250000,
"currency": "GBP"
},
"employeeGross": {
"minor": 7500,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 6000,
"currency": "GBP"
},
"employer": {
"minor": 12500,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "an employer paying 6% lets the employee pay 2% and still meet the 8% minimum",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": 600,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 198000,
"currency": "GBP"
},
"employeeGross": {
"minor": 3960,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 3168,
"currency": "GBP"
},
"employer": {
"minor": 11880,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "an employer paying 10% leaves no minimum employee contribution",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": 1000,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 198000,
"currency": "GBP"
},
"employeeGross": {
"minor": 0,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 0,
"currency": "GBP"
},
"employer": {
"minor": 19800,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "half a penny rounds up, and 80% of the rounded gross is rounded again",
"args": [
{
"minor": 100010,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expect": {
"pensionableEarnings": {
"minor": 48010,
"currency": "GBP"
},
"employeeGross": {
"minor": 2401,
"currency": "GBP"
},
"employeeDeduction": {
"minor": 1921,
"currency": "GBP"
},
"employer": {
"minor": 1440,
"currency": "GBP"
},
"deductBeforeTax": false,
"earningsTriggerMet": true
}
},
{
"name": "a date before the thresholds this package carries",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2023-04-05"
],
"expectError": "no auto-enrolment earnings thresholds"
},
{
"name": "negative earnings are refused",
"args": [
{
"minor": -1,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expectError": "earnings must not be negative"
},
{
"name": "a negative rate is refused",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": -100,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expectError": "employeeBasisPoints must be a whole number of basis points"
},
{
"name": "an unknown earnings basis is refused",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "band",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expectError": "unknown earnings basis"
},
{
"name": "an unknown relief arrangement is refused",
"args": [
{
"minor": 250000,
"currency": "GBP"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "salary-sacrifice"
},
"2026-05-28"
],
"expectError": "unknown relief arrangement"
},
{
"name": "another currency is refused",
"args": [
{
"minor": 250000,
"currency": "EUR"
},
"monthly",
{
"employeeBasisPoints": null,
"employerBasisPoints": null,
"earningsBasis": "qualifying-earnings",
"arrangement": "relief-at-source"
},
"2026-05-28"
],
"expectError": "must be in GBP"
}
]