62 lines
4.3 KiB
JavaScript
62 lines
4.3 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { readFileSync } from 'node:fs'
|
|
import { runInNewContext } from 'node:vm'
|
|
import test from 'node:test'
|
|
import ts from 'typescript'
|
|
|
|
const source = readFileSync(new URL('./transportDemandForm.ts', import.meta.url), 'utf8')
|
|
const code = ts.transpileModule(source, { compilerOptions: { target: ts.ScriptTarget.ES2022, module: ts.ModuleKind.ESNext } }).outputText.replace(/^export /gm, '')
|
|
const { createTransportDemandForm, transportDemandError, buildTransportDemand } = runInNewContext(`${code}\n({ createTransportDemandForm, transportDemandError, buildTransportDemand })`)
|
|
const valid = () => ({ ...createTransportDemandForm(), vehicleType: 'PALLET_15', origin: ' LA ', destination: ' ONT ', originContactName: ' 发货人 ', originContactPhone: ' +1-555-0100 ', destinationContactName: ' 收货人 ', destinationContactPhone: ' +1-555-0101 ', pickupAt: '2026-10-20T09:30:45', deliveryAt: '2026-10-20T15:45:12' })
|
|
|
|
test('initial form leaves contacts and times blank, zeroes cargo and distinguishes blank budget from zero', () => {
|
|
const form = createTransportDemandForm()
|
|
for (const key of ['originContactName', 'originContactPhone', 'destinationContactName', 'destinationContactPhone', 'pickupAt', 'deliveryAt']) assert.equal(form[key], '')
|
|
for (const key of ['estimatedPalletCount', 'packageCount', 'totalWeightKg', 'totalVolumeCbm']) assert.equal(form[key], 0)
|
|
assert.equal(form.budgetAmount, undefined)
|
|
assert.equal(form.currency, 'USD')
|
|
assert.equal(buildTransportDemand('truck', valid()).budgetAmount, undefined)
|
|
assert.equal(buildTransportDemand('truck', { ...valid(), budgetAmount: 0 }).budgetAmount, 0)
|
|
})
|
|
|
|
for (const kind of ['truck', 'looseboard']) {
|
|
test(`${kind} requires both route contacts and both service times before building a payload`, () => {
|
|
for (const field of ['origin', 'destination', 'originContactName', 'originContactPhone', 'destinationContactName', 'destinationContactPhone', 'pickupAt', 'deliveryAt']) {
|
|
const form = { ...valid(), [field]: '' }
|
|
assert.ok(transportDemandError(kind, form), field)
|
|
assert.throws(() => buildTransportDemand(kind, form), undefined, field)
|
|
}
|
|
})
|
|
test(`${kind} rejects negative cargo, fractional counts, invalid budgets and reversed times`, () => {
|
|
for (const field of ['packageCount', 'totalWeightKg', 'totalVolumeCbm', 'budgetAmount']) {
|
|
assert.ok(transportDemandError(kind, { ...valid(), [field]: -1 }), field)
|
|
assert.ok(transportDemandError(kind, { ...valid(), [field]: Number.NaN }), field)
|
|
}
|
|
assert.ok(transportDemandError(kind, { ...valid(), packageCount: 1.5 }))
|
|
assert.ok(transportDemandError(kind, { ...valid(), deliveryAt: '2026-10-20T09:29:00' }))
|
|
assert.ok(transportDemandError(kind, { ...valid(), currency: 'EUR' }))
|
|
})
|
|
test(`${kind} sends minute wall-clock values, trims contacts, and excludes customer and old fields`, () => {
|
|
const payload = buildTransportDemand(kind, { ...valid(), customerId: 'forged', tenantId: 'forged', transportMode: 'OLD', containerType: '40HQ' })
|
|
assert.equal(payload.pickupAt, '2026-10-20T09:30:00')
|
|
assert.equal(payload.deliveryAt, '2026-10-20T15:45:00')
|
|
assert.equal(payload.origin, 'LA')
|
|
assert.equal(payload.originContactName, '发货人')
|
|
assert.equal(payload.destinationContactPhone, '+1-555-0101')
|
|
for (const key of ['customerId', 'tenantId', 'transportMode', 'transportType', 'containerType', 'contactName', 'contactInfo', 'requestedDate']) assert.equal(Object.hasOwn(payload, key), false, key)
|
|
assert.equal(transportDemandError(kind, { ...valid(), deliveryAt: '2026-10-20T09:30:01' }), undefined)
|
|
})
|
|
}
|
|
|
|
test('truck accepts only the two vehicle types and does not submit looseboard cargo forecasts', () => {
|
|
assert.ok(transportDemandError('truck', { ...valid(), vehicleType: 'PALLET_99' }))
|
|
const truck = buildTransportDemand('truck', { ...valid(), productName: 'cargo', estimatedPalletCount: 3 })
|
|
assert.equal(Object.hasOwn(truck, 'productName'), false)
|
|
assert.equal(Object.hasOwn(truck, 'estimatedPalletCount'), false)
|
|
const loose = buildTransportDemand('looseboard', { ...valid(), vehicleType: '', productName: ' cargo ', estimatedPalletCount: 3, packageCount: 8 })
|
|
assert.equal(Object.hasOwn(loose, 'vehicleType'), false)
|
|
assert.equal(loose.productName, 'cargo')
|
|
assert.equal(loose.estimatedPalletCount, 3)
|
|
assert.equal(loose.packageCount, 8)
|
|
})
|