103 lines
2.2 KiB
Go
103 lines
2.2 KiB
Go
package storage
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"testing"
|
|
|
|
"git.toowon.com/jimmy/go-common/config"
|
|
)
|
|
|
|
func TestLocalStorage_UploadGetExistsDelete(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
cfg := &config.LocalStorageConfig{
|
|
BaseDir: t.TempDir(),
|
|
PublicURL: "http://localhost:8080/file?key={objectKey}",
|
|
}
|
|
s, err := NewLocalStorage(cfg)
|
|
if err != nil {
|
|
t.Fatalf("NewLocalStorage error: %v", err)
|
|
}
|
|
|
|
ctx := context.Background()
|
|
objectKey := "uploads/2026/01/30/hello.txt"
|
|
body := []byte("hello local storage")
|
|
|
|
if err := s.Upload(ctx, objectKey, bytes.NewReader(body), "text/plain"); err != nil {
|
|
t.Fatalf("Upload error: %v", err)
|
|
}
|
|
|
|
exists, err := s.Exists(ctx, objectKey)
|
|
if err != nil {
|
|
t.Fatalf("Exists error: %v", err)
|
|
}
|
|
if !exists {
|
|
t.Fatalf("expected exists=true")
|
|
}
|
|
|
|
rc, err := s.GetObject(ctx, objectKey)
|
|
if err != nil {
|
|
t.Fatalf("GetObject error: %v", err)
|
|
}
|
|
defer rc.Close()
|
|
|
|
got, err := io.ReadAll(rc)
|
|
if err != nil {
|
|
t.Fatalf("ReadAll error: %v", err)
|
|
}
|
|
if !bytes.Equal(got, body) {
|
|
t.Fatalf("content mismatch: got=%q want=%q", string(got), string(body))
|
|
}
|
|
|
|
u, err := s.GetURL(objectKey, 0)
|
|
if err != nil {
|
|
t.Fatalf("GetURL error: %v", err)
|
|
}
|
|
if u == "" {
|
|
t.Fatalf("expected non-empty url")
|
|
}
|
|
|
|
if err := s.Delete(ctx, objectKey); err != nil {
|
|
t.Fatalf("Delete error: %v", err)
|
|
}
|
|
|
|
exists, err = s.Exists(ctx, objectKey)
|
|
if err != nil {
|
|
t.Fatalf("Exists error: %v", err)
|
|
}
|
|
if exists {
|
|
t.Fatalf("expected exists=false after delete")
|
|
}
|
|
}
|
|
|
|
func TestNormalizeObjectKey(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
if _, err := normalizeObjectKey(""); err == nil {
|
|
t.Fatalf("expected error for empty objectKey")
|
|
}
|
|
if _, err := normalizeObjectKey(" "); err == nil {
|
|
t.Fatalf("expected error for blank objectKey")
|
|
}
|
|
if _, err := normalizeObjectKey("."); err == nil {
|
|
t.Fatalf("expected error for '.'")
|
|
}
|
|
clean1, err := normalizeObjectKey("a/b/")
|
|
if err != nil {
|
|
t.Fatalf("normalizeObjectKey error: %v", err)
|
|
}
|
|
if clean1 != "a/b" {
|
|
t.Fatalf("unexpected clean key: %q", clean1)
|
|
}
|
|
|
|
clean, err := normalizeObjectKey(`\a\..\b\c.txt`)
|
|
if err != nil {
|
|
t.Fatalf("normalizeObjectKey error: %v", err)
|
|
}
|
|
if clean != "b/c.txt" {
|
|
t.Fatalf("unexpected clean key: %q", clean)
|
|
}
|
|
}
|