package alerts import ( "testing" "time" ) func TestAlertEnumsAndRuleCode(t *testing.T) { t.Parallel() for _, value := range []string{"BUSINESS", "TECHNICAL", "SECURITY", "COST"} { if !validCategory(value) { t.Fatalf("expected valid category %q", value) } } for _, value := range []string{"CRITICAL", "HIGH", "MEDIUM", "LOW"} { if !validSeverity(value) { t.Fatalf("expected valid severity %q", value) } } for _, value := range []string{"OPEN", "ACKNOWLEDGED", "MITIGATED", "RESOLVED", "SILENCED"} { if !validStatus(value) { t.Fatalf("expected valid status %q", value) } } for _, value := range []string{"OUTBOX_DEAD_LETTER", "VOICE_TASK_STUCK", "COST_DAILY_QUOTA_NEAR"} { if !rulePattern.MatchString(value) { t.Fatalf("expected valid rule code %q", value) } } for _, value := range []string{"", "ab", "lower_case", "-BROKEN"} { if rulePattern.MatchString(value) { t.Fatalf("expected invalid rule code %q", value) } } } func TestNormalizeRouting(t *testing.T) { t.Parallel() input := RoutingInput{ Category: " technical ", Severity: " high ", ReceiverGroup: " on-call ", EscalationReceiverGroup: " incident-command ", RunbookRef: " runbook://outbox/dead-letter ", ChangeSummary: " initial route ", } normalizeRouting(&input) if input.Category != "TECHNICAL" || input.Severity != "HIGH" || input.ReceiverGroup != "on-call" || input.EscalationReceiverGroup != "incident-command" || input.RunbookRef != "runbook://outbox/dead-letter" || input.ChangeSummary != "initial route" { t.Fatalf("unexpected normalized routing input: %#v", input) } input.ResponseMinutes = 10 input.EscalationAfterMinutes = 30 if !validRoutingInput(input) { t.Fatal("expected complete routing policy to be valid") } input.EscalationAfterMinutes = 5 if validRoutingInput(input) { t.Fatal("escalation deadline before response deadline must be rejected") } } func TestSilenceWindowBoundaries(t *testing.T) { t.Parallel() start := time.Date(2026, 8, 23, 10, 0, 0, 0, time.UTC) input := SilenceInput{RuleCode: " outbox_dead_letter ", Reason: " planned maintenance ", StartsAt: start, EndsAt: start.Add(30 * 24 * time.Hour)} normalizeSilence(&input) if !validSilenceInput(input, start) { t.Fatal("expected normalized 30-day silence to be valid") } input.EndsAt = start.Add(30*24*time.Hour + time.Second) if validSilenceInput(input, start) { t.Fatal("silence longer than 30 days must be rejected") } input.EndsAt = start.Add(time.Hour) input.RuleCode = "" if validSilenceInput(input, start) { t.Fatal("silence without rule, category or resource scope must be rejected") } }