53 lines
2.0 KiB
JavaScript
53 lines
2.0 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import { createImageDerivativeProcessor } from '../../src/infrastructure/images/image-derivative-processor.js';
|
|
import { createSharpImageRenderer } from '../../src/infrastructure/images/sharp-image-renderer.js';
|
|
|
|
test('renders and stores thumbnail, medium, and large derivatives in order', async () => {
|
|
const renderedWidths = [];
|
|
const stored = [];
|
|
const processor = createImageDerivativeProcessor({
|
|
imageStorage: {
|
|
async put(value) { stored.push(value); },
|
|
},
|
|
async renderer({ data, maxWidth }) {
|
|
renderedWidths.push(maxWidth);
|
|
return Buffer.concat([data, Buffer.from(`-${maxWidth}`)]);
|
|
},
|
|
});
|
|
|
|
const results = await processor.process({
|
|
sourceKey: 'inventory/item/front.jpg',
|
|
data: Buffer.from('source'),
|
|
});
|
|
|
|
assert.deepEqual(renderedWidths, [320, 1280, 2400]);
|
|
assert.deepEqual(results.map(({ name, key }) => ({ name, key })), [
|
|
{ name: 'thumbnail', key: 'inventory/item/front-thumbnail.webp' },
|
|
{ name: 'medium', key: 'inventory/item/front-medium.webp' },
|
|
{ name: 'large', key: 'inventory/item/front-large.webp' },
|
|
]);
|
|
assert.equal(stored.length, 3);
|
|
assert.equal(stored[1].data.toString(), 'source-1280');
|
|
});
|
|
|
|
test('requires a renderer implementation', () => {
|
|
assert.throws(
|
|
() => createImageDerivativeProcessor({ imageStorage: {} }),
|
|
/renderer is required/,
|
|
);
|
|
});
|
|
|
|
test('creates a sharp-backed WebP renderer that resizes to the requested maximum width', async () => {
|
|
const renderer = createSharpImageRenderer();
|
|
const data = Buffer.from(
|
|
'<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024"><rect width="1024" height="1024" fill="#ff0000"/></svg>',
|
|
);
|
|
const output = await renderer({ data, maxWidth: 320 });
|
|
|
|
assert.ok(output instanceof Buffer);
|
|
assert.ok(output.length > 0);
|
|
assert.equal(output.subarray(0, 4).toString('ascii'), 'RIFF');
|
|
assert.equal(output.subarray(8, 12).toString('ascii'), 'WEBP');
|
|
}); |