test(fleet): handle PDFs from direct print requests

This commit is contained in:
2026-10-03 19:27:03 +08:00
parent dbc7688516
commit e5af1ba758
2 changed files with 36 additions and 5 deletions
@@ -5,6 +5,7 @@ import { tmpdir } from 'node:os'
import { join, dirname, resolve } from 'node:path'
import { AcceptanceRun } from './admin-test-env-acceptance.mjs'
import { run as runInboundMeasurement } from './admin-test-env-modules/inbound-measurement.mjs'
import { verifyPalletLabels } from './admin-test-env-modules/phase3-loading-finalize.mjs'
import { parseFleetArguments, fleetExecutionPlan, runFleetAcceptance, reviewedFullCheckpoint, verifyFleetTerminalState, runFleetHandoverStage, fleetCostShares, prepareFleetCostActors, guardFleetWrites, redactFleetWrite } from './fleet-test-env-acceptance.mjs'
for (const response of [
@@ -112,6 +113,34 @@ test('raw JSON prerequisite writes retain headers, original version and bounded
} finally { restore(); t.mock.restoreAll() }
})
for (const invalidPdf of [false, true, 'zip']) test(`real loading finalize prints both PDFs through guarded direct fetch; invalid=${invalidPdf}`, async t => {
const saved = [], calls = [], fixture = { destinationType: 'FBA', warehouseId: '1', containerNo: 'CONTAINER', cabinetNo: 'CABINET' }
const manifest = { containerNo: fixture.containerNo, totalCount: 1, groups: [{ destinationWarehouseCode: 'FBA', labels: [{
containerNo: fixture.containerNo, destinationWarehouseInternalCode: 'F01', palletIndex: 1, palletCode: 'CABINET-F01-001' }] }] }
t.mock.method(globalThis, 'fetch', async (input, init) => {
const req = new Request(input, init); calls.push(req.url)
assert.equal(saved.at(-1).status, 'SENDING')
const headers = { 'x-request-id': 'r', 'x-trace-id': 't' }
return req.url.includes('/prepare?')
? new Response(JSON.stringify({ code: '200', data: manifest }), { headers: { ...headers, 'content-type': 'application/json' } })
: new Response(invalidPdf === true ? '<html>proxy failure</html>' : '%PDF-1.6\nfixture',
{ headers: { ...headers, 'content-type': invalidPdf === 'zip' ? 'application/zip' : 'application/pdf' } })
})
const ctx = new AcceptanceRun({ gateway: 'https://test.invalid' })
const restore = guardFleetWrites(ctx, entry => saved.push(redactFleetWrite(structuredClone(entry))), { guardFetch: true })
try {
await verifyPalletLabels(ctx, fixture, '2')
const prints = saved.filter(row => row.path.includes('/print?'))
assert.equal(calls.filter(url => url.includes('/print?')).length, invalidPdf ? 1 : 2)
assert.equal(prints.at(-1).status, invalidPdf ? 'UNKNOWN_RESULT' : 'RESPONDED')
assert.equal(prints.at(-1).binary.validPdf, !invalidPdf)
assert.equal(prints.at(-1).raw, null, 'binary response bytes must not enter text evidence')
assert.equal(prints[0].body.destinationWarehouseCode, null)
if (!invalidPdf) { assert.equal(prints[2].body.destinationWarehouseCode, 'FBA'); assert.ok(ctx.steps.every(row => row.passed)) }
else await assert.rejects(ctx.request('POST', '/no-retry'), /Unknown write outcome/)
} finally { restore(); t.mock.restoreAll() }
})
for (const override of [{ http: 0 }, { http: 503 }, { bytes: Buffer.from('<html>proxy</html>') },
{ bytes: new Uint8Array() }, { contentType: 'text/html' }, { traceId: null },
{ contentType: 'application/json', bytes: Buffer.from('{"code":"200"}'), body: { code: '200' } }])