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) } }