134 lines
5.0 KiB
Go
134 lines
5.0 KiB
Go
package semanticcache
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/maximhq/bifrost/core/schemas"
|
|
)
|
|
|
|
// TestDefaultCacheKey_CachesWithoutPerRequestKey verifies that when DefaultCacheKey
|
|
// is configured, requests without an explicit cache key are cached automatically.
|
|
func TestDefaultCacheKey_CachesWithoutPerRequestKey(t *testing.T) {
|
|
config := getDefaultTestConfig()
|
|
config.DefaultCacheKey = "test-default-key"
|
|
|
|
setup := NewTestSetupWithConfig(t, config)
|
|
defer setup.Cleanup()
|
|
|
|
// Context with NO per-request cache key
|
|
ctx := schemas.NewBifrostContext(context.Background(), schemas.NoDeadline)
|
|
|
|
testRequest := CreateBasicChatRequest("What is Bifrost? Answer in one short sentence.", 0.7, 50)
|
|
|
|
t.Log("Making first request without per-request cache key (should use default and be cached)...")
|
|
response1, err1 := setup.Client.ChatCompletionRequest(ctx, testRequest)
|
|
if err1 != nil {
|
|
return // Test will be skipped by retry function
|
|
}
|
|
|
|
if response1 == nil || len(response1.Choices) == 0 || response1.Choices[0].Message.Content.ContentStr == nil {
|
|
t.Fatal("First response is invalid")
|
|
}
|
|
|
|
// First request should NOT be a cache hit
|
|
AssertNoCacheHit(t, &schemas.BifrostResponse{ChatResponse: response1})
|
|
|
|
WaitForCache(setup.Plugin)
|
|
|
|
t.Log("Making second identical request without per-request cache key (should hit cache)...")
|
|
ctx2 := schemas.NewBifrostContext(context.Background(), schemas.NoDeadline)
|
|
response2, err2 := setup.Client.ChatCompletionRequest(ctx2, testRequest)
|
|
if err2 != nil {
|
|
if err2.Error != nil {
|
|
t.Fatalf("Second request failed: %v", err2.Error.Message)
|
|
}
|
|
t.Fatalf("Second request failed: %v", err2)
|
|
}
|
|
|
|
AssertCacheHit(t, &schemas.BifrostResponse{ChatResponse: response2}, string(CacheTypeDirect))
|
|
t.Log("Default cache key correctly enabled caching without per-request key")
|
|
}
|
|
|
|
// TestDefaultCacheKey_PerRequestKeyOverridesDefault verifies that an explicit
|
|
// per-request cache key takes precedence over the configured default.
|
|
func TestDefaultCacheKey_PerRequestKeyOverridesDefault(t *testing.T) {
|
|
config := getDefaultTestConfig()
|
|
config.DefaultCacheKey = "test-default-key"
|
|
|
|
setup := NewTestSetupWithConfig(t, config)
|
|
defer setup.Cleanup()
|
|
|
|
testRequest := CreateBasicChatRequest("What is the capital of France?", 0.5, 50)
|
|
|
|
// Cache with the default key (no per-request key)
|
|
ctx1 := schemas.NewBifrostContext(context.Background(), schemas.NoDeadline)
|
|
_, err1 := setup.Client.ChatCompletionRequest(ctx1, testRequest)
|
|
if err1 != nil {
|
|
return // Test will be skipped by retry function
|
|
}
|
|
|
|
WaitForCache(setup.Plugin)
|
|
|
|
// Verify the cache was actually populated with the default key
|
|
ctxDefault2 := schemas.NewBifrostContext(context.Background(), schemas.NoDeadline)
|
|
responseDefault2, errDefault2 := setup.Client.ChatCompletionRequest(ctxDefault2, testRequest)
|
|
if errDefault2 != nil {
|
|
if errDefault2.Error != nil {
|
|
t.Fatalf("Default-key verification request failed: %v", errDefault2.Error.Message)
|
|
}
|
|
t.Fatalf("Default-key verification request failed: %v", errDefault2)
|
|
}
|
|
AssertCacheHit(t, &schemas.BifrostResponse{ChatResponse: responseDefault2}, string(CacheTypeDirect))
|
|
|
|
// Same request but with a DIFFERENT per-request key — should miss
|
|
ctx2 := CreateContextWithCacheKey("override-key")
|
|
response2, err2 := setup.Client.ChatCompletionRequest(ctx2, testRequest)
|
|
if err2 != nil {
|
|
if err2.Error != nil {
|
|
t.Fatalf("Second request failed: %v", err2.Error.Message)
|
|
}
|
|
t.Fatalf("Second request failed: %v", err2)
|
|
}
|
|
|
|
AssertNoCacheHit(t, &schemas.BifrostResponse{ChatResponse: response2})
|
|
t.Log("Per-request cache key correctly overrides default (different namespace = cache miss)")
|
|
}
|
|
|
|
// TestDefaultCacheKey_EmptyDefault_NoCaching verifies that when DefaultCacheKey
|
|
// is empty (default zero value), requests without a per-request key bypass caching.
|
|
func TestDefaultCacheKey_EmptyDefault_NoCaching(t *testing.T) {
|
|
config := getDefaultTestConfig()
|
|
// DefaultCacheKey is intentionally left empty (zero value)
|
|
|
|
setup := NewTestSetupWithConfig(t, config)
|
|
defer setup.Cleanup()
|
|
|
|
ctx := schemas.NewBifrostContext(context.Background(), schemas.NoDeadline)
|
|
|
|
testRequest := CreateBasicChatRequest("What is deep learning", 0.7, 50)
|
|
|
|
t.Log("Making first request without any cache key and no default (should not cache)...")
|
|
response1, err1 := setup.Client.ChatCompletionRequest(ctx, testRequest)
|
|
if err1 != nil {
|
|
return // Test will be skipped by retry function
|
|
}
|
|
|
|
AssertNoCacheHit(t, &schemas.BifrostResponse{ChatResponse: response1})
|
|
|
|
WaitForCache(setup.Plugin)
|
|
|
|
t.Log("Making second identical request (should still not cache)...")
|
|
ctx2 := schemas.NewBifrostContext(context.Background(), schemas.NoDeadline)
|
|
response2, err2 := setup.Client.ChatCompletionRequest(ctx2, testRequest)
|
|
if err2 != nil {
|
|
if err2.Error != nil {
|
|
t.Fatalf("Second request failed: %v", err2.Error.Message)
|
|
}
|
|
t.Fatalf("Second request failed: %v", err2)
|
|
}
|
|
|
|
AssertNoCacheHit(t, &schemas.BifrostResponse{ChatResponse: response2})
|
|
t.Log("Empty default cache key correctly preserves opt-in behavior")
|
|
}
|