t32-diameter-live.mjs 2.2 KB

1234567891011121314151617181920212223242526272829303132
  1. import assert from 'node:assert/strict'
  2. import { writeFile } from 'node:fs/promises'
  3. import { toPipeNetwork } from '../../../src/modules/cockpit/domain/pipeNetwork.js'
  4. import { planPipeModels } from '../../../src/modules/cockpit/domain/pipeModels.js'
  5. const endpoint='http://192.168.110.96:8301/api/cockpit/v1/infrastructure/geometry'
  6. const response=await fetch(endpoint)
  7. assert.equal(response.status,200)
  8. const envelope=await response.json()
  9. assert.equal(envelope.code,200)
  10. const payload=envelope.data
  11. const rawLines=payload.features.filter(row=>row.geometry?.type==='LineString')
  12. assert.ok(rawLines.every(row=>Object.hasOwn(row.properties,'diameter')),'deployed backend diameter field missing')
  13. const network=toPipeNetwork(payload)
  14. const original=JSON.stringify(network.pipes)
  15. const plan=planPipeModels(network)
  16. assert.equal(JSON.stringify(network.pipes),original,'raw diameters/coordinates must remain unchanged')
  17. const byId=new Map(plan.instances.filter(row=>row.kind==='spline').map(row=>[row.id,row]))
  18. const interpolated=[...byId.values()].filter(row=>row.diameterSource==='interpolated')
  19. for(const row of interpolated){
  20. assert.equal(row.diameterAnchors.length,2)
  21. assert.notEqual(row.diameterAnchors[0].code,row.diameterAnchors[1].code)
  22. const values=row.diameterAnchors.map(anchor=>anchor.diameterMm/1000)
  23. assert.ok(row.diameterM>=Math.min(...values)&&row.diameterM<=Math.max(...values))
  24. }
  25. assert.equal(plan.diameterSummary.reported+plan.diameterSummary.interpolated+plan.diameterSummary.missing,network.pipes.length)
  26. const result={checkedAt:new Date().toISOString(),endpoint,httpStatus:response.status,businessCode:envelope.code,
  27. rawLines:rawLines.length,diameterFieldCount:rawLines.filter(row=>Object.hasOwn(row.properties,'diameter')).length,
  28. diameterSummary:plan.diameterSummary,components:network.components.length,blocked:network.blocked.length,
  29. inferredExample:interpolated.slice(0,8).map(row=>({code:row.id.slice(5),diameterMm:row.diameterM*1000,source:row.diameterSource,anchors:row.diameterAnchors})),
  30. rawDataUnchanged:true,browserVerified:false,renderingPerformanceVerified:false}
  31. await writeFile(new URL('./artifacts/t32/diameter-live-result.json',import.meta.url),JSON.stringify(result,null,2)+'\n')
  32. console.log(JSON.stringify(result,null,2))