check / check (push) Canceled after 0s
The fetcher accepts image/svg+xml again and internal/magic detects SVG. A raster format renders the SVG at the least size that covers the output, held to 8192 on a side, through libvips' thumbnail, which renders at any scale, so an enlarged SVG stays sharp. An SVG's own size is not limited; one with a side more than 8192 times the other is ErrSVGTooThin, answered 415. orig of an SVG at the orig size is the SVG unchanged, cached as a variant; at any other size it is ErrSVGNotOriginalSize, answered 400. The cache reads up to 1024 first bytes of a file to find its format. Render time and memory grow with what the SVG draws; their bound is the owner's decision on #68. Tests that pinned SVG as refused now expect it to be read. Model: opus-5-5
76 lines
2.4 KiB
Go
76 lines
2.4 KiB
Go
package imageprocessor
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"io"
|
|
"testing"
|
|
|
|
"sneak.berlin/go/pixa/internal/imagerequest"
|
|
)
|
|
|
|
// TestImageProcessor_LoadsEachSourceFormat verifies that an image in each of
|
|
// the six source formats, saved by the processor itself, is loaded and saved
|
|
// again in its own format (orig).
|
|
func TestImageProcessor_LoadsEachSourceFormat(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
proc := New(Params{MaxInputBytes: 50 << 20, MaxConcurrentProcessing: 1})
|
|
|
|
for _, format := range []imagerequest.Format{
|
|
imagerequest.FormatJPEG, imagerequest.FormatPNG, imagerequest.FormatGIF,
|
|
imagerequest.FormatWebP, imagerequest.FormatAVIF, imagerequest.FormatJXL,
|
|
} {
|
|
saved, err := proc.Process(t.Context(),
|
|
bytes.NewReader(createTestPNG(t, 20, 20)), imagerequest.FormatPNG,
|
|
&imagerequest.Transform{Format: format})
|
|
if err != nil {
|
|
t.Fatalf("saving the test image as %s: %v", format, err)
|
|
}
|
|
|
|
source, err := io.ReadAll(saved.Content)
|
|
if err != nil {
|
|
t.Fatalf("reading the %s image: %v", format, err)
|
|
}
|
|
|
|
result, err := proc.Process(t.Context(), bytes.NewReader(source), format,
|
|
&imagerequest.Transform{Format: imagerequest.FormatOriginal})
|
|
if err != nil {
|
|
t.Errorf("orig of the %s image: %v", format, err)
|
|
|
|
continue
|
|
}
|
|
|
|
t.Logf("orig of the %s image: %s", format, result.ContentType)
|
|
|
|
if result.ContentType != format.MIMEType() {
|
|
t.Errorf("orig of the %s image is %s, want %s",
|
|
format, result.ContentType, format.MIMEType())
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestImageProcessor_NotASourceFormatRefused verifies that a source format
|
|
// other than the seven, such as orig, auto or none, is refused with
|
|
// ErrUnsupportedInputFormat. The input is text, which libvips reads as no
|
|
// format.
|
|
func TestImageProcessor_NotASourceFormatRefused(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
proc := New(Params{MaxInputBytes: 50 << 20, MaxConcurrentProcessing: 1})
|
|
|
|
for _, sourceFormat := range []imagerequest.Format{
|
|
imagerequest.FormatOriginal, imagerequest.FormatAuto, "",
|
|
} {
|
|
result, err := proc.Process(t.Context(),
|
|
bytes.NewReader([]byte("this is text, not an image")), sourceFormat,
|
|
&imagerequest.Transform{Format: imagerequest.FormatJPEG})
|
|
t.Logf("source format %q: error = %v", sourceFormat, err)
|
|
|
|
if result != nil || !errors.Is(err, ErrUnsupportedInputFormat) {
|
|
t.Errorf("Process() with source format %q = %v, error %v; want %v",
|
|
sourceFormat, result, err, ErrUnsupportedInputFormat)
|
|
}
|
|
}
|
|
}
|