test(firstleg): use valid PDF truck fixtures
This commit is contained in:
@@ -2,7 +2,19 @@ import assert from 'node:assert/strict'
|
|||||||
import { readFileSync } from 'node:fs'
|
import { readFileSync } from 'node:fs'
|
||||||
import test from 'node:test'
|
import test from 'node:test'
|
||||||
|
|
||||||
import { activeCustomerIdentity, inspectOceanBookingIdentity, platformWarehouseIdentity, truckAppointmentPayload } from './truck-appointments.mjs'
|
import { activeCustomerIdentity, inspectOceanBookingIdentity, minimalPdfBytes, platformWarehouseIdentity, truckAppointmentPayload } from './truck-appointments.mjs'
|
||||||
|
|
||||||
|
test('PDF upload fixtures contain real PDF magic bytes instead of MIME-only text', () => {
|
||||||
|
const bytes = minimalPdfBytes('RUN-2-DISPATCH_ORDER')
|
||||||
|
const content = Buffer.from(bytes).toString('ascii')
|
||||||
|
assert.equal(content.slice(0, 5), '%PDF-')
|
||||||
|
assert.match(content, /%%EOF\n$/)
|
||||||
|
|
||||||
|
const source = readFileSync(new URL('truck-appointments.mjs', import.meta.url), 'utf8')
|
||||||
|
assert.match(source, /new Blob\(\[minimalPdfBytes\(`\$\{context\.marker\}-BILL_OF_LADING`\)\], \{ type: 'application\/pdf' \}\)/)
|
||||||
|
assert.match(source, /new Blob\(\[minimalPdfBytes\(`\$\{context\.marker\}-DISPATCH_ORDER`\)\], \{ type: 'application\/pdf' \}\)/)
|
||||||
|
assert.doesNotMatch(source, /new Blob\(\[\s*`\$\{context\.marker\}-(?:BILL_OF_LADING|DISPATCH_ORDER)`\s*\], \{ type: 'application\/pdf' \}\)/)
|
||||||
|
})
|
||||||
|
|
||||||
test('booking prerequisite resolves an ACTIVE platform customer without fixture state', () => {
|
test('booking prerequisite resolves an ACTIVE platform customer without fixture state', () => {
|
||||||
assert.deepEqual(activeCustomerIdentity({ id: '21', tenantName: '现有客户' }),
|
assert.deepEqual(activeCustomerIdentity({ id: '21', tenantName: '现有客户' }),
|
||||||
|
|||||||
@@ -14,6 +14,22 @@ function data(response) { return codeOf(response) === '200' ? response.body.data
|
|||||||
function failure(response) { return response?.http === 0 || response?.http >= 400 || (response?.http === 200 && codeOf(response) !== '200') }
|
function failure(response) { return response?.http === 0 || response?.http >= 400 || (response?.http === 200 && codeOf(response) !== '200') }
|
||||||
function records(value) { return Array.isArray(value) ? value : value?.records || [] }
|
function records(value) { return Array.isArray(value) ? value : value?.records || [] }
|
||||||
|
|
||||||
|
export function minimalPdfBytes(label = 'truck-appointment-fixture') {
|
||||||
|
const safeLabel = String(label).replace(/[^\x20-\x7E]/g, '_').slice(0, 64)
|
||||||
|
return new TextEncoder().encode(`%PDF-1.4
|
||||||
|
% ${safeLabel}
|
||||||
|
1 0 obj
|
||||||
|
<< /Type /Catalog /Pages 2 0 R >>
|
||||||
|
endobj
|
||||||
|
2 0 obj
|
||||||
|
<< /Type /Pages /Kids [] /Count 0 >>
|
||||||
|
endobj
|
||||||
|
trailer
|
||||||
|
<< /Root 1 0 R >>
|
||||||
|
%%EOF
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
|
||||||
export function platformWarehouseIdentity(item) {
|
export function platformWarehouseIdentity(item) {
|
||||||
return { warehouseId: id(item?.warehouseId || item?.id || item?.warehouse?.id), platformTenantId: '0' }
|
return { warehouseId: id(item?.warehouseId || item?.id || item?.warehouse?.id), platformTenantId: '0' }
|
||||||
}
|
}
|
||||||
@@ -136,7 +152,7 @@ async function fixture(context) {
|
|||||||
const bookingId = id(created?.oceanBooking?.id); if (!bookingId) return null
|
const bookingId = id(created?.oceanBooking?.id); if (!bookingId) return null
|
||||||
const form = new FormData(); form.append('expectedVersion', String(created.oceanBooking.version))
|
const form = new FormData(); form.append('expectedVersion', String(created.oceanBooking.version))
|
||||||
form.append('documentType', 'BILL_OF_LADING')
|
form.append('documentType', 'BILL_OF_LADING')
|
||||||
form.append('file', new Blob([`${context.marker}-BILL_OF_LADING`], { type: 'application/pdf' }), `bill-${suffix}.pdf`)
|
form.append('file', new Blob([minimalPdfBytes(`${context.marker}-BILL_OF_LADING`)], { type: 'application/pdf' }), `bill-${suffix}.pdf`)
|
||||||
const uploadResponse = await context.requestMultipart('POST', `${BOOKINGS}/${bookingId}/documents/upload`, form,
|
const uploadResponse = await context.requestMultipart('POST', `${BOOKINGS}/${bookingId}/documents/upload`, form,
|
||||||
context.token, { 'Idempotency-Key': `${context.marker}-truck-booking-file`.slice(0, 128) })
|
context.token, { 'Idempotency-Key': `${context.marker}-truck-booking-file`.slice(0, 128) })
|
||||||
const uploaded = context.apiSuccess(MODULE, '上传当前有效 BILL_OF_LADING 文件', uploadResponse, '', OPTIONS)
|
const uploaded = context.apiSuccess(MODULE, '上传当前有效 BILL_OF_LADING 文件', uploadResponse, '', OPTIONS)
|
||||||
@@ -186,7 +202,7 @@ export async function run(context) {
|
|||||||
&& !Object.hasOwn(appointment, 'customerId') && !Object.hasOwn(appointment, 'customerName'), '', OPTIONS)
|
&& !Object.hasOwn(appointment, 'customerId') && !Object.hasOwn(appointment, 'customerName'), '', OPTIONS)
|
||||||
const path = `${TRUCKS}/${appointmentId}`
|
const path = `${TRUCKS}/${appointmentId}`
|
||||||
const attachmentForm = new FormData(); attachmentForm.append('attachmentType', 'DISPATCH_ORDER')
|
const attachmentForm = new FormData(); attachmentForm.append('attachmentType', 'DISPATCH_ORDER')
|
||||||
attachmentForm.append('file', new Blob([`${context.marker}-DISPATCH_ORDER`], { type: 'application/pdf' }),
|
attachmentForm.append('file', new Blob([minimalPdfBytes(`${context.marker}-DISPATCH_ORDER`)], { type: 'application/pdf' }),
|
||||||
`dispatch-order-${identity.suffix}.pdf`)
|
`dispatch-order-${identity.suffix}.pdf`)
|
||||||
const uploadAttachmentResponse = await context.requestMultipart('POST', `${path}/attachments/upload`,
|
const uploadAttachmentResponse = await context.requestMultipart('POST', `${path}/attachments/upload`,
|
||||||
attachmentForm, context.token)
|
attachmentForm, context.token)
|
||||||
|
|||||||
Reference in New Issue
Block a user