|
| 1 | +require 'rails_helper' |
| 2 | + |
| 3 | +RSpec.describe Strata::Rules::MedicaidRuleset do |
| 4 | + evaluated_on = Date.new(2025, 5, 28) # Freeze time for testing |
| 5 | + let(:rules) { described_class.new } |
| 6 | + |
| 7 | + describe '#medicaid_eligibility' do |
| 8 | + [ |
| 9 | + [ "when applicant is over 65 with qualifying income", "AK", true, 35000, true ], |
| 10 | + [ "when applicant is over 65 but income is too high", "AK", true, 55000, false ], |
| 11 | + [ "when applicant is under 65", "AK", false, 35000, false ], |
| 12 | + [ "when state of residence is missing", nil, true, 35000, true ] |
| 13 | + ].each do |context_description, state, over_65, income, expected| |
| 14 | + context context_description do |
| 15 | + it 'determines correct medicaid eligibility' do |
| 16 | + expect(rules.medicaid_eligibility(state, over_65, income)).to be expected |
| 17 | + end |
| 18 | + end |
| 19 | + end |
| 20 | + end |
| 21 | + |
| 22 | + describe '#age' do |
| 23 | + [ |
| 24 | + [ "calculates age correctly", Date.new(1954, 1, 1), evaluated_on, 71 ], # 71 years old in 2025 |
| 25 | + [ "calculates age on birthday", Date.new(1954, 1, 1), Date.new(2004, 1, 1), 50 ], |
| 26 | + [ "calculates age for age on leap year birthday", Date.new(2000, 2, 29), Date.new(2004, 2, 29), 4 ], |
| 27 | + [ "calculates age for age on leap year birthday", Date.new(2000, 2, 29), Date.new(2005, 3, 1), 5 ], |
| 28 | + [ "handles leap years", Date.new(2000, 5, 29), Date.new(2025, 5, 28), 24 ], |
| 29 | + [ "returns nil when date of birth is nil", nil, evaluated_on, nil ], |
| 30 | + [ "handles birth dates near evaluation date", Date.new(evaluated_on.year - 65, evaluated_on.month, evaluated_on.day + 1), evaluated_on, 64 ], |
| 31 | + [ "returns nil when date of birth is after evaluation date", evaluated_on + 1.day, evaluated_on, nil ], |
| 32 | + [ "returns nil when evaluated_on is nil", Date.new(1954, 1, 1), nil, nil ] |
| 33 | + ].each do |description, birth_date, evaluated_on, expected| |
| 34 | + it description do |
| 35 | + expect(rules.age(birth_date, evaluated_on)).to expected.nil? ? be_nil : eq(expected) |
| 36 | + end |
| 37 | + end |
| 38 | + end |
| 39 | + |
| 40 | + describe '#age_over_65' do |
| 41 | + [ |
| 42 | + [ "returns true when age is over 65", 71, true ], |
| 43 | + [ "returns true when age is exactly 65", 65, true ], |
| 44 | + [ "returns false when age is under 65", 64, false ], |
| 45 | + [ "returns nil when age is nil", nil, nil ] |
| 46 | + ].each do |description, age, expected| |
| 47 | + it description do |
| 48 | + expect(rules.age_over_65(age)).to be expected |
| 49 | + end |
| 50 | + end |
| 51 | + end |
| 52 | + |
| 53 | + describe '#state_of_residence' do |
| 54 | + [ |
| 55 | + [ "returns state from residential address", Strata::Address.new({ |
| 56 | + street_line_1: "123 A St", |
| 57 | + city: "Anchorage", |
| 58 | + state: "AK", |
| 59 | + zip_code: "12345" |
| 60 | + }), "AK" ], |
| 61 | + [ "returns nil when address is nil", nil, nil ] |
| 62 | + ].each do |description, addr, expected| |
| 63 | + it description do |
| 64 | + expect(rules.state_of_residence(addr)).to expected.nil? ? be_nil : eq(expected) |
| 65 | + end |
| 66 | + end |
| 67 | + end |
| 68 | + |
| 69 | + describe '#modified_adjusted_gross_income' do |
| 70 | + [ |
| 71 | + [ "subtracts deductions from annual income", 40000, 5000, 35000 ], |
| 72 | + [ "calculates income without deductions", 40000, 0, 40000 ], |
| 73 | + [ "calculates income where deductions exceeds income", 40000, 45000, 0 ], |
| 74 | + [ "returns nil if income nil", nil, 5000, nil ], |
| 75 | + [ "returns nil if deductions nil", 40000, nil, nil ] |
| 76 | + ].each do |description, income, deductions, expected| |
| 77 | + it description do |
| 78 | + expect(rules.modified_adjusted_gross_income(income, deductions)).to eq(expected) |
| 79 | + end |
| 80 | + end |
| 81 | + end |
| 82 | +end |
0 commit comments