Files
fn_registry/functions/infra/thumbnail_generate_test.go
T

110 lines
2.7 KiB
Go

package infra
import (
"image"
"image/color"
"image/png"
"os"
"path/filepath"
"testing"
)
// genPNG crea un PNG cuadrado de size pixeles en path.
func genPNG(t *testing.T, path string, size int) {
t.Helper()
img := image.NewRGBA(image.Rect(0, 0, size, size))
for y := 0; y < size; y++ {
for x := 0; x < size; x++ {
img.Set(x, y, color.RGBA{R: uint8(x % 255), G: uint8(y % 255), B: 100, A: 255})
}
}
f, err := os.Create(path)
if err != nil {
t.Fatalf("create: %v", err)
}
defer f.Close()
if err := png.Encode(f, img); err != nil {
t.Fatalf("encode: %v", err)
}
}
func TestThumbnailGenerate(t *testing.T) {
t.Run("genera thumbnail PNG mas pequeno que el original", func(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "src.png")
dst := filepath.Join(dir, "thumb.png")
genPNG(t, src, 400)
if err := ThumbnailGenerate(src, dst, 100, 100); err != nil {
t.Fatalf("ThumbnailGenerate: %v", err)
}
f, err := os.Open(dst)
if err != nil {
t.Fatalf("open dst: %v", err)
}
defer f.Close()
img, _, err := image.Decode(f)
if err != nil {
t.Fatalf("decode dst: %v", err)
}
b := img.Bounds()
if b.Dx() > 100 || b.Dy() > 100 {
t.Errorf("thumbnail %dx%d, want <= 100x100", b.Dx(), b.Dy())
}
})
t.Run("preserva aspect ratio", func(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "src.png")
dst := filepath.Join(dir, "thumb.png")
// Imagen 400x200 (aspect 2:1)
img := image.NewRGBA(image.Rect(0, 0, 400, 200))
f, _ := os.Create(src)
png.Encode(f, img)
f.Close()
if err := ThumbnailGenerate(src, dst, 100, 100); err != nil {
t.Fatalf("err: %v", err)
}
f2, _ := os.Open(dst)
defer f2.Close()
thumb, _, _ := image.Decode(f2)
b := thumb.Bounds()
// Aspect 2:1 mantenido: 100x50
if b.Dx() != 100 || b.Dy() != 50 {
t.Errorf("thumbnail %dx%d, want 100x50 (aspect 2:1)", b.Dx(), b.Dy())
}
})
t.Run("rechaza extension de salida no soportada", func(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "src.png")
dst := filepath.Join(dir, "thumb.webp")
genPNG(t, src, 200)
err := ThumbnailGenerate(src, dst, 100, 100)
if err == nil {
t.Error("got nil err, want extension no soportada")
}
})
t.Run("no agranda imagenes ya pequenas", func(t *testing.T) {
dir := t.TempDir()
src := filepath.Join(dir, "src.png")
dst := filepath.Join(dir, "thumb.png")
genPNG(t, src, 50)
if err := ThumbnailGenerate(src, dst, 200, 200); err != nil {
t.Fatalf("err: %v", err)
}
f, _ := os.Open(dst)
defer f.Close()
thumb, _, _ := image.Decode(f)
b := thumb.Bounds()
if b.Dx() != 50 || b.Dy() != 50 {
t.Errorf("thumbnail %dx%d, want 50x50 (sin agrandar)", b.Dx(), b.Dy())
}
})
}