feat: reconcile application vertical slices
Backfill the completed acquisitions, sales, dashboard, pricing, search, public detail, worker, migration, contracts, validation, tests, and implementation-status changes into one verified application slice.
This commit is contained in:
@@ -1,76 +1,83 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import assert from "node:assert/strict";
|
||||
import test from "node:test";
|
||||
|
||||
import {
|
||||
calculateNetSaleProceeds,
|
||||
createSale,
|
||||
createSaleItem,
|
||||
} from '../../src/modules/sales/domain/sale.js';
|
||||
} from "../../src/modules/sales/domain/sale.js";
|
||||
|
||||
test('creates a valid sale record and calculates net proceeds after fees', () => {
|
||||
test("creates a valid sale record and calculates net proceeds after fees", () => {
|
||||
const sale = createSale({
|
||||
sellerId: 'seller-id',
|
||||
saleDate: '2026-09-08',
|
||||
saleLocation: 'eBay',
|
||||
sellerId: "seller-id",
|
||||
saleDate: "2026-09-08",
|
||||
saleLocation: "eBay",
|
||||
soldPriceMinor: 4999,
|
||||
currency: 'USD',
|
||||
currency: "USD",
|
||||
platformFeesMinor: 300,
|
||||
paymentProcessingFeesMinor: 120,
|
||||
shippingCostMinor: 50,
|
||||
taxesMinor: 90,
|
||||
otherFeesMinor: 40,
|
||||
buyerName: 'Alex',
|
||||
buyerContact: 'alex@example.com',
|
||||
buyerName: "Alex",
|
||||
buyerContact: "alex@example.com",
|
||||
});
|
||||
|
||||
assert.equal(sale.soldPriceMinor, 4999);
|
||||
assert.equal(sale.currency, 'USD');
|
||||
assert.equal(calculateNetSaleProceeds({
|
||||
soldPriceMinor: 4999,
|
||||
platformFeesMinor: 300,
|
||||
paymentProcessingFeesMinor: 120,
|
||||
shippingCostMinor: 50,
|
||||
taxesMinor: 90,
|
||||
otherFeesMinor: 40,
|
||||
}), 4399);
|
||||
assert.equal(sale.currency, "USD");
|
||||
assert.equal(
|
||||
calculateNetSaleProceeds({
|
||||
soldPriceMinor: 4999,
|
||||
platformFeesMinor: 300,
|
||||
paymentProcessingFeesMinor: 120,
|
||||
shippingCostMinor: 50,
|
||||
taxesMinor: 90,
|
||||
otherFeesMinor: 40,
|
||||
}),
|
||||
4399,
|
||||
);
|
||||
});
|
||||
|
||||
test('rejects invalid sales and negative fee values', () => {
|
||||
test("rejects invalid sales and negative fee values", () => {
|
||||
assert.throws(
|
||||
() => createSale({
|
||||
sellerId: 'seller-id',
|
||||
saleDate: '2026-09-08',
|
||||
soldPriceMinor: 0,
|
||||
}),
|
||||
() =>
|
||||
createSale({
|
||||
sellerId: "seller-id",
|
||||
saleDate: "2026-09-08",
|
||||
soldPriceMinor: 0,
|
||||
}),
|
||||
/must be a positive integer minor unit/,
|
||||
);
|
||||
|
||||
assert.throws(
|
||||
() => createSaleItem({
|
||||
saleId: 'sale-id',
|
||||
inventoryItemId: 'inventory-item-id',
|
||||
soldPriceMinor: 2000,
|
||||
costBasisMinor: -1,
|
||||
}),
|
||||
() =>
|
||||
createSaleItem({
|
||||
saleId: "sale-id",
|
||||
inventoryItemId: "inventory-item-id",
|
||||
soldPriceMinor: 2000,
|
||||
costBasisMinor: -1,
|
||||
}),
|
||||
/must be a non-negative integer minor unit/,
|
||||
);
|
||||
|
||||
assert.throws(
|
||||
() => createSale({
|
||||
sellerId: 'seller-id',
|
||||
saleDate: '2026-02-30',
|
||||
soldPriceMinor: 2000,
|
||||
}),
|
||||
() =>
|
||||
createSale({
|
||||
sellerId: "seller-id",
|
||||
saleDate: "2026-02-30",
|
||||
soldPriceMinor: 2000,
|
||||
}),
|
||||
/must be a valid ISO date/,
|
||||
);
|
||||
|
||||
assert.throws(
|
||||
() => createSale({
|
||||
sellerId: 'seller-id',
|
||||
saleDate: '2026-09-08',
|
||||
soldPriceMinor: 2000,
|
||||
currency: 'US dollars',
|
||||
}),
|
||||
() =>
|
||||
createSale({
|
||||
sellerId: "seller-id",
|
||||
saleDate: "2026-09-08",
|
||||
soldPriceMinor: 2000,
|
||||
currency: "US dollars",
|
||||
}),
|
||||
/must be a three-letter ISO currency code/,
|
||||
);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user