package bell_rule_alert_test import ( "errors" "testing" "go-admin/app/bell/rule" ) func TestRuleNormalizeTrimsAndNormalizesFields(t *testing.T) { eventType := " danger_area_entered " location := " 东门 " got, err := rule.Normalize(rule.WriteInput{ Code: " AREA_HIGH ", Name: " 高风险区域 ", EventType: &eventType, MinimumSeverity: " HIGH ", LocationContains: &location, }, true) if err != nil { t.Fatal(err) } if got.Code != "area_high" || got.Name != "高风险区域" || got.MinimumSeverity != "high" { t.Fatalf("unexpected normalized rule: %#v", got) } if got.EventType == nil || *got.EventType != "danger_area_entered" || got.LocationContains == nil || *got.LocationContains != "东门" { t.Fatalf("optional fields were not normalized: %#v", got) } } func TestRuleNormalizeRejectsInvalidInput(t *testing.T) { tests := []struct { name string input rule.WriteInput }{ {name: "invalid code", input: rule.WriteInput{Code: "Bad Code", Name: "规则", MinimumSeverity: "low"}}, {name: "missing name", input: rule.WriteInput{Code: "valid-code", Name: " ", MinimumSeverity: "low"}}, {name: "unknown severity", input: rule.WriteInput{Code: "valid-code", Name: "规则", MinimumSeverity: "urgent"}}, {name: "control character", input: rule.WriteInput{Code: "valid-code", Name: "规则\n泄露", MinimumSeverity: "low"}}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { if _, err := rule.Normalize(test.input, true); !errors.Is(err, rule.ErrInvalid) { t.Fatalf("expected ErrInvalid, got %v", err) } }) } } func TestRuleUpdateKeepsImmutableCodeOutsideInput(t *testing.T) { got, err := rule.Normalize(rule.WriteInput{Code: "ignored invalid code", Name: "更新后规则", MinimumSeverity: "medium"}, false) if err != nil { t.Fatal(err) } if got.Name != "更新后规则" || got.MinimumSeverity != "medium" { t.Fatalf("unexpected update normalization: %#v", got) } }