Files
photoprism/internal/thumb/vips_rotate_test.go
2025-09-22 03:07:51 +02:00

205 lines
4.3 KiB
Go

package thumb
import (
"os"
"testing"
"github.com/davidbyttow/govips/v2/vips"
"github.com/stretchr/testify/assert"
"github.com/photoprism/photoprism/pkg/fs"
)
func TestVipsRotate(t *testing.T) {
if err := os.MkdirAll("testdata/vips/rotate", fs.ModeDir); err != nil {
t.Fatal(err)
}
t.Run("OrientationNormal", func(t *testing.T) {
src := "testdata/example.jpg"
dst := "testdata/vips/rotate/0.jpg"
assert.FileExists(t, src)
// Load image from file.
img, err := vips.NewImageFromFile(src)
if err != nil {
t.Fatal(err)
}
if err = VipsRotate(img, OrientationNormal); err != nil {
t.Fatal(err)
}
params := vips.NewJpegExportParams()
imageBytes, _, exportErr := img.ExportJpeg(params)
if exportErr != nil {
t.Fatal(exportErr)
}
// Write thumbnail to file.
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
t.Fatal(exportErr)
}
assert.FileExists(t, dst)
})
t.Run("OrientationRotate90", func(t *testing.T) {
src := "testdata/example.jpg"
dst := "testdata/vips/rotate/90.jpg"
assert.FileExists(t, src)
// Load image from file.
img, err := vips.NewImageFromFile(src)
if err != nil {
t.Fatal(err)
}
if err = VipsRotate(img, OrientationRotate90); err != nil {
t.Fatal(err)
}
params := vips.NewJpegExportParams()
imageBytes, _, exportErr := img.ExportJpeg(params)
if exportErr != nil {
t.Fatal(exportErr)
}
// Write thumbnail to file.
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
t.Fatal(exportErr)
}
assert.FileExists(t, dst)
})
t.Run("OrientationRotate180", func(t *testing.T) {
src := "testdata/example.jpg"
dst := "testdata/vips/rotate/180.jpg"
assert.FileExists(t, src)
// Load image from file.
img, err := vips.NewImageFromFile(src)
if err != nil {
t.Fatal(err)
}
if err = VipsRotate(img, OrientationRotate180); err != nil {
t.Fatal(err)
}
params := vips.NewJpegExportParams()
imageBytes, _, exportErr := img.ExportJpeg(params)
if exportErr != nil {
t.Fatal(exportErr)
}
// Write thumbnail to file.
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
t.Fatal(exportErr)
}
assert.FileExists(t, dst)
})
t.Run("OrientationRotate270", func(t *testing.T) {
src := "testdata/example.jpg"
dst := "testdata/vips/rotate/270.jpg"
assert.FileExists(t, src)
// Load image from file.
img, err := vips.NewImageFromFile(src)
if err != nil {
t.Fatal(err)
}
if err = VipsRotate(img, OrientationRotate270); err != nil {
t.Fatal(err)
}
params := vips.NewJpegExportParams()
imageBytes, _, exportErr := img.ExportJpeg(params)
if exportErr != nil {
t.Fatal(exportErr)
}
// Write thumbnail to file.
if err = os.WriteFile(dst, imageBytes, fs.ModeFile); err != nil {
t.Fatal(exportErr)
}
assert.FileExists(t, dst)
})
}
func TestVipsRotate_VariousAndInvalid(t *testing.T) {
// Ensure vips is initialized for image operations
VipsInit()
img, err := vips.LoadImageFromFile("testdata/example.jpg", VipsImportParams())
if err != nil {
t.Fatalf("load failed: %v", err)
}
defer img.Close()
// Valid operations should not return errors
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationFlipH))
} else {
t.Fatal(err)
}
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationFlipV))
} else {
t.Fatal(err)
}
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationRotate90))
} else {
t.Fatal(err)
}
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationRotate180))
} else {
t.Fatal(err)
}
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationRotate270))
} else {
t.Fatal(err)
}
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationTranspose))
} else {
t.Fatal(err)
}
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, OrientationTransverse))
} else {
t.Fatal(err)
}
// Invalid orientation triggers debug branch but must not error
if c, err := img.Copy(); err == nil {
defer c.Close()
assert.NoError(t, VipsRotate(c, 999))
} else {
t.Fatal(err)
}
}