Files
pokemon-inventory/apps/api/tests/domain/acquisition-pricing.test.js
fragginwagon b8f089a5d9 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.
2026-09-09 22:12:53 -04:00

71 lines
1.9 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import {
calculateAcquisitionCostBasis,
createAcquisition,
} from "../../src/modules/acquisitions/domain/acquisition.js";
import {
calculateMedianPriceMinor,
createPricingObservation,
identifyOutlierPrices,
} 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);
});
test("identifies extreme pricing observations without discarding normal values", () => {
assert.deepEqual(
[...identifyOutlierPrices([1000, 1050, 1100, 5000])],
[5000],
);
assert.equal(identifyOutlierPrices([1000, 1050, 1100]).size, 0);
});