device-observability-model.test.mjs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import assert from 'node:assert/strict'
  2. import test from 'node:test'
  3. import {
  4. analysisPresentation,
  5. canEditDeviceObservability,
  6. eventStatusLabel,
  7. eventTypeLabel,
  8. relationPathLabel,
  9. relationTypeLabel,
  10. toGraphData
  11. } from '../src/views/dataGovernance/development/deviceObservabilityModel.js'
  12. test('presents operational event and relation labels for business users', () => {
  13. assert.equal(eventTypeLabel('alarm'), '告警')
  14. assert.equal(eventTypeLabel('fault'), '故障')
  15. assert.equal(eventTypeLabel('maintenance'), '维修')
  16. assert.equal(eventTypeLabel('downtime'), '停机')
  17. assert.equal(eventStatusLabel('resolved'), '已恢复')
  18. assert.equal(relationTypeLabel('triggered'), '触发')
  19. assert.equal(
  20. relationPathLabel(['indicates', 'triggered']),
  21. '表征 → 触发'
  22. )
  23. })
  24. test('converts bounded canonical graph into directed chart data', () => {
  25. const result = toGraphData({
  26. anchor_kind: 'event',
  27. anchor_uid: 'event-downtime',
  28. nodes: [
  29. {
  30. kind: 'event',
  31. uid: 'event-alarm',
  32. node_type: 'alarm',
  33. label: '轴承温度高'
  34. },
  35. {
  36. kind: 'event',
  37. uid: 'event-downtime',
  38. node_type: 'downtime',
  39. label: '一号泵停机'
  40. },
  41. {
  42. kind: 'asset',
  43. uid: 'asset-pump',
  44. node_type: 'device',
  45. label: '一号泵'
  46. }
  47. ],
  48. relations: [
  49. {
  50. uid: 'relation-1',
  51. from_kind: 'event',
  52. from_uid: 'event-alarm',
  53. relation_type: 'triggered',
  54. to_kind: 'event',
  55. to_uid: 'event-downtime'
  56. }
  57. ]
  58. })
  59. assert.equal(result.nodes.length, 3)
  60. assert.equal(result.links[0].source, 'event:event-alarm')
  61. assert.equal(result.links[0].target, 'event:event-downtime')
  62. assert.equal(result.links[0].name, '触发')
  63. assert.equal(
  64. result.nodes.find(item => item.id === 'event:event-downtime').itemStyle
  65. .borderWidth,
  66. 4
  67. )
  68. assert.ok(result.categories.some(item => item.name === '设备'))
  69. })
  70. test('makes evidence sufficiency explicit and never presents a verdict', () => {
  71. assert.deepEqual(analysisPresentation('supported_candidates'), {
  72. color: 'warning',
  73. icon: 'mdi-alert-decagram-outline',
  74. title: '发现有证据支持的候选,等待专家确认'
  75. })
  76. assert.deepEqual(analysisPresentation('insufficient_evidence'), {
  77. color: 'info',
  78. icon: 'mdi-information-outline',
  79. title: '证据不足,无法确认根因'
  80. })
  81. })
  82. test('separates observability import permission from read access', () => {
  83. assert.equal(
  84. canEditDeviceObservability(['governance:read']),
  85. false
  86. )
  87. assert.equal(
  88. canEditDeviceObservability([
  89. 'governance:read',
  90. 'device-observability:edit'
  91. ]),
  92. true
  93. )
  94. })