Files
shanxia2.0/web-admin/scripts/mobile-contract-picker.test.ts
T
2026-10-22 16:24:46 +08:00

63 lines
2.0 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { existsSync } from 'node:fs'
const modulePath = new URL('../src/views/m/crm/contract/mobileFormState.ts', import.meta.url)
const deferred = () => {
let resolve: any
let reject: any
const promise = new Promise((a, b) => {
resolve = a
reject = b
})
return { promise, resolve, reject }
}
async function harness() {
assert.ok(existsSync(modulePath), 'production mobile state helper exists')
const { createContractPicker } = await import(modulePath.href)
const calls: any[] = []
const picker = createContractPicker(async (query: any) => {
const request = deferred()
calls.push({ query, ...request })
return request.promise
})
return { picker, calls }
}
test('pagination errors retry the same page and preserve selected objects across searches', async () => {
const { picker: p, calls } = await harness()
const first = p.search('A')
calls[0].resolve({ data: { list: [{ id: 'A' }], total: 3 } })
await first
p.toggle({ id: 'A' })
const more = p.more()
calls[1].reject(new Error('offline'))
await more
const retry = p.more()
assert.equal(calls[2].query.page, 2)
calls[2].resolve({ rows: [{ id: 'B' }], total: 3 })
await retry
const search = p.search('C')
calls[3].resolve({ rows: [{ id: 'C' }], total: 1 })
await search
p.toggle({ id: 'C' })
assert.deepEqual(
p.selected.value.map((x: any) => x.id),
['A', 'C']
)
assert.equal(p.rows.value[0].id, 'C')
})
test('invalidating a search or closing prevents stale success and finally writes', async () => {
const { picker: p, calls } = await harness()
const first = p.search('A')
p.invalidate()
const second = p.search('B')
calls[0].resolve({ rows: [{ id: 'old' }] })
await first
assert.equal(p.loading.value, true)
assert.deepEqual(p.rows.value, [])
calls[1].resolve({ rows: [{ id: 'new' }] })
await second
assert.equal(p.rows.value[0].id, 'new')
p.close()
assert.deepEqual(p.selected.value, [])
})