43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import {
|
|
unitRate,
|
|
isValidQuantity,
|
|
isValidPrice,
|
|
lineAmount,
|
|
baseUnitPrice,
|
|
} from '../src/utils/transaction.js'
|
|
|
|
test('source-unit pricing converts exactly once', () => {
|
|
const row = {
|
|
source_unit: 7,
|
|
units: [{ unit_id: 7, rate: 24 }],
|
|
quantity: 2,
|
|
unit_price: 120,
|
|
}
|
|
|
|
assert.equal(unitRate(row), 24)
|
|
assert.equal(lineAmount(row), 240)
|
|
assert.equal(baseUnitPrice(row), 5)
|
|
})
|
|
|
|
test('base-unit rows keep their entered amount', () => {
|
|
const row = { source_unit: null, quantity: 3, unit_price: 12.5, units: [] }
|
|
|
|
assert.equal(unitRate(row), 1)
|
|
assert.equal(lineAmount(row), 37.5)
|
|
assert.equal(baseUnitPrice(row), 12.5)
|
|
})
|
|
|
|
test('quantity and price validators reject non-finite or out-of-range values', () => {
|
|
assert.equal(isValidQuantity({ quantity: 0.001 }), true)
|
|
assert.equal(isValidQuantity({ quantity: 0 }), false)
|
|
assert.equal(isValidQuantity({ quantity: Number.NaN }), false)
|
|
assert.equal(isValidQuantity({ quantity: 1e9 + 1 }), false)
|
|
|
|
assert.equal(isValidPrice({ unit_price: 0.01 }), true)
|
|
assert.equal(isValidPrice({ unit_price: 0 }), false)
|
|
assert.equal(isValidPrice({ unit_price: Number.POSITIVE_INFINITY }), false)
|
|
assert.equal(isValidPrice({ unit_price: 1e9 + 1 }), false)
|
|
})
|