134 lines
5.8 KiB
TypeScript
134 lines
5.8 KiB
TypeScript
import { flushPromises, shallowMount } from '@vue/test-utils'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { listPlatformUnifiedOrders } from '@/modules/unified-orders/api/unifiedOrders'
|
|
import UnifiedOrdersView from './UnifiedOrdersView.vue'
|
|
|
|
vi.mock('vue-router', () => ({
|
|
useRoute: () => ({ params: {}, query: {} }),
|
|
useRouter: () => ({ push: vi.fn() }),
|
|
}))
|
|
vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) }))
|
|
vi.mock('@/modules/iam', () => ({ listPlatformTenants: vi.fn().mockResolvedValue({ records: [], page: 1, size: 200, total: 0, pages: 0 }) }))
|
|
vi.mock('@/modules/warehouses', () => ({ listAllPlatformWarehouses: vi.fn().mockResolvedValue([]) }))
|
|
vi.mock('@/modules/inbounds', () => ({ downloadWeightImage: vi.fn(), getInboundMeasurement: vi.fn() }))
|
|
vi.mock('@/modules/unified-orders/workflows', () => ({ UnifiedOrderWorkflowPanel: { template: '<div />' } }))
|
|
vi.mock('@/modules/unified-orders/api/unifiedOrders', () => ({
|
|
addPlatformUnifiedOrderNote: vi.fn(),
|
|
approvePlatformUnifiedOrder: vi.fn(),
|
|
getPlatformUnifiedOrder: vi.fn(),
|
|
listPlatformUnifiedOrderFeeDetails: vi.fn(),
|
|
listPlatformUnifiedOrders: vi.fn(),
|
|
unifiedOrderStatusOptions: [
|
|
{ value: 'PENDING_REVIEW', label: '待审核' },
|
|
{ value: 'WAIT_MEASURE', label: '待测量数据' },
|
|
{ value: 'WAIT_SPLIT', label: '待分柜' },
|
|
{ value: 'LOADING', label: '装柜中' },
|
|
{ value: 'LOADED', label: '装柜完成' },
|
|
{ value: 'DELIVERED', label: '派送完成' },
|
|
],
|
|
}))
|
|
|
|
function emptyPage() {
|
|
return { records: [], page: 1, size: 20, total: 0, pages: 0 }
|
|
}
|
|
|
|
function mountView() {
|
|
return shallowMount(UnifiedOrdersView, {
|
|
global: {
|
|
directives: { loading: () => undefined },
|
|
stubs: {
|
|
AdminPage: { template: '<main><slot /></main>' },
|
|
ListPageLayout: { template: '<section><slot name="toolbar" /><slot name="state" /><slot /></section>' },
|
|
QueryToolbar: { name: 'QueryToolbar', props: ['modelValue'], emits: ['update:modelValue', 'search', 'reset'], template: '<div data-testid="query-toolbar" />' },
|
|
DataTable: { name: 'DataTable', props: ['page', 'pageSize'], emits: ['update:page', 'update:pageSize'], template: '<div data-testid="data-table" />' },
|
|
'el-button': { template: '<button><slot /></button>' },
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
describe('UnifiedOrdersView list request coordination', () => {
|
|
beforeEach(() => {
|
|
vi.mocked(listPlatformUnifiedOrders).mockReset().mockResolvedValue(emptyPage())
|
|
})
|
|
|
|
it('loads once initially and once for query, reset, status tab and pagination', async () => {
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(1)
|
|
|
|
const toolbar = wrapper.getComponent({ name: 'QueryToolbar' })
|
|
toolbar.vm.$emit('search')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(2)
|
|
|
|
toolbar.vm.$emit('reset')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(3)
|
|
|
|
await wrapper.findAll('.status-tab')[1]!.trigger('click')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(4)
|
|
|
|
wrapper.getComponent({ name: 'DataTable' }).vm.$emit('update:page', 2)
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(5)
|
|
})
|
|
|
|
it('does not apply draft filters to pagination until query is submitted', async () => {
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
const toolbar = wrapper.getComponent({ name: 'QueryToolbar' })
|
|
const draft = { ...toolbar.props('modelValue'), inboundCode: ' DRAFT-CODE ' }
|
|
toolbar.vm.$emit('update:modelValue', draft)
|
|
await wrapper.vm.$nextTick()
|
|
|
|
wrapper.getComponent({ name: 'DataTable' }).vm.$emit('update:page', 2)
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenLastCalledWith(expect.objectContaining({ page: 2, inboundCode: undefined }))
|
|
|
|
toolbar.vm.$emit('search')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(3)
|
|
expect(listPlatformUnifiedOrders).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1, inboundCode: 'DRAFT-CODE' }))
|
|
})
|
|
|
|
it('resets a later page and changes page size with one request per interaction', async () => {
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
const table = wrapper.getComponent({ name: 'DataTable' })
|
|
const toolbar = wrapper.getComponent({ name: 'QueryToolbar' })
|
|
|
|
table.vm.$emit('update:page', 3)
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(2)
|
|
|
|
toolbar.vm.$emit('reset')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(3)
|
|
expect(listPlatformUnifiedOrders).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1 }))
|
|
|
|
table.vm.$emit('update:pageSize', 50)
|
|
table.vm.$emit('update:page', 1)
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenCalledTimes(4)
|
|
expect(listPlatformUnifiedOrders).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1, size: 50 }))
|
|
})
|
|
|
|
it('does not turn a cleared full-container filter into false', async () => {
|
|
const wrapper = mountView()
|
|
await flushPromises()
|
|
const toolbar = wrapper.getComponent({ name: 'QueryToolbar' })
|
|
const selected = { ...toolbar.props('modelValue'), fullContainer: 'true' }
|
|
toolbar.vm.$emit('update:modelValue', selected)
|
|
toolbar.vm.$emit('search')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenLastCalledWith(expect.objectContaining({ fullContainer: true }))
|
|
|
|
toolbar.vm.$emit('update:modelValue', { ...selected, fullContainer: undefined })
|
|
toolbar.vm.$emit('search')
|
|
await flushPromises()
|
|
expect(listPlatformUnifiedOrders).toHaveBeenLastCalledWith(expect.objectContaining({ fullContainer: undefined }))
|
|
})
|
|
})
|