2026-08-26 14:56:33 +08:00
|
|
|
import assert from 'node:assert/strict'
|
|
|
|
|
import { readFileSync } from 'node:fs'
|
|
|
|
|
import test from 'node:test'
|
|
|
|
|
|
2026-09-14 12:40:40 +08:00
|
|
|
import { DOCUMENT_TYPES, applicableDocumentTypes } from './phase3-container-documents.mjs'
|
|
|
|
|
|
|
|
|
|
test('rail excludes DO but truck still requires it; missing channel fails closed', () => {
|
|
|
|
|
for (const code of ['EXX_RAIL_NY', 'NYEXX', 'OA_CHICAGO_RAIL', 'CPHT']) {
|
|
|
|
|
assert.deepEqual(applicableDocumentTypes(code), ['DESTINATION_CLEARANCE'])
|
|
|
|
|
}
|
|
|
|
|
assert.deepEqual(applicableDocumentTypes('EXX_TRUCK'), DOCUMENT_TYPES)
|
|
|
|
|
assert.throws(() => applicableDocumentTypes(null), /权威渠道/)
|
|
|
|
|
})
|
2026-08-26 14:56:33 +08:00
|
|
|
import { normalizeModuleOrder } from '../admin-test-env-acceptance.mjs'
|
|
|
|
|
|
|
|
|
|
const source = readFileSync(new URL('./phase3-container-documents.mjs', import.meta.url), 'utf8')
|
|
|
|
|
const entry = readFileSync(new URL('../admin-test-env-acceptance.mjs', import.meta.url), 'utf8')
|
|
|
|
|
|
2026-09-09 03:11:41 +08:00
|
|
|
test('destination clearance and delivery order documents are frozen while pickup uses the cabinet code', () => {
|
2026-08-26 14:56:33 +08:00
|
|
|
assert.deepEqual(DOCUMENT_TYPES, [
|
2026-09-09 03:11:41 +08:00
|
|
|
'DESTINATION_CLEARANCE', 'DELIVERY_ORDER',
|
2026-08-26 14:56:33 +08:00
|
|
|
])
|
|
|
|
|
for (const token of [
|
2026-09-02 13:26:24 +08:00
|
|
|
'/clearance/document/upload', '/clearance/complete',
|
2026-08-26 14:56:33 +08:00
|
|
|
'/documents/${type}/upload', '/overview', 'requestMultipart', 'Idempotency-Key',
|
|
|
|
|
]) assert.ok(source.includes(token), token)
|
2026-09-02 13:26:24 +08:00
|
|
|
assert.doesNotMatch(source, /customs\/document|CUSTOMS_DECLARATION/)
|
2026-09-09 03:11:41 +08:00
|
|
|
assert.doesNotMatch(source, /PICKUP_ORDER/)
|
2026-08-26 14:56:33 +08:00
|
|
|
assert.doesNotMatch(source, /\/internal\/|https?:\/\/|process\.env|\bfetch\s*\(/)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('document lifecycle is fail-closed, traceable and covers replay, hash conflict and zero drift', () => {
|
|
|
|
|
for (const token of [
|
2026-09-09 02:54:09 +08:00
|
|
|
'finalizeSucceeded !== true', "finalStatus !== 'LOADED'", "outbound?.finalStatus !== 'WAITING_FOR_LOADING'",
|
|
|
|
|
"outbound?.finalInboundStatus !== 'LOADED'", 'deploymentBlocker: true',
|
2026-08-26 14:56:33 +08:00
|
|
|
'同键同载荷重放', '同键异文件返回A0409', '完成同键重放', '完成同键异载荷返回A0409',
|
|
|
|
|
'负向请求后持久事实零漂移', 'requestId=', 'traceId=', 'phase3ContainerDocuments',
|
|
|
|
|
]) assert.ok(source.includes(token), token)
|
|
|
|
|
})
|
|
|
|
|
|
2026-09-09 02:54:09 +08:00
|
|
|
test('focused pickup-ready chain orders destination documents after outbound and before candidate visibility', () => {
|
2026-08-26 14:56:33 +08:00
|
|
|
const modules = normalizeModuleOrder(['phase4-overseas-pda'])
|
|
|
|
|
const required = [
|
2026-09-09 02:54:09 +08:00
|
|
|
'phase3-loading-finalize', 'phase3-customs', 'phase3-outbound-dispatch',
|
|
|
|
|
'phase3-container-documents', 'phase3-carrier-schedule-queries',
|
2026-08-26 14:56:33 +08:00
|
|
|
'phase4-carrier-pickup-ready', 'phase4-overseas-pda',
|
|
|
|
|
]
|
|
|
|
|
for (const module of required) assert.ok(modules.includes(module), module)
|
2026-09-09 02:54:09 +08:00
|
|
|
assert.ok(modules.indexOf('phase3-loading-finalize') < modules.indexOf('phase3-customs'))
|
|
|
|
|
assert.ok(modules.indexOf('phase3-customs') < modules.indexOf('phase3-outbound-dispatch'))
|
|
|
|
|
assert.ok(modules.indexOf('phase3-outbound-dispatch') < modules.indexOf('phase3-container-documents'))
|
|
|
|
|
assert.ok(modules.indexOf('phase3-outbound-dispatch') < modules.indexOf('phase3-carrier-schedule-queries'))
|
|
|
|
|
assert.ok(modules.indexOf('phase3-container-documents') < modules.indexOf('phase4-carrier-pickup-ready'))
|
|
|
|
|
assert.ok(modules.indexOf('phase3-carrier-schedule-queries') < modules.indexOf('phase4-carrier-pickup-ready'))
|
|
|
|
|
assert.ok(modules.indexOf('phase4-carrier-pickup-ready') < modules.indexOf('phase4-overseas-pda'))
|
2026-08-26 14:56:33 +08:00
|
|
|
assert.match(entry, /phase3-container-documents/)
|
|
|
|
|
assert.match(entry, /phase3-container-documents-phase4-/)
|
|
|
|
|
})
|