Files
Sakurasan d5dac5a6fc feat: AutoZero 通用 Agent 框架(从 AutoGo 五阶段拆分完成)
llm(三协议 Provider)/ session(JSONL 持久化)/ tools(Registry、围栏、
builtin、computer)/ cdp(browser)/ skills / mcp / agent(循环、两级压缩、
编排、审批门控)+ 底座 jsonl/textx/execx/diag/scratch/spill/imagecache。

产品装配代码(config 桥接、schedule 工具、memory/plan/retro/prompt)
留在 AutoGo,宿主接入方式见 MIGRATION.md。
2026-10-26 00:54:46 +08:00

189 lines
3.8 KiB
Go

package imagecache
import (
"os"
"path/filepath"
"testing"
)
func TestCache_StoreAndLoad(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
// 存储图片
data := []byte("fake image data")
filename, err := cache.Store(data, ".jpg")
if err != nil {
t.Fatalf("Store() error = %v", err)
}
// 验证文件存在
path := filepath.Join(dir, filename)
if _, err := os.Stat(path); os.IsNotExist(err) {
t.Errorf("Store() file not created: %s", path)
}
// 加载图片
loaded, err := cache.Load(filename)
if err != nil {
t.Fatalf("Load() error = %v", err)
}
if string(loaded) != string(data) {
t.Errorf("Load() = %s, want %s", loaded, data)
}
}
func TestCache_LoadBase64(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
data := []byte("test data")
filename, err := cache.Store(data, ".png")
if err != nil {
t.Fatalf("Store() error = %v", err)
}
b64, err := cache.LoadBase64(filename)
if err != nil {
t.Fatalf("LoadBase64() error = %v", err)
}
if b64 == "" {
t.Error("LoadBase64() returned empty string")
}
}
func TestCache_Exists(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
filename, _ := cache.Store([]byte("data"), ".jpg")
if !cache.Exists(filename) {
t.Error("Exists() = false, want true")
}
if cache.Exists("nonexistent.jpg") {
t.Error("Exists() = true for nonexistent file")
}
}
func TestCache_Delete(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
filename, _ := cache.Store([]byte("data"), ".jpg")
if err := cache.Delete(filename); err != nil {
t.Fatalf("Delete() error = %v", err)
}
if cache.Exists(filename) {
t.Error("Delete() file still exists")
}
}
func TestCache_List(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
cache.Store([]byte("data1"), ".jpg")
cache.Store([]byte("data2"), ".png")
files, err := cache.List()
if err != nil {
t.Fatalf("List() error = %v", err)
}
if len(files) != 2 {
t.Errorf("List() returned %d files, want 2", len(files))
}
}
func TestCache_Stats(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
cache.Store([]byte("data1"), ".jpg")
cache.Store([]byte("data2"), ".png")
count, totalSize, err := cache.Stats()
if err != nil {
t.Fatalf("Stats() error = %v", err)
}
if count != 2 {
t.Errorf("Stats() count = %d, want 2", count)
}
if totalSize <= 0 {
t.Errorf("Stats() totalSize = %d, want > 0", totalSize)
}
}
func TestCache_SafePath(t *testing.T) {
dir := t.TempDir()
cache, err := New(dir, 0, 0)
if err != nil {
t.Fatalf("New() error = %v", err)
}
// 测试路径遍历防护
tests := []struct {
input string
expected string
}{
{"test.jpg", filepath.Join(dir, "test.jpg")},
{"../etc/passwd", filepath.Join(dir, "passwd")},
{"/etc/passwd", filepath.Join(dir, "passwd")},
{"subdir/test.jpg", filepath.Join(dir, "test.jpg")},
}
for _, tt := range tests {
got := cache.safePath(tt.input)
if got != tt.expected {
t.Errorf("safePath(%q) = %q, want %q", tt.input, got, tt.expected)
}
}
}
func TestDetectMIME(t *testing.T) {
tests := []struct {
filename string
expected string
}{
{"test.jpg", "image/jpeg"},
{"test.jpeg", "image/jpeg"},
{"test.png", "image/png"},
{"test.gif", "image/gif"},
{"test.webp", "image/webp"},
{"test.unknown", "image/jpeg"},
}
for _, tt := range tests {
got := detectMIME(tt.filename)
if got != tt.expected {
t.Errorf("detectMIME(%q) = %q, want %q", tt.filename, got, tt.expected)
}
}
}