package cn.iocoder.yudao.module.iot.service.rule.scene.matcher.condition;
|
|
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.IotSceneRuleConditionTypeEnum;
|
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 cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
|
import static org.junit.jupiter.api.Assertions.*;
|
|
/**
|
* {@link IotDeviceStateConditionMatcher} 的单元测试
|
*
|
* @author HUIHUI
|
*/
|
public class IotDeviceStateConditionMatcherTest extends IotBaseConditionMatcherTest {
|
|
private IotDeviceStateConditionMatcher matcher;
|
|
@BeforeEach
|
public void setUp() {
|
matcher = new IotDeviceStateConditionMatcher();
|
}
|
|
@Test
|
public void testGetSupportedConditionType() {
|
// 调用
|
IotSceneRuleConditionTypeEnum result = matcher.getSupportedConditionType();
|
|
// 断言
|
assertEquals(IotSceneRuleConditionTypeEnum.DEVICE_STATE, result);
|
}
|
|
@Test
|
public void testGetPriority() {
|
// 调用
|
int result = matcher.getPriority();
|
|
// 断言
|
assertEquals(30, result);
|
}
|
|
@Test
|
public void testIsEnabled() {
|
// 调用
|
boolean result = matcher.isEnabled();
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_onlineState_success() {
|
// 准备参数
|
IotDeviceStateEnum deviceState = IotDeviceStateEnum.ONLINE;
|
IotDeviceMessage message = createDeviceMessage(deviceState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
deviceState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_offlineState_success() {
|
// 准备参数
|
IotDeviceStateEnum deviceState = IotDeviceStateEnum.OFFLINE;
|
IotDeviceMessage message = createDeviceMessage(deviceState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
deviceState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_inactiveState_success() {
|
// 准备参数
|
IotDeviceStateEnum deviceState = IotDeviceStateEnum.INACTIVE;
|
IotDeviceMessage message = createDeviceMessage(deviceState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
deviceState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_stateMismatch_fail() {
|
// 准备参数
|
IotDeviceStateEnum actualState = IotDeviceStateEnum.ONLINE;
|
IotDeviceStateEnum expectedState = IotDeviceStateEnum.OFFLINE;
|
IotDeviceMessage message = createDeviceMessage(actualState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
expectedState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_notEqualsOperator_success() {
|
// 准备参数
|
IotDeviceStateEnum actualState = IotDeviceStateEnum.ONLINE;
|
IotDeviceStateEnum compareState = IotDeviceStateEnum.OFFLINE;
|
IotDeviceMessage message = createDeviceMessage(actualState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.NOT_EQUALS.getOperator(),
|
compareState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_greaterThanOperator_success() {
|
// 准备参数
|
IotDeviceStateEnum actualState = IotDeviceStateEnum.OFFLINE; // 状态值为 2
|
IotDeviceStateEnum compareState = IotDeviceStateEnum.ONLINE; // 状态值为 1
|
IotDeviceMessage message = createDeviceMessage(actualState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.GREATER_THAN.getOperator(),
|
compareState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_lessThanOperator_success() {
|
// 准备参数
|
IotDeviceStateEnum actualState = IotDeviceStateEnum.INACTIVE; // 状态值为 0
|
IotDeviceStateEnum compareState = IotDeviceStateEnum.ONLINE; // 状态值为 1
|
IotDeviceMessage message = createDeviceMessage(actualState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.LESS_THAN.getOperator(),
|
compareState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_nullCondition_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage(IotDeviceStateEnum.ONLINE.getState());
|
|
// 调用
|
boolean result = matcher.matches(message, null);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullConditionType_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage(IotDeviceStateEnum.ONLINE.getState());
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(null);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_missingOperator_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage(IotDeviceStateEnum.ONLINE.getState());
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.DEVICE_STATE.getType());
|
condition.setOperator(null);
|
condition.setParam(IotDeviceStateEnum.ONLINE.getState().toString());
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_missingParam_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage(IotDeviceStateEnum.ONLINE.getState());
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.DEVICE_STATE.getType());
|
condition.setOperator(IotSceneRuleConditionOperatorEnum.EQUALS.getOperator());
|
condition.setParam(null);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullMessage_fail() {
|
// 准备参数
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
IotDeviceStateEnum.ONLINE.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(null, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_nullDeviceState_fail() {
|
// 准备参数
|
IotDeviceMessage message = new IotDeviceMessage();
|
message.setParams(null);
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
IotDeviceStateEnum.ONLINE.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_greaterThanOrEqualsOperator_success() {
|
// 准备参数
|
IotDeviceStateEnum deviceState = IotDeviceStateEnum.ONLINE; // 状态值为 1
|
IotDeviceMessage message = createDeviceMessage(deviceState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.GREATER_THAN_OR_EQUALS.getOperator(),
|
deviceState.getState().toString() // 比较值也为 1
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_lessThanOrEqualsOperator_success() {
|
// 准备参数
|
IotDeviceStateEnum actualState = IotDeviceStateEnum.ONLINE; // 状态值为 1
|
IotDeviceStateEnum compareState = IotDeviceStateEnum.OFFLINE; // 状态值为 2
|
IotDeviceMessage message = createDeviceMessage(actualState.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.LESS_THAN_OR_EQUALS.getOperator(),
|
compareState.getState().toString()
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertTrue(result);
|
}
|
|
@Test
|
public void testMatches_invalidOperator_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage(IotDeviceStateEnum.ONLINE.getState());
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.DEVICE_STATE.getType());
|
condition.setOperator(randomString()); // 随机无效操作符
|
condition.setParam(IotDeviceStateEnum.ONLINE.getState().toString());
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
@Test
|
public void testMatches_invalidParamFormat_fail() {
|
// 准备参数
|
IotDeviceMessage message = createDeviceMessage(IotDeviceStateEnum.ONLINE.getState());
|
IotSceneRuleDO.TriggerCondition condition = createValidCondition(
|
IotSceneRuleConditionOperatorEnum.EQUALS.getOperator(),
|
randomString() // 随机无效状态值
|
);
|
|
// 调用
|
boolean result = matcher.matches(message, condition);
|
|
// 断言
|
assertFalse(result);
|
}
|
|
// ========== 辅助方法 ==========
|
|
/**
|
* 创建设备消息
|
*/
|
private IotDeviceMessage createDeviceMessage(Integer deviceState) {
|
IotDeviceMessage message = new IotDeviceMessage();
|
message.setDeviceId(randomLongId());
|
message.setMethod(IotDeviceMessageMethodEnum.STATE_UPDATE.getMethod());
|
message.setParams(MapUtil.of("state", deviceState));
|
return message;
|
}
|
|
/**
|
* 创建有效的条件
|
*/
|
private IotSceneRuleDO.TriggerCondition createValidCondition(String operator, String param) {
|
IotSceneRuleDO.TriggerCondition condition = new IotSceneRuleDO.TriggerCondition();
|
condition.setType(IotSceneRuleConditionTypeEnum.DEVICE_STATE.getType());
|
condition.setOperator(operator);
|
condition.setParam(param);
|
return condition;
|
}
|
|
}
|