94 lines
5.3 KiB
TypeScript
94 lines
5.3 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { readFileSync } from 'node:fs'
|
|
import { resolve } from 'node:path'
|
|
|
|
const source = readFileSync(resolve(process.cwd(), 'src/modules/trucking/components/TruckAppointmentForm.vue'), 'utf8')
|
|
|
|
describe('TruckAppointmentForm interaction contract', () => {
|
|
it('uses searchable business selectors for shared resources', () => {
|
|
expect(source).toContain('listPlatformTenants')
|
|
expect(source).toContain('listSuppliers')
|
|
expect(source).toContain('listContainers')
|
|
expect(source).toContain('listOceanBookings')
|
|
expect(source).toContain('listAllPlatformWarehouses')
|
|
expect(source).not.toContain('label="承运商 ID"')
|
|
expect(source).not.toContain('label="客户关联 ID"')
|
|
expect(source).toContain("listPlatformTenants({ page: 1, size: 200, status: 'ACTIVE' })")
|
|
expect(source).toContain("listSuppliers({ page: 1, size: 200, category: 'TRUCKING', status: 'ACTIVE' })")
|
|
expect(source).toContain('function customerLabel(customer: PlatformTenantResource) { return customer.tenantName }')
|
|
expect(source).not.toContain('customer.tenantCode')
|
|
})
|
|
|
|
it('synchronizes ids and names and recovers failed option loading', () => {
|
|
expect(source).toContain('selectCarrier')
|
|
expect(source).toContain("item.category === 'TRUCKING' && item.status === 'ACTIVE'")
|
|
expect(source).toContain('请选择有效的合作中拖车供应商')
|
|
expect(source).toContain('draft.carrierName')
|
|
expect(source).toContain('selectCustomer')
|
|
expect(source).toContain('draft.customerName')
|
|
expect(source).toContain('selectContainer')
|
|
expect(source).toContain('draft.loadingPlanId = item.planId || null')
|
|
expect(source).toContain('draft.loadingPlanId = null; draft.warehouseId = null')
|
|
expect(source).toContain("derivedCustomerSource.value === 'container'")
|
|
expect(source).toContain("derivedCustomerSource.value === 'booking'")
|
|
expect(source).toContain('重新加载选项')
|
|
})
|
|
|
|
it('keeps historical snapshots visible but requires active customer and carrier choices', () => {
|
|
expect(source).toContain("item.status === 'ACTIVE'")
|
|
expect(source).toContain("item.status === 'ACTIVE' || String(item.id) === String(draft.warehouseId)")
|
|
expect(source).toContain('v-for="item in selectableCustomers"')
|
|
expect(source).toContain('v-for="item in selectableWarehouses"')
|
|
expect(source).toContain("customerId: [{ required: true, message: '请选择客户'")
|
|
expect(source).toContain("carrierId: [{ required: true, message: '请选择承运商'")
|
|
expect(source).toContain("plannedLoadingAt: [{ required: true, message: '请选择预计装箱时间'")
|
|
expect(source).toContain("draft.customerName || '历史客户(需重新选择)'")
|
|
expect(source).toContain(':value="String(draft.customerId)" disabled')
|
|
expect(source).not.toContain('const relationText = computed')
|
|
})
|
|
|
|
it('loads readonly detail options and preserves relation snapshots outside the first page', () => {
|
|
expect(source).toContain('onMounted(() => { void loadOptions() })')
|
|
expect(source).toContain('const selectedContainerFallback = computed')
|
|
expect(source).toContain('const selectedBookingFallback = computed')
|
|
expect(source).toContain('const selectedWarehouseFallback = computed')
|
|
expect(source).toContain('v-if="selectedContainerFallback"')
|
|
expect(source).toContain('v-if="selectedBookingFallback"')
|
|
expect(source).toContain('v-if="selectedWarehouseFallback"')
|
|
})
|
|
|
|
it('keeps booking, cabinet and loading plan optional and only uses them for completion hints', () => {
|
|
expect(source).toContain('订舱、柜次和装柜计划均为可选关联,不影响独立开立拖车预约')
|
|
expect(source).toContain('class="relation-note"')
|
|
expect(source).toContain('<slot name="relation-note-actions" />')
|
|
expect(source).toContain('justify-content:space-between')
|
|
expect(source).not.toContain('class="relation-alert">历史关联快照')
|
|
expect(source).toContain('<el-divider content-position="left">可选关联</el-divider>')
|
|
expect(source).toContain('label="关联柜次(可选)"')
|
|
expect(source).toContain('label="关联订舱(可选)"')
|
|
expect(source).toContain("relationWarning.value = '所选关联资源与当前客户不一致")
|
|
expect(source).toContain("item.status === 'RELEASED'")
|
|
expect(source).toContain('已从放舱订舱回填并锁定')
|
|
expect(source).toContain(':disabled="Boolean(selectedReleasedBooking)"')
|
|
expect(source).toContain('草稿可暂不填写,派车前必填')
|
|
expect(source).not.toContain('尚未建立装柜计划')
|
|
})
|
|
|
|
it('gives editable fields clear placeholders', () => {
|
|
expect(source).toContain('placeholder="请输入司机姓名"')
|
|
expect(source).toContain('placeholder="请选择预计装箱时间"')
|
|
expect(source).toContain('placeholder="请输入目的门店地址"')
|
|
expect(source).toContain('placeholder="请输入拖车预约备注(可选)"')
|
|
})
|
|
|
|
it('labels the generated cabinet reference and physical container number separately', () => {
|
|
expect(source).toContain('柜次号:${item.cabinetNo')
|
|
expect(source).toContain('集装箱号:${item.containerNo')
|
|
})
|
|
|
|
it('keeps the form usable at 390px', () => {
|
|
expect(source).toContain('@media (max-width: 480px)')
|
|
expect(source).toContain('min-height: 40px')
|
|
})
|
|
})
|