[ { "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" }, { "name": "a trailing newline is not part of an ISO date", "args": [ { "minor": 250000, "currency": "GBP" }, "monthly", { "employeeBasisPoints": null, "employerBasisPoints": null, "earningsBasis": "qualifying-earnings", "arrangement": "relief-at-source" }, "2026-05-28\n" ], "expectError": "payDate must be an ISO date" }, { "name": "Arabic-Indic digits are not an ISO date", "args": [ { "minor": 250000, "currency": "GBP" }, "monthly", { "employeeBasisPoints": null, "employerBasisPoints": null, "earningsBasis": "qualifying-earnings", "arrangement": "relief-at-source" }, "٢٠٢٦-٠٥-٢٨" ], "expectError": "payDate must be an ISO date" } ]