Files
2025-09-27 04:55:20 +03:00

212 lines
4.9 KiB
Go

package patterns
import (
"testing"
"github.com/wasilibs/go-re2"
"github.com/wasilibs/go-re2/experimental"
"gopkg.in/yaml.v3"
)
func TestLoadPatternsGeneral(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypeGeneral)
if err != nil {
t.Fatalf("failed to load general patterns: %v", err)
}
if patterns == nil {
t.Fatal("patterns should not be nil")
}
if len(patterns.Patterns) == 0 {
t.Fatal("general patterns should not be empty")
}
t.Logf("loaded %d general patterns", len(patterns.Patterns))
}
func TestLoadPatternsPii(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypePii)
if err != nil {
t.Fatalf("failed to load pii patterns: %v", err)
}
if patterns == nil {
t.Fatal("patterns should not be nil")
}
if len(patterns.Patterns) == 0 {
t.Fatal("pii patterns should not be empty")
}
t.Logf("loaded %d pii patterns", len(patterns.Patterns))
}
func TestLoadPatternsSecrets(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypeSecrets)
if err != nil {
t.Fatalf("failed to load secrets patterns: %v", err)
}
if patterns == nil {
t.Fatal("patterns should not be nil")
}
if len(patterns.Patterns) == 0 {
t.Fatal("secrets patterns should not be empty")
}
t.Logf("loaded %d secrets patterns", len(patterns.Patterns))
}
func TestLoadPatternsAll(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypeAll)
if err != nil {
t.Fatalf("failed to load all patterns: %v", err)
}
if patterns == nil {
t.Fatal("patterns should not be nil")
}
if len(patterns.Patterns) == 0 {
t.Fatal("all patterns should not be empty")
}
t.Logf("loaded %d total patterns", len(patterns.Patterns))
}
func TestPatternsMethods(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypeGeneral)
if err != nil {
t.Fatalf("failed to load patterns: %v", err)
}
namesList := patterns.Names()
regexList := patterns.Regexes()
if len(namesList) != len(patterns.Patterns) {
t.Errorf("expected %d names, got %d", len(patterns.Patterns), len(namesList))
}
if len(regexList) != len(patterns.Patterns) {
t.Errorf("expected %d regexes, got %d", len(patterns.Patterns), len(regexList))
}
for i, name := range namesList {
if name == "" {
t.Errorf("name at index %d is empty", i)
}
}
for i, regex := range regexList {
if regex == "" {
t.Errorf("regex at index %d is empty", i)
}
}
}
func TestPatternsStructure(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypeGeneral)
if err != nil {
t.Fatalf("failed to load patterns: %v", err)
}
for i, pattern := range patterns.Patterns {
if pattern.Name == "" {
t.Errorf("pattern at index %d has empty name", i)
}
if pattern.Regex == "" {
t.Errorf("pattern at index %d has empty regex", i)
}
}
}
func TestPatternsDuplicate(t *testing.T) {
patterns, err := LoadPatterns(PatternListTypeAll)
if err != nil {
t.Fatalf("failed to load patterns: %v", err)
}
patternMap := make(map[string]struct{})
for _, pattern := range patterns.Patterns {
if _, ok := patternMap[pattern.Name]; ok {
t.Errorf("duplicate pattern %s", pattern.Name)
}
patternMap[pattern.Name] = struct{}{}
}
}
func TestRawPatternsStructure(t *testing.T) {
patternsRawData := [][]byte{
GeneralPatterns,
PiiPatterns,
SecretsPatterns,
}
for _, patternData := range patternsRawData {
var patterns map[string][]map[string]string
if err := yaml.Unmarshal(patternData, &patterns); err != nil {
t.Fatalf("failed to unmarshal patterns: %v", err)
}
if len(patterns) != 1 {
t.Errorf("patterns has %d fields, expected 1", len(patterns))
}
if len(patterns["patterns"]) == 0 {
t.Errorf("patterns has no patterns")
}
for _, pattern := range patterns["patterns"] {
if len(pattern) != 2 {
t.Errorf("pattern has %d fields, expected 2", len(pattern))
}
if pattern["name"] == "" {
t.Errorf("pattern has empty name")
}
if pattern["regex"] == "" {
t.Errorf("pattern has empty regex")
}
}
}
}
func TestPatternCompilation(t *testing.T) {
patternTypes := []struct {
name string
ptype PatternListType
}{
{"general", PatternListTypeGeneral},
{"pii", PatternListTypePii},
{"secrets", PatternListTypeSecrets},
}
for _, pt := range patternTypes {
t.Run(pt.name, func(t *testing.T) {
patterns, err := LoadPatterns(pt.ptype)
if err != nil {
t.Fatalf("failed to load %s patterns: %v", pt.name, err)
}
namesList := patterns.Names()
regexList := patterns.Regexes()
for i, regex := range regexList {
if regex == "" {
t.Errorf("empty regex at index %d", i)
continue
}
if _, err := re2.Compile(regex); err != nil {
t.Errorf("failed to compile regex at index %d with name '%s': %s - error: %v",
i, namesList[i], regex, err)
}
}
if _, err := experimental.CompileSet(regexList); err != nil {
t.Errorf("failed to compile regex set: %v", err)
}
t.Logf("successfully compiled %d %s regexes", len(regexList), pt.name)
})
}
}