feat(dispatch): unify whole vehicle scheduling, source ownership and staged execution
This commit is contained in:
+18
-10
@@ -1,6 +1,7 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { verifyFleetBookingReservation } from './fleet-booking-reservation-acceptance.mjs'
|
||||
import { verifyFleetBookingReservation, testPlannedCapacity } from './fleet-booking-reservation-acceptance.mjs'
|
||||
import { controlledPalletMeasurements } from './fleet-trip-fulfillment.mjs'
|
||||
|
||||
function fixture(fault = '') {
|
||||
const baseline = [
|
||||
@@ -71,16 +72,12 @@ function fixture(fault = '') {
|
||||
return result(booking)
|
||||
},
|
||||
}
|
||||
const measurements = (actual, stops) => {
|
||||
assert.deepEqual(actual, cargo); assert.deepEqual(stops, tripProof.stops)
|
||||
return cargo.map((row, index) => ({ warehousePalletId: row.warehousePalletId, palletSpaces: 1, weightKg: 100, volumeCbm: 1, deliveryIndex: index + 1 }))
|
||||
}
|
||||
return { context, tripProof, measurements, calls, bookings, assertions }
|
||||
return { context, tripProof, cargo, calls, bookings, assertions }
|
||||
}
|
||||
|
||||
test('reservation HTTP helper verifies actual segments, original requests and cancellation without receiving or charging', async () => {
|
||||
const f = fixture()
|
||||
const proof = await verifyFleetBookingReservation(f.context, 'fleet-test', f.tripProof, f.measurements)
|
||||
const proof = await verifyFleetBookingReservation(f.context, 'fleet-test', f.tripProof)
|
||||
assert.equal(proof.status, 'VERIFIED')
|
||||
assert.equal(proof.bookings.length, 2)
|
||||
assert.ok(f.bookings.every(row => row.status === 'CANCELLED'))
|
||||
@@ -89,13 +86,14 @@ test('reservation HTTP helper verifies actual segments, original requests and ca
|
||||
assert.ok(f.assertions.every(row => row.passed && row.options.deploymentBlocker))
|
||||
assert.ok(f.calls.every(row => !/incoming|receipt-confirmation|transfer-delivery|departure/.test(row.suffix)))
|
||||
assert.equal(proof.createRequest.customerId, '900719925474099301')
|
||||
await assert.rejects(() => verifyFleetBookingReservation(f.context, 'fleet-test', f.tripProof, f.measurements), /本轮新建/)
|
||||
assert.equal(proof.planningBasis.kind, 'CONTROLLED_TEST_PLAN'); assert.equal(proof.planningBasis.actual, false)
|
||||
await assert.rejects(() => verifyFleetBookingReservation(f.context, 'fleet-test', f.tripProof), /本轮新建/)
|
||||
})
|
||||
|
||||
for (const fault of ['wrong-segment', 'replay-reoccupies', 'cancel-does-not-release', 'fake-loaded', 'missing-trace', 'wrong-conflict']) {
|
||||
test(`reservation helper fails closed on ${fault} even when HTTP reports success`, async () => {
|
||||
const f = fixture(fault)
|
||||
await assert.rejects(() => verifyFleetBookingReservation(f.context, 'fleet-test', f.tripProof, f.measurements))
|
||||
await assert.rejects(() => verifyFleetBookingReservation(f.context, 'fleet-test', f.tripProof))
|
||||
assert.equal(f.tripProof.reservation.status, 'CHECKING')
|
||||
assert.ok(f.assertions.some(row => !row.passed && row.options.deploymentBlocker))
|
||||
if (['wrong-segment', 'replay-reoccupies'].includes(fault)) assert.equal(f.calls.some(row => row.suffix.endsWith('/cancel')), false)
|
||||
@@ -104,6 +102,16 @@ for (const fault of ['wrong-segment', 'replay-reoccupies', 'cancel-does-not-rele
|
||||
|
||||
test('reservation helper rejects foreign fixture before making any request', async () => {
|
||||
const f = fixture()
|
||||
await assert.rejects(() => verifyFleetBookingReservation(f.context, 'fleet-test', { ...f.tripProof }, f.measurements), /本轮新建/)
|
||||
await assert.rejects(() => verifyFleetBookingReservation(f.context, 'fleet-test', { ...f.tripProof }), /本轮新建/)
|
||||
assert.equal(f.calls.length, 0)
|
||||
})
|
||||
|
||||
test('planned capacity counts a cross-customer physical pallet once and cannot be treated as actual measurement', () => {
|
||||
const f = fixture(), first = f.cargo[0]
|
||||
const planned = testPlannedCapacity([first, { ...first, customerId: 'OTHER-CUSTOMER' }], f.tripProof.stops)
|
||||
assert.equal(planned.length, 1); assert.equal(planned[0].warehousePalletId, first.warehousePalletId)
|
||||
assert.throws(() => controlledPalletMeasurements(planned, f.tripProof.stops), /实际预览|实际托盘/)
|
||||
assert.throws(() => testPlannedCapacity([first, { ...first, destinationKey: 'FBA:B' }], f.tripProof.stops), /不同计划卸货站/)
|
||||
assert.throws(() => testPlannedCapacity([{ ...first, warehousePalletId: null }], f.tripProof.stops), /缺少真实/)
|
||||
assert.throws(() => testPlannedCapacity([first], [{ name: 'Origin' }]), /唯一路线/)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user