Files
vantablackTea 9d03ea4c51
CI / Go (build + vet + test) (push) Canceled after 0s
CI / Web (build + lint) (push) Canceled after 0s
big update: added reactions, groups, media share
2026-09-27 21:59:48 +03:00

74 lines
1.6 KiB
Go

package media
import (
"bytes"
"context"
"errors"
"io"
"strings"
"testing"
)
func TestLocalSaveOpenDelete(t *testing.T) {
ctx := context.Background()
store, err := NewLocal(t.TempDir())
if err != nil {
t.Fatalf("NewLocal: %v", err)
}
payload := []byte("hello attachment")
if err := store.Save(ctx, "a/b/file.txt", bytes.NewReader(payload)); err != nil {
t.Fatalf("Save: %v", err)
}
rc, err := store.Open(ctx, "a/b/file.txt")
if err != nil {
t.Fatalf("Open: %v", err)
}
got, err := io.ReadAll(rc)
rc.Close()
if err != nil {
t.Fatalf("ReadAll: %v", err)
}
if !bytes.Equal(got, payload) {
t.Fatalf("content = %q, want %q", got, payload)
}
if err := store.Delete(ctx, "a/b/file.txt"); err != nil {
t.Fatalf("Delete: %v", err)
}
if err := store.Delete(ctx, "a/b/file.txt"); err != nil {
t.Fatalf("Delete idempotent: %v", err)
}
if _, err := store.Open(ctx, "a/b/file.txt"); !errors.Is(err, ErrNotFound) {
t.Fatalf("Open after delete = %v, want ErrNotFound", err)
}
}
func TestLocalPathTraversalRejected(t *testing.T) {
store, err := NewLocal(t.TempDir())
if err != nil {
t.Fatalf("NewLocal: %v", err)
}
err = store.Save(context.Background(), "../../etc/evil", strings.NewReader("x"))
if err == nil {
t.Fatal("Save with traversal key = nil, want error")
}
}
func TestIsImage(t *testing.T) {
cases := map[string]bool{
"image/png": true,
"image/jpeg": true,
"image/gif": true,
"image/webp": true,
"application/pdf": false,
"text/plain": false,
}
for ct, want := range cases {
if got := IsImage(ct); got != want {
t.Errorf("IsImage(%q) = %v, want %v", ct, got, want)
}
}
}