Files
admin-web/src/modules/inbounds/components/InboundWorkflowWorkspace.test.ts
T
2026-08-18 11:41:14 +08:00

103 lines
5.4 KiB
TypeScript

import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import { describe, expect, it } from 'vitest'
const source = readFileSync(resolve(process.cwd(), 'src/modules/inbounds/components/InboundWorkflowWorkspace.vue'), 'utf8')
const measurementDialogSource = readFileSync(resolve(process.cwd(), 'src/modules/inbounds/measurement/InboundMeasurementDialog.vue'), 'utf8')
describe('InboundWorkflowWorkspace', () => {
it('assembles every phase-two inbound domain behind one server-backed workspace', () => {
expect(source).toContain('InboundSummaryPanel')
expect(source).toContain('InboundHistoryPanel')
expect(source).toContain('InboundMeasurementDialog')
expect(source).toContain('MeasurementReviewPanel')
expect(source).toContain('InboundFeePanel')
expect(source).toContain('getPlatformInbound')
expect(source).toContain('StatusBadge')
expect(source).toContain('label="基本信息"')
expect(source).toContain('label="货品与测量"')
expect(source).toContain('label="测量审核"')
expect(source).toContain('label="费用信息"')
expect(source).toContain('label="状态历史"')
expect(source).toContain('label="其他记录"')
})
it('opens measurement editing and review in prototype-sized centered dialogs', () => {
expect(source).toContain('<InboundMeasurementDialog')
expect(source).toContain('width="min(1240px, calc(100vw - 32px))"')
expect(source).toContain(':title="`测量审核 · ${title}`"')
expect(source).toContain('width="min(1240px, calc(100vw - 32px))"')
expect(source).toContain('height: 92vh')
expect(source).toContain('max-height: 92vh')
expect(source).toContain('.el-dialog__body) { min-height: 0; flex: 1 1 auto; overflow-y: auto;')
expect(source).toContain('@media (max-width: 720px)')
expect(source).toContain('@media (max-width: 360px)')
})
it('keeps domain writes inside their existing panels and mounts them only in dialog bodies', () => {
expect(source).toContain('@click="measurementDialogOpen = true"')
expect(source).toContain('@click="reviewDialogOpen = true"')
expect(source).toContain(':key="`review-dialog-${revision}`"')
expect(source).toContain(':customer-name="detail?.summary.customerName || detail?.summary.companyName"')
expect(source).toContain(':channel-name="detail?.summary.channelName"')
expect(source).toContain('@changed="handleReviewChanged"')
expect(source).not.toContain('<template #footer>')
expect(source).toContain('@updated="handleDomainChanged"')
expect(source).toContain('@submitted="handleDomainChanged"')
expect(source).not.toContain('reviewPanelRef')
expect(source).not.toContain('inbound-operation-dialog__footer')
expect(source).not.toContain('approveMeasurement')
expect(source).not.toContain('submitInboundMeasurement')
})
it('uses the established first-leg detail density without nested framed surfaces', () => {
expect(source).toContain('padding: 18px 24px 16px')
expect(source).toContain('border-bottom: 1px solid var(--cc-border)')
expect(source).not.toContain('border-radius: 10px')
expect(source).not.toContain('<el-tag')
})
it('refreshes the aggregate and remounts domains after manual or child refresh', () => {
expect(source).toContain('function handleDomainChanged()')
expect(source).toContain('async function refreshWorkspace()')
expect(source).toContain('revision.value += 1')
expect(source).toContain('void refreshWorkspace()')
expect(source).toContain('@click="refreshWorkspace"')
expect(source).toContain('@changed="handleDomainChanged"')
})
it('uses customer context in the page layer and maps it to compatible domain APIs', () => {
expect(source).toContain('customerId: string')
expect(source).toContain('getPlatformInbound(props.customerId, props.inboundId)')
expect(source).toContain(':customer-id="customerId"')
expect(source).toContain('缺少所属企业信息')
expect(source).not.toContain('请选择企业')
expect(source).not.toContain('租户')
})
it('does not mount the review domain without its required measurement data permission', () => {
expect(source).toContain("access.can('platform:firstleg:inbound:measure:view')")
expect(source).toContain('v-if="canViewMeasurement"')
expect(source).toContain('无测量审核查看权限')
})
it('keeps pallet and location results read-only in the overview', () => {
expect(source).toContain(':pallet-locations="detail.palletLocations"')
expect(source).toContain(':sections="[\'history\']"')
expect(source).toContain(':sections="[\'allocations\', \'files\', \'notes\', \'remark\']"')
expect(source).not.toContain('reserveLocation')
expect(source).not.toContain('allocatePallet')
})
it('uses semantic outlined or solid buttons for workflow launches and decisions', () => {
expect(source).toContain('<el-button v-if="canViewMeasurement" type="primary" @click="measurementDialogOpen = true">')
expect(source).toContain('<el-button type="primary" @click="reviewDialogOpen = true">')
expect(measurementDialogSource).toContain('type="primary"')
expect(measurementDialogSource).toContain('plain')
expect(source).not.toContain('异常放行')
expect(source).toContain('<Pencil :size="16" />编辑测量数据')
expect(source).toContain('<ClipboardCheck :size="16" />审核测量数据')
expect(source).toContain('@media (max-width: 360px)')
})
})