package imgcache import ( "bytes" "errors" "io" "os" "path/filepath" "testing" "sneak.berlin/go/pixa/internal/imagerequest" ) func TestContentStorage_StoreAndLoad(t *testing.T) { t.Parallel() tmpDir := t.TempDir() storage, err := NewContentStorage(tmpDir) if err != nil { t.Fatalf("NewContentStorage() error = %v", err) } content := []byte("hello world") key := imagerequest.Source{Host: testHostCDN, Path: testPathCat}.Key() size, err := storage.Store(key, content) if err != nil { t.Fatalf("Store() error = %v", err) } if size != int64(len(content)) { t.Errorf("Store() size = %d, want %d", size, len(content)) } // Verify file exists at expected path keyStr := string(key) expectedPath := filepath.Join(tmpDir, keyStr[0:2], keyStr[2:4], keyStr) _, err = os.Stat(expectedPath) if err != nil { t.Errorf("File not at expected path %s: %v", expectedPath, err) } // Load and verify content r, err := storage.Load(key) if err != nil { t.Fatalf("Load() error = %v", err) } defer func() { _ = r.Close() }() loaded, err := io.ReadAll(r) if err != nil { t.Fatalf("ReadAll() error = %v", err) } if !bytes.Equal(loaded, content) { t.Errorf("Load() content = %q, want %q", loaded, content) } } func TestContentStorage_LoadNotFound(t *testing.T) { t.Parallel() tmpDir := t.TempDir() storage, err := NewContentStorage(tmpDir) if err != nil { t.Fatalf("NewContentStorage() error = %v", err) } _, err = storage.Load(imagerequest.SourceKey("nonexistent")) if !errors.Is(err, ErrNotFound) { t.Errorf("Load() error = %v, want ErrNotFound", err) } } func TestContentStorage_Delete(t *testing.T) { t.Parallel() tmpDir := t.TempDir() storage, err := NewContentStorage(tmpDir) if err != nil { t.Fatalf("NewContentStorage() error = %v", err) } content := []byte("to be deleted") key := imagerequest.Source{Host: testHostCDN, Path: testPathCat}.Key() _, err = storage.Store(key, content) if err != nil { t.Fatalf("Store() error = %v", err) } if !storage.Exists(key) { t.Error("Exists() = false, want true") } err = storage.Delete(key) if err != nil { t.Fatalf("Delete() error = %v", err) } if storage.Exists(key) { t.Error("Exists() = true after delete, want false") } } func TestContentStorage_DeleteNonexistent(t *testing.T) { t.Parallel() tmpDir := t.TempDir() storage, err := NewContentStorage(tmpDir) if err != nil { t.Fatalf("NewContentStorage() error = %v", err) } // Should not error err = storage.Delete(imagerequest.SourceKey("nonexistent")) if err != nil { t.Errorf("Delete() error = %v, want nil", err) } } func TestContentStorage_KeyToPath(t *testing.T) { t.Parallel() tmpDir := t.TempDir() storage, err := NewContentStorage(tmpDir) if err != nil { t.Fatalf("NewContentStorage() error = %v", err) } // Test by storing and verifying the resulting path structure content := []byte("test content for path verification") key := imagerequest.Source{Host: testHostCDN, Path: testPathCat}.Key() _, err = storage.Store(key, content) if err != nil { t.Fatalf("Store() error = %v", err) } keyStr := string(key) expectedPath := filepath.Join(tmpDir, keyStr[0:2], keyStr[2:4], keyStr) _, err = os.Stat(expectedPath) if err != nil { t.Errorf("File not at expected path %s: %v", expectedPath, err) } }