t47-main-scene.mjs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import assert from 'node:assert/strict'
  2. import { registerCockpitMocks } from '../../../src/modules/cockpit/mocks/contractMocks.js'
  3. import { registerMockTransport, getMockTransportPaths, resetMockTransportsForTest } from '../../../src/modules/cockpit/services/cockpitApi.js'
  4. import { fetchMapSnapshot } from '../../../src/modules/cockpit/services/mapApi.js'
  5. import { fetchMonitoringPointDetail } from '../../../src/modules/cockpit/services/detailApi.js'
  6. import { groupOverlappingDevices } from '../../../src/modules/cockpit/domain/overlapDevices.js'
  7. import { planDeviceEffects } from '../../../src/modules/cockpit/domain/deviceEffects.js'
  8. import { resolveDetailAnchor } from '../../../src/modules/cockpit/domain/detailAnchor.js'
  9. const config = { dataSource: 'mock', api: { baseUrl: '', token: '' } }
  10. registerCockpitMocks({ scenario: 'success', handlers: { registerMockTransport, getMockTransportPaths, resetMockTransportsForTest } })
  11. const snapshot = await fetchMapSnapshot({ page: 1, pageSize: 100, config })
  12. assert.equal(snapshot.state, 'success')
  13. const objects = snapshot.data.points
  14. for (const [code, k] of [['MP-001', 2], ['MP-002', 11]]) {
  15. const section = await fetchMonitoringPointDetail(code, { config })
  16. assert.equal(section.state, 'success')
  17. const point = objects.find((item) => item.code === code)
  18. assert.ok(point)
  19. const devices = section.data.devices.map((device) => ({ ...device, pointCode: code, placement: 'drawn' }))
  20. assert.equal(devices.length, k)
  21. assert.deepEqual(devices.map((item) => item.code), point.deviceCodes)
  22. assert.ok(devices.every((item) => item.coordinate.renderable === true))
  23. const groups = groupOverlappingDevices(devices, { maxFan: 10 })
  24. assert.equal(groups.length, 1)
  25. assert.equal(groups[0].k, k)
  26. assert.equal(groups[0].degraded, k > 10)
  27. const effects = planDeviceEffects({ devices, enabled: true })
  28. assert.ok(effects.animated.length > 0)
  29. assert.equal(effects.degraded, false)
  30. for (const device of devices) {
  31. assert.ok(Math.abs(device.longitude - point.longitude) < 0.002)
  32. assert.ok(Math.abs(device.latitude - point.latitude) < 0.002)
  33. const anchor = resolveDetailAnchor({ selection: { level: 'equipment', pointCode: code, deviceCode: device.code }, objects, devices })
  34. assert.equal(anchor.code, device.code)
  35. assert.equal(anchor.object, device)
  36. }
  37. if (code === 'MP-002') {
  38. assert.deepEqual([...new Set(devices.map((item) => item.status))].sort(), ['ALARM', 'WARNING', 'WORK_ORDER', 'NORMAL', 'OFFLINE'].sort())
  39. assert.deepEqual([...new Set(effects.animated.map((item) => item.effect))].sort(), ['pulse', 'blink', 'spin'].sort())
  40. }
  41. console.log(`PASS default main scene ${code}: K=${k}, matching snapshot/detail, local coordinates, device anchors and effects`)
  42. }
  43. resetMockTransportsForTest()