72 lines
3.8 KiB
TypeScript
72 lines
3.8 KiB
TypeScript
import { computed } from 'vue'
|
|
import { flushPromises, mount, type VueWrapper } from '@vue/test-utils'
|
|
import ElementPlus from 'element-plus'
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import DataTable from '@/shared/components/DataTable.vue'
|
|
import { UI_PREFERENCE_SCOPE, preferenceStorageKey } from '@/shared/utils/uiLayoutPreference'
|
|
import { listMojiaSkuSync } from '../api/mojiaSkuSync'
|
|
import MojiaSkuSyncView from './MojiaSkuSyncView.vue'
|
|
|
|
vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) }))
|
|
vi.mock('../api/mojiaSkuSync', () => ({
|
|
getMojiaSkuSyncConfig: vi.fn().mockResolvedValue({ autoSyncEnabled: false }),
|
|
listMojiaSkuSync: vi.fn(), retryMojiaSkuSync: vi.fn(), updateMojiaSkuSync: vi.fn(),
|
|
submitLingxingVerificationCode: vi.fn(), testLingxingConnection: vi.fn(),
|
|
}))
|
|
let wrapper: VueWrapper | undefined
|
|
async function mountView() {
|
|
wrapper = mount(MojiaSkuSyncView, {
|
|
attachTo: document.body,
|
|
global: { plugins: [ElementPlus], provide: { [UI_PREFERENCE_SCOPE as symbol]: computed(() => 'mojia-test') } },
|
|
})
|
|
await flushPromises()
|
|
return wrapper
|
|
}
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
localStorage.clear()
|
|
vi.mocked(listMojiaSkuSync).mockResolvedValue({
|
|
records: [{ id: 'record-1', measurementKind: 'SKU', boxCode: '', skuCode: 'SKU-TEST', lengthCm: 20, widthCm: 10, heightCm: 10, weightKg: 1, revision: 1 }],
|
|
page: 1, size: 20, total: 70, pages: 4,
|
|
})
|
|
})
|
|
afterEach(() => { wrapper?.unmount(); wrapper = undefined; document.body.innerHTML = '' })
|
|
|
|
describe('MojiaSkuSyncView shared pagination', () => {
|
|
it('preserves server paging and resets to page one when querying or changing page size', async () => {
|
|
const view = await mountView()
|
|
expect(view.get('h1').text()).toBe('称重机器')
|
|
expect(view.getComponent(DataTable).props('pageSizes')).toEqual([10, 20, 30, 40, 50, 100])
|
|
view.getComponent(DataTable).vm.$emit('update:page', 2)
|
|
await flushPromises()
|
|
expect(listMojiaSkuSync).toHaveBeenLastCalledWith(expect.objectContaining({ page: 2, size: 20 }))
|
|
await view.get('input[placeholder="搜索箱码或 SKU"]').setValue('SKU-QUERY')
|
|
await view.get('.sync-filters .el-button--primary').trigger('click')
|
|
await flushPromises()
|
|
expect(listMojiaSkuSync).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1, code: 'SKU-QUERY' }))
|
|
view.getComponent(DataTable).vm.$emit('update:page', 2)
|
|
await flushPromises()
|
|
vi.mocked(listMojiaSkuSync).mockClear()
|
|
view.getComponent(DataTable).vm.$emit('update:pageSize', 50)
|
|
await flushPromises()
|
|
expect(listMojiaSkuSync).toHaveBeenCalledTimes(1)
|
|
expect(listMojiaSkuSync).toHaveBeenLastCalledWith(expect.objectContaining({ page: 1, size: 50, code: 'SKU-QUERY' }))
|
|
})
|
|
|
|
it('restores resized columns after remount while preserving query buttons and operation permissions', async () => {
|
|
const view = await mountView()
|
|
expect(view.find('button[aria-label="列设置"]').exists()).toBe(true)
|
|
expect(view.get('.sync-filters .el-button--primary').classes()).not.toContain('density-action')
|
|
expect(view.getComponent(DataTable).props('columns')[0]).toMatchObject({ key: 'actions', fixed: 'left' })
|
|
view.getComponent({ name: 'ElTable' }).vm.$emit('header-dragend', 260, 180, { columnKey: 'sourceCode' })
|
|
await flushPromises()
|
|
expect(JSON.parse(localStorage.getItem(preferenceStorageKey('table', 'mojia-test', 'mojia-sku-sync-table'))!).widths.sourceCode).toBe(260)
|
|
view.unmount()
|
|
wrapper = undefined
|
|
const restored = await mountView()
|
|
const column = restored.findAllComponents({ name: 'ElTableColumn' }).find(item => item.props('columnKey') === 'sourceCode')!
|
|
expect(column.props('width')).toBe(260)
|
|
expect(restored.get('.el-table__body .admin-text-actions').findAll('button').map(button => button.text())).toEqual(['编辑', '人工推送'])
|
|
})
|
|
})
|