Files
pocket-id/backend/internal/utils/image/validation_test.go
T

59 lines
1.6 KiB
Go

package profilepicture
import (
"bytes"
"encoding/binary"
"hash/crc32"
"image"
"image/png"
"testing"
"github.com/stretchr/testify/require"
)
func TestCreateProfilePictureRejectsOversizedPixelCountBeforeDecode(t *testing.T) {
_, err := CreateProfilePicture(bytes.NewReader(pngHeaderWithDimensions(12_000, 12_000)))
require.ErrorIs(t, err, ErrInvalidImage)
require.ErrorIs(t, err, errImageDimensionsTooLarge)
}
func TestCreateProfilePictureAcceptsImageWithinLimits(t *testing.T) {
var input bytes.Buffer
require.NoError(t, png.Encode(&input, image.NewNRGBA(image.Rect(0, 0, 400, 300))))
output, err := CreateProfilePicture(bytes.NewReader(input.Bytes()))
require.NoError(t, err)
config, format, err := image.DecodeConfig(output)
require.NoError(t, err)
require.Equal(t, "png", format)
require.Equal(t, 300, config.Width)
require.Equal(t, 300, config.Height)
}
func TestStripMetadataRejectsOversizedPixelCount(t *testing.T) {
_, err := StripMetadata(bytes.NewReader(pngHeaderWithDimensions(12_000, 12_000)), "png")
require.ErrorIs(t, err, ErrInvalidImage)
require.ErrorIs(t, err, errImageDimensionsTooLarge)
}
func pngHeaderWithDimensions(width, height uint32) []byte {
var out bytes.Buffer
out.Write([]byte("\x89PNG\r\n\x1a\n"))
const headerLength = 13
data := make([]byte, headerLength)
binary.BigEndian.PutUint32(data[0:4], width)
binary.BigEndian.PutUint32(data[4:8], height)
data[8] = 8
_ = binary.Write(&out, binary.BigEndian, uint32(headerLength))
out.WriteString("IHDR")
out.Write(data)
_ = binary.Write(&out, binary.BigEndian, crc32.ChecksumIEEE(append([]byte("IHDR"), data...)))
return out.Bytes()
}