Files
sure/test/controllers/retirement_controller_test.rb
ChakibMoMi 4f3230c904 Generalize pension system: multi-country strategy pattern
- Add JSONB pension_params column to retirement_configs
- Add data JSONB column to pension_entries
- Create pension calculator strategy classes (Base, DeGrv, UsSocialSecurity, UkStatePension, FrRegimeGeneral, EsSocialSecurity)
- Update RetirementConfig model to delegate to calculators
- Make PensionEntry.current_points optional for non-points systems
- Update controller strong params (pension_params: {})
- Add Stimulus pension_system_controller for dynamic form fields
- Update views with per-country field groups and conditional points columns
- Expand i18n (EN, DE) and add ES, FR locale files
- Update fixtures and tests for new schema

Addresses review feedback from jjmata on PR #1057
2026-04-09 00:37:11 +02:00

171 lines
4.5 KiB
Ruby

require "test_helper"
class RetirementControllerTest < ActionDispatch::IntegrationTest
setup do
sign_in @user = users(:family_admin)
@family = @user.family
end
test "show redirects to setup when no config exists" do
@family.retirement_config&.destroy
get retirement_path
assert_redirected_to setup_retirement_path
end
test "show renders successfully when config exists" do
# Ensure config exists
@family.create_retirement_config!(
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR"
) unless @family.retirement_config
get retirement_path
assert_response :ok
end
test "setup renders successfully" do
get setup_retirement_path
assert_response :ok
end
test "create saves retirement config" do
@family.retirement_config&.destroy
assert_difference "RetirementConfig.count", 1 do
post retirement_path, params: {
retirement_config: {
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR",
pension_system: "de_grv",
country: "DE",
expected_return_pct: 7.0,
inflation_pct: 2.0,
tax_rate_pct: 26.38,
pension_params: {
expected_annual_points: 1.0,
rentenwert: 39.32,
contribution_start_year: 2015
}
}
}
end
assert_redirected_to retirement_path
end
test "edit renders successfully" do
@family.create_retirement_config!(
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR"
) unless @family.retirement_config
get edit_retirement_path
assert_response :ok
end
test "update modifies retirement config" do
config = @family.retirement_config || @family.create_retirement_config!(
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR"
)
patch retirement_path, params: {
retirement_config: {
target_monthly_income: 4000
}
}
assert_redirected_to retirement_path
config.reload
assert_equal 4000, config.target_monthly_income.to_i
end
test "add_pension_entry creates new entry" do
config = @family.retirement_config || @family.create_retirement_config!(
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR"
)
assert_difference "PensionEntry.count", 1 do
post add_pension_entry_retirement_path, params: {
pension_entry: {
recorded_at: "2025-01-15",
current_points: 10.5,
current_monthly_pension: 400.0,
projected_monthly_pension: 1900.0,
notes: "Test entry"
}
}
end
assert_redirected_to retirement_path
end
test "destroy_pension_entry removes entry" do
config = @family.retirement_config || @family.create_retirement_config!(
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR"
)
entry = config.pension_entries.create!(
recorded_at: "2025-06-01",
current_points: 11.0
)
assert_difference "PensionEntry.count", -1 do
delete destroy_pension_entry_retirement_path(id: entry.id)
end
assert_redirected_to retirement_path
end
test "destroy_pension_entry cannot delete another family's entry" do
# Create config and entry for the current user's family
config = @family.retirement_config || @family.create_retirement_config!(
birth_year: 1990,
retirement_age: 67,
target_monthly_income: 3000,
currency: "EUR"
)
own_entry = config.pension_entries.create!(
recorded_at: "2025-06-01",
current_points: 11.0
)
# Create config and entry for a different family
other_family = families(:empty)
other_config = other_family.retirement_config || other_family.create_retirement_config!(
birth_year: 1985,
retirement_age: 65,
target_monthly_income: 2500,
currency: "EUR"
)
other_entry = other_config.pension_entries.create!(
recorded_at: "2025-06-01",
current_points: 8.0
)
# Attempting to delete another family's entry should return 404
assert_no_difference "PensionEntry.count" do
delete destroy_pension_entry_retirement_path(id: other_entry.id)
end
assert_response :not_found
# The other family's entry should still exist
assert PensionEntry.exists?(other_entry.id)
end
end