Files
sure/test/models/pension_source_test.rb
Guillem Arias bf0f10c21f feat(retirement): PR2 data models — pension sources, statements, bucket
Data plane for Retirement v2 (no FIRE math yet — that is PR3). Five
migrations + four AR models, wired to Goal::Retirement.

Models:
- PensionSource — state/workplace/other source with country, pension
  system, tax treatment, payout shape (string-backed + inclusion
  validations rather than PG enums, so v2 can add countries without
  ALTER TYPE). monetize :amount; end_age required for fixed-term.
- Goal::RetirementStatement — append-only audit journal. default_scope
  excludes soft-deleted rows; soft_replace! does soft-delete + insert;
  points_delta drives the "—"/signed Δ column; monetize against
  projected_currency.
- Goal::RetirementAdjustment — signed today's-money deltas to the
  spending target, ordered, applicable_at?(age).
- RetirementBucketEntry — account selection join, unique per plan,
  same-family guard.

Goal::Retirement gains the four associations + bucket_accounts and an
ADJUSTMENTS_LIMIT (10) cap. retirement_params jsonb added to goals for
PR3 plan settings.

Namespaced fixture classes mapped via set_fixture_class so the
goal_retirement association resolves. Minimal fixtures + model tests
(112 runs green, incl. goal/family/controller regression sweep). No
new gems.
2026-05-29 10:36:18 +02:00

40 lines
1.1 KiB
Ruby

require "test_helper"
class PensionSourceTest < ActiveSupport::TestCase
setup do
@source = pension_sources(:de_grv_bob)
end
test "fixture is valid" do
assert @source.valid?, @source.errors.full_messages.to_sentence
end
test "validates enum-like inclusions" do
@source.kind = "bogus"
assert_not @source.valid?
assert_includes @source.errors.attribute_names, :kind
end
test "end_age required for fixed-term payout" do
@source.payout_shape = "monthly_fixed_term"
@source.end_age = nil
assert_not @source.valid?
assert_includes @source.errors[:end_age],
I18n.t("activerecord.errors.models.pension_source.attributes.end_age.required_for_fixed_term")
end
test "end_age must exceed start_age" do
@source.end_age = @source.start_age - 1
assert_not @source.valid?
end
test "amount_money uses the source currency" do
assert_equal Money.new(1510, "EUR"), @source.amount_money
end
test "effective_rate_override bounded between 0 and 1" do
@source.effective_rate_override = 1.5
assert_not @source.valid?
end
end