import { describe, expect, it } from 'vitest' import { readFileSync } from 'node:fs' import { resolve } from 'node:path' const source = readFileSync(resolve(process.cwd(), 'src/modules/loading-lists/components/LoadingListsView.vue'), 'utf8') const detailSource = readFileSync(resolve(process.cwd(), 'src/modules/loading-lists/components/LoadingListDetailDrawer.vue'), 'utf8') describe('LoadingListsView', () => { it('keeps the operation column first and fixed left in both lists', () => { const actionColumns = [...source.matchAll(/key: 'actions', label: '操作', fixed: 'left'/g)] expect(actionColumns).toHaveLength(2) expect(source.indexOf("key: 'actions'")).toBeLessThan(source.indexOf("key: 'preloadNo'")) expect(source.indexOf("key: 'actions'", source.indexOf("key: 'actions'") + 1)).toBeLessThan(source.indexOf("key: 'loadingListNo'")) }) it('queries all warehouses without exposing a warehouse selector', () => { expect(source).not.toContain('listAllPlatformWarehouses') expect(source).not.toContain("key: 'warehouseId'") expect(source).not.toContain('loadingWarehouses') expect(source).not.toContain('warehouseId: warehouseId || undefined') expect(source).toContain("selectedWarehouseId.value = String(row.warehouseId || '')") expect(source).not.toContain("ElMessage.warning('请先选择仓库')") expect(source).not.toContain("'请先选择仓库后查询'") expect(source).toContain('MISSING_WAREHOUSE_CONTEXT') }) it('uses the shared query, table, drawer, dialog and error components', () => { expect(source).toContain('QueryToolbar') expect(source).toContain('DataTable') expect(source).toContain('AppDialog') expect(source).toContain('LoadErrorState') expect(source).toContain('ApiErrorMeta') expect(detailSource).toContain('AppDrawer') }) it('only exposes transport editing for LOADING preload details', () => { expect(detailSource).toContain("mode === 'preload' && canEdit && ['EDITING', 'LOADING'].includes(summary.status)") expect(detailSource).toContain('装柜完成后清单、明细和运输信息永久只读') expect(source).toContain('expectedVersion: detail.value.summary.version') }) it('renders business labels instead of raw loading-plan status codes', () => { expect(source).toContain(':status="loadingListStatusLabel(row.status)"') expect(detailSource).toContain(':status="loadingListStatusLabel(summary.status)"') expect(detailSource).not.toContain(':status="summary.status"') expect(source).not.toContain('仅装柜中允许修改') }) it('exposes a row edit action only for loading preload plans', () => { expect(source).toContain("isPreload && canEdit && ['EDITING', 'LOADING'].includes(row.status)") expect(source).toContain('openEditFromRow(row)') expect(source).toContain('await loadDetail()') }) it('refreshes the detail version on A0409 while preserving transport input', () => { expect(source).toContain("details.code === 'A0409'") expect(source).toContain('await loadDetail()') expect(source).toContain('当前输入已保留,请核对后重新保存') }) it('opens a validated plan and warehouse deep link without mixing list modes', () => { expect(source).toContain('useRoute()') expect(source).toContain('route.query.planId') expect(source).toContain('route.query.warehouseId') expect(source).toContain("const expectedStatuses = isPreload.value ? ['EDITING', 'LOADING'] : ['COMPLETED']") expect(source).toContain('MODE_STATUS_MISMATCH') }) it('passes translated status text directly to the badge', () => { expect(source).toContain('') expect(source).not.toContain('') expect(detailSource).toContain('') }) it('does not expose unknown history action codes', () => { expect(detailSource).toContain("[action] || '状态更新'") expect(detailSource).not.toContain('[action] || action') }) it('uses safe labels when customer or operator names are missing', () => { expect(source).toContain("item.customerName || '客户信息缺失'") expect(source).not.toContain('item.customerName || item.accountId') expect(detailSource).toContain("item.customerName || '客户信息缺失'") expect(detailSource).toContain("history.operatorName || '操作人信息缺失'") expect(detailSource).not.toContain('item.customerName || item.accountId') expect(detailSource).not.toContain('history.operatorName || history.operatorId') }) })