79 lines
4.2 KiB
TypeScript
79 lines
4.2 KiB
TypeScript
import ElementPlus from 'element-plus'
|
|
import { flushPromises, mount } from '@vue/test-utils'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { listDeliveryOrders, listDeliveryReturnInboundOptions, markDeliveryReturn } from '../api/deliveryOrders'
|
|
import { updateDeliveryOrderStatus } from '../api/customerVisits'
|
|
import DeliveryOrdersView from './DeliveryOrdersView.vue'
|
|
import { commonPhase5Stubs } from './phase5TestStubs'
|
|
|
|
const canPermission = vi.hoisted(() => vi.fn((_code: string) => false))
|
|
vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: canPermission }) }))
|
|
vi.mock('vue-router', () => ({ useRouter: () => ({ push: vi.fn() }) }))
|
|
vi.mock('../api/deliveryOrders', () => ({ listDeliveryOrders: vi.fn(), listDeliveryReturnInboundOptions: vi.fn(), markDeliveryReturn: vi.fn() }))
|
|
vi.mock('../api/customerVisits', () => ({ updateDeliveryOrderStatus: vi.fn() }))
|
|
vi.mock('../api/pallets', () => ({ listReceivingOverseasWarehouses: vi.fn() }))
|
|
|
|
const row = {
|
|
id: '1', customerId: '100', deliveryNo: 'DEL/1', outboundNo: 'OUT-1', dispatchNo: 'PC-1',
|
|
status: 'WAIT_DELIVERY', palletCount: 1, packageCount: 2, createdAt: '2026-09-01T10:00:00',
|
|
}
|
|
|
|
function mountView() {
|
|
return mount(DeliveryOrdersView, { global: { plugins: [ElementPlus], stubs: commonPhase5Stubs } })
|
|
}
|
|
|
|
describe('DeliveryOrdersView permissions and commands', () => {
|
|
beforeEach(() => {
|
|
canPermission.mockReset().mockReturnValue(false)
|
|
vi.mocked(listDeliveryOrders).mockReset().mockResolvedValue({ records: [row], page: 1, size: 10, total: 1, pages: 1 })
|
|
vi.mocked(listDeliveryReturnInboundOptions).mockReset().mockResolvedValue([{ inboundOrderId: '9', inboundCode: 'IN-1', lastMileOrderNo: 'LM-1', customerId: '100' }])
|
|
vi.mocked(markDeliveryReturn).mockReset().mockResolvedValue({ id: '19', exceptionNo: 'EXC-1', status: 'PENDING' })
|
|
vi.mocked(updateDeliveryOrderStatus).mockReset().mockResolvedValue({ deliveryNo: 'DEL/1', deliveryStatus: 'WAIT_DELIVERY', replayed: false })
|
|
})
|
|
|
|
it('keeps detail read-only while hiding independent write operations', async () => {
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
const tableText = wrapper.find('[data-testid="data-table"]').text()
|
|
expect(tableText).toContain('详情')
|
|
expect(tableText).not.toContain('编辑状态')
|
|
expect(tableText).not.toContain('标记退货')
|
|
wrapper.unmount()
|
|
})
|
|
|
|
it('submits status and return commands with the row customer scope', async () => {
|
|
canPermission.mockImplementation(code => code.endsWith(':status') || code.endsWith(':return'))
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
|
|
await wrapper.findAll('button').find(button => button.text().includes('编辑状态'))!.trigger('click')
|
|
await wrapper.find('[data-dialog="编辑派送状态"] .dialog-confirm').trigger('click')
|
|
await flushPromises()
|
|
expect(updateDeliveryOrderStatus).toHaveBeenCalledWith('DEL/1', '100', { status: 'WAIT_DELIVERY', remark: undefined })
|
|
|
|
await wrapper.findAll('button').find(button => button.text().includes('标记退货'))!.trigger('click')
|
|
await flushPromises()
|
|
expect(listDeliveryReturnInboundOptions).toHaveBeenCalledWith('DEL/1', '100')
|
|
await wrapper.find('[data-dialog="标记退货"] textarea').setValue(' 客户拒收 ')
|
|
await wrapper.find('[data-dialog="标记退货"] .dialog-confirm').trigger('click')
|
|
await flushPromises()
|
|
expect(markDeliveryReturn).toHaveBeenCalledWith('DEL/1', '100', {
|
|
inboundOrderId: '9', reason: '客户拒收', returnDirection: 'OVERSEAS_WAREHOUSE',
|
|
returnLogisticsNo: undefined, packageCount: undefined, skuCode: undefined,
|
|
})
|
|
wrapper.unmount()
|
|
})
|
|
|
|
it('does not submit an incomplete return form', async () => {
|
|
canPermission.mockImplementation(code => code.endsWith(':return'))
|
|
vi.mocked(listDeliveryReturnInboundOptions).mockResolvedValue([])
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
await wrapper.findAll('button').find(button => button.text().includes('标记退货'))!.trigger('click')
|
|
await flushPromises()
|
|
await wrapper.find('[data-dialog="标记退货"] .dialog-confirm').trigger('click')
|
|
expect(markDeliveryReturn).not.toHaveBeenCalled()
|
|
wrapper.unmount()
|
|
})
|
|
})
|