Files
chorus/portal/service/validation_test.go
T

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