check / check (push) Waiting to run
A JPEG XL source is accepted, and orig of one is JPEG XL. The format jxl works in plain and encrypted URLs and on the generator page, served as image/jxl; auto chooses it first when Accept names image/jxl. govips sends libvips a JPEG XL distance, which overrides the quality, so q becomes a distance, keeping 100 lossy. Metadata is removed from the image before the JPEG XL save, as govips cannot have libvips strip it, and the image is given 72 dpi so that the EXIF block libvips 8.16 adds holds nothing from the source. The sRGB conversion moved ahead of the format switch, and a CMYK image with no ICC profile is converted to sRGB, as libvips cannot save CMYK as JPEG XL. Model: opus-5-5
74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package handlers
|
|
|
|
import (
|
|
"log/slog"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/davidbyttow/govips/v2/vips"
|
|
|
|
"sneak.berlin/go/pixa/internal/imgcache"
|
|
)
|
|
|
|
// jxlType is the content type of JPEG XL.
|
|
const jxlType = "image/jxl"
|
|
|
|
// TestFormatForAccept_JPEGXL verifies that the format auto chooses JPEG XL
|
|
// when Accept names image/jxl, ahead of AVIF whatever their q, and AVIF when
|
|
// Accept refuses JPEG XL with q=0.
|
|
func TestFormatForAccept_JPEGXL(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tests := []struct {
|
|
name string
|
|
accept string
|
|
want imgcache.ImageFormat
|
|
}{
|
|
{"JPEG XL-capable browser",
|
|
"image/jxl,image/avif,image/webp,image/*,*/*;q=0.8", imgcache.FormatJXL},
|
|
{"JPEG XL only", jxlType, imgcache.FormatJXL},
|
|
{"JPEG XL with a lower q than AVIF", "image/avif,image/jxl;q=0.5",
|
|
imgcache.FormatJXL},
|
|
{"q=0 on JPEG XL", "image/jxl;q=0,image/avif,*/*", imgcache.FormatAVIF},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
got, err := formatForAccept(tt.accept)
|
|
if got != tt.want || err != nil {
|
|
t.Errorf("formatForAccept(%q) = %q, %v, want %q",
|
|
tt.accept, got, err, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestFormatAuto_JPEGXL requests an auto URL on each image route with an
|
|
// Accept header that names image/jxl, and checks that the answer is a JPEG XL
|
|
// image.
|
|
func TestFormatAuto_JPEGXL(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
h, srv := newSignedHostServer(t, slog.New(slog.DiscardHandler))
|
|
signedURL, encryptedURL := autoPhotoURLs(t, h)
|
|
|
|
for _, target := range []string{signedURL, encryptedURL} {
|
|
rec := requestImage(t, srv, http.MethodGet, target,
|
|
"image/jxl,image/avif,image/webp,*/*;q=0.8")
|
|
gotType := rec.Header().Get("Content-Type")
|
|
|
|
if rec.Code != http.StatusOK || gotType != jxlType {
|
|
t.Errorf("%s: %d %s, want 200 %s; body %s",
|
|
target, rec.Code, gotType, jxlType, rec.Body)
|
|
|
|
continue
|
|
}
|
|
|
|
if got := vips.DetermineImageType(rec.Body.Bytes()); got != vips.ImageTypeJXL {
|
|
t.Errorf("%s: body is %s, want jxl", target, vips.ImageTypes[got])
|
|
}
|
|
}
|
|
}
|