shinnmen / internal /runtime /executor /codex_prompt_cache_redis_test.go
shinmentakezo07
feat(codex): add Redis-backed prompt cache fallback
0e6d51f
Raw
History Blame Contribute Delete
3.18 kB
package executor
import (
"testing"
"time"
miniredis "github.com/alicebob/miniredis/v2"
"github.com/router-for-me/CLIProxyAPI/v6/internal/config"
)
func TestGetOrCreateCodexPromptCacheRedis_StableKey(t *testing.T) {
resetCodexPromptCacheRedisForTest()
defer resetCodexPromptCacheRedisForTest()
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("start miniredis: %v", err)
}
defer mr.Close()
cfg := &config.Config{}
cfg.CodexPromptCache.RedisURL = "redis://" + mr.Addr() + "/0"
cfg.CodexPromptCache.KeyPrefix = "cliproxy:test:"
cfg.CodexPromptCache.TTLSeconds = 3600
cfg.CodexPromptCache.TimeoutMS = 500
id1, ok1 := getOrCreateCodexPromptCacheRedis(cfg, "gpt-5-user-1", 0)
if !ok1 || id1 == "" {
t.Fatalf("first redis cache id not created: ok=%v id=%q", ok1, id1)
}
id2, ok2 := getOrCreateCodexPromptCacheRedis(cfg, "gpt-5-user-1", 0)
if !ok2 || id2 == "" {
t.Fatalf("second redis cache id not returned: ok=%v id=%q", ok2, id2)
}
if id1 != id2 {
t.Fatalf("redis cache id mismatch: %q vs %q", id1, id2)
}
}
func TestGetOrCreateCodexPromptCacheRedis_FallbackOnInvalidURL(t *testing.T) {
resetCodexPromptCacheRedisForTest()
defer resetCodexPromptCacheRedisForTest()
cfg := &config.Config{}
cfg.CodexPromptCache.RedisURL = "::://invalid"
cfg.CodexPromptCache.TimeoutMS = 100
id, ok := getOrCreateCodexPromptCacheRedis(cfg, "gpt-5-user-1", 0)
if ok {
t.Fatalf("expected redis disabled/fallback on invalid URL, got ok=true id=%q", id)
}
}
func TestGetOrCreateCodexPromptCacheRedis_UsesConfiguredTTL(t *testing.T) {
resetCodexPromptCacheRedisForTest()
defer resetCodexPromptCacheRedisForTest()
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("start miniredis: %v", err)
}
defer mr.Close()
cfg := &config.Config{}
cfg.CodexPromptCache.RedisURL = "redis://" + mr.Addr() + "/0"
cfg.CodexPromptCache.KeyPrefix = "cliproxy:test:"
cfg.CodexPromptCache.TTLSeconds = 7
cfg.CodexPromptCache.TimeoutMS = 500
_, ok := getOrCreateCodexPromptCacheRedis(cfg, "gpt-5-user-ttl", 0)
if !ok {
t.Fatalf("expected redis set to succeed")
}
ttl := mr.TTL("cliproxy:test:gpt-5-user-ttl")
if ttl <= 0 {
t.Fatalf("expected positive ttl, got %v", ttl)
}
if ttl > 8*time.Second || ttl < 6*time.Second {
t.Fatalf("expected ttl around 7s, got %v", ttl)
}
}
func TestGetOrCreateCodexPromptCacheRedis_RequestTTLOverridesConfiguredTTL(t *testing.T) {
resetCodexPromptCacheRedisForTest()
defer resetCodexPromptCacheRedisForTest()
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("start miniredis: %v", err)
}
defer mr.Close()
cfg := &config.Config{}
cfg.CodexPromptCache.RedisURL = "redis://" + mr.Addr() + "/0"
cfg.CodexPromptCache.KeyPrefix = "cliproxy:test:"
cfg.CodexPromptCache.TTLSeconds = 3600
cfg.CodexPromptCache.TimeoutMS = 500
_, ok := getOrCreateCodexPromptCacheRedis(cfg, "gpt-5-user-ttl-override", 75*time.Second)
if !ok {
t.Fatalf("expected redis set to succeed")
}
ttl := mr.TTL("cliproxy:test:gpt-5-user-ttl-override")
if ttl <= 0 {
t.Fatalf("expected positive ttl, got %v", ttl)
}
if ttl > 76*time.Second || ttl < 74*time.Second {
t.Fatalf("expected ttl around 75s, got %v", ttl)
}
}