sealedGoaf.transform.test.ts 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * 矿端(isLeaf)取数转换回归测试
  3. *
  4. * 数据形状取自真实接口返回(deptId=1125&isLeaf=true):
  5. * - /province/device/getGoafData:records 中 sourcePressureAlarm / unsealAlarm / overLimitAlarm 均为 null
  6. * - /province/homeData/getCoalSeamFireNum:{ 容易自燃: '1', 不易自燃: 0, 未检测: 0, 自燃: 0 }
  7. *
  8. * 使用方式:
  9. * npx jest tests/sealedGoaf.transform.test.ts
  10. */
  11. import {
  12. buildCoalSeamFireRows,
  13. enrichGoafMonitorRecords,
  14. } from '../src/views/dashboard/SealedGoaf/sealedGoaf.transform';
  15. /** 与 response.txt 中 coalSeamAlarmRule 一致的精简规则集 */
  16. const coalSeamAlarmRule = {
  17. id: '1',
  18. ycWarn1: '20<=sourcePressureChange && sourcePressureChange<=40',
  19. ycWarn2: '40<sourcePressureChange && sourcePressureChange<=60',
  20. fireWarn1: '(((coRzl<=20 || coZf<=0.5*coAvg) && coVal<=10)||o2Val<=5 ) && temperatureDifference<2',
  21. fireOutWarn1: 'temperatureDifferenceOut<2 || (ch4ValOut>0 && ch4ValOut<0.5) || (coValOut>=0 && coValOut<5) || o2ValOut < 20',
  22. };
  23. /** 真实返回中的一条密闭监测记录(告警对象为 null 的情况) */
  24. function createRecord(overrides: Record<string, any> = {}) {
  25. return {
  26. devicePos: '25213撤架巷2号墙',
  27. mineName: '红柳林煤矿',
  28. coalSeamName: '5-2煤层',
  29. coalSeamLevel: 'Ⅰ类容易自燃',
  30. coalSeamAlarmRule,
  31. // 现网返回中这三个告警对象均为 null
  32. leakageAlarm: { alarmLevel: '1', alarmName: '闭外气体涌入-存在漏风供氧可能' },
  33. sourcePressureAlarm: null,
  34. fireAlarm: { alarmLevel: '1', alarmName: '低风险' },
  35. fireAlarmReson: ['coVal', 'temperatureDifference', 'coZf', 'coRzl'],
  36. fireAlarmOut: { alarmLevel: '1', alarmName: '低风险' },
  37. fireAlarmOutReson: ['temperatureDifferenceOut', 'coValOut'],
  38. unsealAlarm: null,
  39. explosionAlarm: { alarmLevel: '1', alarmName: '增减风安全区' },
  40. alarmLevel: 1,
  41. status: 0,
  42. linkStatus: 1,
  43. ch4Val: '0.00',
  44. c2h4Val: '0.00',
  45. c2h2Val: '0.00',
  46. sourcePressure: -675.38,
  47. ...overrides,
  48. };
  49. }
  50. describe('enrichGoafMonitorRecords', () => {
  51. it('sourcePressureAlarm 为 null 时不抛错,且保证 sourcePressureReason 为空串', () => {
  52. const payload = { records: Array.from({ length: 7 }, (_, i) => createRecord({ devicePos: `墙-${i}` })), total: 7 };
  53. let result: any;
  54. expect(() => {
  55. result = enrichGoafMonitorRecords(payload);
  56. }).not.toThrow();
  57. // 原地返回同一个对象,保持原引用语义
  58. expect(result).toBe(payload);
  59. expect(result.records).toHaveLength(7);
  60. result.records.forEach((record) => {
  61. expect(record.sourcePressureReason).toBe('');
  62. });
  63. });
  64. it('告警对象存在时仍能正常翻译出预警原因文本', () => {
  65. const [record] = enrichGoafMonitorRecords({
  66. records: [
  67. createRecord({
  68. sourcePressureAlarm: { alarmLevel: '1', alarmName: '内外压差风险报警' },
  69. }),
  70. ],
  71. }).records;
  72. expect(record.sourcePressureReason).not.toBe('');
  73. expect(record.sourcePressureReason).toContain('压差变化');
  74. expect(record.fireAlarmReason).toContain('温差');
  75. expect(record.fireAlarmOutReason).toContain('密闭墙外温差');
  76. });
  77. it('规则缺失 / 告警缺失 / 规则键不存在时均返回空串而不抛错', () => {
  78. const [noRule, noAlarm, missingRuleKey] = enrichGoafMonitorRecords({
  79. records: [
  80. createRecord({ coalSeamAlarmRule: null }),
  81. createRecord({ fireAlarm: null, fireAlarmOut: null }),
  82. createRecord({ fireAlarm: { alarmLevel: '4' }, fireAlarmOut: { alarmLevel: '4' } }),
  83. ],
  84. }).records;
  85. expect(noRule.sourcePressureReason).toBe('');
  86. expect(noRule.fireAlarmReason).toBe('');
  87. expect(noRule.fireAlarmOutReason).toBe('');
  88. expect(noAlarm.sourcePressureReason).toBe('');
  89. expect(noAlarm.fireAlarmReason).toBe('');
  90. expect(noAlarm.fireAlarmOutReason).toBe('');
  91. // 规则集中只有 fireWarn1 / fireOutWarn1,等级 4 取不到对应规则,应退化为空串
  92. expect(missingRuleKey.fireAlarmReason).toBe('');
  93. expect(missingRuleKey.fireAlarmOutReason).toBe('');
  94. });
  95. it('reson 字段不是数组时按空数组处理,不抛错', () => {
  96. const [record] = enrichGoafMonitorRecords({
  97. records: [createRecord({ fireAlarmReson: null, fireAlarmOutReson: undefined })],
  98. }).records;
  99. expect(typeof record.fireAlarmReason).toBe('string');
  100. expect(typeof record.fireAlarmOutReason).toBe('string');
  101. });
  102. it('records 缺失、非数组或含 null 项时安全返回(不再让整个请求进入 catch)', () => {
  103. expect(enrichGoafMonitorRecords(null)).toBeNull();
  104. expect(enrichGoafMonitorRecords({ total: 0 })).toEqual({ total: 0 });
  105. const result = enrichGoafMonitorRecords({ records: [null, createRecord()] });
  106. expect(result.records).toHaveLength(2);
  107. expect(result.records[1].sourcePressureReason).toBe('');
  108. });
  109. });
  110. describe('buildCoalSeamFireRows', () => {
  111. it('把「类别 → 数量」映射转换为表格行并保持接口顺序', () => {
  112. const rows = buildCoalSeamFireRows({ 容易自燃: '1', 不易自燃: 0, 未检测: 0, 自燃: 0 });
  113. expect(rows).toEqual([
  114. { coalSeamLevel: '容易自燃', num: '1' },
  115. { coalSeamLevel: '不易自燃', num: 0 },
  116. { coalSeamLevel: '未检测', num: 0 },
  117. { coalSeamLevel: '自燃', num: 0 },
  118. ]);
  119. });
  120. it('非对象返回值统一为空数组(表格显示空状态)', () => {
  121. expect(buildCoalSeamFireRows(null)).toEqual([]);
  122. expect(buildCoalSeamFireRows(undefined)).toEqual([]);
  123. expect(buildCoalSeamFireRows({})).toEqual([]);
  124. expect(buildCoalSeamFireRows([] as any)).toEqual([]);
  125. expect(buildCoalSeamFireRows('容易自燃' as any)).toEqual([]);
  126. });
  127. });