104 lines
2.7 KiB
Go
104 lines
2.7 KiB
Go
package test
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/sha256"
|
|
"encoding/base64"
|
|
"encoding/hex"
|
|
"image"
|
|
"image/color"
|
|
"image/jpeg"
|
|
"image/png"
|
|
"io"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
const webpFixtureBase64 = "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA=="
|
|
|
|
const svgFixture = `<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"/>`
|
|
|
|
func solidImage(width int, height int) image.Image {
|
|
canvas := image.NewRGBA(image.Rect(0, 0, width, height))
|
|
for x := 0; x < width; x++ {
|
|
for y := 0; y < height; y++ {
|
|
canvas.Set(x, y, color.RGBA{R: uint8(x * 40), G: uint8(y * 40), B: 200, A: 255})
|
|
}
|
|
}
|
|
return canvas
|
|
}
|
|
|
|
func pngBytes(t *testing.T, width int, height int) []byte {
|
|
t.Helper()
|
|
buffer := &bytes.Buffer{}
|
|
if err := png.Encode(buffer, solidImage(width, height)); err != nil {
|
|
t.Fatalf("failed to encode png: %v", err)
|
|
}
|
|
return buffer.Bytes()
|
|
}
|
|
|
|
func jpegBytes(t *testing.T, width int, height int) []byte {
|
|
t.Helper()
|
|
buffer := &bytes.Buffer{}
|
|
if err := jpeg.Encode(buffer, solidImage(width, height), nil); err != nil {
|
|
t.Fatalf("failed to encode jpeg: %v", err)
|
|
}
|
|
return buffer.Bytes()
|
|
}
|
|
|
|
func webpBytes(t *testing.T) []byte {
|
|
t.Helper()
|
|
data, err := base64.StdEncoding.DecodeString(webpFixtureBase64)
|
|
if err != nil {
|
|
t.Fatalf("failed to decode webp fixture: %v", err)
|
|
}
|
|
return data
|
|
}
|
|
|
|
func paddedPngBytes(t *testing.T, size int) []byte {
|
|
t.Helper()
|
|
data := pngBytes(t, 3, 2)
|
|
return append(data, bytes.Repeat([]byte{0}, size-len(data))...)
|
|
}
|
|
|
|
func sha256Hex(data []byte) string {
|
|
sum := sha256.Sum256(data)
|
|
return hex.EncodeToString(sum[:])
|
|
}
|
|
|
|
func newMultipartFileRequest(t *testing.T, method string, url string, filename string, contentType string, content []byte) *http.Request {
|
|
t.Helper()
|
|
body := &bytes.Buffer{}
|
|
writer := multipart.NewWriter(body)
|
|
part, err := writer.CreatePart(map[string][]string{
|
|
"Content-Disposition": {`form-data; name="file"; filename="` + filename + `"`},
|
|
"Content-Type": {contentType},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("failed to create multipart part: %v", err)
|
|
}
|
|
if _, err := io.Copy(part, bytes.NewReader(content)); err != nil {
|
|
t.Fatalf("failed to write file content: %v", err)
|
|
}
|
|
if err := writer.Close(); err != nil {
|
|
t.Fatalf("failed to close multipart writer: %v", err)
|
|
}
|
|
req := httptest.NewRequest(method, url, body)
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
|
return req
|
|
}
|
|
|
|
func newMultipartWithoutFileRequest(t *testing.T, url string) *http.Request {
|
|
t.Helper()
|
|
body := &bytes.Buffer{}
|
|
writer := multipart.NewWriter(body)
|
|
if err := writer.Close(); err != nil {
|
|
t.Fatalf("failed to close multipart writer: %v", err)
|
|
}
|
|
req := httptest.NewRequest(http.MethodPost, url, body)
|
|
req.Header.Set("Content-Type", writer.FormDataContentType())
|
|
return req
|
|
}
|