feat: add acquisition and pricing domain rules
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
|
||||
import {
|
||||
calculateAcquisitionCostBasis,
|
||||
createAcquisition,
|
||||
} from '../../src/modules/acquisitions/domain/acquisition.js';
|
||||
import {
|
||||
calculateMedianPriceMinor,
|
||||
createPricingObservation,
|
||||
} from '../../src/modules/pricing/domain/pricing-observation.js';
|
||||
|
||||
test('calculates acquisition cost basis from all cost components', () => {
|
||||
const total = calculateAcquisitionCostBasis({
|
||||
costMinor: 1000,
|
||||
shippingMinor: 150,
|
||||
taxMinor: 75,
|
||||
otherFeesMinor: 50,
|
||||
estimatedTradeValueMinor: 200,
|
||||
});
|
||||
|
||||
assert.equal(total, 1075);
|
||||
});
|
||||
|
||||
test('rejects negative acquisition values and missing identity fields', () => {
|
||||
assert.throws(
|
||||
() => createAcquisition({
|
||||
inventoryItemId: 'inventory-item-id',
|
||||
method: 'PURCHASE',
|
||||
costMinor: -1,
|
||||
}),
|
||||
/must be a non-negative integer minor unit/,
|
||||
);
|
||||
|
||||
assert.throws(
|
||||
() => createAcquisition({
|
||||
inventoryItemId: '',
|
||||
method: 'PURCHASE',
|
||||
costMinor: 1000,
|
||||
}),
|
||||
/Inventory item ID is required/,
|
||||
);
|
||||
});
|
||||
|
||||
test('creates pricing observations and calculates a median observed price', () => {
|
||||
const observation = createPricingObservation({
|
||||
productId: 'product-id',
|
||||
inventoryItemId: 'inventory-item-id',
|
||||
providerId: 'ebay',
|
||||
priceMinor: 2499,
|
||||
currency: 'USD',
|
||||
sourceIdentifier: 'listing-1',
|
||||
conditionId: 'condition-id',
|
||||
});
|
||||
|
||||
assert.equal(observation.currency, 'USD');
|
||||
assert.equal(observation.priceMinor, 2499);
|
||||
assert.equal(calculateMedianPriceMinor([1199, 2499, 2000]), 2000);
|
||||
});
|
||||
Reference in New Issue
Block a user