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