85 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|