|
|
@@ -0,0 +1,145 @@
|
|
|
+/**
|
|
|
+ * 矿端(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([]);
|
|
|
+ });
|
|
|
+});
|