package cn.iocoder.yudao.module.iot.service.rule.scene.matcher.trigger; import cn.hutool.core.map.MapUtil; import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum; import cn.iocoder.yudao.module.iot.core.enums.device.IotDeviceStateEnum; import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage; import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotSceneRuleDO; import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionOperatorEnum; import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleTriggerTypeEnum; import cn.iocoder.yudao.module.iot.service.rule.scene.matcher.IotBaseConditionMatcherTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; import static org.junit.jupiter.api.Assertions.*; /** * {@link IotDeviceStateUpdateTriggerMatcher} 的单元测试 * * @author HUIHUI */ public class IotDeviceStateUpdateTriggerMatcherTest extends IotBaseConditionMatcherTest { private IotDeviceStateUpdateTriggerMatcher matcher; @BeforeEach public void setUp() { matcher = new IotDeviceStateUpdateTriggerMatcher(); } @Test public void testGetSupportedTriggerType_success() { // 准备参数 // 无需准备参数 // 调用 IotSceneRuleTriggerTypeEnum result = matcher.getSupportedTriggerType(); // 断言 assertEquals(IotSceneRuleTriggerTypeEnum.DEVICE_STATE_UPDATE, result); } @Test public void testGetPriority_success() { // 准备参数 // 无需准备参数 // 调用 int result = matcher.getPriority(); // 断言 assertEquals(10, result); } @Test public void testIsEnabled_success() { // 准备参数 // 无需准备参数 // 调用 boolean result = matcher.isEnabled(); // 断言 assertTrue(result); } @Test public void testMatches_onlineStateSuccess() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(), IotDeviceStateEnum.ONLINE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertTrue(result); } @Test public void testMatches_offlineStateSuccess() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.OFFLINE.getState()); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(), IotDeviceStateEnum.OFFLINE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertTrue(result); } @Test public void testMatches_stateMismatch() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(), IotDeviceStateEnum.OFFLINE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertFalse(result); } @Test public void testMatches_nullTrigger() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); // 调用 boolean result = matcher.matches(message, null); // 断言 assertFalse(result); } @Test public void testMatches_nullTriggerType() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger(); trigger.setType(null); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertFalse(result); } @Test public void testMatches_wrongMessageMethod() { // 准备参数 IotDeviceMessage message = new IotDeviceMessage(); message.setDeviceId(randomLongId()); message.setMethod(IotDeviceMessageMethodEnum.PROPERTY_POST.getMethod()); message.setParams(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(), IotDeviceStateEnum.ONLINE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertFalse(result); } @Test public void testMatches_nullTriggerOperator() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger(); trigger.setType(IotSceneRuleTriggerTypeEnum.DEVICE_STATE_UPDATE.getType()); trigger.setOperator(null); trigger.setValue(IotDeviceStateEnum.ONLINE.getState().toString()); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertFalse(result); } @Test public void testMatches_nullTriggerValue() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger(); trigger.setType(IotSceneRuleTriggerTypeEnum.DEVICE_STATE_UPDATE.getType()); trigger.setOperator(IotSceneRuleConditionOperatorEnum.EQUALS.getOperator()); trigger.setValue(null); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertFalse(result); } @Test public void testMatches_nullMessageParams() { // 准备参数 IotDeviceMessage message = new IotDeviceMessage(); message.setDeviceId(randomLongId()); message.setMethod(IotDeviceMessageMethodEnum.STATE_UPDATE.getMethod()); message.setParams(null); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(), IotDeviceStateEnum.ONLINE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertFalse(result); } @Test public void testMatches_greaterThanOperatorSuccess() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.GREATER_THAN.getOperator(), IotDeviceStateEnum.INACTIVE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertTrue(result); } @Test public void testMatches_notEqualsOperatorSuccess() { // 准备参数 IotDeviceMessage message = createStateUpdateMessage(IotDeviceStateEnum.ONLINE.getState()); IotSceneRuleDO.Trigger trigger = createValidTrigger( IotSceneRuleConditionOperatorEnum.NOT_EQUALS.getOperator(), IotDeviceStateEnum.OFFLINE.getState().toString() ); // 调用 boolean result = matcher.matches(message, trigger); // 断言 assertTrue(result); } // ========== 辅助方法 ========== /** * 创建设备状态更新消息 */ private IotDeviceMessage createStateUpdateMessage(Integer state) { IotDeviceMessage message = new IotDeviceMessage(); message.setDeviceId(randomLongId()); message.setMethod(IotDeviceMessageMethodEnum.STATE_UPDATE.getMethod()); message.setParams(MapUtil.of("state", state)); return message; } /** * 创建有效的触发器 */ private IotSceneRuleDO.Trigger createValidTrigger(String operator, String value) { IotSceneRuleDO.Trigger trigger = new IotSceneRuleDO.Trigger(); trigger.setType(IotSceneRuleTriggerTypeEnum.DEVICE_STATE_UPDATE.getType()); trigger.setOperator(operator); trigger.setValue(value); return trigger; } }