Files
pokemon-inventory/apps/api/tests/application/image-derivative-processor.test.js
T

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');
});