test: align ocean booking fixtures with direct confirmed flow
This commit is contained in:
@@ -3,8 +3,7 @@ const OPTIONS = { scenario: 'manual-ocean-trucking-state-matrix', deploymentBloc
|
||||
const OCEAN_BASE = '/api/platform/v1/ocean-bookings'
|
||||
const TRUCK_BASE = '/api/platform/v1/truck-appointments'
|
||||
const OCEAN_LIST_STATUSES = ['CONFIRMED', 'CHANGE_PENDING', 'RELEASED', 'CANCELLED']
|
||||
const OCEAN_HIDDEN_STATUSES = ['DRAFT', 'SUBMITTED', 'FAILED']
|
||||
const OCEAN_STATUSES = ['DRAFT', 'SUBMITTED', 'CONFIRMED', 'RELEASED', 'FAILED', 'CHANGE_PENDING', 'CANCELLED']
|
||||
const OCEAN_STATUSES = [...OCEAN_LIST_STATUSES]
|
||||
const TRUCK_STATUSES = ['DRAFT', 'PENDING_DISPATCH', 'DISPATCHED', 'PICKUP_IN_PROGRESS', 'ARRIVED_WAREHOUSE',
|
||||
'LOADING', 'DEPARTED', 'COMPLETED', 'RESCHEDULED', 'EXCEPTION', 'CANCELLED']
|
||||
|
||||
@@ -24,12 +23,15 @@ function oceanPayload(context, template, index) {
|
||||
customerId: source.customerId, customerName: source.customerName,
|
||||
channelCode: source.channelCode,
|
||||
warehouseId: source.warehouseId, warehouseName: source.warehouseName,
|
||||
billOfLadingNo: `BL-${suffix(context, index)}`, vesselName: `人工轮-${suffix(context, index)}`,
|
||||
voyageNo: `V${suffix(context, index)}`,
|
||||
shippingCompanyId: source.shippingCompanyId,
|
||||
shippingCompanyName: source.shippingCompanyName, bookingAgentId: source.bookingAgentId,
|
||||
bookingAgentName: source.bookingAgentName,
|
||||
departurePortCode: source.departurePortCode, departurePortName: source.departurePortName,
|
||||
destinationPortCode: source.destinationPortCode, destinationPortName: source.destinationPortName,
|
||||
placeOfDelivery: source.placeOfDelivery, serviceTerm: source.serviceTerm, freightTerm: source.freightTerm,
|
||||
estimatedSailingAt: '2026-09-16T08:00:00', estimatedArrivalAt: '2026-10-16T08:00:00',
|
||||
remark: `${context.marker} 人工列表状态 ${index}`,
|
||||
parties: template.parties.map(({ partyType, partyName, address, contactName, contactPhone }) =>
|
||||
({ partyType, partyName, address, contactName, contactPhone })),
|
||||
@@ -41,7 +43,12 @@ function oceanPayload(context, template, index) {
|
||||
async function createOcean(context, template, index) {
|
||||
const response = await post(context, OCEAN_BASE, oceanPayload(context, template, index), `ocean-create-${index}`)
|
||||
const value = context.apiSuccess(MODULE, `创建订舱状态样本 ${index}`, response, '', OPTIONS)
|
||||
if (!value?.oceanBooking?.id) throw new Error(`创建订舱样本 ${index} 失败`)
|
||||
context.assert(MODULE, `订舱样本 ${index} 一次创建直接返回 CONFIRMED`, response,
|
||||
Boolean(value?.oceanBooking?.id) && value?.oceanBooking?.status === 'CONFIRMED',
|
||||
`id=${id(value?.oceanBooking?.id) || 'missing'}, status=${value?.oceanBooking?.status || 'missing'}`, OPTIONS)
|
||||
if (!value?.oceanBooking?.id || value?.oceanBooking?.status !== 'CONFIRMED') {
|
||||
throw new Error(`创建订舱样本 ${index} 未直接进入 CONFIRMED`)
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
@@ -55,13 +62,8 @@ async function oceanAction(context, value, endpoint, body = {}) {
|
||||
|
||||
async function buildOcean(context, template, status, index) {
|
||||
let value = await createOcean(context, template, index)
|
||||
if (status === 'DRAFT') return value
|
||||
value = await oceanAction(context, value, 'submit')
|
||||
if (status === 'SUBMITTED') return value
|
||||
if (status === 'FAILED') return oceanAction(context, value, 'fail')
|
||||
if (status === 'CANCELLED') return oceanAction(context, value, 'cancel')
|
||||
value = await oceanAction(context, value, 'confirm')
|
||||
if (status === 'CONFIRMED') return value
|
||||
if (status === 'CANCELLED') return oceanAction(context, value, 'cancel')
|
||||
if (status === 'CHANGE_PENDING') return oceanAction(context, value, 'change-request', {
|
||||
vesselName: `变更轮-${suffix(context, index)}`, voyageNo: `CV${suffix(context, index)}`,
|
||||
estimatedSailingAt: '2026-09-16T08:00:00', estimatedArrivalAt: '2026-10-16T08:00:00' })
|
||||
@@ -130,19 +132,6 @@ async function verify(context, base, status, resourceId) {
|
||||
`status=${status}, id=${resourceId}`, OPTIONS)
|
||||
}
|
||||
|
||||
async function verifyHiddenOcean(context, status, resourceId) {
|
||||
const listResponse = await context.request('GET', `${OCEAN_BASE}?page=1&size=100&status=${status}`)
|
||||
context.assert(MODULE, `${status} 不进入正式订舱列表筛选`, listResponse,
|
||||
listResponse?.http === 200 && code(listResponse) === 'A0400',
|
||||
`HTTP=${listResponse?.http ?? 'missing'}, code=${code(listResponse)}, id=${resourceId}`, OPTIONS)
|
||||
|
||||
const detailResponse = await context.request('GET', `${OCEAN_BASE}/${resourceId}`)
|
||||
const detail = context.apiSuccess(MODULE, `${status} 后台样本仅通过详情契约验证`, detailResponse, '', OPTIONS)
|
||||
context.assert(MODULE, `${status} 后台详情身份与状态正确`, detailResponse,
|
||||
id(detail?.oceanBooking?.id) === resourceId && detail?.oceanBooking?.status === status,
|
||||
`id=${id(detail?.oceanBooking?.id) || 'missing'}, actual=${detail?.oceanBooking?.status || 'missing'}`, OPTIONS)
|
||||
}
|
||||
|
||||
export async function run(context, matrix = context.createdResources.manualStateMatrix) {
|
||||
const sourceOceanId = id(context.createdResources?.oceanBooking?.id)
|
||||
if (!sourceOceanId) throw new Error('缺少现有订舱生命周期模块生成的模板资源')
|
||||
@@ -151,7 +140,7 @@ export async function run(context, matrix = context.createdResources.manualState
|
||||
if (!template?.oceanBooking || !template?.parties?.length || !template?.containerRequirements?.length) {
|
||||
throw new Error('订舱模板缺少渠道、仓库、参与方或箱型需求')
|
||||
}
|
||||
matrix.pages.oceanBookings = { requiredStatuses: OCEAN_LIST_STATUSES, fixtures: {}, hiddenFixtures: {} }
|
||||
matrix.pages.oceanBookings = { requiredStatuses: OCEAN_LIST_STATUSES, fixtures: {} }
|
||||
for (const [index, status] of OCEAN_STATUSES.entries()) {
|
||||
const value = await buildOcean(context, template, status, index)
|
||||
const resourceId = id(value?.oceanBooking?.id); const actual = value?.oceanBooking?.status
|
||||
@@ -163,11 +152,6 @@ export async function run(context, matrix = context.createdResources.manualState
|
||||
customerId: id(value?.oceanBooking?.customerId), customerName: value?.oceanBooking?.customerName,
|
||||
warehouseId: id(value?.oceanBooking?.warehouseId),
|
||||
}
|
||||
if (OCEAN_HIDDEN_STATUSES.includes(status)) {
|
||||
matrix.pages.oceanBookings.hiddenFixtures[status] = fixtureValue
|
||||
await verifyHiddenOcean(context, status, resourceId)
|
||||
continue
|
||||
}
|
||||
matrix.pages.oceanBookings.fixtures[status] = {
|
||||
...fixtureValue, detailPath: `/ocean-bookings/${resourceId}`,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user