package project import ( "strings" "testing" ) func TestRequiresAttackChainBody(t *testing.T) { cases := []struct { cat, key string want bool }{ {"finding", "note/misc", true}, {"note", "finding/sqli-login", true}, {"target", "target/primary_domain", false}, {"auth", "auth/admin_cookie", false}, {"chain", "x", true}, {"", "exploit/rce-upload", true}, } for _, tc := range cases { if got := RequiresAttackChainBody(tc.cat, tc.key); got != tc.want { t.Errorf("RequiresAttackChainBody(%q,%q)=%v want %v", tc.cat, tc.key, got, tc.want) } } } func TestIsSparseFactBody(t *testing.T) { long := strings.Repeat("x", 150) if !IsSparseFactBody("finding", "finding/x", "") { t.Error("empty body should be sparse") } if !IsSparseFactBody("finding", "finding/x", long) { t.Error("body without repro clues should be sparse") } body := "## 攻击链\n1. step\n## Exploit\n```http\nGET / HTTP/1.1\n```\n" if IsSparseFactBody("finding", "finding/x", body) { t.Error("structured body should not be sparse") } if IsSparseFactBody("target", "target/x", "") { t.Error("env fact empty body is ok") } }