chore: establish local platform baseline
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user