package importer import ( "os" "strings" "testing" ) func TestTruffleHogImporter_Name(t *testing.T) { var imp TruffleHogImporter if got := imp.Name(); got != "trufflehog" { t.Fatalf("Name() = %q, want %q", got, "trufflehog") } } func TestTruffleHogImporter_Import(t *testing.T) { f, err := os.Open("testdata/trufflehog-sample.json") if err != nil { t.Fatalf("open fixture: %v", err) } defer f.Close() var imp TruffleHogImporter findings, err := imp.Import(f) if err != nil { t.Fatalf("Import returned error: %v", err) } if len(findings) != 3 { t.Fatalf("expected 3 findings, got %d", len(findings)) } // Record 1: OpenAI / Git / verified. f0 := findings[0] if f0.ProviderName != "openai" { t.Errorf("findings[0].ProviderName = %q, want openai", f0.ProviderName) } if f0.Confidence != "high" { t.Errorf("findings[0].Confidence = %q, want high", f0.Confidence) } if !f0.Verified { t.Error("findings[0].Verified = false, want true") } if f0.VerifyStatus != "live" { t.Errorf("findings[0].VerifyStatus = %q, want live", f0.VerifyStatus) } if f0.Source != "src/config.py" { t.Errorf("findings[0].Source = %q, want src/config.py", f0.Source) } if f0.LineNumber != 42 { t.Errorf("findings[0].LineNumber = %d, want 42", f0.LineNumber) } if f0.SourceType != "import:trufflehog" { t.Errorf("findings[0].SourceType = %q, want import:trufflehog", f0.SourceType) } if f0.KeyValue != "sk-proj-abcdef1234567890abcdef" { t.Errorf("findings[0].KeyValue unexpected: %q", f0.KeyValue) } if f0.KeyMasked == "" || f0.KeyMasked == f0.KeyValue { t.Errorf("findings[0].KeyMasked not populated: %q", f0.KeyMasked) } // Record 2: AnthropicV2 / Filesystem / unverified. f1 := findings[1] if f1.ProviderName != "anthropic" { t.Errorf("findings[1].ProviderName = %q, want anthropic", f1.ProviderName) } if f1.Confidence != "medium" { t.Errorf("findings[1].Confidence = %q, want medium", f1.Confidence) } if f1.Verified { t.Error("findings[1].Verified = true, want false") } if f1.VerifyStatus != "unverified" { t.Errorf("findings[1].VerifyStatus = %q, want unverified", f1.VerifyStatus) } if f1.Source != "/tmp/leaked.env" { t.Errorf("findings[1].Source = %q, want /tmp/leaked.env", f1.Source) } // Record 3: AWS / Github link. f2 := findings[2] if f2.ProviderName != "aws" { t.Errorf("findings[2].ProviderName = %q, want aws", f2.ProviderName) } if !f2.Verified { t.Error("findings[2].Verified = false, want true") } if f2.Source != "https://github.com/foo/bar/blob/main/a.yml" { t.Errorf("findings[2].Source = %q, want github link", f2.Source) } } func TestTruffleHogImporter_NormalizeName(t *testing.T) { cases := []struct { in, want string }{ {"OpenAI", "openai"}, {"GithubV2", "github"}, {"AnthropicV2", "anthropic"}, {"AWS", "aws"}, {"GCP", "gcp"}, {"HuggingFace", "huggingface"}, {"UnknownDetector", "unknowndetector"}, } for _, c := range cases { if got := normalizeTruffleHogName(c.in); got != c.want { t.Errorf("normalizeTruffleHogName(%q) = %q, want %q", c.in, got, c.want) } } } func TestTruffleHogImporter_EmptyArray(t *testing.T) { var imp TruffleHogImporter findings, err := imp.Import(strings.NewReader("[]")) if err != nil { t.Fatalf("unexpected error: %v", err) } if len(findings) != 0 { t.Fatalf("expected 0 findings, got %d", len(findings)) } } func TestTruffleHogImporter_InvalidJSON(t *testing.T) { var imp TruffleHogImporter if _, err := imp.Import(strings.NewReader("not json")); err == nil { t.Fatal("expected error for invalid JSON, got nil") } }