80 lines
2.6 KiB
Go
80 lines
2.6 KiB
Go
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")
|
|
}
|
|
}
|