package unsub import ( "math" "testing" "time" ) func TestCalculateRefundRatio(t *testing.T) { effective := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC) cases := []struct { name string cutoff time.Time want float64 }{ {name: "before effective refunds all", cutoff: effective.Add(-time.Hour), want: 1}, {name: "half paid period", cutoff: time.Date(2026, 7, 1, 0, 0, 0, 0, time.UTC), want: 184.0 / 365.0}, {name: "during gift period refunds none", cutoff: time.Date(2027, 2, 1, 0, 0, 0, 0, time.UTC), want: 0}, {name: "after paid period refunds none", cutoff: time.Date(2027, 1, 1, 0, 0, 0, 0, time.UTC), want: 0}, } for _, testCase := range cases { t.Run(testCase.name, func(t *testing.T) { got := calculateRefundRatio(effective, testCase.cutoff, 12) if math.Abs(got-testCase.want) > 0.000001 { t.Fatalf("calculateRefundRatio() = %v, want %v", got, testCase.want) } }) } } func TestAddRefundMonthsClampsMonthEnd(t *testing.T) { got := addRefundMonths(time.Date(2026, 1, 31, 12, 0, 0, 0, time.UTC), 1) want := time.Date(2026, 2, 28, 12, 0, 0, 0, time.UTC) if !got.Equal(want) { t.Fatalf("addRefundMonths() = %v, want %v", got, want) } }