63 lines
2.0 KiB
TypeScript
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, [])
|
|
})
|