Files
RenewCMS/test/media_fixtures_test.go
T
2026-09-30 18:35:28 +02:00

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
}