t23-map-contract.mjs 2.2 KB

123456789101112131415161718192021222324252627
  1. import assert from 'node:assert/strict'
  2. import { createMapSummaryLoader, toStatusDistribution } from '../../../src/modules/cockpit/domain/mapSummary.js'
  3. import { fetchMapSnapshot } from '../../../src/modules/cockpit/services/mapApi.js'
  4. const keys = ['ALARM','WARNING','WORK_ORDER','NORMAL','OFFLINE','EMPTY','UNKNOWN','UNASSOCIATED']
  5. const rows = keys.map(status => ({ status, count: 0 }))
  6. assert.equal(toStatusDistribution({pointStatusDistribution:rows}).available,true)
  7. for(const list of [[],rows.slice(0,6),[...rows,rows[0]],rows.map(row=>({...row,count:-1}))]) assert.equal(toStatusDistribution({pointStatusDistribution:list}).available,false)
  8. const config={dataSource:'real',api:{baseUrl:'http://fixture.invalid'}}
  9. const token='opaque/+token:2026'
  10. let requests=0
  11. const loader=createMapSummaryLoader({pageSize:2,fetchPage:async query=>{
  12. const result=await fetchMapSnapshot({...query,config,pointStatus:['ALARM','WARNING','BOGUS'],fetchImpl:async url=>{
  13. const params=new URL(url).searchParams; requests++
  14. assert.equal(params.get('snapshotAt'),query.page===1?null:token)
  15. assert.equal(params.get('pointStatus'),'ALARM,WARNING')
  16. return {ok:true,status:200,json:async()=>({code:200,data:{page:query.page,pageSize:2,total:2,snapshotAt:token,complete:query.page===2,monitoringPoints:[{pointCode:`p${query.page}`,longitude:110,latitude:28}],unassociatedEquipment:[],pointStatusDistribution:rows}})}
  17. }})
  18. return {ok:result.state==='success',data:result.data}
  19. }})
  20. await loader.refresh(); assert.equal((await loader.loadNext()).phase,'complete');assert.equal(requests,2)
  21. let calls=0
  22. const missing=createMapSummaryLoader({fetchPage:async()=>{calls++;return {ok:true,data:{objects:[{code:'p'}],complete:false}}}})
  23. await missing.refresh(); const stopped=await missing.loadNext()
  24. assert.equal(calls,1);assert.equal(stopped.phase,'failed');assert.equal(stopped.objects.length,1)
  25. const expired=createMapSummaryLoader({fetchPage:async query=>query.page===1?{ok:true,data:{snapshotAt:token,complete:false,objects:[{code:'old'}]}}:{ok:false,reason:'snapshot-expired'}})
  26. await expired.refresh();assert.equal((await expired.loadNext()).objects.length,1)
  27. console.log('T23 token transport, eight-bucket completeness, invalid status exclusion, missing-token stop and expiry retention passed')