80 lines
2.7 KiB
Go
80 lines
2.7 KiB
Go
package service
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/base64"
|
|
"errors"
|
|
"image"
|
|
"image/color"
|
|
"image/png"
|
|
"testing"
|
|
)
|
|
|
|
func TestUploadValidationErrors(t *testing.T) {
|
|
service := &Service{config: Config{MaxImages: 2, MaxImageBytes: 100, MaxUploadBytes: 200, MaxImagePixels: 16}}
|
|
tests := []struct {
|
|
name, mime string
|
|
data []byte
|
|
want error
|
|
}{
|
|
{"mime", "text/plain", smallPNG(2, 2), ErrImageMIME},
|
|
{"extension", "image/png", smallPNG(2, 2), ErrImageExtension},
|
|
{"decode", "image/png", append([]byte{137, 80, 78, 71, 13, 10, 26, 10}, []byte("broken")...), ErrImageDecode},
|
|
{"bytes", "image/png", bytes.Repeat([]byte{1}, 101), ErrImageTooLarge},
|
|
{"pixels", "image/png", smallPNG(5, 5), ErrImagePixels},
|
|
}
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
name := "file.png"
|
|
if test.name == "extension" {
|
|
name = "file.jpg"
|
|
}
|
|
_, err := service.validateImages([]Upload{{Name: name, DeclaredMIME: test.mime, Content: test.data}})
|
|
if !errors.Is(err, test.want) {
|
|
t.Fatalf("error=%v want=%v", err, test.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestImageCountAndTotalSize(t *testing.T) {
|
|
service := &Service{config: Config{MaxImages: 1, MaxImageBytes: 1000, MaxUploadBytes: 100, MaxImagePixels: 100}}
|
|
if _, err := service.validateImages(nil); !errors.Is(err, ErrImageCount) {
|
|
t.Fatalf("empty error=%v", err)
|
|
}
|
|
data := smallPNG(2, 2)
|
|
images := []Upload{{Name: "a.png", DeclaredMIME: "image/png", Content: data}, {Name: "b.png", DeclaredMIME: "image/png", Content: data}}
|
|
if _, err := service.validateImages(images); !errors.Is(err, ErrImageCount) {
|
|
t.Fatalf("count error=%v", err)
|
|
}
|
|
service.config.MaxImages = 2
|
|
service.config.MaxUploadBytes = int64(len(data)*2 - 1)
|
|
if _, err := service.validateImages(images); !errors.Is(err, ErrUploadTooLarge) {
|
|
t.Fatalf("total error=%v", err)
|
|
}
|
|
}
|
|
|
|
func TestWebPValidationMatchesConfirmedPrototype(t *testing.T) {
|
|
data, err := base64.StdEncoding.DecodeString("UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
service := &Service{config: Config{MaxImages: 1, MaxImageBytes: 1000, MaxUploadBytes: 1000, MaxImagePixels: 100}}
|
|
images, err := service.validateImages([]Upload{{Name: "pixel.webp", DeclaredMIME: "image/webp", Content: data}})
|
|
if err != nil || len(images) != 1 || images[0].MIME != "image/webp" {
|
|
t.Fatalf("webp validation=%#v error=%v", images, err)
|
|
}
|
|
}
|
|
|
|
func smallPNG(width, height int) []byte {
|
|
img := image.NewRGBA(image.Rect(0, 0, width, height))
|
|
for y := 0; y < height; y++ {
|
|
for x := 0; x < width; x++ {
|
|
img.Set(x, y, color.RGBA{R: 1, G: 2, B: 3, A: 255})
|
|
}
|
|
}
|
|
var output bytes.Buffer
|
|
_ = png.Encode(&output, img)
|
|
return output.Bytes()
|
|
}
|