check / check (push) Waiting to run
The fetcher accepts image/svg+xml; internal/magic detects SVG. orig of an SVG at the orig size is the SVG unchanged, cached, with a Content-Security-Policy allowing only its styles and data: images; at another size, ErrSVGNotOriginalSize (400). Any other format renders it at the least size covering the output, at most 8192 on a side, so it stays sharp. Rendering refuses an SVG with a side over 8192 times the other (ErrSVGTooThin, 415), and the orig size of one above 8192 on a side (ErrSVGTooLargeForOrigSize, 400). The cache reads up to 1024 first bytes to find a file's format. Tests pinning the SVG refusal now expect SVG. Render time and memory are unbounded: P1 in TODO.md until the owner decides on #68. 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)
|
|
}
|
|
}
|
|
}
|