mirror of
https://github.com/vxcontrol/cloud.git
synced 2026-07-20 23:46:09 -04:00
197 lines
5.0 KiB
Go
197 lines
5.0 KiB
Go
package testdata
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/vxcontrol/cloud/anonymizer/patterns"
|
|
)
|
|
|
|
func TestLoadAllTestData(t *testing.T) {
|
|
datasets, err := LoadAllTestData()
|
|
if err != nil {
|
|
t.Fatalf("failed to load test data: %v", err)
|
|
}
|
|
|
|
if len(datasets) == 0 {
|
|
t.Fatal("no datasets loaded")
|
|
}
|
|
|
|
expectedCategories := []string{
|
|
"credentials", "financial", "network", "personal",
|
|
"crypto", "cloud", "services", "paths", "config",
|
|
}
|
|
|
|
if len(datasets) != len(expectedCategories) {
|
|
t.Errorf("expected %d categories, got %d", len(expectedCategories), len(datasets))
|
|
}
|
|
|
|
totalEntries := 0
|
|
totalExamples := 0
|
|
|
|
for _, dataset := range datasets {
|
|
if dataset.Category == "" {
|
|
t.Error("dataset category should not be empty")
|
|
}
|
|
|
|
if len(dataset.Entries) == 0 {
|
|
t.Errorf("dataset %s should have entries", dataset.Category)
|
|
}
|
|
|
|
for _, entry := range dataset.Entries {
|
|
if entry.Name == "" {
|
|
t.Errorf("entry name should not be empty in category %s", dataset.Category)
|
|
}
|
|
if entry.Examples == "" {
|
|
t.Errorf("entry %s should have examples", entry.Name)
|
|
}
|
|
exampleLines := strings.Split(entry.Examples, "\n")
|
|
totalExamples += len(exampleLines)
|
|
}
|
|
|
|
totalEntries += len(dataset.Entries)
|
|
}
|
|
|
|
t.Logf("loaded %d datasets with %d entries and %d examples",
|
|
len(datasets), totalEntries, totalExamples)
|
|
}
|
|
|
|
func TestIndividualDatasetLoaders(t *testing.T) {
|
|
loaders := map[string]func() (*TestDataset, error){
|
|
"credentials": LoadCredentialsData,
|
|
"financial": LoadFinancialData,
|
|
"network": LoadNetworkData,
|
|
"personal": LoadPersonalData,
|
|
"crypto": LoadCryptoData,
|
|
"cloud": LoadCloudData,
|
|
"services": LoadServicesData,
|
|
"paths": LoadPathsData,
|
|
"config": LoadConfigData,
|
|
"insensitive": LoadInsensitiveData,
|
|
}
|
|
|
|
for name, loader := range loaders {
|
|
t.Run(name, func(t *testing.T) {
|
|
dataset, err := loader()
|
|
if err != nil {
|
|
t.Fatalf("failed to load %s data: %v", name, err)
|
|
}
|
|
|
|
if dataset.Category != name {
|
|
t.Errorf("expected category %s, got %s", name, dataset.Category)
|
|
}
|
|
|
|
if len(dataset.Entries) == 0 {
|
|
t.Errorf("%s dataset should have entries", name)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDatasetDuplicates(t *testing.T) {
|
|
datasets, err := LoadAllTestData()
|
|
if err != nil {
|
|
t.Fatalf("failed to load test data: %v", err)
|
|
}
|
|
|
|
testPatterns := make(map[string]struct{})
|
|
for _, dataset := range datasets {
|
|
for _, entry := range dataset.Entries {
|
|
if _, ok := testPatterns[entry.Name]; ok {
|
|
t.Errorf("duplicate pattern %s in %s", entry.Name, dataset.Category)
|
|
}
|
|
testPatterns[entry.Name] = struct{}{}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestPatternCoverage(t *testing.T) {
|
|
datasets, err := LoadAllTestData()
|
|
if err != nil {
|
|
t.Fatalf("failed to load test data: %v", err)
|
|
}
|
|
|
|
testPatterns := make(map[string]struct{})
|
|
for _, dataset := range datasets {
|
|
for _, entry := range dataset.Entries {
|
|
testPatterns[entry.Name] = struct{}{}
|
|
}
|
|
}
|
|
|
|
allPatterns, err := patterns.LoadPatterns(patterns.PatternListTypeAll)
|
|
if err != nil {
|
|
t.Fatalf("failed to load all patterns: %v", err)
|
|
}
|
|
allPatternNames := make(map[string]struct{})
|
|
for _, pattern := range allPatterns.Patterns {
|
|
allPatternNames[pattern.Name] = struct{}{}
|
|
}
|
|
|
|
var uncoveredPatterns []string
|
|
|
|
for _, pattern := range allPatterns.Patterns {
|
|
if _, ok := testPatterns[pattern.Name]; !ok {
|
|
uncoveredPatterns = append(uncoveredPatterns, "general: "+pattern.Name)
|
|
}
|
|
}
|
|
|
|
if len(uncoveredPatterns) > 0 {
|
|
t.Errorf("uncovered patterns found (%d):", len(uncoveredPatterns))
|
|
for _, pattern := range uncoveredPatterns {
|
|
t.Logf(" - %s", pattern)
|
|
}
|
|
t.Error("please add test data for uncovered patterns")
|
|
} else {
|
|
t.Log("100% required patterns covered")
|
|
}
|
|
|
|
totalPatterns := len(allPatterns.Patterns)
|
|
coveredPatterns := len(testPatterns)
|
|
coveragePercent := float64(coveredPatterns) / float64(totalPatterns) * 100
|
|
|
|
t.Logf("pattern coverage: %d/%d (%.1f%%)",
|
|
coveredPatterns, totalPatterns, coveragePercent)
|
|
|
|
if coveragePercent != 100.0 {
|
|
t.Errorf("pattern coverage too low: %.1f%% (expected 100%%)", coveragePercent)
|
|
}
|
|
|
|
for _, dataset := range datasets {
|
|
for _, entry := range dataset.Entries {
|
|
if _, ok := allPatternNames[entry.Name]; !ok {
|
|
t.Errorf("pattern '%s' in %s is not covered", entry.Name, dataset.Category)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDataFormat(t *testing.T) {
|
|
datasets, err := LoadAllTestData()
|
|
if err != nil {
|
|
t.Fatalf("failed to load test data: %v", err)
|
|
}
|
|
|
|
for _, dataset := range datasets {
|
|
// check that raw content exists
|
|
if dataset.Raw == "" {
|
|
t.Errorf("dataset %s should have raw content", dataset.Category)
|
|
}
|
|
|
|
for _, entry := range dataset.Entries {
|
|
if entry.Examples == "" {
|
|
t.Errorf("entry %s in %s has no examples", entry.Name, dataset.Category)
|
|
continue
|
|
}
|
|
|
|
// check that examples are not empty when split by lines
|
|
exampleLines := strings.Split(entry.Examples, "\n")
|
|
for i, example := range exampleLines {
|
|
if strings.TrimSpace(example) == "" {
|
|
t.Errorf("empty example at line %d for %s in %s",
|
|
i, entry.Name, dataset.Category)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|