Files
client-web/src/modules/first-leg/views/FirstLegWorkbenchPagination.test.mjs
T

62 lines
3.4 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { ref } from 'vue'
import ts from 'typescript'
const source = readFileSync(new URL('./FirstLegOrdersView.vue', import.meta.url), 'utf8').match(/<script setup lang="ts">([\s\S]*?)<\/script>/)[1]
const ast = ts.createSourceFile('view.ts', source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS)
const names = ['loadOrderPage', 'changeOrderPage', 'changeOrderPageSize', 'selectOrderQueue', 'searchOrders']
const functions = ast.statements.filter(n => ts.isFunctionDeclaration(n) && names.includes(n.name?.text)).map(n => n.getText(ast)).join('\n')
const code = ts.transpileModule('let orderPageRequestVersion = 0;\n' + functions, { compilerOptions: { target: ts.ScriptTarget.ES2022 } }).outputText
function harness() {
const calls = []
const values = {
tablePage: ref(1), tablePageSize: ref(10), activeOrderQueue: ref('all'), appliedFilters: ref({}),
selectedOrders: ref(['previous']), orderTableVersion: ref(0),
store: { total: 215, loadError: '', load: async q => { calls.push(q) } },
}
const handlers = new Function(...Object.keys(values), code + ';return {' + names.join(',') + '}')(...Object.values(values))
return { ...values, ...handlers, calls }
}
test('page events request server pages; size, queue and search reset to the first page', async () => {
const h = harness()
await h.changeOrderPage(21); assert.equal(h.calls.at(-1).page, 21)
await h.changeOrderPageSize(50); assert.equal(h.calls.at(-1).page, 1); assert.equal(h.calls.at(-1).size, 50)
await h.selectOrderQueue('customs'); assert.equal(h.calls.at(-1).queue, 'customs'); assert.equal(h.tablePage.value, 1)
await h.searchOrders({ cargoKeyword: ' SKU ', status: 'DRAFT', createdRange: ['2026-10-01', '2026-10-03'] })
assert.equal(h.calls.at(-1).cargoKeyword, 'SKU'); assert.equal(h.calls.at(-1).mainStatus, 'DRAFT')
assert.equal(h.calls.at(-1).createdFrom, '2026-10-01T00:00:00')
assert.equal(h.calls.at(-1).createdTo, '2026-10-03T23:59:59.999')
assert.deepEqual(h.selectedOrders.value, [])
})
test('deletion on the last page clamps and reloads once; failed reads retain the requested page for retry', async () => {
const h = harness(); h.store.total = 200
await h.changeOrderPage(22)
assert.deepEqual(h.calls.map(q => q.page), [22, 20]); assert.equal(h.tablePage.value, 20)
h.store.total = 0; h.store.loadError = 'failed'
await h.changeOrderPage(22)
assert.equal(h.tablePage.value, 22); assert.equal(h.calls.length, 3)
})
test('old same-page response cannot clamp a newer query or clear its current selection', async () => {
const h = harness(); let release
h.store.load = () => new Promise(resolve => { release = resolve })
const first = h.loadOrderPage(); const oldRelease = release
const second = h.searchOrders({ cargoKeyword: 'new' })
h.store.total = 215; release(); await second
h.selectedOrders.value = ['new-selection']
oldRelease(); await first
assert.deepEqual(h.selectedOrders.value, ['new-selection'])
assert.equal(h.orderTableVersion.value, 1)
})
test('clicking the current category does not reload or reset its page, but an error can be retried', async () => {
const h = harness(); h.tablePage.value = 3
await h.selectOrderQueue('all')
assert.equal(h.calls.length, 0); assert.equal(h.tablePage.value, 3)
h.store.loadError = 'failed'
await h.selectOrderQueue('all')
assert.equal(h.calls.length, 1); assert.equal(h.tablePage.value, 1)
})