50 lines
4.5 KiB
TypeScript
50 lines
4.5 KiB
TypeScript
import { mount, flushPromises } from '@vue/test-utils'
|
|
import ElementPlus from 'element-plus'
|
|
import { beforeEach, expect, it, vi } from 'vitest'
|
|
import TransportExecutionPanel from './TransportExecutionPanel.vue'
|
|
import { commandTransport, getTransport, uploadTransport, type TransportDetail } from '../api/transportTasks'
|
|
|
|
vi.mock('vue-router', () => ({ onBeforeRouteLeave: vi.fn() }))
|
|
vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) }))
|
|
vi.mock('@/modules/overseas-master-data', () => ({ listVehicles: vi.fn(), listDrivers: vi.fn(), pickupStatusLabels: { ASSIGNED: '待取货', PICKED: '已取货', ARRIVED: '已到仓' } }))
|
|
vi.mock('../api/transportTasks', () => ({ getTransport: vi.fn(), assignTransport: vi.fn(), transportOccupancy: vi.fn(), cancelTransport: vi.fn(), releaseTransport: vi.fn(), commandTransport: vi.fn(), uploadTransport: vi.fn(), downloadTransportEvidence: vi.fn(), transportLabels: { PICKUP: '到仓取货', LOCAL_TRUCK: '本土卡车' } }))
|
|
const facts = (arriving = false): TransportDetail => ({ dispatchNo: 'PC1', taskType: 'PICKUP', execution: { trip: { status: arriving ? 'IN_TRANSIT' : 'PLANNED', recordVersion: 4, warehouseName: '洛杉矶仓', vehicleId: '1', vehiclePlate: 'CA-1', driverId: '2', driverName: '司机甲', driverPhone: '555' } }, pickups: [{ customerId: 'C1', transferNo: 'WT1', packageCount: 5, actualPackages: arriving ? 5 : null, status: arriving ? 'PICKED' : 'ASSIGNED', evidence: [] }], completionEvidence: [] }) as unknown as TransportDetail
|
|
const options = { global: { plugins: [ElementPlus] } }
|
|
beforeEach(() => {
|
|
vi.clearAllMocks(); vi.stubGlobal('ResizeObserver', class { observe() {} unobserve() {} disconnect() {} })
|
|
vi.mocked(getTransport).mockResolvedValue(facts())
|
|
vi.mocked(uploadTransport).mockResolvedValue({ fileId: '88', fileName: '现场.jpg', contentType: 'image/jpeg', sizeBytes: 10 })
|
|
})
|
|
it.each([false, true])('confirms the %s photo stage with its own evidence and current transport version', async arriving => {
|
|
vi.mocked(getTransport).mockResolvedValue(facts(arriving))
|
|
const wrapper = mount(TransportExecutionPanel, { ...options, props: { dispatchNo: 'PC1', pickupApproved: true } }); await flushPromises()
|
|
expect(wrapper.text()).toContain(arriving ? '派送中' : '装货中')
|
|
expect(wrapper.findAll('button').some(button => button.text() === '确认发车')).toBe(false)
|
|
await wrapper.findAll('button').find(button => button.text() === (arriving ? '上传到仓照片' : '上传取货照片'))!.trigger('click'); await flushPromises()
|
|
const input = wrapper.get('input[type="file"]')
|
|
Object.defineProperty(input.element, 'files', { value: [new File(['photo'], '现场.jpg', { type: 'image/jpeg' })], configurable: true })
|
|
await input.trigger('change'); await flushPromises()
|
|
await wrapper.findAll('button').find(button => button.text() === (arriving ? '确认到仓' : '确认取货'))!.trigger('click'); await flushPromises()
|
|
expect(commandTransport).toHaveBeenCalledWith('PC1', `pickup/C1/WT1/${arriving ? 'arrive' : 'picked'}`, expect.objectContaining({ recordVersion: 4, evidenceFileIds: ['88'], ...(arriving ? { reason: '上传到仓照片,确认取货派送完成' } : { actualPackages: 5 }) }))
|
|
expect(wrapper.emitted('saved')).toHaveLength(1); wrapper.unmount()
|
|
})
|
|
it('keeps photo confirmation unavailable until both reviews are approved', async () => {
|
|
const wrapper = mount(TransportExecutionPanel, { ...options, props: { dispatchNo: 'PC1', pickupApproved: false } }); await flushPromises()
|
|
expect(wrapper.findAll('button').some(button => button.text() === '上传取货照片')).toBe(false)
|
|
expect(commandTransport).not.toHaveBeenCalled(); wrapper.unmount()
|
|
})
|
|
it.each([false, true])('renders read-only transport facts without resource editing or execution controls (%s)', async arriving => {
|
|
const value = facts(arriving)
|
|
value.execution.trip.vehicleId = null
|
|
value.execution.trip.driverId = null
|
|
vi.mocked(getTransport).mockResolvedValue(value)
|
|
const wrapper = mount(TransportExecutionPanel, { ...options, props: { dispatchNo: 'PC1', pickupApproved: true, readonly: true } }); await flushPromises()
|
|
expect(wrapper.text()).toContain('WT1')
|
|
expect(wrapper.text()).toContain('洛杉矶仓')
|
|
expect(wrapper.findAll('input, select, textarea')).toHaveLength(0)
|
|
expect(wrapper.findAll('button')).toHaveLength(0)
|
|
expect(wrapper.findAll('th').map(column => column.text())).not.toContain('操作')
|
|
expect(commandTransport).not.toHaveBeenCalled()
|
|
wrapper.unmount()
|
|
})
|