62 lines
3.4 KiB
JavaScript
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)
|
|
})
|