Files
keyhunter/pkg/recon/dedup_test.go
2026-04-06 00:42:45 +03:00

56 lines
1.9 KiB
Go

package recon
import (
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/salvacybersec/keyhunter/pkg/engine"
)
func TestDedupEmpty(t *testing.T) {
require.Nil(t, Dedup(nil))
require.Nil(t, Dedup([]engine.Finding{}))
}
func TestDedupNoDuplicates(t *testing.T) {
in := []engine.Finding{
{ProviderName: "openai", KeyMasked: "sk-abc12...9xyz", Source: "https://example.com/a"},
{ProviderName: "anthropic", KeyMasked: "sk-ant-1...2def", Source: "https://example.com/b"},
{ProviderName: "cohere", KeyMasked: "co-abcde...wxyz", Source: "https://example.com/c"},
}
out := Dedup(in)
require.Len(t, out, 3)
require.Equal(t, in, out, "order must be preserved")
}
func TestDedupAllDuplicates(t *testing.T) {
f := engine.Finding{ProviderName: "openai", KeyMasked: "sk-abc12...9xyz", Source: "https://example.com/a"}
out := Dedup([]engine.Finding{f, f, f})
require.Len(t, out, 1)
require.Equal(t, f, out[0])
}
func TestDedupPreservesFirstSeen(t *testing.T) {
first := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
second := time.Date(2026, 2, 2, 0, 0, 0, 0, time.UTC)
in := []engine.Finding{
{ProviderName: "openai", KeyMasked: "sk-abc12...9xyz", Source: "https://example.com/a", DetectedAt: first, Confidence: "high"},
{ProviderName: "openai", KeyMasked: "sk-abc12...9xyz", Source: "https://example.com/a", DetectedAt: second, Confidence: "low"},
}
out := Dedup(in)
require.Len(t, out, 1)
require.Equal(t, first, out[0].DetectedAt, "first-seen timestamp must win")
require.Equal(t, "high", out[0].Confidence, "first-seen metadata must win")
}
func TestDedupDifferentSource(t *testing.T) {
in := []engine.Finding{
{ProviderName: "openai", KeyMasked: "sk-abc12...9xyz", Source: "https://example.com/a"},
{ProviderName: "openai", KeyMasked: "sk-abc12...9xyz", Source: "https://example.com/b"},
}
out := Dedup(in)
require.Len(t, out, 2, "same provider+masked but different Source URLs must both be kept")
}