import assert from 'node:assert/strict'; import test from 'node:test'; import { createSaleService } from '../../src/modules/sales/services/sale-service.js'; function validInput(overrides = {}) { return { sellerId: 'seller-1', inventoryItemId: 'inventory-1', saleDate: '2026-09-09', soldPriceMinor: 2499, costBasisMinor: 1200, ...overrides, }; } test('creates a sale through the repository with validated money values', async () => { let received; const service = createSaleService({ saleRepository: { async createForInventoryItem(input) { received = input; return { status: 'CREATED', sale: { id: 'sale-1', soldPriceMinor: 2499, platformFeesMinor: 100, paymentProcessingFeesMinor: 0, shippingCostMinor: 0, taxesMinor: 0, otherFeesMinor: 0, }, saleItem: { costBasisMinor: 1200 }, }; }, }, }); assert.deepEqual(await service.create(validInput()), { status: 'CREATED', sale: { id: 'sale-1', soldPriceMinor: 2499, platformFeesMinor: 100, paymentProcessingFeesMinor: 0, shippingCostMinor: 0, taxesMinor: 0, otherFeesMinor: 0, }, saleItem: { costBasisMinor: 1200 }, netProceedsMinor: 2399, profitMinor: 1199, }); assert.equal(received.sale.sellerId, 'seller-1'); assert.equal(received.sale.soldPriceMinor, 2499); assert.equal(received.costBasisMinor, 1200); }); test('lists seller sales with derived net proceeds and profit', async () => { const service = createSaleService({ saleRepository: { async listBySellerId(sellerId) { assert.equal(sellerId, 'seller-1'); return [{ sale: { soldPriceMinor: 3000, shippingCostMinor: 200 }, saleItem: { costBasisMinor: 1500 }, inventoryItem: { id: 'inventory-1', status: 'SOLD' }, }]; }, }, }); const [sale] = await service.list({ sellerId: 'seller-1' }); assert.equal(sale.netProceedsMinor, 2800); assert.equal(sale.profitMinor, 1300); }); test('voids an owned sale with a required reason', async () => { let received; const service = createSaleService({ saleRepository: { async voidForSeller(input) { received = input; return { status: 'VOIDED', sale: { id: 'sale-1', soldPriceMinor: 3000 }, saleItem: { costBasisMinor: 1500 }, inventoryItem: { id: 'inventory-1', status: 'ACTIVE' }, }; }, }, }); const result = await service.void({ saleId: 'sale-1', sellerId: 'seller-1', actorUserId: 'user-1', reason: ' Duplicate sale ', }); assert.equal(received.reason, 'Duplicate sale'); assert.equal(result.inventoryItem.status, 'ACTIVE'); await assert.rejects( () => service.void({ saleId: 'sale-1', sellerId: 'seller-1', actorUserId: 'user-1', reason: 'x' }), (error) => error.code === 'SALE_VOID_REASON_REQUIRED' && error.statusCode === 400, ); }); test('creates one sale containing multiple inventory items', async () => { let received; const service = createSaleService({ saleRepository: { async createForInventoryItems(input) { received = input; return { status: 'CREATED', sale: { id: 'sale-2', soldPriceMinor: 3000 }, saleItems: input.items, saleItem: input.items[0], inventoryItems: input.items.map(({ inventoryItemId }) => ({ id: inventoryItemId, status: 'SOLD' })), inventoryItem: { id: input.items[0].inventoryItemId, status: 'SOLD' }, }; }, }, }); const result = await service.create({ sellerId: 'seller-1', saleDate: '2026-09-09', items: [ { inventoryItemId: 'inventory-1', soldPriceMinor: 1200, costBasisMinor: 500 }, { inventoryItemId: 'inventory-2', soldPriceMinor: 1800, costBasisMinor: 700 }, ], }); assert.equal(received.sale.soldPriceMinor, 3000); assert.equal(received.items.length, 2); assert.equal(result.profitMinor, 1800); }); test('maps missing and already-sold inventory to application errors', async () => { for (const result of [ { status: 'NOT_FOUND', code: 'INVENTORY_NOT_FOUND', statusCode: 404 }, { status: 'NOT_ACTIVE', code: 'INVENTORY_NOT_AVAILABLE_FOR_SALE', statusCode: 409 }, ]) { const service = createSaleService({ saleRepository: { async createForInventoryItem() { return result; } }, }); await assert.rejects( () => service.create(validInput()), (error) => error.code === result.code && error.statusCode === result.statusCode, ); } });