refac: decouple persistence and image storage behind driver registries
This commit is contained in:
1 parent
421cfafec3
commit
81e299f09a
46 files changed
+1036
-374
No files matched your search
@@ -5,7 +5,8 @@ import (
|
||||
domainImage "RenewCMS/internal/domain/image"
|
||||
"RenewCMS/internal/infrastructure/persistence/models"
|
||||
persistence "RenewCMS/internal/infrastructure/persistence/repositories"
|
||||
"bytes"
|
||||
"RenewCMS/internal/infrastructure/storage"
|
||||
"RenewCMS/internal/infrastructure/useCases"
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -21,13 +22,13 @@ func newMediaPersistence(t *testing.T) (*gorm.DB, *persistence.ImageRepository,
|
||||
t.Fatalf("failed to migrate: %v", err)
|
||||
}
|
||||
uploadDir := t.TempDir()
|
||||
return db, persistence.NewImageRepository(db, uploadDir), uploadDir
|
||||
return db, persistence.NewImageRepository(db), uploadDir
|
||||
}
|
||||
|
||||
func createStoredImage(t *testing.T, repo *persistence.ImageRepository, filename string, content []byte, contentType string) domainImage.Image {
|
||||
t.Helper()
|
||||
created, err := repo.Create(domainImage.ImageInput{
|
||||
Content: bytes.NewReader(content),
|
||||
created, err := repo.Create(domainImage.Image{
|
||||
Path: domainImage.PublicPath(filename),
|
||||
Filename: filename,
|
||||
Size: int64(len(content)),
|
||||
ContentType: contentType,
|
||||
@@ -42,8 +43,8 @@ func createStoredImage(t *testing.T, repo *persistence.ImageRepository, filename
|
||||
}
|
||||
|
||||
func TestMediaImageRepository(t *testing.T) {
|
||||
t.Run("Create stores the file and the metadata and returns the assigned id", func(t *testing.T) {
|
||||
_, repo, uploadDir := newMediaPersistence(t)
|
||||
t.Run("Create stores the metadata and returns the assigned id", func(t *testing.T) {
|
||||
_, repo, _ := newMediaPersistence(t)
|
||||
content := pngBytes(t, 3, 2)
|
||||
|
||||
created := createStoredImage(t, repo, "a.png", content, "image/png")
|
||||
@@ -51,10 +52,6 @@ func TestMediaImageRepository(t *testing.T) {
|
||||
if created.ID == 0 || created.Filename != "a.png" || created.SHA256 != sha256Hex(content) || created.Width != 3 || created.Size != int64(len(content)) {
|
||||
t.Errorf("unexpected image %+v", created)
|
||||
}
|
||||
onDisk, err := os.ReadFile(filepath.Join(uploadDir, filepath.Base(created.Path)))
|
||||
if err != nil || !bytes.Equal(onDisk, content) {
|
||||
t.Errorf("expected the file on disk, got %v", err)
|
||||
}
|
||||
got, err := repo.Get(created.ID)
|
||||
if err != nil || got.SHA256 != created.SHA256 {
|
||||
t.Errorf("Get returned %+v, %v", got, err)
|
||||
@@ -69,34 +66,19 @@ func TestMediaImageRepository(t *testing.T) {
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Delete removes the file and the row", func(t *testing.T) {
|
||||
_, repo, uploadDir := newMediaPersistence(t)
|
||||
t.Run("Delete removes the row", func(t *testing.T) {
|
||||
_, repo, _ := newMediaPersistence(t)
|
||||
created := createStoredImage(t, repo, "a.png", pngBytes(t, 3, 2), "image/png")
|
||||
|
||||
if err := repo.Delete(created.ID); err != nil {
|
||||
t.Fatalf("Delete failed: %v", err)
|
||||
}
|
||||
if _, err := os.Stat(filepath.Join(uploadDir, filepath.Base(created.Path))); !os.IsNotExist(err) {
|
||||
t.Errorf("expected the file to be gone")
|
||||
}
|
||||
if _, err := repo.Get(created.ID); !errors.Is(err, domainImage.ErrImageNotFound) {
|
||||
t.Errorf("expected the row to be gone, got %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("A file already missing from disk still deletes the row", func(t *testing.T) {
|
||||
_, repo, uploadDir := newMediaPersistence(t)
|
||||
created := createStoredImage(t, repo, "a.png", pngBytes(t, 3, 2), "image/png")
|
||||
if err := os.Remove(filepath.Join(uploadDir, filepath.Base(created.Path))); err != nil {
|
||||
t.Fatalf("failed to remove the file: %v", err)
|
||||
}
|
||||
|
||||
if err := repo.Delete(created.ID); err != nil {
|
||||
t.Fatalf("Delete failed: %v", err)
|
||||
}
|
||||
if _, err := repo.Get(created.ID); !errors.Is(err, domainImage.ErrImageNotFound) {
|
||||
t.Errorf("expected the row to be gone, got %v", err)
|
||||
}
|
||||
if err := repo.Delete(created.ID); !errors.Is(err, domainImage.ErrImageNotFound) {
|
||||
t.Errorf("expected ErrImageNotFound on a second delete, got %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("List, FindByHash, Rename, ListDuplicates and Counts", func(t *testing.T) {
|
||||
@@ -183,7 +165,7 @@ func TestMediaImageBackfill(t *testing.T) {
|
||||
writeFile(t, uploadDir, "two.svg", svg)
|
||||
pngRow, svgRow := seedLegacyRow(t, db, "one.png"), seedLegacyRow(t, db, "two.svg")
|
||||
|
||||
if err := persistence.BackfillImageMetadata(db, uploadDir); err != nil {
|
||||
if err := useCases.NewBackfillImageMetadataUseCase(repo, storage.NewLocalStorage(uploadDir)).Run(); err != nil {
|
||||
t.Fatalf("backfill failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -201,7 +183,7 @@ func TestMediaImageBackfill(t *testing.T) {
|
||||
db, repo, uploadDir := newMediaPersistence(t)
|
||||
row := seedLegacyRow(t, db, "gone.png")
|
||||
|
||||
if err := persistence.BackfillImageMetadata(db, uploadDir); err != nil {
|
||||
if err := useCases.NewBackfillImageMetadataUseCase(repo, storage.NewLocalStorage(uploadDir)).Run(); err != nil {
|
||||
t.Fatalf("backfill failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -217,7 +199,7 @@ func TestMediaImageBackfill(t *testing.T) {
|
||||
writeFile(t, uploadDir, "fine.png", pngBytes(t, 3, 2))
|
||||
broken, fine := seedLegacyRow(t, db, "broken.png"), seedLegacyRow(t, db, "fine.png")
|
||||
|
||||
if err := persistence.BackfillImageMetadata(db, uploadDir); err != nil {
|
||||
if err := useCases.NewBackfillImageMetadataUseCase(repo, storage.NewLocalStorage(uploadDir)).Run(); err != nil {
|
||||
t.Fatalf("backfill failed: %v", err)
|
||||
}
|
||||
|
||||
@@ -233,7 +215,7 @@ func TestMediaImageBackfill(t *testing.T) {
|
||||
db, repo, uploadDir := newMediaPersistence(t)
|
||||
writeFile(t, uploadDir, "one.png", pngBytes(t, 3, 2))
|
||||
row := seedLegacyRow(t, db, "one.png")
|
||||
if err := persistence.BackfillImageMetadata(db, uploadDir); err != nil {
|
||||
if err := useCases.NewBackfillImageMetadataUseCase(repo, storage.NewLocalStorage(uploadDir)).Run(); err != nil {
|
||||
t.Fatalf("backfill failed: %v", err)
|
||||
}
|
||||
afterFirst, _ := repo.Get(row.ID)
|
||||
@@ -241,7 +223,7 @@ func TestMediaImageBackfill(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if err := persistence.BackfillImageMetadata(db, uploadDir); err != nil {
|
||||
if err := useCases.NewBackfillImageMetadataUseCase(repo, storage.NewLocalStorage(uploadDir)).Run(); err != nil {
|
||||
t.Fatalf("second backfill failed: %v", err)
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user