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 = `` 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 }