[ { "name": "£200k on £54,000 a year: 3.70× income and 39.52% stressed, passes both", "args": [ { "minor": 5400000, "currency": "GBP" }, { "minor": 30000, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 750, 300, 45000, 4000 ], "expect": { "incomeMultipleBasisPoints": 37038, "maxLoanByMultiple": { "minor": 24300000, "currency": "GBP" }, "withinMultiple": true, "monthlyIncome": { "minor": 450000, "currency": "GBP" }, "repayment": { "payment": { "minor": 111167, "currency": "GBP" }, "stressedPayment": { "minor": 147799, "currency": "GBP" }, "debtToIncomeBasisPoints": 3138, "stressedDebtToIncomeBasisPoints": 3952, "affordable": true, "headroom": { "minor": 2201, "currency": "GBP" } }, "affordable": true } }, { "name": "£200k on £40,000 a year: 5× income and 53.34% stressed, fails both", "args": [ { "minor": 4000000, "currency": "GBP" }, { "minor": 30000, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 750, 300, 45000, 4000 ], "expect": { "incomeMultipleBasisPoints": 50000, "maxLoanByMultiple": { "minor": 18000000, "currency": "GBP" }, "withinMultiple": false, "monthlyIncome": { "minor": 333333, "currency": "GBP" }, "repayment": { "payment": { "minor": 111167, "currency": "GBP" }, "stressedPayment": { "minor": 147799, "currency": "GBP" }, "debtToIncomeBasisPoints": 4236, "stressedDebtToIncomeBasisPoints": 5334, "affordable": false, "headroom": { "minor": -44466, "currency": "GBP" } }, "affordable": false } }, { "name": "exactly 4.5× income is within a 4.5× multiple", "args": [ { "minor": 4000000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 18000000, "currency": "GBP" }, 425, 725, 300, 45000, 4000 ], "expect": { "incomeMultipleBasisPoints": 45000, "maxLoanByMultiple": { "minor": 18000000, "currency": "GBP" }, "withinMultiple": true, "monthlyIncome": { "minor": 333333, "currency": "GBP" }, "repayment": { "payment": { "minor": 97513, "currency": "GBP" }, "stressedPayment": { "minor": 130106, "currency": "GBP" }, "debtToIncomeBasisPoints": 2926, "stressedDebtToIncomeBasisPoints": 3904, "affordable": true, "headroom": { "minor": 3227, "currency": "GBP" } }, "affordable": true } }, { "name": "a penny over 4.5× fails the multiple though the repayment fits", "args": [ { "minor": 4000000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 18000001, "currency": "GBP" }, 425, 725, 300, 45000, 4000 ], "expect": { "incomeMultipleBasisPoints": 45001, "maxLoanByMultiple": { "minor": 18000000, "currency": "GBP" }, "withinMultiple": false, "monthlyIncome": { "minor": 333333, "currency": "GBP" }, "repayment": { "payment": { "minor": 97513, "currency": "GBP" }, "stressedPayment": { "minor": 130106, "currency": "GBP" }, "debtToIncomeBasisPoints": 2926, "stressedDebtToIncomeBasisPoints": 3904, "affordable": true, "headroom": { "minor": 3227, "currency": "GBP" } }, "affordable": false } }, { "name": "within the multiple but the stressed repayment does not fit", "args": [ { "minor": 8000000, "currency": "GBP" }, { "minor": 50000, "currency": "GBP" }, { "minor": 30000000, "currency": "GBP" }, 500, 800, 360, 45000, 4000 ], "expect": { "incomeMultipleBasisPoints": 37500, "maxLoanByMultiple": { "minor": 36000000, "currency": "GBP" }, "withinMultiple": true, "monthlyIncome": { "minor": 666666, "currency": "GBP" }, "repayment": { "payment": { "minor": 161047, "currency": "GBP" }, "stressedPayment": { "minor": 220130, "currency": "GBP" }, "debtToIncomeBasisPoints": 3166, "stressedDebtToIncomeBasisPoints": 4052, "affordable": false, "headroom": { "minor": -3464, "currency": "GBP" } }, "affordable": false } }, { "name": "a comfortable 2× income loan", "args": [ { "minor": 10000000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 750, 300, 45000, 4000 ], "expect": { "incomeMultipleBasisPoints": 20000, "maxLoanByMultiple": { "minor": 45000000, "currency": "GBP" }, "withinMultiple": true, "monthlyIncome": { "minor": 833333, "currency": "GBP" }, "repayment": { "payment": { "minor": 111167, "currency": "GBP" }, "stressedPayment": { "minor": 147799, "currency": "GBP" }, "debtToIncomeBasisPoints": 1335, "stressedDebtToIncomeBasisPoints": 1774, "affordable": true, "headroom": { "minor": 185534, "currency": "GBP" } }, "affordable": true } }, { "name": "an interest-free loan still gets a stressed repayment; odd income rounds the multiple up and the maximum down", "args": [ { "minor": 6000001, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 12000000, "currency": "GBP" }, 0, 300, 240, 45000, 3500 ], "expect": { "incomeMultipleBasisPoints": 20000, "maxLoanByMultiple": { "minor": 27000004, "currency": "GBP" }, "withinMultiple": true, "monthlyIncome": { "minor": 500000, "currency": "GBP" }, "repayment": { "payment": { "minor": 50000, "currency": "GBP" }, "stressedPayment": { "minor": 66552, "currency": "GBP" }, "debtToIncomeBasisPoints": 1000, "stressedDebtToIncomeBasisPoints": 1332, "affordable": true, "headroom": { "minor": 108448, "currency": "GBP" } }, "affordable": true } }, { "name": "mixed currencies are refused", "args": [ { "minor": 5400000, "currency": "GBP" }, { "minor": 30000, "currency": "GBP" }, { "minor": 20000000, "currency": "EUR" }, 450, 750, 300, 45000, 4000 ], "expectError": "currency mismatch" }, { "name": "a zero income is refused", "args": [ { "minor": 0, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 750, 300, 45000, 4000 ], "expectError": "annualIncome must be between 12 and" }, { "name": "a zero loan is refused", "args": [ { "minor": 5400000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, 450, 750, 300, 45000, 4000 ], "expectError": "loan must be between 1 and" }, { "name": "a zero multiple is refused", "args": [ { "minor": 5400000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 750, 300, 0, 4000 ], "expectError": "maxIncomeMultipleBasisPoints must be between 1 and 200000" }, { "name": "a stress rate below the actual rate is refused by lending.affordability", "args": [ { "minor": 5400000, "currency": "GBP" }, { "minor": 0, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 400, 300, 45000, 4000 ], "expectError": "stressRateBasisPoints must not be below the actual rate" }, { "name": "negative commitments are refused by lending.affordability", "args": [ { "minor": 5400000, "currency": "GBP" }, { "minor": -1, "currency": "GBP" }, { "minor": 20000000, "currency": "GBP" }, 450, 750, 300, 45000, 4000 ], "expectError": "monthlyCommitments must not be negative" } ]