import { describe, expect, it } from "vitest" ;
import { getImageMetadata, MAX_IMAGE_INPUT_PIXELS, resizeToJpeg } from "./image-ops.js" ;
import { createPngBufferWithDimensions } from "./test-helpers.js" ;
describe("image input pixel guard" , () => {
const oversizedPng = createPngBufferWithDimensions({ width: 8 _000 , height: 4 _000 });
const overflowedPng = createPngBufferWithDimensions({
width: 4 _294 _967 _295 ,
height: 4 _294 _967 _295 ,
});
it("returns null metadata for images above the pixel limit" , async () => {
await expect(getImageMetadata(oversizedPng)).resolves.toBeNull();
expect(8 _000 * 4 _000 ).toBeGreaterThan(MAX_IMAGE_INPUT_PIXELS);
});
it("rejects oversized images before resize work starts" , async () => {
await expect(
resizeToJpeg({
buffer: oversizedPng,
maxSide: 2 _048 ,
quality: 80 ,
}),
).rejects.toThrow(/pixel input limit/i);
});
it("rejects overflowed pixel counts before resize work starts" , async () => {
await expect(
resizeToJpeg({
buffer: overflowedPng,
maxSide: 2 _048 ,
quality: 80 ,
}),
).rejects.toThrow(/pixel input limit/i);
});
it("fails closed when sips cannot determine image dimensions" , async () => {
const previousBackend = process.env.OPENCLAW_IMAGE_BACKEND;
process.env.OPENCLAW_IMAGE_BACKEND = "sips" ;
try {
await expect(
resizeToJpeg({
buffer: Buffer.from("not-an-image" ),
maxSide: 2 _048 ,
quality: 80 ,
}),
).rejects.toThrow(/unable to determine image dimensions/i);
} finally {
if (previousBackend === undefined) {
delete process.env.OPENCLAW_IMAGE_BACKEND;
} else {
process.env.OPENCLAW_IMAGE_BACKEND = previousBackend;
}
}
});
});
Messung V0.5 in Prozent C=98 H=98 G=97
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland