mobile-contract-picker.test.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import assert from 'node:assert/strict'
  2. import test from 'node:test'
  3. import { existsSync } from 'node:fs'
  4. const modulePath = new URL('../src/views/m/crm/contract/mobileFormState.ts', import.meta.url)
  5. const deferred = () => {
  6. let resolve: any
  7. let reject: any
  8. const promise = new Promise((a, b) => {
  9. resolve = a
  10. reject = b
  11. })
  12. return { promise, resolve, reject }
  13. }
  14. async function harness() {
  15. assert.ok(existsSync(modulePath), 'production mobile state helper exists')
  16. const { createContractPicker } = await import(modulePath.href)
  17. const calls: any[] = []
  18. const picker = createContractPicker(async (query: any) => {
  19. const request = deferred()
  20. calls.push({ query, ...request })
  21. return request.promise
  22. })
  23. return { picker, calls }
  24. }
  25. test('pagination errors retry the same page and preserve selected objects across searches', async () => {
  26. const { picker: p, calls } = await harness()
  27. const first = p.search('A')
  28. calls[0].resolve({ data: { list: [{ id: 'A' }], total: 3 } })
  29. await first
  30. p.toggle({ id: 'A' })
  31. const more = p.more()
  32. calls[1].reject(new Error('offline'))
  33. await more
  34. const retry = p.more()
  35. assert.equal(calls[2].query.page, 2)
  36. calls[2].resolve({ rows: [{ id: 'B' }], total: 3 })
  37. await retry
  38. const search = p.search('C')
  39. calls[3].resolve({ rows: [{ id: 'C' }], total: 1 })
  40. await search
  41. p.toggle({ id: 'C' })
  42. assert.deepEqual(
  43. p.selected.value.map((x: any) => x.id),
  44. ['A', 'C']
  45. )
  46. assert.equal(p.rows.value[0].id, 'C')
  47. })
  48. test('invalidating a search or closing prevents stale success and finally writes', async () => {
  49. const { picker: p, calls } = await harness()
  50. const first = p.search('A')
  51. p.invalidate()
  52. const second = p.search('B')
  53. calls[0].resolve({ rows: [{ id: 'old' }] })
  54. await first
  55. assert.equal(p.loading.value, true)
  56. assert.deepEqual(p.rows.value, [])
  57. calls[1].resolve({ rows: [{ id: 'new' }] })
  58. await second
  59. assert.equal(p.rows.value[0].id, 'new')
  60. p.close()
  61. assert.deepEqual(p.selected.value, [])
  62. })