test(customs): verify page navigation and refresh recovery

This commit is contained in:
2026-10-03 12:15:04 +08:00
parent 8e5fa0bebc
commit 1fe2cada15
@@ -41,7 +41,7 @@ function harness(t, orders, getDetail = async id => detail(id)) {
})
const source = readFileSync(new URL('./CustomsDocumentsView.vue', import.meta.url), 'utf8').match(/<script setup lang="ts">([\s\S]*?)<\/script>/)[1]
const scope = vue.effectScope()
const view = scope.run(() => evaluate(source + '\nexport { load, records, loading, errorMessage, openDetail, selectedOrderId, selectedDetail, dialogOpen, search, queryModel, filteredRecords, queryFields, statusLabel, statusType, updateDetail }', {
const view = scope.run(() => evaluate(source + '\nexport { load, records, loading, errorMessage, openDetail, selectedOrderId, selectedDetail, dialogOpen, search, queryModel, filteredRecords, pagedRecords, page, pageSize, queryFields, statusLabel, statusType, updateDetail }', {
vue: { ...vue, onMounted() {} },
'../utils/customsDocumentsReader': reader,
'../api/customs': customsApi,
@@ -80,6 +80,64 @@ test('second page failure is explicit and retry does not retain an incomplete re
assert.equal(pageCalls.length, 4)
})
test('display pagination reaches the final refund order without refetching or opening the wrong detail', async t => {
const { view, calls, pageCalls } = harness(t, Array.from({ length: 21 }, (_, i) => order(`refund-${i}`, 'COMPLETED')))
await view.load()
assert.equal(view.pagedRecords.value.length, 20)
view.page.value = 2
assert.deepEqual(view.pagedRecords.value.map(row => row.order.id), ['refund-20'])
view.openDetail(view.pagedRecords.value[0])
assert.equal(view.selectedOrderId.value, 'refund-20')
assert.deepEqual(view.selectedDetail.value.inbounds, [{ orderId: 'refund-20', taxMode: 'TAX_REFUND' }])
view.pageSize.value = 10
await vue.nextTick()
assert.equal(view.page.value, 1)
assert.equal(view.pagedRecords.value.length, 10)
view.page.value = 3
assert.deepEqual(view.pagedRecords.value.map(row => row.order.id), ['refund-20'])
assert.equal(pageCalls.length, 1)
assert.equal(calls.length, 21)
})
test('searching from a later display page resets pagination and clearing filters restores all documents', async t => {
const { view, calls } = harness(t, Array.from({ length: 21 }, (_, i) => order(`refund-${i}`)))
await view.load()
view.page.value = 2
view.queryModel.value.inboundCode = 'IN-refund-20'
view.search()
await vue.nextTick()
assert.equal(view.page.value, 1)
assert.deepEqual(view.pagedRecords.value.map(row => row.order.id), ['refund-20'])
view.queryModel.value.inboundCode = 'does-not-exist'
view.search()
await vue.nextTick()
assert.equal(view.page.value, 1)
assert.equal(view.pagedRecords.value.length, 0)
view.queryModel.value.inboundCode = ''
view.search()
assert.equal(view.filteredRecords.value.length, 21)
assert.equal(view.pagedRecords.value.length, 20)
assert.equal(calls.length, 21)
})
test('refresh failure on a later page clears stale rows and retry returns to a valid page', async t => {
const { view, store } = harness(t, Array.from({ length: 21 }, (_, i) => order(`refund-${i}`)))
await view.load()
view.page.value = 2
store.loadError = '资料列表请求失败'
await view.load()
await vue.nextTick()
assert.equal(view.page.value, 1)
assert.equal(view.pagedRecords.value.length, 0)
assert.equal(view.errorMessage.value, '资料列表请求失败')
store.loadError = ''
await view.load()
assert.equal(view.page.value, 1)
assert.equal(view.pagedRecords.value.length, 20)
assert.equal(view.filteredRecords.value.length, 21)
assert.equal(view.errorMessage.value, '')
})
test('empty pages, duplicate records and changing totals cannot silently truncate history', async t => {
for (const change of [
response => response.page === 2 ? { ...response, records: [] } : response,