package alert import ( "os" "path/filepath" "testing" ) func TestLoadRulesRejectsUnknownAndDuplicateValues(t *testing.T) { path := filepath.Join(t.TempDir(), "rules.json") valid := `{"version":1,"rules":[{"tenant_id":1,"site_id":2,"rule_key":"zone-entry","display_name":"区域闯入","event_kind":"zone_entry","minimum_severity":"medium","enabled":true,"effective_from":"2026-08-11T00:00:00Z"}]}` if err := os.WriteFile(path, []byte(valid), 0o600); err != nil { t.Fatal(err) } rules, err := LoadRules(path) if err != nil || len(rules) != 1 { t.Fatalf("load valid rules: %v %#v", err, rules) } if err := os.WriteFile(path, []byte(`{"version":1,"unknown":true,"rules":[]}`), 0o600); err != nil { t.Fatal(err) } if _, err := LoadRules(path); err == nil { t.Fatal("unknown rule document property was accepted") } if err := os.WriteFile(path, []byte(valid+` trailing`), 0o600); err != nil { t.Fatal(err) } if _, err := LoadRules(path); err == nil { t.Fatal("trailing rule file data was accepted") } } func TestSeverityRankIsStable(t *testing.T) { for index, value := range []string{"low", "medium", "high", "critical"} { rank, ok := SeverityRank(value) if !ok || rank != index { t.Fatalf("rank %q: %d %v", value, rank, ok) } } if _, ok := SeverityRank("urgent"); ok { t.Fatal("unknown severity was accepted") } }