Files
2026-08-21 16:00:13 +08:00

123 lines
3.0 KiB
Go

package cache
import (
"testing"
"time"
"github.com/chenxin/hunjing/mcp/web-search/internal/config"
"github.com/chenxin/hunjing/mcp/web-search/internal/models"
)
func TestCache_SetAndGet(t *testing.T) {
m, err := New(config.CacheConfig{
Enabled: true,
TTL: 5 * time.Minute,
MaxItems: 100,
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
req := &models.SearchRequest{Query: "test", MaxResults: 5}
result := &models.SearchResult{Query: "test", TotalCount: 1}
m.Set(req, models.ProviderTavily, result)
got := m.Get(req, models.ProviderTavily)
if got == nil {
t.Fatal("expected cached result")
}
if !got.Cached {
t.Error("expected cached=true")
}
}
func TestCache_Miss(t *testing.T) {
m, err := New(config.CacheConfig{
Enabled: true,
TTL: 5 * time.Minute,
MaxItems: 100,
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
got := m.Get(&models.SearchRequest{Query: "nosuch"}, models.ProviderTavily)
if got != nil {
t.Fatal("expected nil for cache miss")
}
}
func TestCache_Disabled(t *testing.T) {
m, err := New(config.CacheConfig{Enabled: false})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
m.Set(&models.SearchRequest{Query: "test"}, models.ProviderTavily, &models.SearchResult{})
got := m.Get(&models.SearchRequest{Query: "test"}, models.ProviderTavily)
if got != nil {
t.Fatal("expected nil when cache disabled")
}
}
func TestCache_Expired(t *testing.T) {
m, err := New(config.CacheConfig{
Enabled: true,
TTL: -1 * time.Second, // 立即过期
MaxItems: 100,
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
m.Set(&models.SearchRequest{Query: "test"}, models.ProviderTavily, &models.SearchResult{})
got := m.Get(&models.SearchRequest{Query: "test"}, models.ProviderTavily)
if got != nil {
t.Fatal("expected nil for expired entry")
}
}
func TestCache_Stats(t *testing.T) {
m, err := New(config.CacheConfig{
Enabled: true,
TTL: 5 * time.Minute,
MaxItems: 100,
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
// Miss then hit
m.Get(&models.SearchRequest{Query: "miss"}, models.ProviderTavily)
m.Set(&models.SearchRequest{Query: "hit"}, models.ProviderTavily, &models.SearchResult{})
m.Get(&models.SearchRequest{Query: "hit"}, models.ProviderTavily)
l1Hits, l2Hits, misses := m.Stats()
if l1Hits != 1 {
t.Errorf("expected 1 L1 hit, got %d", l1Hits)
}
if l2Hits != 0 {
t.Errorf("expected 0 L2 hits, got %d", l2Hits)
}
if misses != 1 {
t.Errorf("expected 1 miss, got %d", misses)
}
}
func TestCache_ProviderIsolation(t *testing.T) {
m, err := New(config.CacheConfig{
Enabled: true,
TTL: 5 * time.Minute,
MaxItems: 100,
})
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
req := &models.SearchRequest{Query: "test", MaxResults: 5}
m.Set(req, models.ProviderTavily, &models.SearchResult{Query: "test"})
// Same query, different provider should miss
got := m.Get(req, models.ProviderBrave)
if got != nil {
t.Fatal("expected miss for different provider")
}
}