test: provision canonical carrier fixture

This commit is contained in:
2026-08-24 23:19:27 +08:00
parent bf4fd95841
commit 985d952e54
2 changed files with 40 additions and 17 deletions
@@ -5,6 +5,7 @@ const MODULE = 'phase3-loading'
const OPTIONS = { scenario: 'phase3-split-preload-loading', deploymentBlocker: true }
const MERCHANT_USERNAME = process.env.MERCHANT_TEST_USERNAME || 'merchant_admin'
const MERCHANT_PASSWORD = process.env.MERCHANT_TEST_PASSWORD || 'ChangeMe123!'
const MATSON_SUPPLIER_NAME = 'MATSON 开发联调船司'
function id(value) { return value == null ? '' : String(value) }
export function markerSuffix(marker) {
@@ -22,6 +23,27 @@ function failure(response) {
|| (response?.http === 200 && codeOf(response) !== '200')
}
async function ensureMatsonSupplier(context, records) {
const existing = records.find((value) => value?.id && value?.name === MATSON_SUPPLIER_NAME)
if (existing?.status === 'ACTIVE') return existing
if (existing?.id) {
const activatedResponse = await context.request('PATCH',
`/api/platform/v1/suppliers/${encodeURIComponent(id(existing.id))}/status?tenantId=0`, { status: 'ACTIVE' })
const activated = context.apiSuccess(MODULE, '启用稳定MATSON船司开发夹具', activatedResponse,
`supplierId=${id(existing.id)}`, OPTIONS)
return activated?.id ? activated : null
}
const createdResponse = await context.request('POST', '/api/platform/v1/suppliers?tenantId=0', {
name: MATSON_SUPPLIER_NAME, category: 'BOOKING', region: '开发环境', legalRepresentative: '开发联调',
contactName: '开发联调', phone: '13800000000', email: 'matson-dev-fixture@example.com',
address: '开发环境稳定船司夹具', businessLicenseNo: 'DEV-CARRIER-MATSON', licenseFileId: null,
status: 'ACTIVE', settlementPeriod: 'MONTHLY_30', remark: '三四期开发环境HTTP验收稳定船司夹具',
})
const supplierId = id(context.apiSuccess(MODULE, '创建稳定MATSON船司开发夹具', createdResponse,
`name=${MATSON_SUPPLIER_NAME}`, OPTIONS))
return supplierId ? { id: supplierId, name: MATSON_SUPPLIER_NAME, status: 'ACTIVE' } : null
}
async function request(context, method, path, body, headers = {}) {
try {
const response = await fetch(`${context.options.gateway}${path}`, {
@@ -132,28 +154,28 @@ export async function run(context) {
const smartLoadingBase = '/api/platform/v1/first-leg/smart-loading'
const pdaBase = '/api/platform/v1/first-leg/pda-loading'
const supplierResponse = await context.request('GET',
'/api/platform/v1/suppliers?tenantId=0&category=BOOKING&status=ACTIVE&page=1&size=20')
const supplierPage = context.apiSuccess(MODULE, '读取 ACTIVE 订舱代理作为运输事实源', supplierResponse, '', OPTIONS)
const supplier = supplierPage?.records?.find?.((value) => value?.id && value?.name)
'/api/platform/v1/suppliers?tenantId=0&category=BOOKING&page=1&size=200')
const supplierPage = context.apiSuccess(MODULE, '读取订舱代理与船司供应商事实源', supplierResponse, '', OPTIONS)
const supplierRecords = Array.isArray(supplierPage?.records) ? supplierPage.records : []
const supplier = supplierRecords.find((value) => value?.id && value?.name && value?.status === 'ACTIVE'
&& value.name !== MATSON_SUPPLIER_NAME)
context.assert(MODULE, '存在可用于发布订舱的 ACTIVE 订舱代理', supplierResponse,
Boolean(supplier?.id && supplier?.name), `supplierId=${id(supplier?.id) || 'missing'}`, OPTIONS)
if (!supplier?.id) return
const carrierResponse = await context.request('GET',
'/api/platform/v1/carrier-schedule-queries/carriers')
const carriers = context.apiSuccess(MODULE, '读取船节点canonical船司目录', carrierResponse, '', OPTIONS)
const shippingCarrier = Array.isArray(carriers)
? carriers.find((value) => value?.carrierCode === 'MATSON' && value?.carrierName)
: null
context.assert(MODULE, '订舱船司与订舱代理使用各自真实事实源', carrierResponse,
Boolean(shippingCarrier?.carrierName),
`carrierCode=${shippingCarrier?.carrierCode || 'missing'}, bookingAgentId=${id(supplier.id)}`, OPTIONS)
if (!shippingCarrier?.carrierName) return
const shippingCarrier = await ensureMatsonSupplier(context, supplierRecords)
context.assert(MODULE, '订舱船司与订舱代理使用各自真实供应商事实', supplierResponse,
Boolean(shippingCarrier?.id && shippingCarrier?.name === MATSON_SUPPLIER_NAME),
`shippingCompanyId=${id(shippingCarrier?.id) || 'missing'}, bookingAgentId=${id(supplier.id)}`, OPTIONS)
if (!shippingCarrier?.id) return
context.createdResources.phase3CarrierSupplier = {
supplierId: id(shippingCarrier.id), name: shippingCarrier.name, status: 'ACTIVE', stableDevFixture: true,
}
const bookingDraft = {
customerId: tenantId, customerName: initial?.summary?.customerName,
warehouseId,
channelCode: initial?.summary?.channelCode,
billOfLadingNo: `P3BL-${suffix}`.slice(0, 128),
shippingCompanyId: null, shippingCompanyName: shippingCarrier.carrierName,
shippingCompanyId: id(shippingCarrier.id), shippingCompanyName: shippingCarrier.name,
bookingAgentId: id(supplier.id), bookingAgentName: supplier.name,
vesselName: `P3VESSEL-${suffix}`.slice(0, 128), voyageNo: `P3V-${suffix}`.slice(0, 64),
departurePortCode: 'CNSZX', departurePortName: '深圳', destinationPortCode: 'USLAX',
@@ -395,9 +395,10 @@ test('preload and loading versions use immediate operation baselines and exact p
assert.equal((loading.match(/request\(context, 'POST', pushRequest\.path, pushRequest\.body, pushRequest\.headers\)/g) || []).length, 2)
assert.match(loading, /push exact replay 对计划版本历史关联和任务零漂移/)
assert.match(loading, /Number\(claimedPlan\?\.version\) > beforeClaimPlanVersion/)
assert.match(loading, /carrier-schedule-queries\/carriers/)
assert.match(loading, /carrierCode === 'MATSON'/)
assert.match(loading, /shippingCompanyId: null, shippingCompanyName: shippingCarrier\.carrierName/)
assert.match(loading, /MATSON_SUPPLIER_NAME = 'MATSON 开发联调船司'/)
assert.match(loading, /category=BOOKING&page=1&size=200/)
assert.match(loading, /ensureMatsonSupplier\(context, supplierRecords\)/)
assert.match(loading, /shippingCompanyId: id\(shippingCarrier\.id\), shippingCompanyName: shippingCarrier\.name/)
assert.match(loading, /bookingAgentId: id\(supplier\.id\), bookingAgentName: supplier\.name/)
assert.doesNotMatch(loading, /shippingCompanyId: id\(supplier\.id\), shippingCompanyName: supplier\.name/)
})