Files
kefu/im/backend/internal/app/media_batch_test.go
T
2026-09-03 08:38:17 +08:00

85 lines
2.4 KiB
Go

package app
import (
"bytes"
"context"
"errors"
"io"
"os"
"path/filepath"
"testing"
)
type recordingMediaStorage struct {
files map[string][]byte
failAt string
cancel context.CancelFunc
}
func (s *recordingMediaStorage) Bucket() string { return "test-bucket" }
func (s *recordingMediaStorage) Put(_ context.Context, key, _ string, size int64, body io.Reader) error {
if key == s.failAt {
if s.cancel != nil {
s.cancel()
}
return errors.New("storage unavailable")
}
data, err := io.ReadAll(body)
if err != nil {
return err
}
if int64(len(data)) != size {
return errors.New("incorrect content length")
}
s.files[key] = data
return nil
}
func (s *recordingMediaStorage) Delete(ctx context.Context, key string) error {
if err := ctx.Err(); err != nil {
return err
}
delete(s.files, key)
return nil
}
func TestMediaVariantUploadCleanup(t *testing.T) {
for _, failure := range []string{"", "thumb.jpg", "display.jpg"} {
t.Run(failure, func(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
storage := &recordingMediaStorage{files: map[string][]byte{}, failAt: failure, cancel: cancel}
var objects []mediaUploadObject
for _, key := range []string{"original.png", "thumb.jpg", "display.jpg"} {
objects = append(objects, mediaUploadObject{Key: key, ContentType: "image/jpeg", Size: 3, Body: bytes.NewReader([]byte("abc"))})
}
cleanup, err := putMediaObjects(ctx, storage, objects)
if failure == "" {
if err != nil || len(storage.files) != 3 {
t.Fatal("missing uploaded variants", err)
}
cancel()
cleanup()
} else if err == nil {
t.Fatal("expected upload failure")
}
if len(storage.files) != 0 {
t.Fatal("partial objects left behind after failure/cancellation")
}
})
}
}
func TestLocalUploadCollisionPreservesExistingObject(t *testing.T) {
directory := t.TempDir()
storage := localMediaStorage{directory: directory}
file := filepath.Join(directory, "1-1-av1.jpg")
if err := os.WriteFile(file, []byte("existing"), 0600); err != nil {
t.Fatal(err)
}
if _, err := putMediaObjects(context.Background(), storage, []mediaUploadObject{{Key: "1-1-av1.jpg", Body: bytes.NewReader([]byte("replacement"))}}); err == nil {
t.Fatal("collision should fail")
}
data, err := os.ReadFile(file)
if err != nil || string(data) != "existing" {
t.Fatal("existing object was removed or overwritten", err)
}
}