Files
pokemon-inventory/apps/api/tests/application/inventory-image-service.test.js
T
fragginwagon 7be79f4840
Quality / test (push) Canceled after 0s
feat: persist image derivative jobs
2026-09-08 22:00:18 -04:00

67 lines
1.8 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { createInventoryImageService } from '../../src/modules/inventory/services/inventory-image-service.js';
const input = {
inventoryItemId: 'inventory-item-id',
sellerId: 'seller-id',
storageKey: 'inventory/item/front.jpg',
originalFilename: 'front.jpg',
mimeType: 'image/jpeg',
fileSize: 4,
width: 1200,
height: 900,
data: Buffer.from([0xff, 0xd8, 0xff, 0x00]),
};
test('stores validated upload bytes before persisting image metadata', async () => {
const stored = [];
const jobs = [];
const service = createInventoryImageService({
imageStorage: {
async put(value) { stored.push(value); },
async delete() {},
},
inventoryImageRepository: {
async createForSeller(image) {
return { id: 'image-1', ...image };
},
},
imageDerivativeJobRepository: {
async create(job) { jobs.push(job); },
},
});
const image = await service.upload(input);
assert.equal(stored.length, 1);
assert.deepEqual(stored[0], { key: input.storageKey, data: input.data });
assert.equal(image.id, 'image-1');
assert.equal(image.processingStatus, 'PENDING');
assert.equal('data' in image, false);
assert.deepEqual(jobs, [{
inventoryImageId: 'image-1',
sourceKey: input.storageKey,
status: 'PENDING',
}]);
});
test('removes stored bytes when metadata persistence fails', async () => {
const deleted = [];
const service = createInventoryImageService({
imageStorage: {
async put() {},
async delete(key) { deleted.push(key); },
},
inventoryImageRepository: {
async createForSeller() { return null; },
},
});
await assert.rejects(
() => service.upload(input),
(error) => error.code === 'INVENTORY_ITEM_NOT_FOUND',
);
assert.deepEqual(deleted, [input.storageKey]);
});