test(fleet): isolate pick commands per customer dispatch
This commit is contained in:
@@ -58,6 +58,22 @@ export function assertSingleCommercial(before, after) {
|
||||
&& before.customerId === after.customerId, 'COMMERCIAL_REPLAY_IDENTITY_CHANGED')
|
||||
}
|
||||
|
||||
export function poolPickScope(context, member) {
|
||||
requireThat(context?.marker && /^[1-9]\d*$/.test(id(member?.customerId)) && member?.dispatchNo,
|
||||
'EXACT_CUSTOMER_DISPATCH_PICK_SCOPE_REQUIRED')
|
||||
const scoped = Object.create(context)
|
||||
// pickAll keys only include its context marker and item/position indexes; the PDA key scope is customer-wide.
|
||||
scoped.marker = `POOL-PICK-${createHash('sha256').update(JSON.stringify([context.marker, id(member.customerId), member.dispatchNo])).digest('hex').slice(0, 32)}`
|
||||
return scoped
|
||||
}
|
||||
|
||||
export async function pickPoolDispatch(context, token, member, pick = pickAll) {
|
||||
const scoped = poolPickScope(context, member)
|
||||
const passed = await pick(scoped, token, member.dispatchNo)
|
||||
requireThat(passed === true, `PDA_PICK_FAILED:${member.dispatchNo}`)
|
||||
return scoped.marker
|
||||
}
|
||||
|
||||
export function shrinkingVehicleRequest(vehicle) {
|
||||
requireThat(vehicle?.id && Number.isInteger(Number(vehicle.recordVersion)) && Number(vehicle.maxPalletSpaces) > 1
|
||||
&& Number(vehicle.maxLoadKg) > 0 && Number(vehicle.maxVolumeCbm) > 0, 'COMPLETE_OWNED_VEHICLE_SNAPSHOT_REQUIRED')
|
||||
@@ -167,16 +183,16 @@ async function poolScenario(context, fixture, { execute = false, readInventory,
|
||||
const tripProof = context.createdResources.fleetTrips.find(row => row.tripNo === fixture.tripNo)
|
||||
const tripPath = `${API}/fleet/trips/${encode(fixture.tripNo)}`
|
||||
const key = label => createHash('sha256').update(`${context.marker}:POOL:${label}`).digest('hex')
|
||||
const check = (label, ok) => { context.assert(MODULE, label, null, Boolean(ok), '', { scenario: MODULE, deploymentBlocker: true }); requireThat(ok, label) }
|
||||
const check = (label, ok, response = null) => { context.assert(MODULE, label, response, Boolean(ok), '', { scenario: MODULE, deploymentBlocker: true }); requireThat(ok, label) }
|
||||
const raw = (method, path, body, token = context.token) => context.request(method, path, body, token)
|
||||
const request = async (method, path, body, token = context.token) => {
|
||||
const response = await raw(method, path, body, token)
|
||||
check(`${method} ${path}`, success(response) && response.requestId && response.traceId)
|
||||
check(`${method} ${path}`, success(response) && response.requestId && response.traceId, response)
|
||||
return response.body.data
|
||||
}
|
||||
const reject = async (label, method, path, body, token) => {
|
||||
const response = await raw(method, path, body, token)
|
||||
check(label, denied(response) && response.requestId && response.traceId)
|
||||
check(label, denied(response) && response.requestId && response.traceId, response)
|
||||
return response
|
||||
}
|
||||
const permissions = await request('GET', `${IAM}/permissions`)
|
||||
@@ -303,8 +319,10 @@ async function poolScenario(context, fixture, { execute = false, readInventory,
|
||||
detail = await request('GET', tripPath)
|
||||
for (const binding of detail.dispatches) detail = await request('POST', `${tripPath}/dispatches/${encode(binding.dispatchNo)}/review`, { recordVersion: detail.trip.recordVersion, decision: 'APPROVED' })
|
||||
const members = [...fixture.members, ...poolMembers]
|
||||
proof.pickScopes = []
|
||||
for (const member of members) {
|
||||
await pickAll(context, fixture.pdaToken, member.dispatchNo)
|
||||
const namespace = await pickPoolDispatch(context, fixture.pdaToken, member)
|
||||
proof.pickScopes.push({ customerId: member.customerId, dispatchNo: member.dispatchNo, namespace })
|
||||
const task = await request('GET', `/api/pda/v1/last-leg/dispatches/${encode(member.dispatchNo)}`, undefined, fixture.pdaToken)
|
||||
check('Every owned and external pallet was actually picked', task.items.every(row => Number(row.pickedPackages) === Number(row.scheduledPackages)))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user