| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /**
- * 矿端(isLeaf)取数转换回归测试
- *
- * 数据形状取自真实接口返回(deptId=1125&isLeaf=true):
- * - /province/device/getGoafData:records 中 sourcePressureAlarm / unsealAlarm / overLimitAlarm 均为 null
- * - /province/homeData/getCoalSeamFireNum:{ 容易自燃: '1', 不易自燃: 0, 未检测: 0, 自燃: 0 }
- *
- * 使用方式:
- * npx jest tests/sealedGoaf.transform.test.ts
- */
- import {
- buildCoalSeamFireRows,
- enrichGoafMonitorRecords,
- } from '../src/views/dashboard/SealedGoaf/sealedGoaf.transform';
- /** 与 response.txt 中 coalSeamAlarmRule 一致的精简规则集 */
- const coalSeamAlarmRule = {
- id: '1',
- ycWarn1: '20<=sourcePressureChange && sourcePressureChange<=40',
- ycWarn2: '40<sourcePressureChange && sourcePressureChange<=60',
- fireWarn1: '(((coRzl<=20 || coZf<=0.5*coAvg) && coVal<=10)||o2Val<=5 ) && temperatureDifference<2',
- fireOutWarn1: 'temperatureDifferenceOut<2 || (ch4ValOut>0 && ch4ValOut<0.5) || (coValOut>=0 && coValOut<5) || o2ValOut < 20',
- };
- /** 真实返回中的一条密闭监测记录(告警对象为 null 的情况) */
- function createRecord(overrides: Record<string, any> = {}) {
- return {
- devicePos: '25213撤架巷2号墙',
- mineName: '红柳林煤矿',
- coalSeamName: '5-2煤层',
- coalSeamLevel: 'Ⅰ类容易自燃',
- coalSeamAlarmRule,
- // 现网返回中这三个告警对象均为 null
- leakageAlarm: { alarmLevel: '1', alarmName: '闭外气体涌入-存在漏风供氧可能' },
- sourcePressureAlarm: null,
- fireAlarm: { alarmLevel: '1', alarmName: '低风险' },
- fireAlarmReson: ['coVal', 'temperatureDifference', 'coZf', 'coRzl'],
- fireAlarmOut: { alarmLevel: '1', alarmName: '低风险' },
- fireAlarmOutReson: ['temperatureDifferenceOut', 'coValOut'],
- unsealAlarm: null,
- explosionAlarm: { alarmLevel: '1', alarmName: '增减风安全区' },
- alarmLevel: 1,
- status: 0,
- linkStatus: 1,
- ch4Val: '0.00',
- c2h4Val: '0.00',
- c2h2Val: '0.00',
- sourcePressure: -675.38,
- ...overrides,
- };
- }
- describe('enrichGoafMonitorRecords', () => {
- it('sourcePressureAlarm 为 null 时不抛错,且保证 sourcePressureReason 为空串', () => {
- const payload = { records: Array.from({ length: 7 }, (_, i) => createRecord({ devicePos: `墙-${i}` })), total: 7 };
- let result: any;
- expect(() => {
- result = enrichGoafMonitorRecords(payload);
- }).not.toThrow();
- // 原地返回同一个对象,保持原引用语义
- expect(result).toBe(payload);
- expect(result.records).toHaveLength(7);
- result.records.forEach((record) => {
- expect(record.sourcePressureReason).toBe('');
- });
- });
- it('告警对象存在时仍能正常翻译出预警原因文本', () => {
- const [record] = enrichGoafMonitorRecords({
- records: [
- createRecord({
- sourcePressureAlarm: { alarmLevel: '1', alarmName: '内外压差风险报警' },
- }),
- ],
- }).records;
- expect(record.sourcePressureReason).not.toBe('');
- expect(record.sourcePressureReason).toContain('压差变化');
- expect(record.fireAlarmReason).toContain('温差');
- expect(record.fireAlarmOutReason).toContain('密闭墙外温差');
- });
- it('规则缺失 / 告警缺失 / 规则键不存在时均返回空串而不抛错', () => {
- const [noRule, noAlarm, missingRuleKey] = enrichGoafMonitorRecords({
- records: [
- createRecord({ coalSeamAlarmRule: null }),
- createRecord({ fireAlarm: null, fireAlarmOut: null }),
- createRecord({ fireAlarm: { alarmLevel: '4' }, fireAlarmOut: { alarmLevel: '4' } }),
- ],
- }).records;
- expect(noRule.sourcePressureReason).toBe('');
- expect(noRule.fireAlarmReason).toBe('');
- expect(noRule.fireAlarmOutReason).toBe('');
- expect(noAlarm.sourcePressureReason).toBe('');
- expect(noAlarm.fireAlarmReason).toBe('');
- expect(noAlarm.fireAlarmOutReason).toBe('');
- // 规则集中只有 fireWarn1 / fireOutWarn1,等级 4 取不到对应规则,应退化为空串
- expect(missingRuleKey.fireAlarmReason).toBe('');
- expect(missingRuleKey.fireAlarmOutReason).toBe('');
- });
- it('reson 字段不是数组时按空数组处理,不抛错', () => {
- const [record] = enrichGoafMonitorRecords({
- records: [createRecord({ fireAlarmReson: null, fireAlarmOutReson: undefined })],
- }).records;
- expect(typeof record.fireAlarmReason).toBe('string');
- expect(typeof record.fireAlarmOutReason).toBe('string');
- });
- it('records 缺失、非数组或含 null 项时安全返回(不再让整个请求进入 catch)', () => {
- expect(enrichGoafMonitorRecords(null)).toBeNull();
- expect(enrichGoafMonitorRecords({ total: 0 })).toEqual({ total: 0 });
- const result = enrichGoafMonitorRecords({ records: [null, createRecord()] });
- expect(result.records).toHaveLength(2);
- expect(result.records[1].sourcePressureReason).toBe('');
- });
- });
- describe('buildCoalSeamFireRows', () => {
- it('把「类别 → 数量」映射转换为表格行并保持接口顺序', () => {
- const rows = buildCoalSeamFireRows({ 容易自燃: '1', 不易自燃: 0, 未检测: 0, 自燃: 0 });
- expect(rows).toEqual([
- { coalSeamLevel: '容易自燃', num: '1' },
- { coalSeamLevel: '不易自燃', num: 0 },
- { coalSeamLevel: '未检测', num: 0 },
- { coalSeamLevel: '自燃', num: 0 },
- ]);
- });
- it('非对象返回值统一为空数组(表格显示空状态)', () => {
- expect(buildCoalSeamFireRows(null)).toEqual([]);
- expect(buildCoalSeamFireRows(undefined)).toEqual([]);
- expect(buildCoalSeamFireRows({})).toEqual([]);
- expect(buildCoalSeamFireRows([] as any)).toEqual([]);
- expect(buildCoalSeamFireRows('容易自燃' as any)).toEqual([]);
- });
- });
|