Cybersecurity-Projects/PROJECTS/intermediate/security-news-scraper/internal/ai/factory_test.go

84 lines
2.2 KiB
Go

// ©AngelaMos | 2026
// factory_test.go
package ai
import (
"testing"
"github.com/CarterPerez-dev/nadezhda/internal/config"
"github.com/CarterPerez-dev/nadezhda/internal/store"
)
func TestFactoryProviders(t *testing.T) {
base := config.Default().AI
t.Setenv(envOpenAIKey, "")
t.Setenv(envGeminiKey, "")
t.Setenv(envAnthropicKey, "")
base.Provider = ProviderQwen
p, err := Factory(base)
if err != nil || p.Name() != ProviderQwen {
t.Fatalf("qwen: p=%v err=%v", p, err)
}
base.Provider = ProviderOpenAI
if _, err := Factory(base); err == nil {
t.Error("openai without key should error")
}
t.Setenv(envOpenAIKey, "k")
if p, err := Factory(base); err != nil || p.Name() != ProviderOpenAI {
t.Errorf("openai: p=%v err=%v", p, err)
}
base.Provider = ProviderGemini
if _, err := Factory(base); err == nil {
t.Error("gemini without key should error")
}
t.Setenv(envGeminiKey, "k")
if p, err := Factory(base); err != nil || p.Name() != ProviderGemini {
t.Errorf("gemini: p=%v err=%v", p, err)
}
base.Provider = ProviderAnthropic
if _, err := Factory(base); err == nil {
t.Error("anthropic without key should error")
}
t.Setenv(envAnthropicKey, "k")
if p, err := Factory(base); err != nil || p.Name() != ProviderAnthropic {
t.Errorf("anthropic: p=%v err=%v", p, err)
}
base.Provider = "nope"
if _, err := Factory(base); err == nil {
t.Error("unknown provider should error")
}
}
func TestRequestFromCluster(t *testing.T) {
cvss := 9.8
epss := 0.5
c := store.DigestCluster{
Size: 3,
FirstSeen: 0,
LastSeen: 6 * secondsPerHour,
Articles: []store.DigestArticle{
{Title: "A", SourceName: "krebs"},
{Title: "A", SourceName: "krebs"},
{Title: "B", SourceName: "register"},
},
CVEs: []store.DigestCVE{{ID: "CVE-2025-1", CVSSScore: &cvss, EPSS: &epss, IsKEV: true}},
}
req := RequestFromCluster(c)
if len(req.Titles) != 2 || len(req.Sources) != 2 {
t.Errorf("dedup failed: titles=%v sources=%v", req.Titles, req.Sources)
}
if req.SpanHours != 6 || req.ClusterSize != 3 {
t.Errorf("span=%d size=%d", req.SpanHours, req.ClusterSize)
}
if len(req.CVEs) != 1 || !req.CVEs[0].KEV || req.CVEs[0].CVSS == nil {
t.Errorf("cve mapping: %+v", req.CVEs)
}
}