package s3lifecycle import ( "testing" "time" ) func TestMinTriggerAge_PerKind(t *testing.T) { rule := &Rule{ ExpirationDays: 30, NoncurrentVersionExpirationDays: 7, AbortMPUDaysAfterInitiation: 14, } cases := []struct { kind ActionKind want time.Duration }{ {ActionKindExpirationDays, DaysToDuration(30)}, {ActionKindNoncurrentDays, DaysToDuration(7)}, {ActionKindAbortMPU, DaysToDuration(14)}, {ActionKindExpirationDate, 0}, {ActionKindNewerNoncurrent, 0}, {ActionKindExpiredDeleteMarker, 0}, } for _, c := range cases { t.Run(c.kind.String(), func(t *testing.T) { if got := MinTriggerAge(rule, c.kind); got != c.want { t.Fatalf("want %v, got %v", c.want, got) } }) } } func TestMinTriggerAge_KindNotSetReturnsZero(t *testing.T) { // Asking for a kind that the rule doesn't actually declare returns 0, // so the safety-scan cadence falls through to the kind floor. rule := &Rule{ExpirationDays: 30} if got := MinTriggerAge(rule, ActionKindAbortMPU); got != 0 { t.Fatalf("want 0, got %v", got) } } func TestMinTriggerAge_DateOnlyReturnsZero(t *testing.T) { rule := &Rule{ExpirationDate: mustTime(t, "2025-06-15T00:00:00Z")} if got := MinTriggerAge(rule, ActionKindExpirationDate); got != 0 { t.Fatalf("date kind has no day threshold, got %v", got) } } func TestMinTriggerAge_NilRule(t *testing.T) { if got := MinTriggerAge(nil, ActionKindExpirationDays); got != 0 { t.Fatalf("nil rule should return 0, got %v", got) } }